BattleField.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  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. private ArrayList executeList;
  28. // Use this for initialization
  29. void Start() {
  30. executeList = new ArrayList();
  31. InitEvent();
  32. Invoke("BattleStart", 1.0f);
  33. }
  34. // Update is called once per frame
  35. void Update() {
  36. }
  37. private void OnDestroy() {
  38. RemoveEvent();
  39. }
  40. /*
  41. * 注册事件
  42. */
  43. private void InitEvent() {
  44. EventListener.Instance.RegisterEvent(EventEnum.EVENT_ENTER_COMPAIRE_CARD_ROUND, EnterCompaireRound);
  45. EventListener.Instance.RegisterEvent(EventEnum.EVENT_ENTER_ENEMY_DEAL_ROUND, EnterEnemyDealRound);
  46. EventListener.Instance.RegisterEvent(EventEnum.EVENT_ENTER_PLAYER_DEAL_ROUND, EnterPlayerDealRound);
  47. EventListener.Instance.RegisterEvent(EventEnum.EVENT_ENTER_PLAY_A_HAND_ROUND, EnterPlayAHandRound);
  48. EventListener.Instance.RegisterEvent(EventEnum.EVENT_ERASE_CARD, EraseCard);
  49. }
  50. /*
  51. * 移除事件
  52. */
  53. private void RemoveEvent() {
  54. EventListener.Instance.RemoveEvent(EventEnum.EVENT_ENTER_COMPAIRE_CARD_ROUND);
  55. EventListener.Instance.RemoveEvent(EventEnum.EVENT_ENEMY_DEAL_CARD);
  56. EventListener.Instance.RemoveEvent(EventEnum.EVENT_ENTER_PLAYER_DEAL_ROUND);
  57. EventListener.Instance.RemoveEvent(EventEnum.EVENT_ENTER_PLAY_A_HAND_ROUND);
  58. EventListener.Instance.RemoveEvent(EventEnum.EVENT_ERASE_CARD);
  59. }
  60. /*
  61. * 战场开始
  62. */
  63. private void BattleStart() {
  64. ReadyHandle();
  65. }
  66. /*
  67. * 进入下一个回合
  68. */
  69. public void NextRound() {
  70. // 回合循环转化
  71. switch (round) {
  72. case BattleFieldRound.BATTLE_FIELD_READY_GAME:
  73. round = BattleFieldRound.BATTLE_FIELD_DRAW_CARDS;
  74. // 推送玩家抽牌和敌人抽牌事件
  75. EventListener.Instance.PostEvent(EventEnum.EVENT_PLAYER_SHUFFLING_CARD);
  76. // 为了需要再添加敌人抽牌的事件
  77. print("抽牌");
  78. // 同时更新行动回合
  79. foreach(Transform roleTrs in BattleFieldManager.Instance.ArmyArray) {
  80. Role role = roleTrs.GetComponent<Role>();
  81. role.CurrentAttr.Mp = role.OriginAttr.Mp;
  82. Dictionary<string, object> info = new Dictionary<string, object>();
  83. info.Add("role", role);
  84. EventListener.Instance.PostEvent(EventEnum.EVENT_UPDATE_PLAYER_ENGINE, info);
  85. }
  86. break;
  87. case BattleFieldRound.BATTLE_FIELD_DRAW_CARDS:
  88. round = BattleFieldRound.BATTLE_FIELD_ENEMY_DEAL;
  89. // 等未来敌人管理类添加后再处理,当前过2秒后进入下一回合
  90. EventListener.Instance.PostEvent(EventEnum.EVENT_ENEMY_DEAL_CARD);
  91. print("敌人出牌完毕");
  92. break;
  93. case BattleFieldRound.BATTLE_FIELD_ENEMY_DEAL:
  94. round = BattleFieldRound.BATTLE_FIELD_PLAYER_DEAL;
  95. print("我方出牌,直到按下回合结束按钮 ... ");
  96. break;
  97. case BattleFieldRound.BATTLE_FIELD_PLAYER_DEAL:
  98. round = BattleFieldRound.BATTLE_FIELD_COMPAIRE_CARDS;
  99. print("开始比牌 ... ");
  100. // 暂无行动
  101. CompaireCards();
  102. // 未来在此实现比牌功能,当前过2秒后进入下一回合
  103. Invoke("NextRound", 2.0f);
  104. break;
  105. case BattleFieldRound.BATTLE_FIELD_COMPAIRE_CARDS:
  106. round = BattleFieldRound.BATTLE_FIELD_READY_GAME;
  107. // 清理比较牌
  108. EventListener.Instance.PostEvent(EventEnum.EVENT_CLEAR_COMPAIRE_CARDS);
  109. // 运行Buff
  110. ExecuteRoleBuff();
  111. // 回合重新回到开始回合,过2秒后进入下一回合
  112. Invoke("NextRound", 2.0f);
  113. print("准备好了 ... ");
  114. break;
  115. case BattleFieldRound.BATTLE_FIELD_MAKE_UP_CARDS:
  116. break;
  117. }
  118. }
  119. /*
  120. * 准备游戏回合的事件处理
  121. */
  122. private void ReadyHandle() {
  123. // 通过消息中心,发布带参数的消息
  124. Dictionary<string, object> info = new Dictionary<string, object>();
  125. info.Add("remind", "准备中 ... ");
  126. EventListener.Instance.PostEvent(EventEnum.EVENT_UPDATE_ROUND_TEXT, info);
  127. // 过1秒后进入下一回合
  128. Invoke("NextRound", 1.0f);
  129. }
  130. /*
  131. * 抽牌结束,进入敌人行动回合
  132. */
  133. private void EnterEnemyDealRound() {
  134. // 保证当前处于抽牌阶段
  135. if (round == BattleFieldRound.BATTLE_FIELD_DRAW_CARDS) {
  136. NextRound();
  137. }
  138. }
  139. /*
  140. * 敌人出牌结束,进入玩家出牌阶段
  141. */
  142. private void EnterPlayerDealRound() {
  143. // 保证当前处于敌人出牌阶段
  144. if (round == BattleFieldRound.BATTLE_FIELD_ENEMY_DEAL) {
  145. NextRound();
  146. }
  147. }
  148. /*
  149. * 进入比牌回合
  150. */
  151. private void EnterCompaireRound() {
  152. // 首先得保证上一个回合是我方出牌回合
  153. if (round == BattleFieldRound.BATTLE_FIELD_PLAYER_DEAL) {
  154. // 通知清理牌桌
  155. EventListener.Instance.PostEvent(EventEnum.EVENT_CLEAR_HAND_CARDS);
  156. NextRound();
  157. }
  158. }
  159. /*
  160. * 回合轮回,重新开始
  161. */
  162. private void EnterPlayAHandRound() {
  163. // 首先需要保证上一个回合是结束回合
  164. if (round == BattleFieldRound.BATTLE_FIELD_ROUND_END) {
  165. NextRound();
  166. }
  167. }
  168. /*
  169. * 执行角色BUFF操作
  170. */
  171. private void ExecuteRoleBuff() {
  172. // 遍历数组来启动Buff
  173. foreach (Transform trs in BattleFieldManager.Instance.RoleArray) {
  174. Role role = trs.GetComponent<Role>();
  175. role.BuffExecute();
  176. }
  177. }
  178. /*
  179. * 比牌
  180. */
  181. private void CompaireCards() {
  182. // 新建一个
  183. ArrayList executeArray = new ArrayList();
  184. // 循环遍历两个数组
  185. int index = 0;
  186. // 暂定动画为缩小,缩小的尺寸
  187. Vector3 scaleSize = new Vector3(0.4f, 0.4f, 0.4f);
  188. while (true) {
  189. // 首先判断两个数组是否到最大位置
  190. if (index < BattleFieldManager.Instance.ArmyCpArray.Count && index < BattleFieldManager.Instance.EnemyCpArray.Count) {
  191. // 获取两张卡片
  192. Transform armyTrs = (Transform)BattleFieldManager.Instance.ArmyCpArray[index];
  193. Transform enemyTrs = (Transform)BattleFieldManager.Instance.EnemyCpArray[index];
  194. Card armyCard = armyTrs.GetComponent<Card>();
  195. Card enemyCard = enemyTrs.GetComponent<Card>();
  196. // 比较韧性
  197. // 首先比较两张牌类型一样的情况
  198. if (armyCard.Type == enemyCard.Type) {
  199. if (armyCard.Type == CardType.CARD_TYPE_ATTACK) {
  200. // 当都是攻击类型的时候
  201. // 根据韧性来进行比较
  202. if (armyCard.Tenacity > enemyCard.Tenacity) {
  203. executeArray.Add(armyCard);
  204. enemyTrs.localScale = scaleSize;
  205. } else if (armyCard.Tenacity < enemyCard.Tenacity) {
  206. executeArray.Add(enemyCard);
  207. armyTrs.localScale = scaleSize;
  208. } else {
  209. // 当相等的时候,都不处理
  210. armyTrs.localScale = scaleSize;
  211. enemyTrs.localScale = scaleSize;
  212. }
  213. } else if (armyCard.Type == CardType.CARD_TYPE_DEFANCE) {
  214. // 当都是防御类型的时候
  215. if (armyCard.Tenacity > enemyCard.Tenacity) {
  216. executeArray.Add(armyCard);
  217. enemyTrs.localScale = scaleSize;
  218. } else if (armyCard.Tenacity < enemyCard.Tenacity) {
  219. executeArray.Add(enemyCard);
  220. armyTrs.localScale = scaleSize;
  221. } else {
  222. // 当相等的时候,都加入处理
  223. executeArray.Add(armyCard);
  224. executeArray.Add(enemyCard);
  225. }
  226. } else {
  227. // 特殊牌全部加入处理
  228. executeArray.Add(armyCard);
  229. executeArray.Add(enemyCard);
  230. }
  231. } else {
  232. // 当韧性不相等的时候,高的生效
  233. if (armyCard.Tenacity > enemyCard.Tenacity) {
  234. executeArray.Add(armyCard);
  235. enemyTrs.localScale = scaleSize;
  236. } else {
  237. executeArray.Add(enemyCard);
  238. armyTrs.localScale = scaleSize;
  239. }
  240. }
  241. } else if (index < BattleFieldManager.Instance.ArmyCpArray.Count && index >= BattleFieldManager.Instance.EnemyCpArray.Count) {
  242. // 此种是我方比较卡片比较多的情况,将剩下的牌都放入比较数组中
  243. for (; index < BattleFieldManager.Instance.ArmyCpArray.Count; index++) {
  244. Transform trs = (Transform)BattleFieldManager.Instance.ArmyArray[index];
  245. executeArray.Add(trs.GetComponent<Card>());
  246. }
  247. break;
  248. } else if (index >= BattleFieldManager.Instance.ArmyCpArray.Count && index < BattleFieldManager.Instance.EnemyCpArray.Count) {
  249. // 此种是地方比较卡片比较多的情况,将剩下的牌都放入比较数组中
  250. for (; index < BattleFieldManager.Instance.EnemyCpArray.Count; index++) {
  251. Transform trs = (Transform)BattleFieldManager.Instance.EnemyCpArray[index];
  252. executeArray.Add(trs.GetComponent<Card>());
  253. }
  254. break;
  255. } else {
  256. break;
  257. }
  258. index++;
  259. }
  260. print("最终执行的卡片有 .. " + executeArray.Count + " 张");
  261. foreach(Card card in executeArray) {
  262. // 执行卡片
  263. card.OnExecute();
  264. }
  265. }
  266. /*
  267. * 选择一张牌,从其父节点移除,放在缓存区中
  268. */
  269. private void EraseCard(Dictionary<string, object> info) {
  270. Transform cardTrs = (Transform)info["card"];
  271. cardTrs.SetParent(cachePlace);
  272. cardTrs.localScale = Vector3.zero;
  273. }
  274. /*
  275. * 给本类使用的移除方法,需要传入对应的角色
  276. */
  277. private void EraseCPCard(Transform cardTrs, int index) {
  278. cardTrs.SetParent(cachePlace);
  279. cardTrs.localScale = Vector3.zero;
  280. // 判断角色,同时从对应的比较数组中移除,添加到弃牌堆
  281. if (index == 0) {
  282. // 首先保证在数组中
  283. if (BattleFieldManager.Instance.ArmyCpArray.Contains(cardTrs)) {
  284. BattleFieldManager.Instance.ArmyThrowPool.Add(cardTrs);
  285. BattleFieldManager.Instance.ArmyCpArray.Remove(cardTrs);
  286. // 同时通知更新牌堆数据
  287. Dictionary<string, object> info = new Dictionary<string, object>();
  288. info.Add("index", 1);
  289. info.Add("num", BattleFieldManager.Instance.ArmyThrowPool.Count);
  290. EventListener.Instance.PostEvent(EventEnum.EVENT_UPDATE_TABLE_INFO, info);
  291. }
  292. } else if (index == 1) {
  293. // 首先保证在数组中
  294. if (BattleFieldManager.Instance.EnemyCpArray.Contains(cardTrs)) {
  295. BattleFieldManager.Instance.EnemyThrowPool.Add(cardTrs);
  296. BattleFieldManager.Instance.EnemyCpArray.Remove(cardTrs);
  297. }
  298. }
  299. }
  300. }
  301. }