BattleField.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using FSEvent;
  5. using FSRole;
  6. using FSCard;
  7. using FSAssist;
  8. // 战场相关
  9. namespace FSBattle {
  10. // 战场回合状态
  11. public enum BattleFieldRound {
  12. BATTLE_FIELD_READY_GAME = 0X0010001, // 游戏准备
  13. BATTLE_FIELD_DRAW_CARDS = 0X0010002, // 抽牌
  14. BATTLE_FIELD_ENEMY_DEAL = 0X0010003, // 敌方出牌
  15. BATTLE_FIELD_PLAYER_DEAL = 0X0010004, // 我方出牌
  16. BATTLE_FIELD_COMPAIRE_CARDS = 0X0010005, // 比牌
  17. BATTLE_FIELD_MAKE_UP_CARDS = 0X0010006, // 补牌
  18. BATTLE_FIELD_PLAYER_PLAY_A_HAND = 0X0010007, // 玩家出牌
  19. BATTLE_FIELD_ENEMY_ACTION = 0X0010008, // 敌人行动
  20. BATTLE_FIELD_ROUND_END = 0X0010009, // 回合结束
  21. }
  22. // 战场组件
  23. public class BattleField : MonoBehaviour {
  24. // 记录战场状态
  25. private BattleFieldRound round = BattleFieldRound.BATTLE_FIELD_READY_GAME;
  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. ReadyHandle();
  63. }
  64. /*
  65. * 进入下一个回合
  66. */
  67. public void NextRound() {
  68. // 回合循环转化
  69. switch (round) {
  70. case BattleFieldRound.BATTLE_FIELD_READY_GAME:
  71. round = BattleFieldRound.BATTLE_FIELD_DRAW_CARDS;
  72. // 推送玩家抽牌和敌人抽牌事件
  73. EventListener.Instance.PostEvent(EventEnum.EVENT_PLAYER_SHUFFLING_CARD);
  74. // 为了需要再添加敌人抽牌的事件
  75. print("抽牌");
  76. // 同时更新行动回合
  77. foreach(Transform roleTrs in BattleFieldManager.Instance.ArmyArray) {
  78. Role role = roleTrs.GetComponent<Role>();
  79. role.CurrentAttr.Mp = role.OriginAttr.Mp;
  80. Dictionary<string, object> info = new Dictionary<string, object>();
  81. info.Add("role", role);
  82. EventListener.Instance.PostEvent(EventEnum.EVENT_UPDATE_PLAYER_ENGINE, info);
  83. }
  84. foreach(Transform roleTrs in BattleFieldManager.Instance.EnemyArray) {
  85. Role role = roleTrs.GetComponent<Role>();
  86. role.CurrentAttr.Mp = role.OriginAttr.Mp;
  87. }
  88. break;
  89. case BattleFieldRound.BATTLE_FIELD_DRAW_CARDS:
  90. round = BattleFieldRound.BATTLE_FIELD_ENEMY_DEAL;
  91. // 等未来敌人管理类添加后再处理,当前过2秒后进入下一回合
  92. EventListener.Instance.PostEvent(EventEnum.EVENT_ENEMY_DEAL_CARD);
  93. print("敌人出牌完毕");
  94. break;
  95. case BattleFieldRound.BATTLE_FIELD_ENEMY_DEAL:
  96. round = BattleFieldRound.BATTLE_FIELD_PLAYER_DEAL;
  97. // 将按钮字体改为我方结束出牌
  98. print("我方出牌,直到按下回合结束按钮 ... ");
  99. break;
  100. case BattleFieldRound.BATTLE_FIELD_PLAYER_DEAL:
  101. round = BattleFieldRound.BATTLE_FIELD_COMPAIRE_CARDS;
  102. print("开始比牌 ... ");
  103. // 比牌
  104. CompaireCards();
  105. // 接下来点击结束回合按钮后进入下一回合
  106. //// 未来在此实现比牌功能,当前过2秒后进入下一回合
  107. //Invoke("NextRound", 2.0f);
  108. break;
  109. case BattleFieldRound.BATTLE_FIELD_COMPAIRE_CARDS:
  110. round = BattleFieldRound.BATTLE_FIELD_READY_GAME;
  111. // 清理比较牌
  112. EventListener.Instance.PostEvent(EventEnum.EVENT_CLEAR_COMPAIRE_CARDS);
  113. // 运行Buff
  114. ExecuteRoleBuff();
  115. // 回合重新回到开始回合,过2秒后进入下一回合
  116. Invoke("NextRound", 2.0f);
  117. print("准备好了 ... ");
  118. break;
  119. case BattleFieldRound.BATTLE_FIELD_MAKE_UP_CARDS:
  120. break;
  121. }
  122. }
  123. /*
  124. * 准备游戏回合的事件处理
  125. */
  126. private void ReadyHandle() {
  127. // 通过消息中心,发布带参数的消息
  128. Dictionary<string, object> info = new Dictionary<string, object>();
  129. info.Add("remind", "准备中 ... ");
  130. EventListener.Instance.PostEvent(EventEnum.EVENT_UPDATE_ROUND_TEXT, info);
  131. // 过1秒后进入下一回合
  132. Invoke("NextRound", 1.0f);
  133. }
  134. /*
  135. * 抽牌结束,进入敌人行动回合
  136. */
  137. private void EnterEnemyDealRound() {
  138. // 保证当前处于抽牌阶段
  139. if (round == BattleFieldRound.BATTLE_FIELD_DRAW_CARDS) {
  140. NextRound();
  141. }
  142. }
  143. /*
  144. * 敌人出牌结束,进入玩家出牌阶段
  145. */
  146. private void EnterPlayerDealRound() {
  147. // 保证当前处于敌人出牌阶段
  148. if (round == BattleFieldRound.BATTLE_FIELD_ENEMY_DEAL) {
  149. NextRound();
  150. }
  151. }
  152. /*
  153. * 进入比牌回合
  154. */
  155. private void EnterCompaireRound() {
  156. // 首先得保证上一个回合是我方出牌回合
  157. if (round == BattleFieldRound.BATTLE_FIELD_PLAYER_DEAL) {
  158. // 通知清理牌桌
  159. EventListener.Instance.PostEvent(EventEnum.EVENT_CLEAR_HAND_CARDS);
  160. NextRound();
  161. } else if (round == BattleFieldRound.BATTLE_FIELD_COMPAIRE_CARDS) {
  162. // 如果是比牌回合,则暂无处理,直接进入下一回合
  163. NextRound();
  164. }
  165. }
  166. /*
  167. * 回合轮回,重新开始
  168. */
  169. private void EnterPlayAHandRound() {
  170. // 首先需要保证上一个回合是结束回合
  171. if (round == BattleFieldRound.BATTLE_FIELD_ROUND_END) {
  172. NextRound();
  173. }
  174. }
  175. /*
  176. * 执行角色BUFF操作
  177. */
  178. private void ExecuteRoleBuff() {
  179. // 遍历数组来启动Buff
  180. foreach (Transform trs in BattleFieldManager.Instance.RoleArray) {
  181. Role role = trs.GetComponent<Role>();
  182. role.BuffExecute();
  183. }
  184. }
  185. /*
  186. * 比牌
  187. */
  188. private void CompaireCards() {
  189. // 新建一个
  190. ArrayList executeArray = new ArrayList();
  191. // 循环遍历两个数组
  192. int index = 0;
  193. // 暂定动画为缩小,缩小的尺寸
  194. Vector3 scaleSize = new Vector3(AssistConfig.CardScale, AssistConfig.CardScale, AssistConfig.CardScale);
  195. while (true) {
  196. // 首先判断两个数组是否到最大位置
  197. if (index < BattleFieldManager.Instance.CpArray.Count) {
  198. Dictionary<string, Transform> info = (Dictionary<string, Transform>)BattleFieldManager.Instance.CpArray[index];
  199. // 获取两张卡片
  200. // 再比较两张卡片是否存在,有一方不存在则另一方加入比较数组中
  201. if (info.ContainsKey(AssistConfig.Army) && !info.ContainsKey(AssistConfig.Enemy)) {
  202. Transform armyTrs = info[AssistConfig.Army];
  203. Card armyCard = armyTrs.GetComponent<Card>();
  204. armyCard.SetFront(true);
  205. executeArray.Add(armyTrs);
  206. } else if (!info.ContainsKey(AssistConfig.Army) && info.ContainsKey(AssistConfig.Enemy)) {
  207. Transform enemyTrs = info[AssistConfig.Enemy];
  208. Card enemyCard = enemyTrs.GetComponent<Card>();
  209. enemyCard.SetFront(true);
  210. executeArray.Add(enemyCard);
  211. } else {
  212. Transform armyTrs = info[AssistConfig.Army];
  213. Transform enemyTrs = info[AssistConfig.Enemy];
  214. // 获取两张牌
  215. Card armyCard = armyTrs.GetComponent<Card>();
  216. Card enemyCard = enemyTrs.GetComponent<Card>();
  217. // 翻牌
  218. armyCard.SetFront(true);
  219. enemyCard.SetFront(true);
  220. // 获取韧性
  221. int armyTen = armyCard.Source.CompairePassBuff(armyCard.Tenacity);
  222. int enemyTen = enemyCard.Source.CompairePassBuff(enemyCard.Tenacity);
  223. print("我方韧性 : " + armyTen + ", 敌方韧性 : " + enemyTen);
  224. // 比较韧性
  225. // 首先比较两张牌类型一样的情况
  226. if (armyCard.Type == enemyCard.Type) {
  227. if (armyCard.Type == CardType.CARD_TYPE_ATTACK) {
  228. // 当都是攻击类型的时候
  229. // 根据韧性来进行比较
  230. if (armyTen > enemyTen) {
  231. executeArray.Add(armyCard);
  232. enemyTrs.localScale = scaleSize;
  233. } else if (armyTen < enemyTen) {
  234. executeArray.Add(enemyCard);
  235. armyTrs.localScale = scaleSize;
  236. } else {
  237. // 当相等的时候,都不处理
  238. armyTrs.localScale = scaleSize;
  239. enemyTrs.localScale = scaleSize;
  240. }
  241. } else if (armyCard.Type == CardType.CARD_TYPE_DEFANCE) {
  242. // 当都是防御类型的时候
  243. if (armyTen > enemyTen) {
  244. executeArray.Add(armyCard);
  245. enemyTrs.localScale = scaleSize;
  246. } else if (armyTen < enemyTen) {
  247. executeArray.Add(enemyCard);
  248. armyTrs.localScale = scaleSize;
  249. } else {
  250. // 当相等的时候,都加入处理
  251. executeArray.Add(armyCard);
  252. executeArray.Add(enemyCard);
  253. }
  254. } else {
  255. // 特殊牌全部加入处理
  256. executeArray.Add(armyCard);
  257. executeArray.Add(enemyCard);
  258. }
  259. } else {
  260. // 当韧性不相等的时候,高的生效
  261. if (armyTen > enemyTen) {
  262. executeArray.Add(armyCard);
  263. enemyTrs.localScale = scaleSize;
  264. } else {
  265. executeArray.Add(enemyCard);
  266. armyTrs.localScale = scaleSize;
  267. }
  268. }
  269. }
  270. } else {
  271. break;
  272. }
  273. index++;
  274. }
  275. print("最终执行的卡片有 .. " + executeArray.Count + " 张");
  276. foreach(Card card in executeArray) {
  277. // 执行卡片
  278. card.OnExecute();
  279. }
  280. }
  281. /*
  282. * 选择一张牌,从其父节点移除,放在缓存区中
  283. */
  284. private void EraseCard(Dictionary<string, object> info) {
  285. Transform cardTrs = (Transform)info["card"];
  286. cardTrs.SetParent(cachePlace);
  287. cardTrs.localScale = Vector3.zero;
  288. }
  289. ///*
  290. // * 给本类使用的移除方法,需要传入对应的角色
  291. //*/
  292. //private void EraseCPCard(Transform cardTrs, int index) {
  293. // cardTrs.SetParent(cachePlace);
  294. // cardTrs.localScale = Vector3.zero;
  295. // // 判断角色,同时从对应的比较数组中移除,添加到弃牌堆
  296. // if (index == 0) {
  297. // // 首先保证在数组中
  298. // if (BattleFieldManager.Instance.ArmyCpArray.Contains(cardTrs)) {
  299. // BattleFieldManager.Instance.ArmyThrowPool.Add(cardTrs);
  300. // BattleFieldManager.Instance.ArmyCpArray.Remove(cardTrs);
  301. // // 同时通知更新牌堆数据
  302. // Dictionary<string, object> info = new Dictionary<string, object>();
  303. // info.Add("index", 1);
  304. // info.Add("num", BattleFieldManager.Instance.ArmyThrowPool.Count);
  305. // EventListener.Instance.PostEvent(EventEnum.EVENT_UPDATE_TABLE_INFO, info);
  306. // }
  307. // } else if (index == 1) {
  308. // // 首先保证在数组中
  309. // if (BattleFieldManager.Instance.EnemyCpArray.Contains(cardTrs)) {
  310. // BattleFieldManager.Instance.EnemyThrowPool.Add(cardTrs);
  311. // BattleFieldManager.Instance.EnemyCpArray.Remove(cardTrs);
  312. // }
  313. // }
  314. //}
  315. }
  316. }