using System.Collections.Generic; using System.Linq; using TMPro; using UnityEngine; using UnityEngine.UI; public class PvPModePopup : PopupBase { [Header("Buttons")] [SerializeField] private Button twoPlayerBtn; [SerializeField] private Button threePlayerBtn; [SerializeField] private Button fourPlayerBtn; [SerializeField] private Button switchBtn; [SerializeField] private Button playBtn; [SerializeField] private Button closeBtn; [Header("Input Field")] [SerializeField] private TMP_InputField playerOneNameInput; [SerializeField] private TMP_InputField playerTwoNameInput; [SerializeField] private TMP_InputField playerThreeNameInput; [SerializeField] private TMP_InputField playerFourNameInput; [Header("References")] [SerializeField] private GameObject playerNameInputParent1; [SerializeField] private GameObject playerNameInputParent2; [Header("Placeholders")] [SerializeField] private TMP_Text playerOnePlaceholder; [SerializeField] private TMP_Text playerTwoPlaceholder; [SerializeField] private TMP_Text playerThreePlaceholder; [SerializeField] private TMP_Text playerFourPlaceholder; [SerializeField] private List inputFields = new List(); [Header("Player Names")] private string playerOneName; private string playerTwoName; private string playerThreeName; private string playerFourName; private ScreenManager screenManager; private SoundManager soundManager; private GameModeHandler gameModeHandler; private int selectedPlayerCount; public int SelectedPlayerCount => selectedPlayerCount; [Header("Horizontal Rows (P1–P4)")] private int hiddenIndex = 0; private List hiddenIndexes = new List(); private Dictionary playerNameMap = new(); private void OnEnable() { twoPlayerBtn.onClick.AddListener(OnClick_TwoPlayerBtn); threePlayerBtn.onClick.AddListener(OnClick_ThreePlayerBtn); fourPlayerBtn.onClick.AddListener(OnClick_FourPlayerBtn); playBtn.onClick.AddListener(OnClick_PlayButton); closeBtn.onClick.AddListener(OnClick_CloseButton); switchBtn.onClick.AddListener(OnClick_SwitchButton); } private void Start() { OnClick_FourPlayerBtn(); } private void OnDisable() { twoPlayerBtn.onClick.RemoveListener(OnClick_TwoPlayerBtn); threePlayerBtn.onClick.RemoveListener(OnClick_ThreePlayerBtn); fourPlayerBtn.onClick.RemoveAllListeners(); playBtn.onClick.RemoveListener(OnClick_PlayButton); closeBtn.onClick.RemoveListener(OnClick_CloseButton); switchBtn.onClick.RemoveListener(OnClick_SwitchButton); } private void OnClick_TwoPlayerBtn() { selectedPlayerCount = 2; OnPlayerCountsSwitched(); switchBtn.gameObject.SetActive(true); playerNameInputParent2.SetActive(false); } private void OnClick_ThreePlayerBtn() { selectedPlayerCount = 3; OnPlayerCountsSwitched(); switchBtn.gameObject.SetActive(true); playerNameInputParent1.SetActive(true); playerNameInputParent2.SetActive(true); UpdateInputFieldsVisibility(); } private void OnClick_FourPlayerBtn() { selectedPlayerCount = 4; switchBtn.gameObject.SetActive(false); playerNameInputParent1.SetActive(true); playerNameInputParent2.SetActive(true); UpdateInputFieldsVisibility(); } private void UpdateInputFieldsVisibility() { playerOneNameInput.transform.parent.gameObject.SetActive(true); playerTwoNameInput.transform.parent.gameObject.SetActive(selectedPlayerCount >= 3); playerThreeNameInput.transform.parent.gameObject.SetActive(selectedPlayerCount >= 2); playerFourNameInput.transform.parent.gameObject.SetActive(selectedPlayerCount >= 4); } private void OnClick_PlayButton() { playerNameMap.Clear(); for (int idx = 0; idx < inputFields.Count; idx++) { PlayerType playerType = (PlayerType)idx; if (!inputFields[idx].transform.parent.gameObject.activeInHierarchy) { continue; } playerNameMap.Add(playerType, string.IsNullOrWhiteSpace(inputFields[idx].text) ? $"{playerType}" : inputFields[idx].text); } playerOneName = playerNameMap.GetValueOrDefault(PlayerType.Player1, Ludo_3D_Constants.Player1_Name); playerTwoName = playerNameMap.GetValueOrDefault(PlayerType.Player2, Ludo_3D_Constants.Player2_Name); playerThreeName = playerNameMap.GetValueOrDefault(PlayerType.Player3, Ludo_3D_Constants.Player3_Name); playerFourName = playerNameMap.GetValueOrDefault(PlayerType.Player4, Ludo_3D_Constants.Player4_Name); soundManager = soundManager == null ? InterfaceManager.Instance?.GetInterfaceInstance() : soundManager; soundManager?.PlayGameSoundClip(SoundType.ButtonClick); Debug.Log($"Starting PVP Mode with {selectedPlayerCount} players:"); popupManager.HidePopup(popupType); gameModeHandler = gameModeHandler == null ? InterfaceManager.Instance.GetInterfaceInstance() : gameModeHandler; gameModeHandler.InitPVPModeData(playerNameMap.Keys.ToList(), playerNameMap.Values.ToList()); } private void OnClick_SwitchButton() { hiddenIndexes.Clear(); if (SelectedPlayerCount == 2) { if (playerNameInputParent1.activeInHierarchy) { playerNameInputParent1.SetActive(false); playerNameInputParent2.SetActive(true); playerOnePlaceholder.text = "Player 1"; playerThreePlaceholder.text = "Player 2"; hiddenIndexes.Add((int)PlayerType.Player1); hiddenIndexes.Add((int)PlayerType.Player3); } else { playerNameInputParent1.SetActive(true); playerNameInputParent2.SetActive(false); playerTwoPlaceholder.text = "Player 1"; playerFourPlaceholder.text = "Player 2"; hiddenIndexes.Add((int)PlayerType.Player2); hiddenIndexes.Add((int)PlayerType.Player4); } } else if (SelectedPlayerCount == 3) { hiddenIndex = (hiddenIndex + 1) % inputFields.Count; hiddenIndexes.Add(hiddenIndex); } UpdateRows(); } private void OnPlayerCountsSwitched() { hiddenIndexes.Clear(); if (SelectedPlayerCount == 2) { if (playerNameInputParent1.activeInHierarchy) { playerOnePlaceholder.text = "Player 1"; playerThreePlaceholder.text = "Player 2"; hiddenIndexes.Add((int)PlayerType.Player2); hiddenIndexes.Add((int)PlayerType.Player4); } else if (playerNameInputParent2.activeInHierarchy) { playerTwoPlaceholder.text = "Player 1"; playerFourPlaceholder.text = "Player 2"; hiddenIndexes.Add((int)PlayerType.Player1); hiddenIndexes.Add((int)PlayerType.Player3); } } else if (SelectedPlayerCount == 3) { hiddenIndex = (hiddenIndex + 1) % inputFields.Count; hiddenIndexes.Add(hiddenIndex); } UpdateRows(); } private void UpdateRows() { int visiblePlayerIndex = 1; for (int i = 0; i < inputFields.Count; i++) { bool isHidden = hiddenIndexes.Contains(i); inputFields[i].transform.parent.gameObject.SetActive(!isHidden); if (!isHidden) { TMP_Text placeholder = inputFields[i].placeholder as TMP_Text; if (placeholder != null) { placeholder.text = $"Player {visiblePlayerIndex}"; visiblePlayerIndex++; } } } } private void OnClick_CloseButton() { screenManager = screenManager == null ? InterfaceManager.Instance?.GetInterfaceInstance() : screenManager; screenManager.ShowScreen(ScreenType.MenuScreen); soundManager = soundManager == null ? InterfaceManager.Instance?.GetInterfaceInstance() : soundManager; soundManager?.PlayGameSoundClip(SoundType.ButtonClick); Hide(); } }