using System.Collections; using Core; using Input; using Items; using Minigames.TrashMaze.Core; using Minigames.TrashMaze.Data; using Unity.Cinemachine; using UnityEngine; namespace Minigames.TrashMaze.Objects { /// /// Trash Maze specific controller switch that transitions FROM Pulver back TO Trafalgar (maze exit). /// Handles camera blend back to gameplay view and re-enables follower mode. /// public class TrashMazeSwitchToTrafalgar : ControllerSwitchItem { [Header("Trash Maze - To Trafalgar Settings")] [Tooltip("Camera state to blend to (Gameplay camera)")] [SerializeField] private TrashMazeCameraState targetCameraState = TrashMazeCameraState.Gameplay; protected override IEnumerator SwitchControllerSequence() { _isSwitching = true; // Step 1: Get controllers var currentController = InputManager.Instance.GetActiveController(); var targetController = InputManager.Instance.GetController("trafalgar"); if (currentController == null || targetController == null) { Debug.LogError($"[TrashMazeSwitchToTrafalgar] Failed to get controllers!"); _isSwitching = false; yield break; } GameObject currentGameObject = (currentController as MonoBehaviour)?.gameObject; GameObject targetGameObject = (targetController as MonoBehaviour)?.gameObject; Logging.Debug($"[TrashMazeSwitchToTrafalgar] Switching from Pulver to {targetGameObject?.name}"); // Step 2: Deactivate current controller (Pulver) DeactivateCurrentController(currentController, currentGameObject); // Explicitly deactivate PulverController to ensure it stops receiving input if (currentGameObject != null) { var pulverController = currentGameObject.GetComponent(); if (pulverController != null) { pulverController.DeactivateController(); Logging.Debug("[TrashMazeSwitchToTrafalgar] Explicitly deactivated PulverController"); } } // Step 3: Start camera blend back to gameplay StartCameraBlend(); // Step 4: Wait for camera blend to complete yield return WaitForCameraBlend(); // Step 5: Unset Pulver as tracking target and set Trafalgar for gameplay camera SetTrafalgarAsTrackingTarget(targetGameObject); // Step 6: Activate Pulver's follower mode (so it follows Trafalgar) if (currentGameObject != null) { var pulverFollower = currentGameObject.GetComponent(); if (pulverFollower != null) { pulverFollower.ActivateFollower(); } } // Step 7: Activate Trafalgar controller if (targetController is BasePlayerMovementController targetPlayerController) { targetPlayerController.ActivateController(); } // Step 8: Switch InputManager to Trafalgar controller bool switchSuccess = InputManager.Instance.SwitchToController("trafalgar"); if (switchSuccess) { Logging.Debug($"[TrashMazeSwitchToTrafalgar] Successfully switched to Trafalgar controller"); OnCharacterSwitch.Invoke(); } else { Debug.LogError($"[TrashMazeSwitchToTrafalgar] Failed to switch to Trafalgar controller"); } // Step 8: Mark as used if one-time use if (isOneTime) { DisableVisual(); } _isSwitching = false; } private void StartCameraBlend() { if (TrashMazeCameraController.Instance != null) { Logging.Debug($"[TrashMazeSwitchToTrafalgar] Starting camera blend to {targetCameraState}"); if (targetCameraState == TrashMazeCameraState.Gameplay) { TrashMazeCameraController.Instance.SwitchToGameplay(); } else { Logging.Warning($"[TrashMazeSwitchToTrafalgar] Unexpected camera state: {targetCameraState}"); } } else { Debug.LogError("[TrashMazeSwitchToTrafalgar] TrashMazeCameraController instance not found!"); } } private IEnumerator WaitForCameraBlend() { CinemachineBrain brain = Camera.main?.GetComponent(); if (brain != null) { // Wait until blend is complete while (brain.IsBlending) { yield return null; } Logging.Debug("[TrashMazeSwitchToTrafalgar] Camera blend completed"); } else { // Fallback: wait a brief moment yield return new WaitForSeconds(0.5f); } } private void SetTrafalgarAsTrackingTarget(GameObject trafalgarGameObject) { if (TrashMazeCameraController.Instance != null) { // Clear maze camera tracking target var mazeCamera = TrashMazeCameraController.Instance.GetMazeCamera(); if (mazeCamera != null) { mazeCamera.Follow = null; mazeCamera.LookAt = null; Logging.Debug($"[TrashMazeSwitchToTrafalgar] Cleared Pulver as tracking target from maze camera"); } // Set Trafalgar as tracking target for gameplay camera if (trafalgarGameObject != null) { var gameplayCamera = TrashMazeCameraController.Instance.GetGameplayCamera(); if (gameplayCamera != null) { gameplayCamera.Follow = trafalgarGameObject.transform; gameplayCamera.LookAt = trafalgarGameObject.transform; Logging.Debug($"[TrashMazeSwitchToTrafalgar] Set Trafalgar as tracking target for gameplay camera"); } } } } #if UNITY_EDITOR private void OnValidate() { name = "TrashMazeSwitch_ToTrafalgar"; } #endif } }