fix(room-navigator): sync implementation with Sprint 14 canonical version
This commit is contained in:
@@ -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
|
extends Node
|
||||||
|
|
||||||
signal room_changed(floor_index: int, room_index: int)
|
signal room_changed(floor_index: int, room_index: int)
|
||||||
|
signal home_entered()
|
||||||
|
signal hospital_entered()
|
||||||
|
|
||||||
const FLOOR_HEIGHT: float = 720.0
|
const FLOOR_HEIGHT: float = 720.0
|
||||||
const ROOM_WIDTH: float = 1280.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
|
const CAMERA_TWEEN_DURATION: float = 0.6
|
||||||
|
|
||||||
var _current_floor: int = 0
|
var _current_floor: int = 0
|
||||||
var _current_room: int = 0
|
var _current_room: int = 0
|
||||||
var _camera: Camera2D
|
|
||||||
var _is_at_home: bool = false
|
var _is_at_home: bool = false
|
||||||
var _last_hospital_floor: int = 0
|
var _camera: Camera2D
|
||||||
var _last_hospital_room: int = 0
|
var _active_tween: Tween
|
||||||
|
|
||||||
|
|
||||||
func initialize(camera: Camera2D) -> void:
|
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:
|
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:
|
if _camera == null:
|
||||||
return
|
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
|
return
|
||||||
|
_is_at_home = false
|
||||||
_current_floor = floor_index
|
_current_floor = floor_index
|
||||||
_current_room = room_index
|
_current_room = room_index
|
||||||
var target_x: float = room_index * ROOM_WIDTH + ROOM_WIDTH * 0.5
|
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 target_y: float = floor_index * -FLOOR_HEIGHT + FLOOR_HEIGHT * 0.5
|
||||||
var tween: Tween = create_tween()
|
if _active_tween != null:
|
||||||
tween.set_ease(Tween.EASE_IN_OUT)
|
_active_tween.kill()
|
||||||
tween.set_trans(Tween.TRANS_SINE)
|
_active_tween = create_tween()
|
||||||
tween.tween_property(_camera, "position", Vector2(target_x, target_y), CAMERA_TWEEN_DURATION)
|
_active_tween.set_ease(Tween.EASE_IN_OUT)
|
||||||
tween.finished.connect(func() -> void: room_changed.emit(floor_index, room_index))
|
_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:
|
func get_current_floor() -> int:
|
||||||
@@ -55,19 +87,3 @@ func get_current_room() -> int:
|
|||||||
|
|
||||||
func is_at_home() -> bool:
|
func is_at_home() -> bool:
|
||||||
return _is_at_home
|
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)
|
|
||||||
|
|||||||
Reference in New Issue
Block a user