Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions 2d/finite_state_machine/player/player_state.gd
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
extends "res://state_machine/state.gd"

static var player_state := {
"previous": "previous",
"jump": "jump",
"idle": "idle",
"move": "move",
"stagger": "stagger",
"attack": "attack",
"die": "die",
"dead": "dead",
"walk": "walk",
}
20 changes: 11 additions & 9 deletions 2d/finite_state_machine/player/player_state_machine.gd
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
extends "res://state_machine/state_machine.gd"

var player_state = preload("res://player/player_state.gd").player_state

@onready var idle: Node = $Idle
@onready var move: Node = $Move
@onready var jump: Node = $Jump
Expand All @@ -8,21 +10,21 @@ extends "res://state_machine/state_machine.gd"

func _ready() -> void:
states_map = {
"idle": idle,
"move": move,
"jump": jump,
"stagger": stagger,
"attack": attack,
player_state.idle: idle,
player_state.move: move,
player_state.jump: jump,
player_state.stagger: stagger,
player_state.attack: attack,
}


func _change_state(state_name: String) -> void:
# The base state_machine interface this node extends does most of the work.
if not _active:
return
if state_name in ["stagger", "jump", "attack"]:
if state_name in [player_state.stagger, player_state.jump, player_state.attack]:
states_stack.push_front(states_map[state_name])
if state_name == "jump" and current_state == move:
if state_name == player_state.jump and current_state == move:
jump.initialize(move.speed, move.velocity)

super._change_state(state_name)
Expand All @@ -31,10 +33,10 @@ func _change_state(state_name: String) -> void:
func _unhandled_input(event: InputEvent) -> void:
# Here we only handle input that can interrupt states, attacking in this case,
# otherwise we let the state node handle it.
if event.is_action_pressed("attack"):
if event.is_action_pressed(player_state.attack):
if current_state in [attack, stagger]:
return
_change_state("attack")
_change_state(player_state.attack)
return

current_state.handle_input(event)
6 changes: 3 additions & 3 deletions 2d/finite_state_machine/player/states/combat/attack.gd
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
extends "res://state_machine/state.gd"
extends "res://player/player_state.gd"

func enter() -> void:
owner.get_node(^"AnimationPlayer").play("idle")
owner.get_node(^"AnimationPlayer").play(player_state.idle)


func _on_Sword_attack_finished() -> void:
finished.emit("previous")
finished.emit(player_state.previous)
8 changes: 4 additions & 4 deletions 2d/finite_state_machine/player/states/combat/stagger.gd
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
extends "res://state_machine/state.gd"
extends "res://player/player_state.gd"
# The stagger state end with the stagger animation from the AnimationPlayer.
# The animation only affects the Body Sprite2D's modulate property so it
# could stack with other animations if we had two AnimationPlayer nodes.

func enter() -> void:
owner.get_node(^"AnimationPlayer").play("stagger")
owner.get_node(^"AnimationPlayer").play(player_state.stagger)


func _on_animation_finished(anim_name: String) -> void:
assert(anim_name == "stagger")
finished.emit("previous")
assert(anim_name == player_state.stagger)
finished.emit(player_state.previous)
6 changes: 3 additions & 3 deletions 2d/finite_state_machine/player/states/die.gd
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
extends "res://state_machine/state.gd"
extends "res://player/player_state.gd"

# Initialize the state. E.g. change the animation.
func enter() -> void:
owner.set_dead(true)
owner.get_node(^"AnimationPlayer").play("die")
owner.get_node(^"AnimationPlayer").play(player_state.die)


func _on_animation_finished(_anim_name: String) -> void:
finished.emit("dead")
finished.emit(player_state.dead)
4 changes: 2 additions & 2 deletions 2d/finite_state_machine/player/states/motion/in_air/jump.gd
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ func enter() -> void:
horizontal_velocity = Vector2()
vertical_speed = 600.0

owner.get_node(^"AnimationPlayer").play("idle")
owner.get_node(^"AnimationPlayer").play(player_state.idle)


func update(delta: float) -> void:
Expand All @@ -46,7 +46,7 @@ func update(delta: float) -> void:
move_horizontally(delta, input_direction)
animate_jump_height(delta)
if height <= 0.0:
finished.emit("previous")
finished.emit(player_state.previous)


func move_horizontally(delta: float, direction: Vector2) -> void:
Expand Down
4 changes: 2 additions & 2 deletions 2d/finite_state_machine/player/states/motion/motion.gd
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
extends "res://state_machine/state.gd"
extends "res://player/player_state.gd"
# Collection of important methods to handle direction and animation.

func handle_input(event: InputEvent) -> void:
if event.is_action_pressed("simulate_damage"):
finished.emit("stagger")
finished.emit(player_state.stagger)


func get_input_direction() -> Vector2:
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
extends "on_ground.gd"

func enter() -> void:
owner.get_node(^"AnimationPlayer").play("idle")
owner.get_node(^"AnimationPlayer").play(player_state.idle)


func handle_input(event: InputEvent) -> void:
Expand All @@ -11,4 +11,4 @@ func handle_input(event: InputEvent) -> void:
func update(_delta: float) -> void:
var input_direction: Vector2 = get_input_direction()
if input_direction:
finished.emit("move")
finished.emit(player_state.move)
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ func enter() -> void:

var input_direction := get_input_direction()
update_look_direction(input_direction)
owner.get_node(^"AnimationPlayer").play("walk")
owner.get_node(^"AnimationPlayer").play(player_state.walk)


func handle_input(event: InputEvent) -> void:
Expand All @@ -19,7 +19,7 @@ func handle_input(event: InputEvent) -> void:
func update(_delta: float) -> void:
var input_direction := get_input_direction()
if input_direction.is_zero_approx():
finished.emit("idle")
finished.emit(player_state.idle)
update_look_direction(input_direction)

if Input.is_action_pressed("run"):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,5 @@ var velocity := Vector2()

func handle_input(event: InputEvent) -> void:
if event.is_action_pressed("jump"):
finished.emit("jump")
finished.emit(player_state.jump)
return super.handle_input(event)