SelectPermanentEffect.cs 40 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009
  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 SelectPermanentEffect : MonoBehaviourPunCallbacks
  8. {
  9. public void SetUp
  10. (Player selectPlayer,
  11. Func<Permanent, bool> canTargetCondition,
  12. Func<List<Permanent>, Permanent, bool> canTargetCondition_ByPreSelecetedList,
  13. Func<List<Permanent>, bool> canEndSelectCondition,
  14. int maxCount,
  15. bool canNoSelect,
  16. bool canEndNotMax,
  17. Func<Permanent, IEnumerator> selectPermanentCoroutine,
  18. Func<List<Permanent>, IEnumerator> afterSelectPermanentCoroutine,
  19. Mode mode,
  20. ICardEffect cardEffect)
  21. {
  22. _selectPlayer = selectPlayer;
  23. _canTargetCondition = canTargetCondition;
  24. _canTargetCondition_ByPreSelecetedList = canTargetCondition_ByPreSelecetedList;
  25. _canEndSelectCondition = canEndSelectCondition;
  26. _maxCount = maxCount;
  27. _canNoSelect = canNoSelect;
  28. _canEndNotMax = canEndNotMax;
  29. _selectPermanentCoroutine = selectPermanentCoroutine;
  30. _afterSelectPermanentCoroutine = afterSelectPermanentCoroutine;
  31. _mode = mode;
  32. _cardEffect = cardEffect;
  33. _isLocal = false;
  34. _isdigiXros = false;
  35. _customMessage = null;
  36. _customMessage_Enemy = null;
  37. _customBackButtonMessage = null;
  38. _degenerationCount = 1;
  39. }
  40. public void SetIsLocal()
  41. {
  42. _isLocal = true;
  43. }
  44. public void SetDigiXros()
  45. {
  46. _isdigiXros = true;
  47. }
  48. public void SetUpCustomMessage(string CustomMessage = "", string CustomMessage_Enemy = "", string[] customMessageArray = null)
  49. {
  50. _customMessage = CustomMessage;
  51. _customMessage_Enemy = CustomMessage_Enemy;
  52. if (customMessageArray != null)
  53. {
  54. if (customMessageArray.Length == 2)
  55. {
  56. _customMessage = customMessageArray[0];
  57. _customMessage_Enemy = customMessageArray[1];
  58. }
  59. }
  60. }
  61. public void SetUpCustomBackButtonMessage(string CustomBackButtonMessage)
  62. {
  63. _customBackButtonMessage = CustomBackButtonMessage;
  64. }
  65. public void SetDegenerationCount(int degenerationCount)
  66. {
  67. _degenerationCount = degenerationCount;
  68. }
  69. public void SetCanNotAttackPlayer()
  70. {
  71. _canAttackPlayer = false;
  72. }
  73. public void SetDefenderCondition(Func<Permanent, bool> defenderCondition)
  74. {
  75. _defenderCondition = defenderCondition;
  76. }
  77. //Player to select
  78. Player _selectPlayer = null;
  79. //Conditions of units that can be selected
  80. Func<Permanent, bool> _canTargetCondition = null;
  81. //Whether the unit can be selected with the current selection list status
  82. Func<List<Permanent>, Permanent, bool> _canTargetCondition_ByPreSelecetedList = null;
  83. //Conditions under which a selection can be terminated (see list of selection termination points)
  84. Func<List<Permanent>, bool> _canEndSelectCondition = null;
  85. //Maximum number of sheets to be selected
  86. int _maxCount = 0;
  87. //Whether you can choose not to choose
  88. bool _canNoSelect = false;
  89. //Can you finish your selection with less than the maximum number?
  90. bool _canEndNotMax = false;
  91. //(Limited to Mode.Custom) Processing to be performed by selecting
  92. Func<Permanent, IEnumerator> _selectPermanentCoroutine = null;
  93. //選択した後にする処理
  94. Func<List<Permanent>, IEnumerator> _afterSelectPermanentCoroutine = null;
  95. //Classification of processing to be done by selection
  96. Mode _mode = Mode.Custom;
  97. //Skill in making unit selections
  98. ICardEffect _cardEffect = null;
  99. bool _isLocal = false;
  100. bool _isdigiXros = false;
  101. int _degenerationCount = 1;
  102. bool _canAttackPlayer = true;
  103. Func<Permanent, bool> _defenderCondition = (permanent) => true;
  104. public enum Mode
  105. {
  106. Tap,
  107. UnTap,
  108. Destroy,
  109. Bounce,
  110. PutLibraryBottom,
  111. PutLibraryTop,
  112. Degenerate,
  113. Attack,
  114. Custom
  115. }
  116. //Selected unit list
  117. List<Permanent> _targetPermanents = new List<Permanent>();
  118. //No Selection Flag
  119. public bool _noSelect = false;
  120. bool _endSelect = false;
  121. string _customMessage = null;
  122. string _customMessage_Enemy = null;
  123. string _customBackButtonMessage = null;
  124. bool CanTarget(Permanent permanent)
  125. {
  126. if (_cardEffect != null)
  127. {
  128. if (permanent.TopCard != null)
  129. {
  130. if (_cardEffect.EffectSourceCard != null)
  131. {
  132. if (permanent.TopCard.Owner != _cardEffect.EffectSourceCard.Owner && permanent.TopCard.Owner != _selectPlayer)
  133. {
  134. if (!permanent.CanSelectBySkill(_cardEffect))
  135. {
  136. return false;
  137. }
  138. }
  139. }
  140. }
  141. }
  142. if (_canTargetCondition != null)
  143. {
  144. if (_canTargetCondition(permanent))
  145. {
  146. return !permanent.TopCard.IsFlipped;
  147. }
  148. }
  149. return false;
  150. }
  151. #region 選択が可能かどうか
  152. public bool active()
  153. {
  154. List<Permanent> CanSelectedPermanets = new List<Permanent>();
  155. foreach (Player player in GManager.instance.turnStateMachine.gameContext.Players)
  156. {
  157. foreach (Permanent permanent in player.GetFieldPermanents())
  158. {
  159. if (CanTarget(permanent))
  160. {
  161. CanSelectedPermanets.Add(permanent);
  162. }
  163. }
  164. }
  165. if (CanSelectedPermanets.Count == 0)
  166. {
  167. return false;
  168. }
  169. if (!_canNoSelect && !_canEndNotMax)
  170. {
  171. if (CanSelectedPermanets.Count < _maxCount)
  172. {
  173. return false;
  174. }
  175. List<Permanent[]> permanentsList = ParameterComparer.Enumerate(CanSelectedPermanets, _maxCount).ToList();
  176. if (permanentsList.Count((permanents) => CanEndSelect(permanents.ToList())) == 0)
  177. {
  178. return false;
  179. }
  180. }
  181. return true;
  182. }
  183. #endregion
  184. #region 終了できるか判定
  185. bool CanEndSelect(List<Permanent> permanents)
  186. {
  187. //選択枚数が必要枚数に達していない場合
  188. if (!(permanents.Count == _maxCount || (permanents.Count <= _maxCount && _canEndNotMax)))
  189. {
  190. return false;
  191. }
  192. //特定の条件により失敗
  193. if (_canEndSelectCondition != null)
  194. {
  195. if (!_canEndSelectCondition(permanents))
  196. {
  197. return false;
  198. }
  199. }
  200. return true;
  201. }
  202. #endregion
  203. public IEnumerator Activate()
  204. {
  205. bool oldIsSelecting = GManager.instance.turnStateMachine.IsSelecting;
  206. _targetPermanents = new List<Permanent>();
  207. List<Permanent> destroyPermanents = new List<Permanent>();
  208. List<Permanent> tapPermanents = new List<Permanent>();
  209. List<Permanent> untapPermanents = new List<Permanent>();
  210. List<Permanent> libraryBottomPermanents = new List<Permanent>();
  211. List<Permanent> libraryTopPermanents = new List<Permanent>();
  212. List<Permanent> handBouncePermanents = new List<Permanent>();
  213. List<Permanent> degeneratePermanents = new List<Permanent>();
  214. List<Permanent> attackPermanents = new List<Permanent>();
  215. _noSelect = false;
  216. if (active())
  217. {
  218. #region Show trash cards
  219. if (_cardEffect != null)
  220. {
  221. if (_cardEffect.EffectSourceCard != null)
  222. {
  223. if (_cardEffect.EffectSourceCard.Owner.TrashCards.Contains(_cardEffect.EffectSourceCard) || _cardEffect.EffectSourceCard.Owner.LostCards.Contains(_cardEffect.EffectSourceCard))
  224. {
  225. if (_cardEffect.EffectSourceCard.Owner.TrashHandCard != null)
  226. {
  227. if (!_cardEffect.EffectSourceCard.Owner.TrashHandCard.gameObject.activeSelf)
  228. {
  229. _cardEffect.EffectSourceCard.Owner.TrashHandCard.gameObject.SetActive(true);
  230. _cardEffect.EffectSourceCard.Owner.TrashHandCard.SetUpHandCard(_cardEffect.EffectSourceCard);
  231. _cardEffect.EffectSourceCard.Owner.TrashHandCard.SetUpHandCardImage();
  232. _cardEffect.EffectSourceCard.Owner.TrashHandCard.OnOutline();
  233. _cardEffect.EffectSourceCard.Owner.TrashHandCard.SetBlueOutline();
  234. _cardEffect.EffectSourceCard.Owner.TrashHandCard.transform.localScale = new Vector3(1.4f, 1.4f, 1.4f);
  235. }
  236. }
  237. }
  238. }
  239. }
  240. #endregion
  241. if (!_isLocal)
  242. {
  243. yield return GManager.instance.photonWaitController.StartWait("SelectPermanentEffect");
  244. }
  245. foreach (Player player in GManager.instance.turnStateMachine.gameContext.Players)
  246. {
  247. GManager.instance.turnStateMachine.OffFieldCardTarget(player);
  248. GManager.instance.turnStateMachine.OffHandCardTarget(player);
  249. }
  250. GManager.instance.turnStateMachine.IsSelecting = true;
  251. if (_selectPlayer.isYou)
  252. {
  253. #region Message display
  254. if (!string.IsNullOrEmpty(_customMessage))
  255. {
  256. GManager.instance.commandText.OpenCommandText(_customMessage, _isdigiXros);
  257. }
  258. else
  259. {
  260. string message = "";
  261. switch (_mode)
  262. {
  263. case Mode.Tap:
  264. message = "Select cards to suspend.";
  265. break;
  266. case Mode.UnTap:
  267. message = "Select cards to unsuspend.";
  268. break;
  269. case Mode.Destroy:
  270. message = "Select cards to delete.";
  271. break;
  272. case Mode.Bounce:
  273. message = "Select cards to return to hand.";
  274. break;
  275. case Mode.PutLibraryBottom:
  276. message = "Select cards to put on bottom of the deck.";
  277. break;
  278. case Mode.PutLibraryTop:
  279. message = "Select cards to put on top of the deck.";
  280. break;
  281. case Mode.Degenerate:
  282. message = $"Select cards to De-Digivolve {_degenerationCount}.";
  283. break;
  284. case Mode.Attack:
  285. message = "Select a Digimon to attack with.";
  286. break;
  287. case Mode.Custom:
  288. message = "Select cards.";
  289. break;
  290. }
  291. if (!string.IsNullOrEmpty(message))
  292. {
  293. GManager.instance.commandText.OpenCommandText(message, _isdigiXros);
  294. }
  295. }
  296. #endregion
  297. List<Permanent> PreSelectedPermanents = new List<Permanent>();
  298. bool forcesSelection = false;
  299. #region forced selection
  300. if (!_canNoSelect && !_canEndNotMax)
  301. {
  302. int canSelectCount = 0;
  303. foreach (Player player in GManager.instance.turnStateMachine.gameContext.Players)
  304. {
  305. foreach (Permanent chara in player.GetFieldPermanents())
  306. {
  307. if (CanTarget(chara))
  308. {
  309. canSelectCount++;
  310. }
  311. }
  312. }
  313. if (canSelectCount == _maxCount)
  314. {
  315. foreach (Player player in GManager.instance.turnStateMachine.gameContext.Players)
  316. {
  317. foreach (Permanent chara in player.GetFieldPermanents())
  318. {
  319. if (CanTarget(chara))
  320. {
  321. PreSelectedPermanents.Add(chara);
  322. }
  323. }
  324. }
  325. forcesSelection = true;
  326. EndSelect_RPC();
  327. }
  328. }
  329. #endregion
  330. if (!forcesSelection)
  331. {
  332. GManager.instance.sideBar.SetUpSideBar();
  333. List<FieldPermanentCard> candidates = new List<FieldPermanentCard>();
  334. foreach (Player player in GManager.instance.turnStateMachine.gameContext.Players)
  335. {
  336. foreach (Permanent permanent in player.GetFieldPermanents())
  337. {
  338. if (CanTarget(permanent))
  339. {
  340. permanent.ShowingPermanentCard.AddClickTarget(OnClickFieldPermanentCard);
  341. candidates.Add(permanent.ShowingPermanentCard);
  342. }
  343. }
  344. }
  345. if (candidates.Count >= 1)
  346. {
  347. GManager.instance.hideCannotSelectObject.SetUpHideCannotSelectObject(candidates, false);
  348. }
  349. CheckEndSelect();
  350. #region Processing when a permanent on the field is clicked
  351. void OnClickFieldPermanentCard(FieldPermanentCard feldPermanentCard)
  352. {
  353. if (PreSelectedPermanents.Contains(feldPermanentCard.ThisPermanent))
  354. {
  355. PreSelectedPermanents.Remove(feldPermanentCard.ThisPermanent);
  356. }
  357. else
  358. {
  359. bool CanNotSelected = false;
  360. if (_canTargetCondition_ByPreSelecetedList != null)
  361. {
  362. if (!_canTargetCondition_ByPreSelecetedList(PreSelectedPermanents, feldPermanentCard.ThisPermanent))
  363. {
  364. CanNotSelected = true;
  365. }
  366. }
  367. if (CanNotSelected)
  368. {
  369. return;
  370. }
  371. if (PreSelectedPermanents.Count < _maxCount)
  372. {
  373. PreSelectedPermanents.Add(feldPermanentCard.ThisPermanent);
  374. }
  375. else
  376. {
  377. if (PreSelectedPermanents.Count > 0)
  378. {
  379. PreSelectedPermanents.RemoveAt(PreSelectedPermanents.Count - 1);
  380. PreSelectedPermanents.Add(feldPermanentCard.ThisPermanent);
  381. }
  382. }
  383. if (!ContinuousController.instance.checkBeforeEndingSelection
  384. && !_canNoSelect
  385. && !_canEndNotMax
  386. && _maxCount == PreSelectedPermanents.Count)
  387. {
  388. EndSelect_RPC();
  389. return;
  390. }
  391. }
  392. CheckEndSelect();
  393. }
  394. #endregion
  395. #region Determining whether the selection can be completed and displaying the outline
  396. void CheckEndSelect()
  397. {
  398. #region UI display depending on whether it can be terminated
  399. if (CanEndSelect(PreSelectedPermanents))
  400. {
  401. GManager.instance.selectCommandPanel.SetUpCommandButton(new List<Command_SelectCommand>()
  402. {
  403. new Command_SelectCommand("End Selection", EndSelect_RPC, 0)
  404. });
  405. }
  406. else
  407. {
  408. GManager.instance.selectCommandPanel.Off(false);
  409. GManager.instance.sideBar.SetUpSideBar();
  410. }
  411. #endregion
  412. #region Outline display by selection list
  413. foreach (Player player in GManager.instance.turnStateMachine.gameContext.Players)
  414. {
  415. foreach (Permanent permanent in player.GetFieldPermanents())
  416. {
  417. permanent.ShowingPermanentCard.RemoveSelectEffect();
  418. if (CanTarget(permanent))
  419. {
  420. if (PreSelectedPermanents.Contains(permanent))
  421. {
  422. permanent.ShowingPermanentCard.OnSelectEffect(1.1f);
  423. permanent.ShowingPermanentCard.SetOrangeOutline();
  424. }
  425. else
  426. {
  427. permanent.ShowingPermanentCard.OnSelectEffect(1.1f);
  428. permanent.ShowingPermanentCard.SetBlueOutline();
  429. bool CanNotSelected = false;
  430. if (_canTargetCondition_ByPreSelecetedList != null)
  431. {
  432. if (!_canTargetCondition_ByPreSelecetedList(PreSelectedPermanents, permanent))
  433. {
  434. CanNotSelected = true;
  435. }
  436. }
  437. if (CanNotSelected)
  438. {
  439. permanent.ShowingPermanentCard.RemoveSelectEffect();
  440. }
  441. }
  442. }
  443. }
  444. }
  445. #endregion
  446. if (PreSelectedPermanents.Count >= 1)
  447. {
  448. GManager.instance.BackButton.CloseSelectCommandButton();
  449. }
  450. else
  451. {
  452. if (_canNoSelect)
  453. {
  454. string backButtonMessage = "No Selection";
  455. if (!string.IsNullOrEmpty(_customBackButtonMessage))
  456. {
  457. backButtonMessage = _customBackButtonMessage;
  458. }
  459. GManager.instance.BackButton.OpenSelectCommandButton(backButtonMessage, () => NoSelect_RPC(), 0);
  460. void NoSelect_RPC()
  461. {
  462. if (!_isLocal)
  463. {
  464. photonView.RPC("SetNoSelectChara", RpcTarget.All);
  465. }
  466. else
  467. {
  468. SetNoSelectChara();
  469. }
  470. }
  471. }
  472. }
  473. GManager.instance.sideBar.SetUpSideBar();
  474. }
  475. #endregion
  476. }
  477. #region Selection finished
  478. void EndSelect_RPC()
  479. {
  480. foreach (Player player in GManager.instance.turnStateMachine.gameContext.Players)
  481. {
  482. foreach (Permanent unit in player.GetFieldPermanents())
  483. {
  484. unit.ShowingPermanentCard.RemoveSelectEffect();
  485. unit.ShowingPermanentCard.RemoveClickTarget();
  486. }
  487. }
  488. List<bool> isTurnPlayer = new List<bool>();
  489. List<int> CharaIndex = new List<int>();
  490. foreach (Permanent chara in PreSelectedPermanents)
  491. {
  492. isTurnPlayer.Add(chara.TopCard.Owner == GManager.instance.turnStateMachine.gameContext.TurnPlayer);
  493. CharaIndex.Add(chara.TopCard.Owner.GetFieldPermanents().IndexOf(chara));
  494. }
  495. if (!_isLocal)
  496. {
  497. photonView.RPC("SetTargetFrames", RpcTarget.All, isTurnPlayer.ToArray(), CharaIndex.ToArray());
  498. }
  499. else
  500. {
  501. SetTargetFrames(isTurnPlayer.ToArray(), CharaIndex.ToArray());
  502. }
  503. GManager.instance.BackButton.CloseSelectCommandButton();
  504. }
  505. #endregion
  506. }
  507. else
  508. {
  509. #region Message display
  510. if (!string.IsNullOrEmpty(_customMessage_Enemy))
  511. {
  512. GManager.instance.commandText.OpenCommandText(_customMessage_Enemy, _isdigiXros);
  513. }
  514. else
  515. {
  516. GManager.instance.commandText.OpenCommandText("The opponent is selecting cards.", _isdigiXros);
  517. }
  518. #endregion
  519. #region AI
  520. if (GManager.instance.IsAI)
  521. {
  522. List<Permanent> ValidCharas = new List<Permanent>();
  523. foreach (Player player in GManager.instance.turnStateMachine.gameContext.Players_ForTurnPlayer)
  524. {
  525. foreach (Permanent unit in player.GetFieldPermanents())
  526. {
  527. if (_canTargetCondition(unit))
  528. {
  529. ValidCharas.Add(unit);
  530. }
  531. }
  532. }
  533. IList<int> indexList = Enumerable.Range(0, ValidCharas.Count).ToList();
  534. if (ValidCharas.Count >= _maxCount)
  535. {
  536. for (int i = 0; i < 200; i++)
  537. {
  538. List<int> GetIndexes = indexList.GetRandom(_maxCount).ToList();
  539. List<Permanent> GetCharas = new List<Permanent>();
  540. foreach (int index in GetIndexes)
  541. {
  542. GetCharas.Add(ValidCharas[index]);
  543. }
  544. if (_canEndSelectCondition != null)
  545. {
  546. if (!_canEndSelectCondition(GetCharas))
  547. {
  548. continue;
  549. }
  550. }
  551. List<bool> isTurnPlayer = new List<bool>();
  552. List<int> UnitIDs = new List<int>();
  553. foreach (Permanent chara in GetCharas)
  554. {
  555. if (chara.TopCard != null)
  556. {
  557. isTurnPlayer.Add(chara.TopCard.Owner == GManager.instance.turnStateMachine.gameContext.TurnPlayer);
  558. UnitIDs.Add(chara.TopCard.Owner.GetFieldPermanents().IndexOf(chara));
  559. }
  560. }
  561. SetTargetFrames(isTurnPlayer.ToArray(), UnitIDs.ToArray());
  562. break;
  563. }
  564. }
  565. _endSelect = true;
  566. }
  567. #endregion
  568. }
  569. //Wait until selection is complete
  570. yield return new WaitWhile(() => !_endSelect);
  571. _endSelect = false;
  572. #region reset
  573. foreach (Player player in GManager.instance.turnStateMachine.gameContext.Players)
  574. {
  575. GManager.instance.turnStateMachine.OffFieldCardTarget(player);
  576. GManager.instance.turnStateMachine.OffHandCardTarget(player);
  577. foreach (Permanent chara in player.GetFieldPermanents())
  578. {
  579. chara.ShowingPermanentCard.RemoveSelectEffect();
  580. }
  581. }
  582. GManager.instance.hideCannotSelectObject.Close();
  583. GManager.instance.selectCommandPanel.CloseSelectCommandPanel();
  584. GManager.instance.BackButton.CloseSelectCommandButton();
  585. GManager.instance.commandText.CloseCommandText();
  586. yield return new WaitWhile(() => GManager.instance.commandText.gameObject.activeSelf);
  587. GManager.instance.sideBar.OffSideBar();
  588. #endregion
  589. if (CanEndSelect(_targetPermanents))
  590. {
  591. Hashtable hashtable = new Hashtable();
  592. hashtable.Add("CardEffect", _cardEffect);
  593. if (!_noSelect)
  594. {
  595. string log = "";
  596. log += $"\nSelected Cards:";
  597. foreach (Permanent targetPermanent in _targetPermanents)
  598. {
  599. log += $"\n{targetPermanent.TopCard.BaseENGCardNameFromEntity}({targetPermanent.TopCard.CardID})";
  600. FieldPermanentCard fieldPermanentCard = targetPermanent.ShowingPermanentCard;
  601. fieldPermanentCard.OnSelectEffect(1.1f);
  602. #region target arrow display
  603. if (_cardEffect != null)
  604. {
  605. if (_cardEffect.EffectSourceCard != null)
  606. {
  607. if (_cardEffect.EffectSourceCard.PermanentOfThisCard() == null)
  608. {
  609. #region processing area card
  610. if (_cardEffect.EffectSourceCard.Owner.ExecutingCards.Contains(_cardEffect.EffectSourceCard) || _cardEffect.EffectSourceCard.Owner.brainStormObject.BrainStormHandCards.Count((handCard) => handCard.cardSource == _cardEffect.EffectSourceCard && handCard.gameObject.activeSelf) >= 1)
  611. {
  612. if (_cardEffect.EffectSourceCard.Owner.isYou)
  613. {
  614. yield return GManager.instance.OnTargetArrow(
  615. new Vector3(-840, -100, 0),
  616. fieldPermanentCard.GetLocalCanvasPosition() + fieldPermanentCard.ThisPermanent.TopCard.Owner.playerUIObjectParent.localPosition,
  617. null,
  618. null);
  619. }
  620. else
  621. {
  622. yield return GManager.instance.OnTargetArrow(
  623. new Vector3(810, 240, 0),
  624. fieldPermanentCard.GetLocalCanvasPosition() + fieldPermanentCard.ThisPermanent.TopCard.Owner.playerUIObjectParent.localPosition,
  625. null,
  626. null);
  627. }
  628. }
  629. #endregion
  630. #region Cards in the trash or lost zone or deck
  631. else if (_cardEffect.EffectSourceCard.Owner.TrashCards.Contains(_cardEffect.EffectSourceCard) || _cardEffect.EffectSourceCard.Owner.LostCards.Contains(_cardEffect.EffectSourceCard) || _cardEffect.EffectSourceCard.Owner.LibraryCards.Contains(_cardEffect.EffectSourceCard))
  632. {
  633. if (_cardEffect.EffectSourceCard.Owner.isYou)
  634. {
  635. yield return GManager.instance.OnTargetArrow(
  636. new Vector3(725, -220, 0),
  637. fieldPermanentCard.GetLocalCanvasPosition() + fieldPermanentCard.ThisPermanent.TopCard.Owner.playerUIObjectParent.localPosition,
  638. null,
  639. null);
  640. }
  641. else
  642. {
  643. yield return GManager.instance.OnTargetArrow(
  644. new Vector3(-684, 287, 0),
  645. fieldPermanentCard.GetLocalCanvasPosition() + fieldPermanentCard.ThisPermanent.TopCard.Owner.playerUIObjectParent.localPosition,
  646. null,
  647. null);
  648. }
  649. }
  650. #endregion
  651. #region cards in hand
  652. else if (_cardEffect.EffectSourceCard.Owner.HandCards.Contains(_cardEffect.EffectSourceCard) && (_cardEffect.IsDeclarative || _cardEffect.EffectName.Contains("Digisorption")))
  653. {
  654. if (_cardEffect.EffectSourceCard.Owner.isYou)
  655. {
  656. yield return GManager.instance.OnTargetArrow(
  657. new Vector3(0, -380, 0),
  658. fieldPermanentCard.GetLocalCanvasPosition() + fieldPermanentCard.ThisPermanent.TopCard.Owner.playerUIObjectParent.localPosition,
  659. null,
  660. null);
  661. }
  662. else
  663. {
  664. yield return GManager.instance.OnTargetArrow(
  665. new Vector3(0, 480, 0),
  666. fieldPermanentCard.GetLocalCanvasPosition() + fieldPermanentCard.ThisPermanent.TopCard.Owner.playerUIObjectParent.localPosition,
  667. null,
  668. null);
  669. }
  670. }
  671. #endregion
  672. #region Other area cards
  673. else
  674. {
  675. }
  676. #endregion
  677. }
  678. else
  679. {
  680. #region character card in place
  681. if (_cardEffect.EffectSourceCard.PermanentOfThisCard().ShowingPermanentCard != null)
  682. {
  683. yield return GManager.instance.OnTargetArrow(
  684. _cardEffect.EffectSourceCard.PermanentOfThisCard().ShowingPermanentCard.GetLocalCanvasPosition() + _cardEffect.EffectSourceCard.Owner.playerUIObjectParent.localPosition,
  685. fieldPermanentCard.GetLocalCanvasPosition() + fieldPermanentCard.ThisPermanent.TopCard.Owner.playerUIObjectParent.localPosition,
  686. _cardEffect.EffectSourceCard.PermanentOfThisCard().ShowingPermanentCard,
  687. fieldPermanentCard);
  688. }
  689. #endregion
  690. }
  691. }
  692. }
  693. yield return new WaitForSeconds(0.2f);
  694. #endregion
  695. #region Perform processing on the selected unit
  696. if (_selectPermanentCoroutine != null)
  697. {
  698. yield return StartCoroutine(_selectPermanentCoroutine(targetPermanent));
  699. }
  700. switch (_mode)
  701. {
  702. case Mode.Tap:
  703. tapPermanents.Add(targetPermanent);
  704. break;
  705. case Mode.UnTap:
  706. untapPermanents.Add(targetPermanent);
  707. break;
  708. case Mode.Destroy:
  709. destroyPermanents.Add(targetPermanent);
  710. break;
  711. case Mode.Bounce:
  712. handBouncePermanents.Add(targetPermanent);
  713. break;
  714. case Mode.PutLibraryBottom:
  715. libraryBottomPermanents.Add(targetPermanent);
  716. break;
  717. case Mode.PutLibraryTop:
  718. libraryTopPermanents.Add(targetPermanent);
  719. break;
  720. case Mode.Degenerate:
  721. degeneratePermanents.Add(targetPermanent);
  722. break;
  723. case Mode.Attack:
  724. attackPermanents.Add(targetPermanent);
  725. break;
  726. }
  727. #endregion
  728. for (int i = 0; i < 1; i++)
  729. {
  730. GManager.instance.OffTargetArrow();
  731. yield return new WaitForSeconds(Time.deltaTime);
  732. }
  733. if (fieldPermanentCard != null)
  734. {
  735. fieldPermanentCard.RemoveSelectEffect();
  736. }
  737. }
  738. #region Add log
  739. if (_targetPermanents.Count >= 1)
  740. {
  741. log += "\n";
  742. PlayLog.OnAddLog?.Invoke(log);
  743. }
  744. #endregion
  745. if (destroyPermanents.Count > 0)
  746. {
  747. yield return ContinuousController.instance.StartCoroutine(new DestroyPermanentsClass(destroyPermanents, hashtable).Destroy());
  748. }
  749. if (tapPermanents.Count > 0)
  750. {
  751. yield return ContinuousController.instance.StartCoroutine(new SuspendPermanentsClass(tapPermanents, hashtable).Tap());
  752. }
  753. if (untapPermanents.Count > 0)
  754. {
  755. yield return ContinuousController.instance.StartCoroutine(new IUnsuspendPermanents(untapPermanents, _cardEffect).Unsuspend());
  756. }
  757. if (libraryBottomPermanents.Count > 0)
  758. {
  759. yield return ContinuousController.instance.StartCoroutine(new DeckBottomBounceClass(libraryBottomPermanents, hashtable).DeckBounce());
  760. }
  761. if (libraryTopPermanents.Count > 0)
  762. {
  763. yield return ContinuousController.instance.StartCoroutine(new DeckTopBounceClass(libraryTopPermanents, hashtable).DeckBounce());
  764. }
  765. if (handBouncePermanents.Count > 0)
  766. {
  767. yield return ContinuousController.instance.StartCoroutine(new HandBounceClaass(handBouncePermanents, hashtable).Bounce());
  768. }
  769. if (degeneratePermanents.Count > 0)
  770. {
  771. foreach (Permanent selectedPermanent in degeneratePermanents)
  772. {
  773. yield return ContinuousController.instance.StartCoroutine(new IDegeneration(selectedPermanent, _degenerationCount, _cardEffect).Degeneration());
  774. }
  775. }
  776. if (attackPermanents.Count > 0)
  777. {
  778. foreach (Permanent selectedPermanent in degeneratePermanents)
  779. {
  780. if (selectedPermanent.CanAttack(_cardEffect))
  781. {
  782. SelectAttackEffect selectAttackEffect = GManager.instance.GetComponent<SelectAttackEffect>();
  783. selectAttackEffect.SetUp(
  784. attacker: selectedPermanent,
  785. canAttackPlayerCondition: () => _canAttackPlayer,
  786. defenderCondition: _defenderCondition,
  787. cardEffect: _cardEffect);
  788. if (!_canNoSelect) selectAttackEffect.SetCanNotSelectNotAttack();
  789. yield return ContinuousController.instance.StartCoroutine(selectAttackEffect.Activate());
  790. }
  791. }
  792. }
  793. }
  794. }
  795. }
  796. if (_afterSelectPermanentCoroutine != null)
  797. {
  798. yield return StartCoroutine(_afterSelectPermanentCoroutine(_targetPermanents));
  799. }
  800. GManager.instance.turnStateMachine.IsSelecting = oldIsSelecting;
  801. }
  802. #region 選択決定
  803. [PunRPC]
  804. public void SetTargetFrames(bool[] isTurnPlayer, int[] UnitIndex)
  805. {
  806. _targetPermanents = new List<Permanent>();
  807. for (int i = 0; i < isTurnPlayer.Length; i++)
  808. {
  809. Player player = null;
  810. if (isTurnPlayer[i])
  811. {
  812. player = GManager.instance.turnStateMachine.gameContext.TurnPlayer;
  813. }
  814. else
  815. {
  816. player = GManager.instance.turnStateMachine.gameContext.NonTurnPlayer;
  817. }
  818. Permanent chara = player.GetFieldPermanents()[UnitIndex[i]];
  819. _targetPermanents.Add(chara);
  820. }
  821. _endSelect = true;
  822. }
  823. #endregion
  824. #region 選択しない
  825. [PunRPC]
  826. public void SetNoSelectChara()
  827. {
  828. GManager.instance.selectCommandPanel.CloseSelectCommandPanel();
  829. _targetPermanents = new List<Permanent>();
  830. _noSelect = true;
  831. _endSelect = true;
  832. }
  833. #endregion
  834. }