From 9be67c8dfe2611aa39a36acc1c49f70971afa23f Mon Sep 17 00:00:00 2001 From: Steven Wroblewski Date: Fri, 8 May 2026 22:02:59 +0200 Subject: [PATCH] feat(character): add animation state API (set/get_animation_state) --- scripts/characters/character.gd | 16 ++++++++++++++++ test/unit/test_character_v2.gd | 29 +++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/scripts/characters/character.gd b/scripts/characters/character.gd index 7a95646..6a48972 100644 --- a/scripts/characters/character.gd +++ b/scripts/characters/character.gd @@ -12,6 +12,7 @@ signal state_changed(new_state: CharacterData.State) @export var data: CharacterData var _is_held: bool = false +var _current_anim: String = "idle" const _STATE_COLORS: Dictionary = { CharacterData.State.HEALTHY: Color(0.6, 0.8, 1.0), @@ -40,6 +41,19 @@ func set_state(new_state: CharacterData.State) -> void: state_changed.emit(new_state) +func set_animation_state(anim: String) -> void: + _current_anim = anim + var sprite: AnimatedSprite2D = get_node_or_null("AnimatedSprite2D") as AnimatedSprite2D + if sprite == null or sprite.sprite_frames == null: + return + if sprite.sprite_frames.has_animation(anim): + sprite.play(anim) + + +func get_animation_state() -> String: + return _current_anim + + func _update_visual_state() -> void: if data == null: return @@ -58,11 +72,13 @@ func _update_visual_state() -> void: func _on_drag_picked_up(_pos: Vector2) -> void: _is_held = true + set_animation_state("held") character_picked_up.emit(self) func _on_drag_released(pos: Vector2) -> void: _is_held = false + set_animation_state("idle") if data == null or data.id.is_empty(): return GameState.set_character_position(character_id, global_position) diff --git a/test/unit/test_character_v2.gd b/test/unit/test_character_v2.gd index e24e7a2..112fb68 100644 --- a/test/unit/test_character_v2.gd +++ b/test/unit/test_character_v2.gd @@ -44,3 +44,32 @@ func test_character_data_outfit_has_three_empty_slots() -> void: assert_eq(_char.data.outfit[0], "") assert_eq(_char.data.outfit[1], "") assert_eq(_char.data.outfit[2], "") + + +func test_default_animation_state_is_idle() -> void: + assert_eq(_char.get_animation_state(), "idle") + + +func test_set_animation_state_sitting() -> void: + _char.set_animation_state("sitting") + assert_eq(_char.get_animation_state(), "sitting") + + +func test_set_animation_state_lying() -> void: + _char.set_animation_state("lying") + assert_eq(_char.get_animation_state(), "lying") + + +func test_set_animation_state_held() -> void: + _char.set_animation_state("held") + assert_eq(_char.get_animation_state(), "held") + + +func test_set_animation_state_happy() -> void: + _char.set_animation_state("happy") + assert_eq(_char.get_animation_state(), "happy") + + +func test_set_animation_state_sleeping() -> void: + _char.set_animation_state("sleeping") + assert_eq(_char.get_animation_state(), "sleeping")