diff --git a/scripts/systems/room_navigator.gd b/scripts/systems/room_navigator.gd index e8f900c..f567ea5 100644 --- a/scripts/systems/room_navigator.gd +++ b/scripts/systems/room_navigator.gd @@ -1,18 +1,21 @@ -## RoomNavigator — autoload that moves the Camera2D smoothly between hospital floors and rooms. +## RoomNavigator — autoload that moves the Camera2D smoothly between hospital floors, rooms, and the home/garden area. extends Node signal room_changed(floor_index: int, room_index: int) +signal home_entered() +signal hospital_entered() const FLOOR_HEIGHT: float = 720.0 const ROOM_WIDTH: float = 1280.0 +const HOME_CAMERA_X: float = 640.0 +const HOME_CAMERA_Y: float = 1080.0 const CAMERA_TWEEN_DURATION: float = 0.6 var _current_floor: int = 0 var _current_room: int = 0 -var _camera: Camera2D var _is_at_home: bool = false -var _last_hospital_floor: int = 0 -var _last_hospital_room: int = 0 +var _camera: Camera2D +var _active_tween: Tween func initialize(camera: Camera2D) -> void: @@ -24,25 +27,54 @@ func go_to_floor(floor_index: int) -> void: func go_to_room(floor_index: int, room_index: int) -> void: - _go_to_room_internal(floor_index, room_index, true) - - -func _go_to_room_internal(floor_index: int, room_index: int, clear_home_flag: bool) -> void: - if clear_home_flag: - _is_at_home = false if _camera == null: return - if floor_index == _current_floor and room_index == _current_room: + if not _is_at_home and floor_index == _current_floor and room_index == _current_room: return + _is_at_home = false _current_floor = floor_index _current_room = room_index var target_x: float = room_index * ROOM_WIDTH + ROOM_WIDTH * 0.5 var target_y: float = floor_index * -FLOOR_HEIGHT + FLOOR_HEIGHT * 0.5 - var tween: Tween = create_tween() - tween.set_ease(Tween.EASE_IN_OUT) - tween.set_trans(Tween.TRANS_SINE) - tween.tween_property(_camera, "position", Vector2(target_x, target_y), CAMERA_TWEEN_DURATION) - tween.finished.connect(func() -> void: room_changed.emit(floor_index, room_index)) + if _active_tween != null: + _active_tween.kill() + _active_tween = create_tween() + _active_tween.set_ease(Tween.EASE_IN_OUT) + _active_tween.set_trans(Tween.TRANS_SINE) + _active_tween.tween_property(_camera, "position", Vector2(target_x, target_y), CAMERA_TWEEN_DURATION) + _active_tween.finished.connect(func() -> void: room_changed.emit(floor_index, room_index)) + + +func go_to_home() -> void: + if _camera == null: + return + if _is_at_home: + return + _is_at_home = true + if _active_tween != null: + _active_tween.kill() + _active_tween = create_tween() + _active_tween.set_ease(Tween.EASE_IN_OUT) + _active_tween.set_trans(Tween.TRANS_SINE) + _active_tween.tween_property(_camera, "position", Vector2(HOME_CAMERA_X, HOME_CAMERA_Y), CAMERA_TWEEN_DURATION) + _active_tween.finished.connect(func() -> void: home_entered.emit()) + + +func go_to_hospital() -> void: + if _camera == null: + return + if not _is_at_home: + return + _is_at_home = false + var target_x: float = _current_room * ROOM_WIDTH + ROOM_WIDTH * 0.5 + var target_y: float = _current_floor * -FLOOR_HEIGHT + FLOOR_HEIGHT * 0.5 + if _active_tween != null: + _active_tween.kill() + _active_tween = create_tween() + _active_tween.set_ease(Tween.EASE_IN_OUT) + _active_tween.set_trans(Tween.TRANS_SINE) + _active_tween.tween_property(_camera, "position", Vector2(target_x, target_y), CAMERA_TWEEN_DURATION) + _active_tween.finished.connect(func() -> void: hospital_entered.emit()) func get_current_floor() -> int: @@ -55,19 +87,3 @@ func get_current_room() -> int: func is_at_home() -> bool: return _is_at_home - - -func go_to_home() -> void: - if _is_at_home: - return - _last_hospital_floor = _current_floor - _last_hospital_room = _current_room - _is_at_home = true - _go_to_room_internal(0, 0, false) - - -func go_to_hospital() -> void: - if not _is_at_home: - return - _is_at_home = false - go_to_room(_last_hospital_floor, _last_hospital_room)