using System; using AppleHills.Core.Settings; using Core; using Input; using Interactions; using System.Threading.Tasks; using UnityEngine; namespace Levels { /// /// Handles level switching when interacted with. Applies switch data and triggers scene transitions. /// public class LevelSwitch : InteractableBase { public LevelSwitchData switchData; private SpriteRenderer iconRenderer; private IInteractionSettings interactionSettings; /// /// Unity Awake callback. Sets up icon, interactable, and event handlers. /// protected override void Awake() { base.Awake(); Debug.Log($"[LevelSwitch] Awake called for {gameObject.name} in scene {gameObject.scene.name}"); if (iconRenderer == null) iconRenderer = GetComponent(); // Initialize settings reference interactionSettings = GameManager.GetSettingsObject(); ApplySwitchData(); } protected override void OnManagedAwake() { Debug.Log($"[LevelSwitch] OnManagedAwake called for {gameObject.name}"); } protected override void OnSceneReady() { Debug.Log($"[LevelSwitch] OnSceneReady called for {gameObject.name}"); } #if UNITY_EDITOR /// /// Unity OnValidate callback. Ensures icon and data are up to date in editor. /// void OnValidate() { if (iconRenderer == null) iconRenderer = GetComponent(); ApplySwitchData(); } #endif /// /// Applies the switch data to the level switch (icon, name, etc). /// public void ApplySwitchData() { if (switchData != null) { if (iconRenderer != null) iconRenderer.sprite = switchData.mapSprite; gameObject.name = switchData.targetLevelSceneName; // Optionally update other fields, e.g. description } } /// /// Main interaction logic: Spawn menu and switch input mode. /// protected override bool DoInteraction() { if (switchData == null || string.IsNullOrEmpty(switchData.targetLevelSceneName)) { Debug.LogWarning("LevelSwitch has no valid switchData!"); return false; } var menuPrefab = interactionSettings?.LevelSwitchMenuPrefab; if (menuPrefab == null) { Debug.LogError("LevelSwitchMenu prefab not assigned in InteractionSettings!"); return false; } // Spawn the menu overlay var menuGo = Instantiate(menuPrefab); var menu = menuGo.GetComponent(); if (menu == null) { Debug.LogError("LevelSwitchMenu component missing on prefab!"); Destroy(menuGo); return false; } // Setup menu with data and callbacks menu.Setup(switchData, OnLevelSelectedWrapper, OnMinigameSelected, OnMenuCancel, OnRestartSelected); // Switch input mode to UI only InputManager.Instance.SetInputMode(InputMode.UI); return true; // Menu spawned successfully } private void OnLevelSelectedWrapper() { _ = OnLevelSelected(); } private async Task OnLevelSelected() { var progress = new Progress(p => Logging.Debug($"Loading progress: {p * 100:F0}%")); await SceneManagerService.Instance.SwitchSceneAsync(switchData.targetLevelSceneName, progress); } private async void OnMinigameSelected() { var progress = new Progress(p => Logging.Debug($"Loading progress: {p * 100:F0}%")); await SceneManagerService.Instance.SwitchSceneAsync(switchData.targetMinigameSceneName, progress); } private async void OnRestartSelected() { // TODO: Restart level here await OnLevelSelected(); } private void OnMenuCancel() { InputManager.Instance.SetInputMode(InputMode.GameAndUI); } } }