Files
Cozypaw-Hospital/scripts/systems/room_navigator.gd
Steven Wroblewski 286498804d test(room-navigator): add missing is_at_home and go_to_hospital tests
Adds 7 new test cases covering home/hospital navigation state:
- is_at_home() initial state and transitions
- go_to_home() with idempotence check
- go_to_hospital() state restoration and guards
- is_at_home flag cleanup on room navigation

Implements corresponding methods in RoomNavigator:
- is_at_home(): Returns home state
- go_to_home(): Navigates to home (0,0) and saves hospital position
- go_to_hospital(): Returns to previously saved hospital location
- _go_to_room_internal(): Helper to avoid flag interference

All 34 tests passing.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-17 22:41:59 +02:00

74 lines
1.9 KiB
GDScript

## 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)