using System.Collections; using Core; using Interactions; using Minigames.TrashMaze.Core; using Minigames.TrashMaze.Data; using UnityEngine; namespace Minigames.TrashMaze.Objects { /// /// Maze exit interactable that teleports Pulver out of the maze. /// Uses camera blend with midway teleportation to create seamless transition. /// Does NOT switch controllers - Pulver remains player-controlled. /// public class MazeExit : SaveableInteractable { [Header("Maze Exit Settings")] [Tooltip("Transform where Pulver should be teleported to (maze exit position)")] [SerializeField] private Transform teleportTarget; [Tooltip("Camera state to blend to (typically PulverGameplay)")] [SerializeField] private TrashMazeCameraState targetCameraState = TrashMazeCameraState.PulverGameplay; public override string SaveId => $"{gameObject.scene.name}/MazeExit/{gameObject.name}"; protected override object GetSerializableState() { // MazeExit doesn't need to save state - it's a simple trigger return null; } protected override void ApplySerializableState(string state) { // MazeExit doesn't need to restore state } protected override bool DoInteraction() { Logging.Debug("[MazeExit] Starting maze exit sequence"); StartCoroutine(ExitMazeSequence()); return true; } private IEnumerator ExitMazeSequence() { // Step 1: Find Pulver (should be the active player-controlled character) var pulverController = FindFirstObjectByType(); if (pulverController == null) { Debug.LogError("[MazeExit] PulverController not found in scene!"); yield break; } GameObject pulverGameObject = pulverController.gameObject; Logging.Debug($"[MazeExit] Found Pulver at {pulverGameObject.transform.position}"); // Step 2: Start camera blend to target state (PulverGameplay) TeleportationHelper.StartCameraBlend(targetCameraState); // Step 3: Wait for halfway through blend, teleport Pulver, and set tracking target yield return TeleportationHelper.TeleportMidBlendAndSetTracking(pulverGameObject, teleportTarget, targetCameraState); // Step 4: Wait for camera blend to complete yield return TeleportationHelper.WaitForCameraBlend(); // Step 5: Stop Pulver movement to prevent it from continuing with cached input if (pulverController != null) { pulverController.InterruptMoveTo(); Logging.Debug("[MazeExit] Stopped Pulver movement after teleportation"); } Logging.Debug("[MazeExit] Maze exit sequence completed"); } #if UNITY_EDITOR private void OnValidate() { name = "MazeExit"; // Default to PulverGameplay camera if (targetCameraState == TrashMazeCameraState.Gameplay) { targetCameraState = TrashMazeCameraState.PulverGameplay; } } #endif } }