## RoomNavigator — autoload that moves the Camera2D smoothly between hospital floors and rooms. extends Node signal room_changed(floor_index: int, room_index: int) const FLOOR_HEIGHT: float = 720.0 const ROOM_WIDTH: float = 1280.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 func initialize(camera: Camera2D) -> void: _camera = camera func go_to_floor(floor_index: int) -> void: go_to_room(floor_index, 0) 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: return _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)) func get_current_floor() -> int: return _current_floor func get_current_room() -> int: return _current_room 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)