BattleField.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using FSEvent;
  5. using FSRole;
  6. using FSCard;
  7. // 战场相关
  8. namespace FSBattle {
  9. // 战场回合状态
  10. public enum BattleFieldRound {
  11. BATTLE_FIELD_READY_GAME = 0X0010001, // 游戏准备
  12. BATTLE_FIELD_DRAW_CARDS = 0X0010002, // 抽牌
  13. BATTLE_FIELD_ENEMY_DEAL = 0X0010003, // 敌方出牌
  14. BATTLE_FIELD_PLAYER_DEAL = 0X0010004, // 我方出牌
  15. BATTLE_FIELD_COMPAIRE_CARDS = 0X0010005, // 比牌
  16. BATTLE_FIELD_MAKE_UP_CARDS = 0X0010006, // 补牌
  17. BATTLE_FIELD_PLAYER_PLAY_A_HAND = 0X0010007, // 玩家出牌
  18. BATTLE_FIELD_ENEMY_ACTION = 0X0010008, // 敌人行动
  19. BATTLE_FIELD_ROUND_END = 0X0010009, // 回合结束
  20. }
  21. // 战场组件
  22. public class BattleField : MonoBehaviour {
  23. // 记录战场状态
  24. private BattleFieldRound round = BattleFieldRound.BATTLE_FIELD_READY_GAME;
  25. public GameObject cardPrefab;
  26. public Transform cachePlace;
  27. // Use this for initialization
  28. void Start() {
  29. InitEvent();
  30. Invoke("BattleStart", 1.0f);
  31. }
  32. // Update is called once per frame
  33. void Update() {
  34. }
  35. private void OnDestroy() {
  36. RemoveEvent();
  37. }
  38. /*
  39. * 注册事件
  40. */
  41. private void InitEvent() {
  42. EventListener.Instance.RegisterEvent(EventEnum.EVENT_ENTER_COMPAIRE_CARD_ROUND, EnterCompaireRound);
  43. EventListener.Instance.RegisterEvent(EventEnum.EVENT_ENTER_ENEMY_DEAL_ROUND, EnterEnemyDealRound);
  44. EventListener.Instance.RegisterEvent(EventEnum.EVENT_ENTER_PLAYER_DEAL_ROUND, EnterPlayerDealRound);
  45. EventListener.Instance.RegisterEvent(EventEnum.EVENT_ENTER_PLAY_A_HAND_ROUND, EnterPlayAHandRound);
  46. EventListener.Instance.RegisterEvent(EventEnum.EVENT_ERASE_CARD, EraseCard);
  47. }
  48. /*
  49. * 移除事件
  50. */
  51. private void RemoveEvent() {
  52. EventListener.Instance.RemoveEvent(EventEnum.EVENT_ENTER_COMPAIRE_CARD_ROUND);
  53. EventListener.Instance.RemoveEvent(EventEnum.EVENT_ENEMY_DEAL_CARD);
  54. EventListener.Instance.RemoveEvent(EventEnum.EVENT_ENTER_PLAYER_DEAL_ROUND);
  55. EventListener.Instance.RemoveEvent(EventEnum.EVENT_ENTER_PLAY_A_HAND_ROUND);
  56. EventListener.Instance.RemoveEvent(EventEnum.EVENT_ERASE_CARD);
  57. }
  58. /*
  59. * 战场开始
  60. */
  61. private void BattleStart() {
  62. // 给卡池添加牌
  63. int[] armyPool = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
  64. int[] enemyPool = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
  65. foreach (int index in armyPool) {
  66. GameObject cardObj = Instantiate(cardPrefab, cachePlace);
  67. // 挂载卡片组件
  68. CardManager.Instance.LoadCard(cardObj, index.ToString());
  69. // 添加进卡池中
  70. BattleFieldManager.Instance.ArmyTakePool.Add(cardObj.transform);
  71. }
  72. Dictionary<string, object> info = new Dictionary<string, object>();
  73. info.Add("index", 0);
  74. info.Add("num", armyPool.Length);
  75. EventListener.Instance.PostEvent(EventEnum.EVENT_UPDATE_TABLE_INFO, info);
  76. info["index"] = 1;
  77. info["num"] = 0;
  78. EventListener.Instance.PostEvent(EventEnum.EVENT_UPDATE_TABLE_INFO, info);
  79. foreach (int index in enemyPool) {
  80. GameObject cardObj = Instantiate(cardPrefab, cachePlace);
  81. // 挂载卡片组件
  82. CardManager.Instance.LoadCard(cardObj, index.ToString());
  83. // 添加进卡池中
  84. BattleFieldManager.Instance.EnemyTakePool.Add(cardObj.transform);
  85. }
  86. ReadyHandle();
  87. }
  88. /*
  89. * 进入下一个回合
  90. */
  91. public void NextRound() {
  92. // 回合循环转化
  93. switch (round) {
  94. case BattleFieldRound.BATTLE_FIELD_READY_GAME:
  95. round = BattleFieldRound.BATTLE_FIELD_DRAW_CARDS;
  96. // 推送玩家抽牌和敌人抽牌事件
  97. EventListener.Instance.PostEvent(EventEnum.EVENT_PLAYER_SHUFFLING_CARD);
  98. // 为了需要再添加敌人抽牌的事件
  99. print("抽牌");
  100. break;
  101. case BattleFieldRound.BATTLE_FIELD_DRAW_CARDS:
  102. round = BattleFieldRound.BATTLE_FIELD_ENEMY_DEAL;
  103. // 等未来敌人管理类添加后再处理,当前过2秒后进入下一回合
  104. EventListener.Instance.PostEvent(EventEnum.EVENT_ENEMY_DEAL_CARD);
  105. print("敌人出牌");
  106. break;
  107. case BattleFieldRound.BATTLE_FIELD_ENEMY_DEAL:
  108. round = BattleFieldRound.BATTLE_FIELD_PLAYER_DEAL;
  109. print("我方出牌,直到按下回合结束按钮 ... ");
  110. break;
  111. case BattleFieldRound.BATTLE_FIELD_PLAYER_DEAL:
  112. round = BattleFieldRound.BATTLE_FIELD_COMPAIRE_CARDS;
  113. print("开始比牌 ... ");
  114. // 暂无行动
  115. CompaireCards();
  116. // 未来在此实现比牌功能,当前过2秒后进入下一回合
  117. Invoke("NextRound", 2.0f);
  118. break;
  119. case BattleFieldRound.BATTLE_FIELD_COMPAIRE_CARDS:
  120. round = BattleFieldRound.BATTLE_FIELD_READY_GAME;
  121. // 清理比较牌
  122. EventListener.Instance.PostEvent(EventEnum.EVENT_CLEAR_COMPAIRE_CARDS);
  123. // 运行Buff
  124. ExecuteRoleBuff();
  125. // 回合重新回到开始回合,过2秒后进入下一回合
  126. Invoke("NextRound", 2.0f);
  127. print("准备好了 ... ");
  128. break;
  129. case BattleFieldRound.BATTLE_FIELD_MAKE_UP_CARDS:
  130. break;
  131. }
  132. }
  133. /*
  134. * 准备游戏回合的事件处理
  135. */
  136. private void ReadyHandle() {
  137. // 通过消息中心,发布带参数的消息
  138. Dictionary<string, object> info = new Dictionary<string, object>();
  139. info.Add("remind", "准备中 ... ");
  140. EventListener.Instance.PostEvent(EventEnum.EVENT_UPDATE_ROUND_TEXT, info);
  141. // 过1秒后进入下一回合
  142. Invoke("NextRound", 1.0f);
  143. }
  144. /*
  145. * 抽牌结束,进入敌人行动回合
  146. */
  147. private void EnterEnemyDealRound() {
  148. // 保证当前处于抽牌阶段
  149. if (round == BattleFieldRound.BATTLE_FIELD_DRAW_CARDS) {
  150. NextRound();
  151. }
  152. }
  153. /*
  154. * 敌人出牌结束,进入玩家出牌阶段
  155. */
  156. private void EnterPlayerDealRound() {
  157. // 保证当前处于敌人出牌阶段
  158. if (round == BattleFieldRound.BATTLE_FIELD_ENEMY_DEAL) {
  159. NextRound();
  160. }
  161. }
  162. /*
  163. * 进入比牌回合
  164. */
  165. private void EnterCompaireRound() {
  166. // 首先得保证上一个回合是我方出牌回合
  167. if (round == BattleFieldRound.BATTLE_FIELD_PLAYER_DEAL) {
  168. // 通知清理牌桌
  169. EventListener.Instance.PostEvent(EventEnum.EVENT_CLEAR_HAND_CARDS);
  170. NextRound();
  171. }
  172. }
  173. /*
  174. * 回合轮回,重新开始
  175. */
  176. private void EnterPlayAHandRound() {
  177. // 首先需要保证上一个回合是结束回合
  178. if (round == BattleFieldRound.BATTLE_FIELD_ROUND_END) {
  179. NextRound();
  180. }
  181. }
  182. /*
  183. * 执行角色BUFF操作
  184. */
  185. private void ExecuteRoleBuff() {
  186. // 遍历数组来启动Buff
  187. foreach (Transform trs in BattleFieldManager.Instance.GetRoleArray()) {
  188. Role role = trs.GetComponent<Role>();
  189. role.BuffExecute();
  190. }
  191. }
  192. /*
  193. * 比牌
  194. */
  195. private void CompaireCards() {
  196. // 新建一个
  197. ArrayList executeArray = new ArrayList();
  198. // 循环遍历两个数组
  199. int index = 0;
  200. while (true) {
  201. // 首先判断两个数组是否到最大位置
  202. if (index < BattleFieldManager.Instance.ArmyCpArray.Count && index < BattleFieldManager.Instance.EnemyCpArray.Count) {
  203. // 获取两张卡片
  204. Card armyCard = ((Transform)BattleFieldManager.Instance.ArmyCpArray[index]).GetComponent<Card>();
  205. Card enemyCard = ((Transform)BattleFieldManager.Instance.EnemyCpArray[index]).GetComponent<Card>();
  206. // 比较韧性
  207. if (armyCard.Tenacity > enemyCard.Tenacity) {
  208. executeArray.Add(armyCard);
  209. } else if (armyCard.Tenacity < enemyCard.Tenacity) {
  210. executeArray.Add(enemyCard);
  211. } else {
  212. }
  213. } else if (index < BattleFieldManager.Instance.ArmyCpArray.Count && index >= BattleFieldManager.Instance.EnemyCpArray.Count) {
  214. // 此种是我方比较卡片比较多的情况,将剩下的牌都放入比较数组中
  215. for (; index < BattleFieldManager.Instance.ArmyCpArray.Count; index++) {
  216. executeArray.Add(BattleFieldManager.Instance.ArmyCpArray[index]);
  217. }
  218. break;
  219. } else if (index >= BattleFieldManager.Instance.ArmyCpArray.Count && index < BattleFieldManager.Instance.EnemyCpArray.Count) {
  220. // 此种是地方比较卡片比较多的情况,将剩下的牌都放入比较数组中
  221. for (; index < BattleFieldManager.Instance.EnemyCpArray.Count; index++) {
  222. executeArray.Add(BattleFieldManager.Instance.EnemyCpArray[index]);
  223. }
  224. break;
  225. } else {
  226. break;
  227. }
  228. index++;
  229. }
  230. print("最终执行的卡片有 .. " + executeArray.Count + " 张");
  231. }
  232. /*
  233. * 选择一张牌,从其父节点移除,放在缓存区中
  234. */
  235. private void EraseCard(Dictionary<string, object> info) {
  236. Transform cardTrs = (Transform)info["card"];
  237. cardTrs.SetParent(cachePlace);
  238. cardTrs.localScale = Vector3.zero;
  239. }
  240. }
  241. }