diff --git a/src/base-environments/youth_room/interactive_sprite.gd b/src/base-environments/youth_room/interactive_sprite.gd index 3c84d06..85bf494 100644 --- a/src/base-environments/youth_room/interactive_sprite.gd +++ b/src/base-environments/youth_room/interactive_sprite.gd @@ -44,11 +44,9 @@ func _ready(): ui.canvas_layer = %CanvasLayer # Find and wire the StoryPlayable if not already set for child in %CanvasLayer.get_children(): - if child is StoryPlayable: - ui.story_playable = child + if child is Control: + ui.interaction_ui = child break - if child is CardBoard: - ui.is_board = true # Connect playback_finished to restore player control ui.playback_finished.connect(_on_playback_finished) diff --git a/src/base-environments/youth_room/youth_room.gd b/src/base-environments/youth_room/youth_room.gd index cc8b031..1f19eab 100644 --- a/src/base-environments/youth_room/youth_room.gd +++ b/src/base-environments/youth_room/youth_room.gd @@ -6,10 +6,12 @@ extends RoomTemplate @onready var board_trigger: InteractiveSprite = %MindBoard @onready var door_trigger: InteractiveSprite = %Door -@onready var card_board: CardBoard = %Board @onready var card_picker: CardPicker = %Picker @onready var ui: Control = %UI +# Is populated by child cardboard instead of onready. +var card_board: CardBoard + func start_room(): %UI.show() $logic/PlayerController.process_mode = Node.PROCESS_MODE_INHERIT @@ -30,10 +32,10 @@ func _play_intro_scene() -> void: Input.mouse_mode = Input.MOUSE_MODE_HIDDEN Input.mouse_mode = Input.MOUSE_MODE_VISIBLE - + # The intro scene is auto-played, not triggered by CollectableUi var intro: InteractiveSprite = $logic/CeilingMemento - + # Play the story (StoryPlayable handles its own visibility via animations) await intro.play_story() @@ -42,26 +44,29 @@ func _play_intro_scene() -> void: func get_ready(): + await get_tree().process_frame + pull_save_state(State.save_game) - card_board.initialise_from_save(save_game) card_board.board_completed.connect(func(): save_game.is_childhood_board_complete = true save_room()) - # Scene registration is now handled by youth_room_scene_player + card_picker.cards_picked.connect(card_board.populate_board) ui.hide() $sfx/distant_rain.play() $"sfx/rain on window".play() - self.show() + + await get_tree().process_frame func _ready(): + printt(_ready, name) super._ready() id = State.rooms.YOUTH Scenes.scene_finished.connect(_on_scene_finished) - card_picker.cards_picked.connect(card_board.populate_board) + func pull_save_state(save: SaveGame) -> void: diff --git a/src/base-environments/youth_room/youth_room.tscn b/src/base-environments/youth_room/youth_room.tscn index 7b2b3a6..ca7004b 100644 --- a/src/base-environments/youth_room/youth_room.tscn +++ b/src/base-environments/youth_room/youth_room.tscn @@ -1711,11 +1711,6 @@ unique_name_in_owner = true visible = false layout_mode = 1 -[node name="Board" parent="logic/UI" instance=ExtResource("4_gyjxx")] -unique_name_in_owner = true -visible = false -layout_mode = 1 - [node name="ending" parent="logic/UI" instance=ExtResource("5_kts6y")] visible = false layout_mode = 1 @@ -1900,6 +1895,7 @@ unique_name_in_owner = true transform = Transform3D(-4.3711374e-08, 0, 0.9999984, 0, 1, 0, -0.9999984, 0, -4.3711374e-08, -0.907206, 1.17661, 1.74337) visible = false interaction_ui = ExtResource("4_gyjxx") +is_board = true [node name="Door" parent="logic" instance=ExtResource("30_ypa88")] unique_name_in_owner = true diff --git a/src/logic-scenes/board/card-board.gd b/src/logic-scenes/board/card-board.gd index f35dc01..c4f8ccc 100644 --- a/src/logic-scenes/board/card-board.gd +++ b/src/logic-scenes/board/card-board.gd @@ -134,6 +134,9 @@ signal board_completed # Called when the node enters the scene tree for the first time. func _ready(): + print("Board Ready!", self, "room", State.room) + State.room.card_board = self + var size_reference := StickyNotePanel.new() dropzone_size = get_viewport_rect().size - Vector2(dropzone_padding + size_reference.minimum_size.x, dropzone_padding) diff --git a/src/logic-scenes/card_picker/card_picker.gd b/src/logic-scenes/card_picker/card_picker.gd index bf6461f..b0e3a44 100644 --- a/src/logic-scenes/card_picker/card_picker.gd +++ b/src/logic-scenes/card_picker/card_picker.gd @@ -241,6 +241,7 @@ func pick_cards(id: Scenes.id, repeat: bool): current_scene_id = id print_debug("Reached actor %s in sequence %s. Is%s repeating." % [name, Scenes.id.keys()[id], " not" if repeat else ""]) if not repeat: + hide() Input.mouse_mode = Input.MOUSE_MODE_VISIBLE fill_card_slots(id) reset() diff --git a/src/logic-scenes/collectable/collectable_ui.gd b/src/logic-scenes/collectable/collectable_ui.gd index e48d3de..47fe55e 100644 --- a/src/logic-scenes/collectable/collectable_ui.gd +++ b/src/logic-scenes/collectable/collectable_ui.gd @@ -15,7 +15,7 @@ signal scene_skipped(i: int) ## The StoryPlayable to play when this memento is collected. ## Auto-discovered from the owner's %CanvasLayer, or can be set manually. -var story_playable: StoryPlayable +var interaction_ui: Control @@ -199,14 +199,7 @@ func collect_memento() -> void: # Hide the collectable UI vanish() - # Check if we have a story_playable to play - if story_playable == null: - push_warning("CollectableUi for scene %s has no story_playable assigned" % Scenes.id.keys()[scene]) - if was_skipped: - scene_skipped.emit(-1) - is_collected = true - playback_finished.emit() - return + is_collected = true # Signal that a scene is starting (for music, etc.) Scenes.begin_sequence(scene) @@ -219,11 +212,12 @@ func collect_memento() -> void: canvas_layer.show() # Play the story - await story_playable.play() + await interaction_ui.play() - # Pick the cards - var picker := State.room.get_node("%Picker") as CardPicker - await picker.pick_cards(story_playable.scene_id, false) + if interaction_ui is StoryPlayable: + # Pick the cards + var picker := State.room.get_node("%Picker") as CardPicker + await picker.pick_cards(interaction_ui.scene_id, false) # Hide the CanvasLayer when done canvas_layer.hide() @@ -239,6 +233,6 @@ func collect_memento() -> void: is_collected = true get_viewport().gui_release_focus() - + # Signal that playback is finished so the InteractiveSprite can restore player control playback_finished.emit() diff --git a/src/logic-scenes/startup/startup_menu.gd b/src/logic-scenes/startup/startup_menu.gd index 05aa566..69e6092 100644 --- a/src/logic-scenes/startup/startup_menu.gd +++ b/src/logic-scenes/startup/startup_menu.gd @@ -88,11 +88,10 @@ func _on_allow_skipping_toggled(button_pressed): State.allow_skipping = button_pressed func hide(): - get_parent().get_child(0).get_ready() - var child_tween = create_tween() + var child_tween := create_tween() child_tween.tween_property($CenterContainer, "modulate", Color(1, 1, 1, 0), .5) await child_tween.finished - var self_tween = create_tween() + var self_tween := create_tween() self_tween.tween_property(self, "modulate", Color(1, 1, 1, 0), .5) await self_tween.finished self.visible = false diff --git a/src/singletons/main/main.gd b/src/singletons/main/main.gd index 4a24c39..9633d1a 100644 --- a/src/singletons/main/main.gd +++ b/src/singletons/main/main.gd @@ -91,8 +91,8 @@ func _load_room(next_path: String) -> bool: ResourceLoader.THREAD_LOAD_LOADED: var next_scene := ResourceLoader.load_threaded_get(youth_room_path) as PackedScene State.room = next_scene.instantiate() as RoomTemplate - await get_tree().process_frame get_tree().root.add_child(State.room) + await get_tree().process_frame await State.room.get_ready() %Loading.stop() await curtain.hide()