using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using TMPro;
///
/// CashSystemCharacterSelection - Handles 3v3 team selection for Cash System mode.
/// User can select any/all team members, or let the game auto-fill.
/// Uses existing CharacterSelection data - no duplication.
///
public class CashSystemCharacterSelection : MonoBehaviour
{
[Header("Team Slots - Assign the button GameObjects (3.1, 3.2, 3.3)")]
[SerializeField] private Button[] teamSlotButtons; // All 3 slot buttons
[Header("Slot UI Components - Arrays aligned with teamSlotButtons")]
[SerializeField] private Image[] slotImages; // Character images for each slot
[SerializeField] private GameObject[] slotAddIcons; // "+" icons for each slot
[SerializeField] private TextMeshProUGUI[] slotTexts; // Text labels
[Header("Confirm Button")]
[SerializeField] private Button confirmButton;
[Header("References - Use existing systems")]
[SerializeField] private ModeSelection modeSelection;
// Available characters - matches CharacterSelection order
private readonly string[] allCharacters = { "Windham", "Amira", "Bahman", "Ziggy", "Amon", "Imani" };
// Team selection state
private string[] playerTeam = new string[3];
private string[] enemyTeam = new string[3];
private int currentSlotSelecting = -1; // Which slot is currently being selected
private int captainIndex = 0; // First selected becomes captain
private bool captainChosen = false;
private void OnEnable()
{
// Only activate for Cash System mode
if (SelectionOptions.Instance == null || !SelectionOptions.Instance.isCashSystemSelected)
{
return;
}
// Only reset if we haven't started selecting yet
// Don't reset if we're returning from character selection with a character chosen
if (!captainChosen && string.IsNullOrEmpty(playerTeam[0]))
{
Debug.Log("[CashSystemCharacterSelection] Initializing 3v3 selection (first time)");
ResetSelection();
}
else
{
Debug.Log("[CashSystemCharacterSelection] Returning to 3v3 selection (preserving state)");
}
}
///
/// Reset all slots to initial state (show add icons, hide character images)
///
public void ResetSelection()
{
captainChosen = false;
captainIndex = 0;
playerTeam = new string[3];
enemyTeam = new string[3];
currentSlotSelecting = -1;
// Reset all slots
for (int i = 0; i < 3; i++)
{
if (i < slotImages.Length && slotImages[i] != null)
slotImages[i].gameObject.SetActive(false);
if (i < slotAddIcons.Length && slotAddIcons[i] != null)
slotAddIcons[i].SetActive(true);
if (i < slotTexts.Length && slotTexts[i] != null)
slotTexts[i].text = i == 0 ? "CAPTAIN" : "TEAMMATE";
}
// Disable confirm until at least captain is selected
if (confirmButton != null) confirmButton.interactable = false;
}
///
/// Called when ANY slot button is clicked - opens character selection for that slot
///
public void OnSlotClicked(int slotIndex)
{
if (slotIndex < 0 || slotIndex >= 3) return;
Debug.Log($"[CashSystemCharacterSelection] Slot {slotIndex + 1} clicked - opening character selection");
currentSlotSelecting = slotIndex;
// Navigate to character selection screen using existing ModeSelection
if (modeSelection != null && modeSelection.selectionScreen != null)
{
// Hide 3v3 graphic temporarily
modeSelection.graphic3v3.SetActive(false);
// Hide mode selection screen (parent screen that may be covering)
if (modeSelection.modeSelectionScreen != null)
{
modeSelection.modeSelectionScreen.SetActive(false);
}
// Show character selection screen
modeSelection.selectionScreen.SetActive(true);
// Add listeners using existing system
if (modeSelection.CharacterSelectionScript != null)
{
var charSelect = modeSelection.CharacterSelectionScript;
if (charSelect.selectCharacterButton != null)
{
charSelect.selectCharacterButton.onClick.AddListener(modeSelection.onSelectionScreenSelectClick);
}
if (charSelect.backButton != null)
{
charSelect.backButton.onClick.AddListener(OnCharacterSelectionBack);
}
// Select first character button
if (charSelect.buttons != null && charSelect.buttons.Length > 0)
{
charSelect.buttons[0].Select();
}
}
}
}
// Convenience methods for button OnClick - call OnSlotClicked with correct index
public void OnSlot1Clicked() => OnSlotClicked(0);
public void OnSlot2Clicked() => OnSlotClicked(1);
public void OnSlot3Clicked() => OnSlotClicked(2);
///
/// Called when a character is selected from the character selection screen
///
public void OnCharacterSelected(string characterName)
{
Debug.Log($"[CashSystemCharacterSelection] OnCharacterSelected called with: {characterName}, currentSlotSelecting: {currentSlotSelecting}");
if (currentSlotSelecting < 0 || currentSlotSelecting >= 3)
{
Debug.LogWarning("[CashSystemCharacterSelection] No slot was being selected!");
return;
}
// Check if character is already selected in another slot
for (int i = 0; i < playerTeam.Length; i++)
{
if (playerTeam[i] == characterName && i != currentSlotSelecting)
{
Debug.LogWarning($"[CashSystemCharacterSelection] {characterName} already selected in slot {i + 1}");
// Could show a warning UI here
return;
}
}
Debug.Log($"[CashSystemCharacterSelection] Slot {currentSlotSelecting + 1} selected: {characterName}");
// Set the character for this slot
playerTeam[currentSlotSelecting] = characterName;
// First selection becomes captain - auto-fill other slots immediately
if (!captainChosen)
{
captainIndex = currentSlotSelecting;
captainChosen = true;
Debug.Log($"[CashSystemCharacterSelection] Captain set to slot {captainIndex + 1}");
// Auto-fill other slots immediately after captain selection
AutoFillEmptySlots();
}
// Update slot UI - use existing CharacterSelection sprites
Debug.Log($"[CashSystemCharacterSelection] Calling UpdateSlotUI for slot {currentSlotSelecting}");
UpdateSlotUI(currentSlotSelecting, characterName);
// Enable confirm button since at least captain is selected
if (confirmButton != null) confirmButton.interactable = true;
int slotThatWasSelected = currentSlotSelecting;
currentSlotSelecting = -1;
Debug.Log($"[CashSystemCharacterSelection] Character selection complete for slot {slotThatWasSelected + 1}");
}
///
/// Update a slot's UI with the selected character - uses existing CharacterSelection data
///
private void UpdateSlotUI(int slotIndex, string characterName)
{
Debug.Log($"[CashSystemCharacterSelection] UpdateSlotUI - slotIndex: {slotIndex}, characterName: {characterName}");
if (slotIndex < 0 || slotIndex >= 3) return;
// Hide add icon
if (slotIndex < slotAddIcons.Length && slotAddIcons[slotIndex] != null)
{
slotAddIcons[slotIndex].SetActive(false);
Debug.Log($"[CashSystemCharacterSelection] Hidden add icon for slot {slotIndex + 1}");
}
else
{
Debug.LogWarning($"[CashSystemCharacterSelection] slotAddIcons not assigned for index {slotIndex}");
}
// Show and set character image - get from existing CharacterSelection
if (slotIndex < slotImages.Length && slotImages[slotIndex] != null)
{
slotImages[slotIndex].gameObject.SetActive(true);
// Get sprite from CharacterSelection
Sprite characterSprite = GetCharacterSprite(characterName);
if (characterSprite != null)
{
slotImages[slotIndex].sprite = characterSprite;
Debug.Log($"[CashSystemCharacterSelection] Set sprite for slot {slotIndex + 1}: {characterSprite.name}");
}
else
{
Debug.LogWarning($"[CashSystemCharacterSelection] Could not find sprite for {characterName}");
}
}
else
{
Debug.LogWarning($"[CashSystemCharacterSelection] slotImages not assigned for index {slotIndex}. Array length: {slotImages?.Length ?? 0}");
}
// Update text
if (slotIndex < slotTexts.Length && slotTexts[slotIndex] != null)
{
string label = characterName.ToUpper();
if (slotIndex == captainIndex)
{
label += " ★"; // Mark captain
}
slotTexts[slotIndex].text = label;
Debug.Log($"[CashSystemCharacterSelection] Set text for slot {slotIndex + 1}: {label}");
}
else
{
Debug.LogWarning($"[CashSystemCharacterSelection] slotTexts not assigned for index {slotIndex}");
}
}
///
/// Get character sprite from existing CharacterSelection - no duplication
///
private Sprite GetCharacterSprite(string characterName)
{
if (modeSelection == null || modeSelection.CharacterSelectionScript == null)
return null;
var charSelect = modeSelection.CharacterSelectionScript;
// Find character index
for (int i = 0; i < charSelect.characterNames.Length; i++)
{
if (charSelect.characterNames[i].Equals(characterName, System.StringComparison.OrdinalIgnoreCase))
{
if (i < charSelect.characterImages.Length)
{
return charSelect.characterImages[i];
}
break;
}
}
return null;
}
///
/// Called when back is pressed in character selection
///
private void OnCharacterSelectionBack()
{
currentSlotSelecting = -1;
if (modeSelection != null)
{
// Hide selection screen
modeSelection.selectionScreen.SetActive(false);
// Show mode selection screen again
if (modeSelection.modeSelectionScreen != null)
{
modeSelection.modeSelectionScreen.SetActive(true);
}
// Show 3v3 graphic again
modeSelection.graphic3v3.SetActive(true);
// Remove listeners
if (modeSelection.CharacterSelectionScript != null)
{
var charSelect = modeSelection.CharacterSelectionScript;
charSelect.selectCharacterButton.onClick.RemoveListener(modeSelection.onSelectionScreenSelectClick);
charSelect.backButton.onClick.RemoveListener(OnCharacterSelectionBack);
}
// Select the slot that was being edited
if (teamSlotButtons != null && teamSlotButtons.Length > 0)
{
teamSlotButtons[0].Select();
}
}
}
///
/// Called when Confirm button is clicked - auto-fill empty slots and start game
///
public void OnConfirmClicked()
{
Debug.Log("[CashSystemCharacterSelection] OnConfirmClicked called!");
if (!captainChosen)
{
Debug.LogWarning("[CashSystemCharacterSelection] Cannot confirm - no captain selected!");
return;
}
// Auto-fill any empty slots with random characters (should already be filled)
AutoFillEmptySlots();
// Generate enemy team
GenerateEnemyTeam();
Debug.Log($"[CashSystemCharacterSelection] Final Player Team: {string.Join(", ", playerTeam)}");
Debug.Log($"[CashSystemCharacterSelection] Final Enemy Team: {string.Join(", ", enemyTeam)}");
Debug.Log($"[CashSystemCharacterSelection] Captain Index: {captainIndex}");
// Save team data to SelectionOptions
if (SelectionOptions.Instance != null)
{
SelectionOptions.Instance.playerTeam = playerTeam;
SelectionOptions.Instance.enemyTeam = enemyTeam;
SelectionOptions.Instance.captainIndex = captainIndex;
SelectionOptions.Instance.currentControlledIndex = captainIndex;
// Store portrait sprites so the Game scene can display them
SelectionOptions.Instance.playerTeamSprites = new Sprite[3];
SelectionOptions.Instance.enemyTeamSprites = new Sprite[3];
for (int i = 0; i < 3; i++)
{
SelectionOptions.Instance.playerTeamSprites[i] = GetCharacterSprite(playerTeam[i]);
SelectionOptions.Instance.enemyTeamSprites[i] = GetCharacterSprite(enemyTeam[i]);
}
Debug.Log("[CashSystemCharacterSelection] Saved team data + sprites to SelectionOptions");
}
else
{
Debug.LogError("[CashSystemCharacterSelection] SelectionOptions.Instance is null!");
}
// Set game mode
if (SelectionOptions.Instance != null)
{
SelectionOptions.Instance.isCashSystemSelected = true;
Debug.Log("[CashSystemCharacterSelection] Set isCashSystemSelected = true");
}
if (GameManager.Instance != null)
{
GameManager.Instance.currentGameMode = GameMode.CashSystem;
Debug.Log("[CashSystemCharacterSelection] Set game mode to CashSystem");
}
else
{
Debug.LogWarning("[CashSystemCharacterSelection] GameManager.Instance is null!");
}
// Load game scene
Debug.Log("[CashSystemCharacterSelection] Loading Game scene...");
SceneManager.LoadScene("Game");
}
///
/// Auto-fill any empty player team slots with random available characters
///
private void AutoFillEmptySlots()
{
// Get list of available characters (not already selected)
var available = new System.Collections.Generic.List(allCharacters);
foreach (string selected in playerTeam)
{
if (!string.IsNullOrEmpty(selected))
{
available.Remove(selected);
}
}
// Shuffle available
for (int i = available.Count - 1; i > 0; i--)
{
int j = Random.Range(0, i + 1);
string temp = available[i];
available[i] = available[j];
available[j] = temp;
}
// Fill empty slots
int availableIndex = 0;
for (int i = 0; i < playerTeam.Length; i++)
{
if (string.IsNullOrEmpty(playerTeam[i]) && availableIndex < available.Count)
{
playerTeam[i] = available[availableIndex];
UpdateSlotUI(i, playerTeam[i]);
availableIndex++;
Debug.Log($"[CashSystemCharacterSelection] Auto-filled slot {i + 1} with {playerTeam[i]}");
}
}
}
///
/// Generate enemy team from remaining characters
///
private void GenerateEnemyTeam()
{
// Get characters not in player team
var available = new System.Collections.Generic.List(allCharacters);
foreach (string selected in playerTeam)
{
available.Remove(selected);
}
// Shuffle and assign
for (int i = available.Count - 1; i > 0; i--)
{
int j = Random.Range(0, i + 1);
string temp = available[i];
available[i] = available[j];
available[j] = temp;
}
for (int i = 0; i < enemyTeam.Length && i < available.Count; i++)
{
enemyTeam[i] = available[i];
}
}
///
/// Called when Back button in 3v3 screen is clicked
///
public void OnBackClicked()
{
ResetSelection();
SelectionOptions.Instance.isCashSystemSelected = false;
// Navigate back to mode selection
if (modeSelection != null)
{
modeSelection.graphic3v3.SetActive(false);
// Return to home or mode selection
}
}
}