diff --git a/Assets/Scripts/Minigames/DivingForPictures/DivingGameManager.cs b/Assets/Scripts/Minigames/DivingForPictures/DivingGameManager.cs index 1f989e44..d97285b4 100644 --- a/Assets/Scripts/Minigames/DivingForPictures/DivingGameManager.cs +++ b/Assets/Scripts/Minigames/DivingForPictures/DivingGameManager.cs @@ -293,13 +293,13 @@ namespace Minigames.DivingForPictures if (isGameOver) return; isGameOver = true; - Debug.Log("[DivingGameManager] Game Over! All ropes broken."); + Debug.Log("[DivingGameManager] Game Over! All ropes broken. Starting surfacing sequence..."); // Fire game over event OnGameOver?.Invoke(); - // Call the existing end game method - EndGame(); + // Start surfacing instead of directly ending the game + StartSurfacing(); } /// @@ -378,6 +378,50 @@ namespace Minigames.DivingForPictures tileSpawner.OnVelocityFactorChanged(_currentVelocityFactor); } + // Handle the Rock object - disable components and animate it falling offscreen + GameObject rockObject = GameObject.FindGameObjectWithTag("Rock"); + if (rockObject != null) + { + // Disable all components except Transform on the rock object (not its children) + foreach (Component component in rockObject.GetComponents()) + { + if (!(component is Transform)) + { + if (component is Behaviour behaviour) + { + behaviour.enabled = false; + } + } + } + + // Start coroutine to animate the rock falling offscreen + StartCoroutine(MoveRockOffscreen(rockObject.transform)); + + Debug.Log("[DivingGameManager] Disabled rock components and animating it offscreen"); + } + + // Handle the Player object - disable components and reset X position + GameObject playerObject = GameObject.FindGameObjectWithTag("Player"); + if (playerObject != null) + { + // Disable all components except Transform and Animator on the player object (not its children) + foreach (Component component in playerObject.GetComponents()) + { + if (!(component is Transform) && !(component is Animator)) + { + if (component is Behaviour behaviour) + { + behaviour.enabled = false; + } + } + } + + // Start coroutine to reset X position to 0 over 1 second + StartCoroutine(ResetPlayerPosition(playerObject.transform)); + + Debug.Log("[DivingGameManager] Disabled player components (keeping Animator) and resetting position"); + } + // 3. Find bubble spawner and slow down existing bubbles (no velocity management needed) BubbleSpawner bubbleSpawner = FindFirstObjectByType(); if (bubbleSpawner != null) @@ -410,6 +454,71 @@ namespace Minigames.DivingForPictures Debug.Log($"[DivingGameManager] Started surfacing with target velocity factor: {targetVelocityFactor}"); } + /// + /// Coroutine to animate the rock falling below the screen + /// + private IEnumerator MoveRockOffscreen(Transform rockTransform) + { + Vector3 startPosition = rockTransform.position; + + // Calculate position below the screen + Camera mainCamera = Camera.main; + if (mainCamera == null) + { + Debug.LogWarning("[DivingGameManager] Cannot find main camera to calculate offscreen position"); + yield break; + } + + // Get a position below the bottom of the screen + Vector3 offscreenPosition = mainCamera.ViewportToWorldPoint(new Vector3(0.5f, -0.2f, mainCamera.nearClipPlane)); + Vector3 targetPosition = new Vector3(startPosition.x, offscreenPosition.y, startPosition.z); + + float duration = 2.0f; // Animation duration in seconds + float elapsed = 0f; + + while (elapsed < duration) + { + elapsed += Time.deltaTime; + float t = Mathf.Clamp01(elapsed / duration); + + // Use an easing function that accelerates to simulate falling + float easedT = t * t; // Quadratic easing + + rockTransform.position = Vector3.Lerp(startPosition, targetPosition, easedT); + yield return null; + } + + // Ensure final position is exactly at target + rockTransform.position = targetPosition; + } + + /// + /// Coroutine to reset the player's X position to 0 over time + /// + private IEnumerator ResetPlayerPosition(Transform playerTransform) + { + Vector3 startPosition = playerTransform.position; + Vector3 targetPosition = new Vector3(0f, startPosition.y, startPosition.z); + + float duration = 1.0f; // Reset duration in seconds (as requested) + float elapsed = 0f; + + while (elapsed < duration) + { + elapsed += Time.deltaTime; + float t = Mathf.Clamp01(elapsed / duration); + + // Use smooth step for more natural movement + float smoothT = Mathf.SmoothStep(0f, 1f, t); + + playerTransform.position = Vector3.Lerp(startPosition, targetPosition, smoothT); + yield return null; + } + + // Ensure final position is exactly at target + playerTransform.position = targetPosition; + } + /// /// Coroutine to handle the surfacing sequence timing ///