using System.Collections.Generic;
using UnityEngine;
///
/// 拆家版固定八卡组、四张手牌轮转管理器。
///
public class BattleDeckCycle : MonoBehaviour
{
public static BattleDeckCycle Instance { get; private set; }
[SerializeField] private Transform cardRoot;
[SerializeField] private int visibleSlotCount = 4;
[SerializeField] private string[] deckDataNames =
{
"人类士兵Data", "弓箭手Data", "盾卫Data", "精锐士兵Data",
"法师Data", "狂暴狼人Data", "石巨人Data", "弓箭猎人Data"
};
private readonly List deck = new List();
private readonly List hand = new List();
private readonly Queue drawQueue = new Queue();
private SummonCardButton[] buttons;
private void Awake()
{
if (Instance != null && Instance != this)
{
Destroy(gameObject);
return;
}
Instance = this;
BuildDeck();
}
private void Start()
{
if (cardRoot == null)
cardRoot = GameObject.Find("角色卡片")?.transform;
buttons = cardRoot != null
? cardRoot.GetComponentsInChildren(true)
: FindObjectsOfType(true);
System.Array.Sort(buttons, (a, b) => a.summonSlot.CompareTo(b.summonSlot));
HideExtraSlots();
hand.Clear();
drawQueue.Clear();
for (int i = 0; i < visibleSlotCount && i < deck.Count; i++)
hand.Add(deck[i]);
for (int i = visibleSlotCount; i < deck.Count; i++)
drawQueue.Enqueue(deck[i]);
RefreshAllCards();
}
public CharacterData GetCard(int slot)
{
int index = slot - 1;
return index >= 0 && index < hand.Count ? hand[index] : null;
}
public bool TryPlay(int slot)
{
CharacterData card = GetCard(slot);
if (card == null || card.unitPrefab == null || CastleSpawnManager.Instance == null)
return false;
if (!CastleSpawnManager.Instance.TrySpawn(card, 0))
return false;
int index = slot - 1;
CharacterData played = hand[index];
hand[index] = drawQueue.Dequeue();
drawQueue.Enqueue(played);
RefreshAllCards();
return true;
}
private void BuildDeck()
{
deck.Clear();
foreach (string dataName in deckDataNames)
{
CharacterData data = Resources.Load("Data/" + dataName);
if (data == null)
{
Debug.LogWarning($"卡组缺少角色数据: Resources/Data/{dataName}.asset");
continue;
}
deck.Add(data);
}
}
private void HideExtraSlots()
{
foreach (var button in buttons)
{
if (button != null && button.summonSlot > visibleSlotCount)
button.gameObject.SetActive(false);
}
}
private void RefreshAllCards()
{
if (buttons == null) return;
foreach (var button in buttons)
{
if (button == null || button.summonSlot > visibleSlotCount) continue;
button.SetDeckCharacter(GetCard(button.summonSlot));
}
}
}