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 var current_row_setup: int = -1 var current_col_setup: int = -1 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 current_col = player.current_position.x # --- ROW LOGIC (Z/Y) --- # Zone 1 (Top): 0-4 # Zone 2 (Mid): 5-9 # Zone 3 (Bot): 10-13 # Initialize if needed if current_row_setup == -1: if current_row <= 4: current_row_setup = 0 elif current_row <= 9: current_row_setup = 1 else: current_row_setup = 2 # Row Hysteresis match current_row_setup: 0: # Top if current_row >= 6: current_row_setup = 1 # Move to Mid 1: # Mid if current_row <= 3: current_row_setup = 0 # Move to Top elif current_row >= 11: current_row_setup = 2 # Move to Bot 2: # Bot if current_row <= 8: current_row_setup = 1 # Move to Mid # --- COLUMN LOGIC (X) --- # Zone 1 (Left): 0-4 # Zone 2 (Center): 5-9 # Zone 3 (Right): 10-13 # Initialize if needed if current_col_setup == -1: if current_col <= 4: current_col_setup = 0 elif current_col <= 9: current_col_setup = 1 else: current_col_setup = 2 # Col Hysteresis match current_col_setup: 0: # Left if current_col >= 6: current_col_setup = 1 # Move to Center 1: # Center if current_col <= 3: current_col_setup = 0 # Move to Left elif current_col >= 11: current_col_setup = 2 # Move to Right 2: # Right if current_col <= 8: current_col_setup = 1 # Move to Center # --- TARGET CALCULATION --- var target_z = 0.0 var target_y = 0.0 var target_x = 7.0 # Apply Row Targets match current_row_setup: 0: # Top target_z = 15.0 target_y = 19.636 1: # Mid target_z = 19.0 target_y = 19.636 2: # Bot target_z = 22.5 target_y = 19.22636 # Apply Col Targets match current_col_setup: 0: # Left target_x = 5.0 1: # Center target_x = 7.0 2: # Right target_x = 9.0 var target_pos = Vector3(target_x, target_y, target_z) # Update Camera Position directly with Tween if camera.position != target_pos: var tween = create_tween() tween.tween_property(camera, "position", target_pos, 0.4).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN_OUT)