summaryrefslogtreecommitdiffstats
path: root/transition_manager.gd
diff options
context:
space:
mode:
authorJan Tuomi <jan@jantuomi.fi>2025-11-21 13:11:52 +0200
committerJan Tuomi <jan@jantuomi.fi>2025-11-21 13:11:52 +0200
commit7b44fcc1ef95fdfcc6723f8e6a594012764a8cab (patch)
tree3e6a81960e26be5ed9185f3d94f54886a153645a /transition_manager.gd
parent1018d3f39ada7aca726fbed2befb5550549ba3cb (diff)
Separate TransitionManager from Top
Diffstat (limited to 'transition_manager.gd')
-rw-r--r--transition_manager.gd55
1 files changed, 55 insertions, 0 deletions
diff --git a/transition_manager.gd b/transition_manager.gd
new file mode 100644
index 0000000..d9a4a09
--- /dev/null
+++ b/transition_manager.gd
@@ -0,0 +1,55 @@
+class_name TransitionManager
+extends CanvasLayer
+
+@onready var top: Top = get_tree().root.get_node("Top")
+
+var _transition_room: Node
+var _transition_door_name: Variant # String or null
+
+func room_transition(from_door: Door, to_room_path: String, door_name: Variant):
+ # Do not transition if there is already a transition in process
+ if _transition_room != null:
+ #print_debug("Tried to transition to ", room_name, " but a transition was already in process")
+ return
+
+ if from_door:
+ var player: Player = top.get_node("ActiveRoom").find_child("Player")
+ player.set_forced_input(from_door.enter_towards)
+
+ # Start animation
+ # The animation calls _change_room at a specific time
+ $AnimationPlayer.play("room_trans_start")
+
+ var room = ResourceLoader.load(to_room_path)
+ _transition_room = room.instantiate()
+ _transition_door_name = door_name
+
+func _transition_start():
+ #print_debug("_transition_start")
+
+ # If the room hasn't loaded yet, loop until it is
+ while _transition_room == null:
+ await get_tree().create_timer(0.1).timeout
+
+ top.replace_active_room(_transition_room, _on_room_changed)
+
+func _on_room_changed():
+ #print_debug("_on_room_changed")
+ var room = top.get_node("ActiveRoom")
+ var player: Player = room.find_child("Player")
+ if _transition_door_name:
+ var door: Door = room.find_child(_transition_door_name)
+ player.position = door.position
+ player.set_forced_input(door.exit_towards)
+
+ $AnimationPlayer.play("room_trans_end")
+
+func _transition_end():
+ #print_debug("_transition_end")
+ _transition_room = null
+ _transition_door_name = null
+
+ var room = top.get_node("ActiveRoom")
+ var player: Player = room.find_child("Player")
+ if player:
+ player.set_forced_input(null)