diff --git a/2d/finite_state_machine/player/player_state.gd b/2d/finite_state_machine/player/player_state.gd new file mode 100644 index 0000000000..9f1b29fa6f --- /dev/null +++ b/2d/finite_state_machine/player/player_state.gd @@ -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", +} diff --git a/2d/finite_state_machine/player/player_state_machine.gd b/2d/finite_state_machine/player/player_state_machine.gd index 369ee2691d..d579813ce7 100644 --- a/2d/finite_state_machine/player/player_state_machine.gd +++ b/2d/finite_state_machine/player/player_state_machine.gd @@ -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 @@ -8,11 +10,11 @@ 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, } @@ -20,9 +22,9 @@ 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) @@ -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) diff --git a/2d/finite_state_machine/player/states/combat/attack.gd b/2d/finite_state_machine/player/states/combat/attack.gd index 917b387116..51e3b2b0f3 100644 --- a/2d/finite_state_machine/player/states/combat/attack.gd +++ b/2d/finite_state_machine/player/states/combat/attack.gd @@ -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) diff --git a/2d/finite_state_machine/player/states/combat/stagger.gd b/2d/finite_state_machine/player/states/combat/stagger.gd index 80f4d968e8..33e3b8bac1 100644 --- a/2d/finite_state_machine/player/states/combat/stagger.gd +++ b/2d/finite_state_machine/player/states/combat/stagger.gd @@ -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) diff --git a/2d/finite_state_machine/player/states/die.gd b/2d/finite_state_machine/player/states/die.gd index 5a4a255a01..875ebfc9bf 100644 --- a/2d/finite_state_machine/player/states/die.gd +++ b/2d/finite_state_machine/player/states/die.gd @@ -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) diff --git a/2d/finite_state_machine/player/states/motion/in_air/jump.gd b/2d/finite_state_machine/player/states/motion/in_air/jump.gd index cc42424a9b..3a59f7a5b9 100644 --- a/2d/finite_state_machine/player/states/motion/in_air/jump.gd +++ b/2d/finite_state_machine/player/states/motion/in_air/jump.gd @@ -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: @@ -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: diff --git a/2d/finite_state_machine/player/states/motion/motion.gd b/2d/finite_state_machine/player/states/motion/motion.gd index 19f2c559c9..168525e007 100644 --- a/2d/finite_state_machine/player/states/motion/motion.gd +++ b/2d/finite_state_machine/player/states/motion/motion.gd @@ -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: diff --git a/2d/finite_state_machine/player/states/motion/on_ground/idle.gd b/2d/finite_state_machine/player/states/motion/on_ground/idle.gd index 3cca03438a..5740f35ee4 100644 --- a/2d/finite_state_machine/player/states/motion/on_ground/idle.gd +++ b/2d/finite_state_machine/player/states/motion/on_ground/idle.gd @@ -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: @@ -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) diff --git a/2d/finite_state_machine/player/states/motion/on_ground/move.gd b/2d/finite_state_machine/player/states/motion/on_ground/move.gd index b722b7f897..d338d6165b 100644 --- a/2d/finite_state_machine/player/states/motion/on_ground/move.gd +++ b/2d/finite_state_machine/player/states/motion/on_ground/move.gd @@ -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: @@ -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"): diff --git a/2d/finite_state_machine/player/states/motion/on_ground/on_ground.gd b/2d/finite_state_machine/player/states/motion/on_ground/on_ground.gd index 59c59c5a6b..e2bf3ef72f 100644 --- a/2d/finite_state_machine/player/states/motion/on_ground/on_ground.gd +++ b/2d/finite_state_machine/player/states/motion/on_ground/on_ground.gd @@ -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)