using System.Collections; using System.Collections.Generic; using UnityEngine; using FSEvent; using FSRole; using FSCard; using FSAssist; // 战场相关 namespace FSBattle { // 战场回合状态 public enum BattleFieldRound { BATTLE_FIELD_READY_GAME = 0X0010001, // 游戏准备 BATTLE_FIELD_DRAW_CARDS = 0X0010002, // 抽牌 BATTLE_FIELD_ENEMY_DEAL = 0X0010003, // 敌方出牌 BATTLE_FIELD_PLAYER_DEAL = 0X0010004, // 我方出牌 BATTLE_FIELD_COMPAIRE_CARDS = 0X0010005, // 比牌 BATTLE_FIELD_MAKE_UP_CARDS = 0X0010006, // 补牌 BATTLE_FIELD_PLAYER_PLAY_A_HAND = 0X0010007, // 玩家出牌 BATTLE_FIELD_ENEMY_ACTION = 0X0010008, // 敌人行动 BATTLE_FIELD_ROUND_END = 0X0010009, // 回合结束 } // 战场组件 public class BattleField : MonoBehaviour { // 记录战场状态 private BattleFieldRound round = BattleFieldRound.BATTLE_FIELD_READY_GAME; public GameObject cardPrefab; public Transform cachePlace; // Use this for initialization void Start() { InitEvent(); Invoke("BattleStart", 1.0f); } // Update is called once per frame void Update() { } private void OnDestroy() { RemoveEvent(); } /* * 注册事件 */ private void InitEvent() { EventListener.Instance.RegisterEvent(EventEnum.EVENT_ENTER_COMPAIRE_CARD_ROUND, EnterCompaireRound); EventListener.Instance.RegisterEvent(EventEnum.EVENT_ENTER_ENEMY_DEAL_ROUND, EnterEnemyDealRound); EventListener.Instance.RegisterEvent(EventEnum.EVENT_ENTER_PLAYER_DEAL_ROUND, EnterPlayerDealRound); EventListener.Instance.RegisterEvent(EventEnum.EVENT_ENTER_PLAY_A_HAND_ROUND, EnterPlayAHandRound); EventListener.Instance.RegisterEvent(EventEnum.EVENT_ERASE_CARD, EraseCard); } /* * 移除事件 */ private void RemoveEvent() { EventListener.Instance.RemoveEvent(EventEnum.EVENT_ENTER_COMPAIRE_CARD_ROUND); EventListener.Instance.RemoveEvent(EventEnum.EVENT_ENEMY_DEAL_CARD); EventListener.Instance.RemoveEvent(EventEnum.EVENT_ENTER_PLAYER_DEAL_ROUND); EventListener.Instance.RemoveEvent(EventEnum.EVENT_ENTER_PLAY_A_HAND_ROUND); EventListener.Instance.RemoveEvent(EventEnum.EVENT_ERASE_CARD); } /* * 战场开始 */ private void BattleStart() { ReadyHandle(); } /* * 进入下一个回合 */ public void NextRound() { // 回合循环转化 switch (round) { case BattleFieldRound.BATTLE_FIELD_READY_GAME: round = BattleFieldRound.BATTLE_FIELD_DRAW_CARDS; // 推送玩家抽牌和敌人抽牌事件 EventListener.Instance.PostEvent(EventEnum.EVENT_PLAYER_SHUFFLING_CARD); // 为了需要再添加敌人抽牌的事件 print("抽牌"); // 同时更新行动回合 foreach(Transform roleTrs in BattleFieldManager.Instance.ArmyArray) { Role role = roleTrs.GetComponent(); role.CurrentAttr.Mp = role.OriginAttr.Mp; Dictionary info = new Dictionary(); info.Add("role", role); EventListener.Instance.PostEvent(EventEnum.EVENT_UPDATE_PLAYER_ENGINE, info); } foreach(Transform roleTrs in BattleFieldManager.Instance.EnemyArray) { Role role = roleTrs.GetComponent(); role.CurrentAttr.Mp = role.OriginAttr.Mp; } break; case BattleFieldRound.BATTLE_FIELD_DRAW_CARDS: round = BattleFieldRound.BATTLE_FIELD_ENEMY_DEAL; // 等未来敌人管理类添加后再处理,当前过2秒后进入下一回合 EventListener.Instance.PostEvent(EventEnum.EVENT_ENEMY_DEAL_CARD); print("敌人出牌完毕"); break; case BattleFieldRound.BATTLE_FIELD_ENEMY_DEAL: round = BattleFieldRound.BATTLE_FIELD_PLAYER_DEAL; print("我方出牌,直到按下回合结束按钮 ... "); break; case BattleFieldRound.BATTLE_FIELD_PLAYER_DEAL: round = BattleFieldRound.BATTLE_FIELD_COMPAIRE_CARDS; print("开始比牌 ... "); // 暂无行动 CompaireCards(); // 未来在此实现比牌功能,当前过2秒后进入下一回合 Invoke("NextRound", 2.0f); break; case BattleFieldRound.BATTLE_FIELD_COMPAIRE_CARDS: round = BattleFieldRound.BATTLE_FIELD_READY_GAME; // 清理比较牌 EventListener.Instance.PostEvent(EventEnum.EVENT_CLEAR_COMPAIRE_CARDS); // 运行Buff ExecuteRoleBuff(); // 回合重新回到开始回合,过2秒后进入下一回合 Invoke("NextRound", 2.0f); print("准备好了 ... "); break; case BattleFieldRound.BATTLE_FIELD_MAKE_UP_CARDS: break; } } /* * 准备游戏回合的事件处理 */ private void ReadyHandle() { // 通过消息中心,发布带参数的消息 Dictionary info = new Dictionary(); info.Add("remind", "准备中 ... "); EventListener.Instance.PostEvent(EventEnum.EVENT_UPDATE_ROUND_TEXT, info); // 过1秒后进入下一回合 Invoke("NextRound", 1.0f); } /* * 抽牌结束,进入敌人行动回合 */ private void EnterEnemyDealRound() { // 保证当前处于抽牌阶段 if (round == BattleFieldRound.BATTLE_FIELD_DRAW_CARDS) { NextRound(); } } /* * 敌人出牌结束,进入玩家出牌阶段 */ private void EnterPlayerDealRound() { // 保证当前处于敌人出牌阶段 if (round == BattleFieldRound.BATTLE_FIELD_ENEMY_DEAL) { NextRound(); } } /* * 进入比牌回合 */ private void EnterCompaireRound() { // 首先得保证上一个回合是我方出牌回合 if (round == BattleFieldRound.BATTLE_FIELD_PLAYER_DEAL) { // 通知清理牌桌 EventListener.Instance.PostEvent(EventEnum.EVENT_CLEAR_HAND_CARDS); NextRound(); } } /* * 回合轮回,重新开始 */ private void EnterPlayAHandRound() { // 首先需要保证上一个回合是结束回合 if (round == BattleFieldRound.BATTLE_FIELD_ROUND_END) { NextRound(); } } /* * 执行角色BUFF操作 */ private void ExecuteRoleBuff() { // 遍历数组来启动Buff foreach (Transform trs in BattleFieldManager.Instance.RoleArray) { Role role = trs.GetComponent(); role.BuffExecute(); } } /* * 比牌 */ private void CompaireCards() { // 新建一个 ArrayList executeArray = new ArrayList(); // 循环遍历两个数组 int index = 0; // 暂定动画为缩小,缩小的尺寸 Vector3 scaleSize = new Vector3(AssistConfig.CardScale, AssistConfig.CardScale, AssistConfig.CardScale); while (true) { // 首先判断两个数组是否到最大位置 if (index < BattleFieldManager.Instance.CpArray.Count) { Dictionary info = (Dictionary)BattleFieldManager.Instance.CpArray[index]; // 获取两张卡片 // 再比较两张卡片是否存在,有一方不存在则另一方加入比较数组中 if (info.ContainsKey(AssistConfig.Army) && !info.ContainsKey(AssistConfig.Enemy)) { Transform armyTrs = info[AssistConfig.Army]; Card armyCard = armyTrs.GetComponent(); armyCard.SetFront(true); executeArray.Add(armyTrs); } else if (!info.ContainsKey(AssistConfig.Army) && info.ContainsKey(AssistConfig.Enemy)) { Transform enemyTrs = info[AssistConfig.Enemy]; Card enemyCard = enemyTrs.GetComponent(); enemyCard.SetFront(true); executeArray.Add(enemyCard); } else { Transform armyTrs = info[AssistConfig.Army]; Transform enemyTrs = info[AssistConfig.Enemy]; // 获取两张牌 Card armyCard = armyTrs.GetComponent(); Card enemyCard = enemyTrs.GetComponent(); // 翻牌 armyCard.SetFront(true); enemyCard.SetFront(true); // 获取韧性 int armyTen = armyCard.Source.CompairePassBuff(armyCard.Tenacity); int enemyTen = enemyCard.Source.CompairePassBuff(enemyCard.Tenacity); print("我方韧性 : " + armyTen + ", 敌方韧性 : " + enemyTen); // 比较韧性 // 首先比较两张牌类型一样的情况 if (armyCard.Type == enemyCard.Type) { if (armyCard.Type == CardType.CARD_TYPE_ATTACK) { // 当都是攻击类型的时候 // 根据韧性来进行比较 if (armyTen > enemyTen) { executeArray.Add(armyCard); enemyTrs.localScale = scaleSize; } else if (armyTen < enemyTen) { executeArray.Add(enemyCard); armyTrs.localScale = scaleSize; } else { // 当相等的时候,都不处理 armyTrs.localScale = scaleSize; enemyTrs.localScale = scaleSize; } } else if (armyCard.Type == CardType.CARD_TYPE_DEFANCE) { // 当都是防御类型的时候 if (armyTen > enemyTen) { executeArray.Add(armyCard); enemyTrs.localScale = scaleSize; } else if (armyTen < enemyTen) { executeArray.Add(enemyCard); armyTrs.localScale = scaleSize; } else { // 当相等的时候,都加入处理 executeArray.Add(armyCard); executeArray.Add(enemyCard); } } else { // 特殊牌全部加入处理 executeArray.Add(armyCard); executeArray.Add(enemyCard); } } else { // 当韧性不相等的时候,高的生效 if (armyTen > enemyTen) { executeArray.Add(armyCard); enemyTrs.localScale = scaleSize; } else { executeArray.Add(enemyCard); armyTrs.localScale = scaleSize; } } } } else { break; } index++; } print("最终执行的卡片有 .. " + executeArray.Count + " 张"); foreach(Card card in executeArray) { // 执行卡片 card.OnExecute(); } } /* * 选择一张牌,从其父节点移除,放在缓存区中 */ private void EraseCard(Dictionary info) { Transform cardTrs = (Transform)info["card"]; cardTrs.SetParent(cachePlace); cardTrs.localScale = Vector3.zero; } ///* // * 给本类使用的移除方法,需要传入对应的角色 //*/ //private void EraseCPCard(Transform cardTrs, int index) { // cardTrs.SetParent(cachePlace); // cardTrs.localScale = Vector3.zero; // // 判断角色,同时从对应的比较数组中移除,添加到弃牌堆 // if (index == 0) { // // 首先保证在数组中 // if (BattleFieldManager.Instance.ArmyCpArray.Contains(cardTrs)) { // BattleFieldManager.Instance.ArmyThrowPool.Add(cardTrs); // BattleFieldManager.Instance.ArmyCpArray.Remove(cardTrs); // // 同时通知更新牌堆数据 // Dictionary info = new Dictionary(); // info.Add("index", 1); // info.Add("num", BattleFieldManager.Instance.ArmyThrowPool.Count); // EventListener.Instance.PostEvent(EventEnum.EVENT_UPDATE_TABLE_INFO, info); // } // } else if (index == 1) { // // 首先保证在数组中 // if (BattleFieldManager.Instance.EnemyCpArray.Contains(cardTrs)) { // BattleFieldManager.Instance.EnemyThrowPool.Add(cardTrs); // BattleFieldManager.Instance.EnemyCpArray.Remove(cardTrs); // } // } //} } }