using UnityEngine; using UnityEngine.UI; using UnityEngine.SceneManagement; // (Removed unused generics import after legacy multi-select removal) using UnityEngine.EventSystems; using TMPro; public class ModeSelectionManager : MonoBehaviour { public TMP_Text selectedModesText; // Displays current selected high-level mode (e.g., Practice / Coming Soon) public HomeSrceen homescreen; // Legacy per-dimension buttons (kept if other systems still reference them, but no longer selected by user directly) public Button one; // 1v1 public Button kill; // Kill condition public Button ai; // AI opponent // Flags still used by downstream logic public bool is1v1Selected; public bool isKillSelected; public bool isTimeSelected; public bool isFreeSelected; public bool isPlayerSelected; public bool isAISelected; public GameObject Mobile_LocalPopUp; // Still available if later needed for Local mode (not used in Practice path) // New single-mode buttons (current design: only one top-level choice). [Header("Single Mode Buttons (New Design)")] public Button practiceModeButton; // Combines 1v1 + Kill + AI public Button cashModeButton; // Locked (coming soon) public Button tournamentModeButton; // Locked (coming soon) [Header("Locked Mode Popup (Optional)")] public GameObject lockedModePopup; // Simple popup to show "Coming Soon" (assign in inspector) public TMP_Text lockedModeMessage; // Text element inside the popup private enum GameMode { None, Practice, Cash, Tournament } private GameMode currentMode = GameMode.None; [Header("Visual Settings")] public Color normalColor = Color.white; // Base color for unselected buttons public Color selectedColor = new Color(0.25f, 0.85f, 0.25f); // Color when a mode is actually chosen public Color lockedColor = new Color(0.6f, 0.6f, 0.6f); // Optional tint for locked modes (not permanent) public bool tintLockedModes = false; // Toggle to visually differentiate locked buttons [Tooltip("If true, navigation focus (arrow / gamepad) will not recolor buttons until a mode is clicked.")] public bool ignoreFocusColor = true; private void OnEnable() { // Do not auto-select any mode; wait for user interaction. currentMode = GameMode.None; if (selectedModesText != null) selectedModesText.text = "Select Mode"; ConfigureNavigation(); SetInitialFocus(); UpdateModeVisuals(); } // ---------------------- SINGLE-SELECTION API ---------------------- // // Player picks ONE high-level mode. Practice maps internally to (1v1 + Kill + AI). public void SelectPracticeMode() { currentMode = GameMode.Practice; // Emulate having chosen 1v1, kill, AI is1v1Selected = true; isKillSelected = true; SelectionOptions.Instance.isKillSelected = true; SelectionOptions.Instance.isTimeSelected = false; isAISelected = true; SelectionOptions.Instance.isAISelected = true; SelectionOptions.Instance.isPlayerSelected = false; isTimeSelected = false; isPlayerSelected = false; isFreeSelected = false; selectedModesText.text = "Mode: Practice"; UpdateModeVisuals(); } public void SelectCashMode() { currentMode = GameMode.Cash; // Set Cash System flags is1v1Selected = false; isKillSelected = false; isTimeSelected = true; // Cash System uses timer isAISelected = true; isPlayerSelected = false; isFreeSelected = false; // Set SelectionOptions flags SelectionOptions.Instance.isCashSystemSelected = true; SelectionOptions.Instance.isTimeSelected = true; SelectionOptions.Instance.isAISelected = true; SelectionOptions.Instance.isPlayerSelected = false; selectedModesText.text = "Mode: Cash System"; UpdateModeVisuals(); } public void SelectTournamentMode() { ShowLockedMode(GameMode.Tournament, "Tournament Mode is coming soon."); UpdateModeVisuals(); } private void ShowLockedMode(GameMode mode, string message) { if (lockedModePopup != null) { lockedModePopup.SetActive(true); if (lockedModeMessage != null) lockedModeMessage.text = message; } // Do not change currentMode if locked; user must select an available one (Practice). // Optionally still highlight the button briefly; keeping current stable behavior by not switching. } private void SetButtonColor(Button btn, Color c) { if (btn == null) return; var img = btn.GetComponent(); if (img != null) img.color = c; } private void UpdateModeVisuals() { // Reset all to normal first SetButtonColor(practiceModeButton, normalColor); SetButtonColor(cashModeButton, tintLockedModes ? lockedColor : normalColor); SetButtonColor(tournamentModeButton, tintLockedModes ? lockedColor : normalColor); switch (currentMode) { case GameMode.Practice: SetButtonColor(practiceModeButton, selectedColor); break; case GameMode.Cash: SetButtonColor(cashModeButton, selectedColor); break; } } private void SetInitialFocus() { // Give keyboard/controller a starting focus without selecting a mode. if (EventSystem.current != null) { if (practiceModeButton != null) EventSystem.current.SetSelectedGameObject(practiceModeButton.gameObject); else if (cashModeButton != null) EventSystem.current.SetSelectedGameObject(cashModeButton.gameObject); } } private void ConfigureNavigation() { // Ensure the three buttons navigate horizontally (or vertically) between each other. ConfigureButtonNavigation(practiceModeButton, cashModeButton, tournamentModeButton); ConfigureButtonNavigation(cashModeButton, tournamentModeButton, practiceModeButton); ConfigureButtonNavigation(tournamentModeButton, practiceModeButton, cashModeButton); } private void ConfigureButtonNavigation(Button current, Button next, Button prev) { if (current == null) return; var nav = current.navigation; nav.mode = Navigation.Mode.Explicit; nav.selectOnRight = next; // or Down for vertical layouts nav.selectOnLeft = prev; // or Up for vertical layouts current.navigation = nav; } // ---------------------------------------------------------------------- // // (Removed legacy multi-select helper methods) public void OnConfirm() { // Block confirmation if no mode chosen if (currentMode == GameMode.None) { // Provide soft feedback; rely on existing locked popup if assigned. if (lockedModePopup != null && !lockedModePopup.activeSelf) { lockedModePopup.SetActive(true); if (lockedModeMessage != null) lockedModeMessage.text = "Please select a mode."; } return; } if (currentMode == GameMode.Practice) { LaunchPracticeMode(); return; } // Cash System mode launch if (currentMode == GameMode.Cash) { LaunchCashSystemMode(); return; } // Tournament mode still locked if (currentMode == GameMode.Tournament) { if (lockedModePopup != null && !lockedModePopup.activeSelf) { lockedModePopup.SetActive(true); if (lockedModeMessage != null) lockedModeMessage.text = "Tournament mode is coming soon."; } return; } } private void LaunchCashSystemMode() { Debug.Log("[ModeSelectionManager] Launching Cash System Mode"); // Cash System = team selection, timer mode, AI opponents SelectionOptions.Instance.isCashSystemSelected = true; SelectionOptions.Instance.isTimeSelected = true; SelectionOptions.Instance.isAISelected = true; SelectionOptions.Instance.isPlayerSelected = false; SelectionOptions.Instance.isKillSelected = false; // Navigate to character selection for Cash System - use 3v3 graphic gameObject.SetActive(false); // Hide other graphics and show 3v3 homescreen.modeSelectionScript.graphic1v1.SetActive(false); homescreen.modeSelectionScript.graphic1v1ai.SetActive(false); homescreen.modeSelectionScript.graphic2v2.SetActive(false); homescreen.modeSelectionScript.graphic3v3.SetActive(true); // Select first button in 3v3 mode if (homescreen.modeSelectionScript.playerButtons3v3 != null && homescreen.modeSelectionScript.playerButtons3v3.Length > 0) { homescreen.modeSelectionScript.playerButtons3v3[0].Select(); } homescreen.ActivateScreen(homescreen.modeScreen); // Configure navigation for 3v3 confirm button if available if (homescreen.modeSelectionScript.confirmButton != null && homescreen.modeSelectionScript.playerButtons3v3 != null && homescreen.modeSelectionScript.playerButtons3v3.Length > 0) { Navigation navigation = homescreen.modeSelectionScript.confirmButton.navigation; navigation.mode = Navigation.Mode.Explicit; navigation.selectOnUp = homescreen.modeSelectionScript.playerButtons3v3[homescreen.modeSelectionScript.playerButtons3v3.Length - 1]; homescreen.modeSelectionScript.confirmButton.navigation = navigation; } } private void LaunchPracticeMode() { // Practice = 1v1 + Kill + AI branch (reuse existing logic block for that combination) // Ensure flags are coherent (some external code may depend on them after confirm). is1v1Selected = true; isKillSelected = true; SelectionOptions.Instance.isKillSelected = true; SelectionOptions.Instance.isTimeSelected = false; isAISelected = true; SelectionOptions.Instance.isAISelected = true; SelectionOptions.Instance.isPlayerSelected = false; isTimeSelected = false; isPlayerSelected = false; isFreeSelected = false; // Reuse the existing AI + 1v1 + Kill flow (mirrors legacy condition block) gameObject.SetActive(false); homescreen.modeSelectionScript.graphic1v1ai.SetActive(true); homescreen.modeSelectionScript.graphic1v1.SetActive(false); homescreen.modeSelectionScript.SelectFirstAIButton(); homescreen.ActivateScreen(homescreen.modeScreen); // Configure navigation (copied from legacy block for AI path) Navigation navigation = homescreen.modeSelectionScript.confirmButtonAI.navigation; navigation.mode = Navigation.Mode.Explicit; navigation.selectOnUp = homescreen.modeSelectionScript.playerButtons1v1ai[1]; homescreen.modeSelectionScript.confirmButtonAI.navigation = navigation; } public void BackButton() { gameObject.SetActive(false); homescreen.primaryButton.Select(); homescreen.ActivateScreen(homescreen.gameObject); } }