SelectAttackEffect.cs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546
  1. using Photon.Pun;
  2. using System;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using UnityEngine;
  7. public class SelectAttackEffect : MonoBehaviourPunCallbacks
  8. {
  9. public void SetUp
  10. (
  11. Permanent attacker,
  12. Func<bool> canAttackPlayerCondition,
  13. Func<Permanent, bool> defenderCondition,
  14. ICardEffect cardEffect)
  15. {
  16. _attacker = attacker;
  17. _canAttackPlayerCondition = canAttackPlayerCondition;
  18. _defenderCondition = defenderCondition;
  19. _cardEffect = cardEffect;
  20. _canSelectNotAttack = true;
  21. _withoutTap = false;
  22. _customMessage = null;
  23. _customMessage_Enemy = null;
  24. _beforeOnAttackCoroutine = null;
  25. }
  26. public void SetUpCustomMessage(string customMessage, string customMessage_Enemy)
  27. {
  28. _customMessage = customMessage;
  29. _customMessage_Enemy = customMessage_Enemy;
  30. }
  31. public void SetCanNotSelectNotAttack()
  32. {
  33. _canSelectNotAttack = false;
  34. }
  35. public void SetWithoutTap()
  36. {
  37. _withoutTap = true;
  38. }
  39. public void SetBeforeOnAttackCoroutine(Func<IEnumerator> beforeOnAttackCoroutine)
  40. {
  41. _beforeOnAttackCoroutine = beforeOnAttackCoroutine;
  42. }
  43. Permanent _attacker = null;
  44. Func<bool> _canAttackPlayerCondition = null;
  45. Func<Permanent, bool> _defenderCondition = null;
  46. bool _canSelectNotAttack = true;
  47. bool _withoutTap = false;
  48. bool _noSelect = false;
  49. bool _endSelect = false;
  50. string _customMessage = null;
  51. string _customMessage_Enemy = null;
  52. Permanent _defender = null;
  53. ICardEffect _cardEffect = null;
  54. Func<IEnumerator> _beforeOnAttackCoroutine = null;
  55. #region パーマネントを選択できるか
  56. bool CanTarget(Permanent permanent)
  57. {
  58. if (_attacker != null)
  59. {
  60. if (_attacker.TopCard != null)
  61. {
  62. if (_attacker.CanAttack(_cardEffect, _withoutTap))
  63. {
  64. if (_attacker.CanAttackTargetDigimon(permanent, _cardEffect, _withoutTap))
  65. {
  66. if (_defenderCondition != null)
  67. {
  68. if (!_defenderCondition(permanent))
  69. {
  70. return false;
  71. }
  72. }
  73. return true;
  74. }
  75. }
  76. }
  77. }
  78. return false;
  79. }
  80. #endregion
  81. #region 攻撃できる相手パーマネントがいるか
  82. public bool CanAttackDigimon()
  83. {
  84. foreach (Player player in GManager.instance.turnStateMachine.gameContext.Players)
  85. {
  86. foreach (Permanent permanent in player.GetFieldPermanents())
  87. {
  88. if (CanTarget(permanent))
  89. {
  90. return true;
  91. }
  92. }
  93. }
  94. return false;
  95. }
  96. #endregion
  97. #region プレイヤーに攻撃が可能か
  98. bool CanAttackPlayer()
  99. {
  100. if (_attacker != null)
  101. {
  102. if (_attacker.TopCard != null)
  103. {
  104. if (_attacker.CanAttack(_cardEffect, _withoutTap))
  105. {
  106. if (_attacker.CanAttackTargetDigimon(null, _cardEffect, _withoutTap))
  107. {
  108. if (_canAttackPlayerCondition != null)
  109. {
  110. if (!_canAttackPlayerCondition())
  111. {
  112. return false;
  113. }
  114. }
  115. return true;
  116. }
  117. }
  118. }
  119. }
  120. return false;
  121. }
  122. #endregion
  123. #region 選択が可能かどうか
  124. public bool active()
  125. {
  126. if (!CanAttackDigimon())
  127. {
  128. if (!CanAttackPlayer())
  129. {
  130. return false;
  131. }
  132. }
  133. if (GManager.instance.attackProcess.IsAttacking)
  134. {
  135. return false;
  136. }
  137. return true;
  138. }
  139. #endregion
  140. #region 終了できるか判定
  141. bool CanEndSelect(Permanent selectedPermanent)
  142. {
  143. if (selectedPermanent == null)
  144. {
  145. if (!CanAttackPlayer())
  146. {
  147. return false;
  148. }
  149. }
  150. else
  151. {
  152. if (!CanAttackDigimon())
  153. {
  154. return false;
  155. }
  156. }
  157. return true;
  158. }
  159. #endregion
  160. public IEnumerator Activate()
  161. {
  162. _defender = null;
  163. _noSelect = false;
  164. if (_attacker == null) yield break;
  165. if (_attacker.TopCard == null) yield break;
  166. if (!_attacker.CanAttack(_cardEffect, _withoutTap)) yield break;
  167. if (active())
  168. {
  169. yield return GManager.instance.photonWaitController.StartWait("SelectAttackEffect");
  170. foreach (Player player in GManager.instance.turnStateMachine.gameContext.Players)
  171. {
  172. GManager.instance.turnStateMachine.OffFieldCardTarget(player);
  173. GManager.instance.turnStateMachine.OffHandCardTarget(player);
  174. }
  175. GManager.instance.turnStateMachine.IsSelecting = true;
  176. if (_attacker != null)
  177. {
  178. if (_attacker.TopCard != null)
  179. {
  180. if (_attacker.CanAttack(_cardEffect, _withoutTap))
  181. {
  182. if (_attacker.TopCard.Owner.isYou)
  183. {
  184. #region メッセージ表示
  185. if (!string.IsNullOrEmpty(_customMessage))
  186. {
  187. GManager.instance.commandText.OpenCommandText(_customMessage);
  188. }
  189. else
  190. {
  191. if (CanAttackDigimon())
  192. {
  193. GManager.instance.commandText.OpenCommandText("Which target will you attack?");
  194. }
  195. else
  196. {
  197. GManager.instance.commandText.OpenCommandText("Will you attack to the opponent?");
  198. }
  199. }
  200. #endregion
  201. Permanent selectedPermanent = null;
  202. #region プレイヤーへの攻撃
  203. if (CanAttackPlayer())
  204. {
  205. if (_attacker.TopCard.Owner.Enemy.SecurityCards.Count >= 1)
  206. {
  207. _attacker.TopCard.Owner.Enemy.securityObject.securityBreakGlass.ShowBlueMatarial();
  208. }
  209. _attacker.TopCard.Owner.Enemy.securityObject.SetSecurityAttackObject();
  210. _attacker.TopCard.Owner.Enemy.securityObject.SetSecurityOutline(true);
  211. _attacker.TopCard.Owner.Enemy.securityObject.AddClickTarget(() =>
  212. {
  213. selectedPermanent = null;
  214. EndSelect_RPC();
  215. });
  216. }
  217. #endregion
  218. List<FieldPermanentCard> candidates = new List<FieldPermanentCard>();
  219. foreach (Player player in GManager.instance.turnStateMachine.gameContext.Players)
  220. {
  221. foreach (Permanent permanent in player.GetFieldPermanents())
  222. {
  223. if (CanTarget(permanent))
  224. {
  225. permanent.ShowingPermanentCard.AddClickTarget(OnClickFieldPermanentCard);
  226. candidates.Add(permanent.ShowingPermanentCard);
  227. }
  228. }
  229. }
  230. if (candidates.Count >= 1)
  231. {
  232. GManager.instance.hideCannotSelectObject.SetUpHideCannotSelectObject(candidates, false);
  233. }
  234. CheckEndSelect();
  235. #region 場のパーマネントがクリックされた時の処理
  236. void OnClickFieldPermanentCard(FieldPermanentCard fieldPermanentCard)
  237. {
  238. if (selectedPermanent == fieldPermanentCard.ThisPermanent)
  239. {
  240. selectedPermanent = null;
  241. }
  242. else
  243. {
  244. selectedPermanent = fieldPermanentCard.ThisPermanent;
  245. }
  246. CheckEndSelect();
  247. }
  248. #endregion
  249. #region 選択を終了できるかの判定とアウトライン表示
  250. void CheckEndSelect()
  251. {
  252. #region 終了できるかによってUI表示
  253. if (CanEndSelect(selectedPermanent))
  254. {
  255. }
  256. else
  257. {
  258. }
  259. #endregion
  260. #region アウトライン表示
  261. foreach (Player player in GManager.instance.turnStateMachine.gameContext.Players)
  262. {
  263. foreach (Permanent permanent in player.GetFieldPermanents())
  264. {
  265. permanent.ShowingPermanentCard.RemoveSelectEffect();
  266. if (CanTarget(permanent))
  267. {
  268. if (selectedPermanent == permanent)
  269. {
  270. permanent.ShowingPermanentCard.OnSelectEffect(1.1f);
  271. permanent.ShowingPermanentCard.SetOrangeOutline();
  272. }
  273. else
  274. {
  275. permanent.ShowingPermanentCard.OnSelectEffect(1.1f);
  276. permanent.ShowingPermanentCard.SetBlueOutline();
  277. }
  278. }
  279. }
  280. }
  281. #endregion
  282. if (selectedPermanent == null)
  283. {
  284. if (_canSelectNotAttack)
  285. {
  286. GManager.instance.BackButton.OpenSelectCommandButton("Not Attack", () => { photonView.RPC("SetNotAttack", RpcTarget.All); }, 0);
  287. }
  288. GManager.instance.selectCommandPanel.CloseSelectCommandPanel();
  289. }
  290. else
  291. {
  292. GManager.instance.selectCommandPanel.SetUpCommandButton(new List<Command_SelectCommand>() { new Command_SelectCommand("End Selection", EndSelect_RPC, 0) });
  293. GManager.instance.BackButton.CloseSelectCommandButton();
  294. }
  295. }
  296. #endregion
  297. #region 選択終了
  298. void EndSelect_RPC()
  299. {
  300. foreach (Player player in GManager.instance.turnStateMachine.gameContext.Players)
  301. {
  302. foreach (Permanent permanent in player.GetFieldPermanents())
  303. {
  304. permanent.ShowingPermanentCard.RemoveSelectEffect();
  305. permanent.ShowingPermanentCard.RemoveClickTarget();
  306. }
  307. }
  308. bool isPlayer = true;
  309. bool isTurnPlayer = false;
  310. int PermanentIndex = -1;
  311. if (selectedPermanent != null)
  312. {
  313. if (selectedPermanent.TopCard != null)
  314. {
  315. isPlayer = false;
  316. isTurnPlayer = selectedPermanent.TopCard.Owner == GManager.instance.turnStateMachine.gameContext.TurnPlayer;
  317. PermanentIndex = selectedPermanent.TopCard.Owner.GetFieldPermanents().IndexOf(selectedPermanent);
  318. }
  319. }
  320. photonView.RPC("SetAttackTarget", RpcTarget.All, isPlayer, isTurnPlayer, PermanentIndex);
  321. GManager.instance.BackButton.CloseSelectCommandButton();
  322. }
  323. #endregion
  324. }
  325. else
  326. {
  327. #region メッセージ表示
  328. if (!string.IsNullOrEmpty(_customMessage_Enemy))
  329. {
  330. GManager.instance.commandText.OpenCommandText(_customMessage_Enemy);
  331. }
  332. else
  333. {
  334. GManager.instance.commandText.OpenCommandText("The opponent is selecting the attack target.");
  335. }
  336. #endregion
  337. #region AI
  338. if (GManager.instance.IsAI)
  339. {
  340. List<Permanent> AttackcTargetCandidates = new List<Permanent>();
  341. foreach (Player player in GManager.instance.turnStateMachine.gameContext.Players_ForTurnPlayer)
  342. {
  343. foreach (Permanent permanent in player.GetFieldPermanents())
  344. {
  345. if (CanTarget(permanent))
  346. {
  347. AttackcTargetCandidates.Add(permanent);
  348. }
  349. }
  350. }
  351. Permanent selectedPermanent = null;
  352. if (AttackcTargetCandidates.Count >= 1)
  353. {
  354. if (!_attacker.CanAttackTargetDigimon(null, _cardEffect, _withoutTap) || (_attacker.TopCard.Owner.Enemy.SecurityCards.Count >= 3 && RandomUtility.IsSucceedProbability(0.5f)))
  355. {
  356. selectedPermanent = AttackcTargetCandidates[UnityEngine.Random.Range(0, AttackcTargetCandidates.Count)];
  357. }
  358. }
  359. bool isPlayer = true;
  360. bool isTurnPlayer = false;
  361. int PermanentIndex = -1;
  362. if (selectedPermanent != null)
  363. {
  364. if (selectedPermanent.TopCard != null)
  365. {
  366. isPlayer = false;
  367. isTurnPlayer = selectedPermanent.TopCard.Owner == GManager.instance.turnStateMachine.gameContext.TurnPlayer;
  368. PermanentIndex = selectedPermanent.TopCard.Owner.GetFieldPermanents().IndexOf(selectedPermanent);
  369. }
  370. }
  371. SetAttackTarget(isPlayer, isTurnPlayer, PermanentIndex);
  372. }
  373. #endregion
  374. }
  375. }
  376. }
  377. }
  378. //選択が完了するまで待機
  379. yield return new WaitWhile(() => !_endSelect);
  380. _endSelect = false;
  381. #region リセット
  382. foreach (Player player in GManager.instance.turnStateMachine.gameContext.Players)
  383. {
  384. GManager.instance.turnStateMachine.OffFieldCardTarget(player);
  385. GManager.instance.turnStateMachine.OffHandCardTarget(player);
  386. foreach (Permanent permanent in player.GetFieldPermanents())
  387. {
  388. permanent.ShowingPermanentCard.RemoveSelectEffect();
  389. }
  390. player.securityObject.OffShowSecurityAttackObject();
  391. player.securityObject.RemoveClickTarget();
  392. if (_defender != null || _noSelect)
  393. {
  394. player.securityObject.securityBreakGlass.gameObject.SetActive(false);
  395. }
  396. }
  397. GManager.instance.hideCannotSelectObject.Close();
  398. GManager.instance.selectCommandPanel.CloseSelectCommandPanel();
  399. GManager.instance.BackButton.CloseSelectCommandButton();
  400. GManager.instance.commandText.CloseCommandText();
  401. yield return new WaitWhile(() => GManager.instance.commandText.gameObject.activeSelf);
  402. #endregion
  403. if (!_noSelect)
  404. {
  405. if (CanEndSelect(_defender))
  406. {
  407. yield return ContinuousController.instance.StartCoroutine(GManager.instance.attackProcess.Attack(_attacker, _defender, _cardEffect, _withoutTap, _beforeOnAttackCoroutine));
  408. }
  409. }
  410. }
  411. }
  412. #region 選択決定
  413. [PunRPC]
  414. public void SetAttackTarget(bool isPlayer, bool isTurnPlayer, int PermanentIndex)
  415. {
  416. _defender = null;
  417. if (!isPlayer)
  418. {
  419. Player player = null;
  420. if (isTurnPlayer)
  421. {
  422. player = GManager.instance.turnStateMachine.gameContext.TurnPlayer;
  423. }
  424. else
  425. {
  426. player = GManager.instance.turnStateMachine.gameContext.NonTurnPlayer;
  427. }
  428. Permanent permanent = null;
  429. if (0 <= PermanentIndex && PermanentIndex <= player.GetFieldPermanents().Count - 1)
  430. {
  431. permanent = player.GetFieldPermanents()[PermanentIndex];
  432. }
  433. if (permanent != null)
  434. {
  435. _defender = permanent;
  436. }
  437. }
  438. _endSelect = true;
  439. }
  440. #endregion
  441. #region 選択しない
  442. [PunRPC]
  443. public void SetNotAttack()
  444. {
  445. GManager.instance.selectCommandPanel.CloseSelectCommandPanel();
  446. _defender = null;
  447. _noSelect = true;
  448. _endSelect = true;
  449. }
  450. #endregion
  451. }