Files
tekton/scripts/managers/camera_context_manager.gd
T

76 lines
2.4 KiB
GDScript

extends Node
# CameraContextManager
# Handles camera position based on player's row on the board.
# var screen_shake_manager: Node # Removed
var camera: Camera3D
var player: Node3D
# Configuration Map: Row Threshold -> Target Position
# We use a list of dictionaries to define ranges.
# Setup A: Rows 0-5
# Setup B: Rows 6-9
# Setup C: Rows 10+
var camera_setups = [
{ "max_row": 5, "position": Vector3(7.0, 19.636, 15.0) },
{ "max_row": 9, "position": Vector3(7.0, 19.636, 19.0) },
{ "max_row": 999, "position": Vector3(7.0, 19.22636, 22.5) } # Default/Bottom
]
var unique_id: int
func initialize(p_camera: Camera3D, _p_shake_manager: Node):
camera = p_camera
# screen_shake_manager = p_shake_manager
print("[CameraContextManager] Initialized with camera")
func set_player(p_player: Node3D):
player = p_player
unique_id = p_player.name.to_int()
# Try to get movement manager (might be initializing)
var movement_mgr = player.get("movement_manager")
if not movement_mgr and player.get("movement_manager") == null:
# Try direct access if script variable
movement_mgr = player.movement_manager
if movement_mgr:
if not movement_mgr.movement_finished.is_connected(_on_player_moved):
movement_mgr.movement_finished.connect(_on_player_moved)
else:
print("[CameraContextManager] Warning: movement_manager not found on player. Retrying in 0.5s...")
await get_tree().create_timer(0.5).timeout
if player == p_player: # Ensure player hasn't changed
set_player(p_player) # Retry
_update_camera_target()
func _on_player_moved():
# print("[CameraContextManager] Player moved signal received")
_update_camera_target()
func _update_camera_target():
if not player or not camera:
return
# Get player row (Z coordinate in 3D world / Y in GridMap)
# In this game: Grid Y maps to World Z.
# Player current_position is Vector2i(grid_x, grid_y)
var current_row = player.current_position.y
var target_pos = Vector3.ZERO
for i in range(camera_setups.size()):
var setup = camera_setups[i]
if current_row <= setup.max_row:
target_pos = setup.position
break
# print("[CameraContextManager] Player Row: %d -> Selected Setup: %d (Target: %s)" % [current_row, setup_index, target_pos])
# Update ScreenShakeManager's target
# Update Camera Position directly with Tween
if camera.position != target_pos:
var tween = create_tween()
tween.tween_property(camera, "position", target_pos, 1.0).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN_OUT)