feat/fix: new animation system handoff in Interactable.

This commit is contained in:
tiger tiger tiger 2026-01-16 21:13:27 +01:00
parent 6e94ccc134
commit 0ca89fd960
4 changed files with 33 additions and 13 deletions

View File

@ -92,8 +92,15 @@ func prepare_transition():
unload() unload()
# Called by youth_room_scene_player when voice training scene starts ## Override to handle scene-specific preparation (chest reveal animation)
func prepare_scene_start(scene_id: Scenes.id, is_repeating: bool) -> void:
# Only play chest reveal on first playthrough of voice training scene
if scene_id == Scenes.id.YOUTH_VOICE_TRAINING and not is_repeating:
await play_chest_reveal()
# Called when voice training scene starts
func play_chest_reveal() -> void: func play_chest_reveal() -> void:
$visuals/AnimationPlayer.play("chest_reveal")
$visuals/SecondaryAnimation.play("chest_reveal") $visuals/SecondaryAnimation.play("chest_reveal")
await $visuals/SecondaryAnimation.animation_finished await $visuals/SecondaryAnimation.animation_finished

View File

@ -14,13 +14,13 @@ func start_soundtrack():
func _on_scene_starting(scene_id: Scenes.id, _repeat: bool) -> void: func _on_scene_starting(scene_id: Scenes.id, _repeat: bool) -> void:
# Handle scene-specific setup (music, chest animation, etc.) # Handle scene-specific music
# Note: Chest animation is now handled by YouthRoom.prepare_scene_start()
match scene_id: match scene_id:
Scenes.id.YOUTH_CHILDHOOD: Scenes.id.YOUTH_CHILDHOOD:
play("childhood_music") play("childhood_music")
Scenes.id.YOUTH_VOICE_TRAINING: Scenes.id.YOUTH_VOICE_TRAINING:
play("voice_music") play("voice_music")
_play_chest_animation()
Scenes.id.YOUTH_JUI_JUTSU: Scenes.id.YOUTH_JUI_JUTSU:
play("jui_jutsu_music") play("jui_jutsu_music")
Scenes.id.YOUTH_DRAVEN: Scenes.id.YOUTH_DRAVEN:
@ -37,13 +37,6 @@ func _on_scene_finished(scene_id: Scenes.id, _repeat: bool) -> void:
queue("RESET") queue("RESET")
func _play_chest_animation() -> void:
# Navigate up to youth_room to trigger chest reveal animation
var room := State.room
if room and room.has_method("play_chest_reveal"):
room.play_chest_reveal()
func play(anim_name: StringName = "", a: float = -1, b: float = 1, c: bool = false) -> void: func play(anim_name: StringName = "", a: float = -1, b: float = 1, c: bool = false) -> void:
print_debug("YouthRoomScenePlayer.play(%s)" % anim_name) print_debug("YouthRoomScenePlayer.play(%s)" % anim_name)
super.play(anim_name, a, b, c) super.play(anim_name, a, b, c)

View File

@ -67,3 +67,9 @@ func prepare_transition():
func unload(): func unload():
pass pass
## Called before a scene starts to allow room-specific preparation (e.g., animations)
## Override in subclasses to add custom scene preparation logic
func prepare_scene_start(_scene_id: Scenes.id, _is_repeating: bool) -> void:
await get_tree().process_frame # Dummy wait for LSP warning otherwise

View File

@ -71,6 +71,7 @@ func collapse() -> void:
tween.parallel().tween_property(view, "scale", Vector3.ZERO, 0.3) tween.parallel().tween_property(view, "scale", Vector3.ZERO, 0.3)
tween.parallel().tween_property(frame, "modulate:a", 0, 0.5).set_trans(Tween.TRANS_QUAD) tween.parallel().tween_property(frame, "modulate:a", 0, 0.5).set_trans(Tween.TRANS_QUAD)
tween.parallel().tween_property(frame, "scale", Vector3.ONE * 2.0, 1.0).set_trans(Tween.TRANS_QUAD) tween.parallel().tween_property(frame, "scale", Vector3.ONE * 2.0, 1.0).set_trans(Tween.TRANS_QUAD)
await tween.finished
func _process(_delta: float) -> void: func _process(_delta: float) -> void:
_process_hover() _process_hover()
@ -99,6 +100,14 @@ func _input(event: InputEvent) -> void:
func play_story() -> void: func play_story() -> void:
collected = true collected = true
canvas_layer.show() canvas_layer.show()
# Check if this is a repeat playthrough
var is_repeating := Scenes.is_sequence_repeating(interaction_ui.scene_id)
# Allow room to prepare for scene (e.g., play animations)
if State.room and State.room.has_method("prepare_scene_start"):
await State.room.prepare_scene_start(interaction_ui.scene_id, is_repeating)
Scenes.begin_sequence(interaction_ui.scene_id) Scenes.begin_sequence(interaction_ui.scene_id)
# Play the story # Play the story
@ -130,8 +139,9 @@ func play_board() -> void:
func collect_memento() -> void: func collect_memento() -> void:
shown = false shown = false
Scenes.player_enable.emit(false)
await collapse()
collected = true collected = true
collapse()
# Hide mouse and collapse other interactables BEFORE showing canvas # Hide mouse and collapse other interactables BEFORE showing canvas
get_tree().call_group("interactables", "collapse") get_tree().call_group("interactables", "collapse")
@ -140,10 +150,14 @@ func collect_memento() -> void:
canvas_layer.show() canvas_layer.show()
if interaction_ui is StoryPlayable: if interaction_ui is StoryPlayable:
play_story() await play_story()
if interaction_ui is CardBoard: if interaction_ui is CardBoard:
play_board() await play_board()
canvas_layer.hide()
active = false
## Updates caption label based on the instantiated interaction_ui ## Updates caption label based on the instantiated interaction_ui
func _update_caption() -> void: func _update_caption() -> void: