SelectPermanentEffect.cs 40 KB

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