extends Node # ScreenShakeManager - Handles camera shake effects for impact feedback var camera: Camera3D var shake_intensity: float = 0.0 var shake_duration: float = 0.0 var shake_timer: float = 0.0 var original_position: Vector3 # Shake presets const SHAKE_TARGETED: Dictionary = {"intensity": 0.15, "duration": 0.4} const SHAKE_GOAL_COMPLETE: Dictionary = {"intensity": 0.1, "duration": 0.3} const SHAKE_LIGHT: Dictionary = {"intensity": 0.05, "duration": 0.2} func initialize(p_camera: Camera3D): """Initialize with specific camera instance.""" camera = p_camera if camera: original_position = camera.position print("[ScreenShakeManager] Initialized with camera: ", camera.name) else: push_warning("[ScreenShakeManager] Initialized with null camera") func _process(delta): if shake_timer > 0: shake_timer -= delta if camera: var shake_offset = Vector3( randf_range(-shake_intensity, shake_intensity), randf_range(-shake_intensity, shake_intensity), randf_range(-shake_intensity * 0.5, shake_intensity * 0.5) ) camera.position = original_position + shake_offset if shake_timer <= 0: _reset_camera() func _reset_camera(): if camera: camera.position = original_position shake_timer = 0.0 shake_intensity = 0.0 func shake(intensity: float, duration: float): """Trigger camera shake with given intensity and duration.""" if not camera: push_warning("Screen shake requested but no camera assigned!") return if camera: # If already shaking, reset camera first to get true original position if shake_timer > 0: camera.position = original_position else: original_position = camera.position shake_intensity = intensity shake_duration = duration shake_timer = duration func shake_targeted(): """Called when local player is targeted by opponent's powerup.""" shake(SHAKE_TARGETED.intensity, SHAKE_TARGETED.duration) func shake_goal_complete(): """Called when local player completes a goal.""" shake(SHAKE_GOAL_COMPLETE.intensity, SHAKE_GOAL_COMPLETE.duration) func shake_light(): """Light shake for minor events.""" shake(SHAKE_LIGHT.intensity, SHAKE_LIGHT.duration)