From d2ae5ada0ed874a10a4f68ea8bd82ffa8a5e48c0 Mon Sep 17 00:00:00 2001 From: Yogi Wiguna Date: Wed, 11 Feb 2026 16:52:27 +0800 Subject: [PATCH] feat: Add dynamic camera context manager, initial main scene setup with gridmap and UI, and player script. --- scenes/main.tscn | 2 +- scenes/player.gd | 14 +--- scripts/managers/camera_context_manager.gd | 83 +++++++++++++++++++--- 3 files changed, 76 insertions(+), 23 deletions(-) diff --git a/scenes/main.tscn b/scenes/main.tscn index 596f4b8..0977cc2 100644 --- a/scenes/main.tscn +++ b/scenes/main.tscn @@ -106,7 +106,7 @@ current = true fov = 35.5 [node name="Camera3D200" type="Camera3D" parent="." unique_id=1763366951] -transform = Transform3D(1, 0, 0, 0, 0.5077037, 0.86153173, 0, -0.86153173, 0.5077037, 7, 19.636, 22.5) +transform = Transform3D(1, 0, 0, 0, 0.5077037, 0.86153173, 0, -0.86153173, 0.5077037, 9, 19.636, 22.5) environment = ExtResource("4_ky38j") current = true fov = 21.0 diff --git a/scenes/player.gd b/scenes/player.gd index 89135d2..87f110b 100644 --- a/scenes/player.gd +++ b/scenes/player.gd @@ -463,18 +463,8 @@ func sync_special_animation() -> void: @rpc("any_peer", "call_local", "reliable") func trigger_screen_shake(shake_type: String) -> void: - """Trigger screen shake effect. Called via RPC when targeted or completing goals.""" - var main = get_tree().get_root().get_node_or_null("Main") - if main: - var screen_shake_manager = main.get_node_or_null("ScreenShakeManager") - if screen_shake_manager: - match shake_type: - "targeted": - screen_shake_manager.shake_targeted() - "goal": - screen_shake_manager.shake_goal_complete() - _: - screen_shake_manager.shake_light() + # Shake disabled by user request. Camera movement now handled by CameraContextManager. + pass # Add function to check if position is at finish line func is_at_finish_line() -> bool: diff --git a/scripts/managers/camera_context_manager.gd b/scripts/managers/camera_context_manager.gd index 6fc7bba..0e2ad99 100644 --- a/scripts/managers/camera_context_manager.gd +++ b/scripts/managers/camera_context_manager.gd @@ -19,6 +19,8 @@ var camera_setups = [ ] 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 @@ -58,18 +60,79 @@ func _update_camera_target(): # Player current_position is Vector2i(grid_x, grid_y) var current_row = player.current_position.y - var target_pos = Vector3.ZERO + var current_col = player.current_position.x - for i in range(camera_setups.size()): - var setup = camera_setups[i] - if current_row <= setup.max_row: - target_pos = setup.position - break + # --- 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) - # 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) + tween.tween_property(camera, "position", target_pos, 0.4).set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN_OUT)