2025-11-24 00:31:21 +08:00

136 lines
6.3 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using DG.Tweening;
using UnityEngine;
public class TurnManager : MonoBehaviour
{
// ======== serializeField ========
[SerializeField] private List<GameObject> playerCharacterGo; // 玩家队伍列表(应该传入5个角色), 暂时只传3个
[SerializeField] private int defaultHandCardNumber = 5; // 默认手牌数量
[SerializeField] private float cardDealDuration = 0.25f; // 系统发牌动画时间
[SerializeField] private float cardDragDuration = 0.25f; // 每张卡牌拖拽动画时间
[SerializeField] private float cardDropDuration = 0.25f; // 系统弃牌动画时间
[SerializeField] private Transform cardDeckContainer;
[SerializeField] private Transform cardHandContainer;
[SerializeField] private Transform characterContainer;
[SerializeField] private Transform dropCardContainer;
// ======== private ========
private TurnManagerSingleton turnManagerSingleton;
[SerializeField] private List<Card> cardDeckList; // 牌组
private readonly List<Card> cardPileList = new(); // 弃牌堆
private TurnManagerStateEnum turnManagerState; // 状态机
private TurnCharacterManager characterManager;
private TurnCardManager cardManager;
private TurnUIManager uiManager;
private TurnEnemyManager enemyManager;
public enum TurnManagerStateEnum
{
WAIT = 0,
SETUP_STATE = 1,
START_SELF_TURN = 2,
STAY_SELF_TURN = 3,
END_SELF_TURN = 4,
START_ENEMY_TURN = 5,
END_ENEMY_TURN = 6
}
private void Start()
{
turnManagerSingleton = TurnManagerSingleton.Instance;
cardManager = GetComponent<TurnCardManager>();
characterManager = GetComponent<TurnCharacterManager>();
uiManager = GetComponent<TurnUIManager>();
enemyManager = GetComponent<TurnEnemyManager>();
TurnManagerEvent.OnTurnManagerStaySelfTurn += TurnManagerStaySelfTurn;
TurnManagerEvent.OnTurnManagerEndSelfTurn += TurnManagerEndSelfTurn;
TurnManagerEvent.OnTurnManagerEnterEnemyTurn += TurnManagerEnterEnemyTurn;
TurnManagerEvent.OnTurnManagerExitEnemyTurn += TurnManagerEndEnemyTurn;
SetupTurnManager();
}
public TurnManagerStateEnum GetTurnManagerState() => turnManagerState;
private void SetupTurnManager() // 进入设置状态
{
turnManagerState = TurnManagerStateEnum.SETUP_STATE;
if (turnManagerSingleton.GetNeedDebugLog()) turnManagerSingleton.PrintMsg("TurnManager", "状态切换", "进入设置状态");
cardDeckList?.Clear();
cardPileList?.Clear();
characterManager.SetupCharacterManager(playerCharacterGo, cardDeckContainer, characterContainer);
cardDeckList = characterManager.RenderCharacterSpriteReturnCardList();
cardManager.SetupCardManager(cardDealDuration, cardHandContainer, cardDragDuration, cardDropDuration);
// cardManager.PlayAnimationShuffleCardToDeck(cardDealDuration);
TurnManagerEnterSelfTurn(6);
}
public Card TakeOutOneCard()
{
Card card = cardDeckList[UnityEngine.Random.Range(0, cardDeckList.Count)];
cardDeckList.Remove(card);
return card;
}
public void DropOutOneCard(Card card) => cardPileList.Add(card);
private bool GetNowTurnManagerIsTargetState(List<TurnManagerStateEnum> targetStateList)
{
if (targetStateList.Contains(GetTurnManagerState())) return true;
string errorMsg = "";
if (targetStateList.Count == 1)
errorMsg = $"[TurnManager][Error]: State Is [{GetTurnManagerState()}], Target Is [{targetStateList[0]}]";
if (targetStateList.Count == 2)
errorMsg = $"[TurnManager][Error]: State Is [{GetTurnManagerState()}], Target Is [{targetStateList[0]}, {targetStateList[1]}]";
if (errorMsg != "") Debug.LogError(errorMsg);
return false;
}
private void TurnManagerEnterSelfTurn(int cardNumber = 0) // 进入我方回合
{
if (!GetNowTurnManagerIsTargetState(new List<TurnManagerStateEnum>()
{ TurnManagerStateEnum.SETUP_STATE, TurnManagerStateEnum.END_ENEMY_TURN })) return;
if (turnManagerSingleton.GetNeedDebugLog()) turnManagerSingleton.PrintMsg("TurnManager", "状态切换", "进入我方回合");
turnManagerState = TurnManagerStateEnum.START_SELF_TURN;
cardManager.TakeCard(cardNumber);
}
private void TurnManagerStaySelfTurn() // 停留我方回合
{
if (!GetNowTurnManagerIsTargetState(new List<TurnManagerStateEnum>() { TurnManagerStateEnum.START_SELF_TURN })) return;
if (turnManagerSingleton.GetNeedDebugLog()) turnManagerSingleton.PrintMsg("TurnManager", "状态切换", "停留我方回合");
turnManagerState = TurnManagerStateEnum.STAY_SELF_TURN;
}
private void TurnManagerEndSelfTurn() // 结束我方回合
{
if (!GetNowTurnManagerIsTargetState(new List<TurnManagerStateEnum>() { TurnManagerStateEnum.STAY_SELF_TURN })) return;
if (!cardManager.GetCardManagerStateIsWait()) return;
if (turnManagerSingleton.GetNeedDebugLog()) turnManagerSingleton.PrintMsg("TurnManager", "状态切换", "结束我方回合");
turnManagerState = TurnManagerStateEnum.END_SELF_TURN;
cardManager.DropCardAllFromHand(dropCardContainer);
}
private void TurnManagerEnterEnemyTurn() // 进入对方回合
{
if (!GetNowTurnManagerIsTargetState(new List<TurnManagerStateEnum>() { TurnManagerStateEnum.END_SELF_TURN })) return;
if (turnManagerSingleton.GetNeedDebugLog()) turnManagerSingleton.PrintMsg("TurnManager", "状态切换", "进入对方回合");
turnManagerState = TurnManagerStateEnum.START_ENEMY_TURN;
uiManager.EnterEnemyTurn();
enemyManager.SetupEnemyManager();
enemyManager.SetDebugEnemyTurn();
}
private void TurnManagerEndEnemyTurn() // 结束对方回合
{
if (!GetNowTurnManagerIsTargetState(new List<TurnManagerStateEnum>() { TurnManagerStateEnum.START_ENEMY_TURN })) return;
if (turnManagerSingleton.GetNeedDebugLog()) turnManagerSingleton.PrintMsg("TurnManager", "状态切换", "结束对方回合");
turnManagerState = TurnManagerStateEnum.END_ENEMY_TURN;
uiManager.ExitEnemyTurn();
TurnManagerEnterSelfTurn(5);
}
}