Engage.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. using System.Collections;
  2. using System;
  3. public partial class CardEffectCommons
  4. {
  5. #region Can activate [Engage]
  6. public static bool CanActivateEngage(CardSource cardSource, ICardEffect activateClass)
  7. {
  8. return IsExistOnBattleArea(cardSource)
  9. && cardSource.PermanentOfThisCard().CanAttack(activateClass)
  10. && !GManager.instance.attackProcess.IsAttacking;
  11. }
  12. #endregion
  13. #region Effect process of [Engage]
  14. public static IEnumerator EngageProcess(CardSource cardSource, ICardEffect activateClass, Func<IEnumerator> beforeOnAttackCoroutine = null)
  15. {
  16. if (CanActivateEngage(cardSource, activateClass))
  17. {
  18. SelectAttackEffect selectAttackEffect = GManager.instance.GetComponent<SelectAttackEffect>();
  19. selectAttackEffect.SetUp(
  20. attacker: cardSource.PermanentOfThisCard(),
  21. canAttackPlayerCondition: () => true,
  22. defenderCondition: (permanent) => true,
  23. cardEffect: activateClass);
  24. selectAttackEffect.SetBeforeOnAttackCoroutine(beforeOnAttackCoroutine);
  25. yield return ContinuousController.instance.StartCoroutine(selectAttackEffect.Activate());
  26. }
  27. }
  28. #endregion
  29. #region Target 1 Digimon gains [Engage]
  30. public static IEnumerator GainEngage(Permanent targetPermanent, EffectDuration effectDuration, ICardEffect activateClass)
  31. {
  32. if (targetPermanent == null) yield break;
  33. if (!IsPermanentExistsOnBattleArea(targetPermanent)) yield break;
  34. if (activateClass == null) yield break;
  35. if (activateClass.EffectSourceCard == null) yield break;
  36. CardSource card = activateClass.EffectSourceCard;
  37. bool CanUseCondition()
  38. {
  39. return IsPermanentExistsOnBattleArea(targetPermanent)
  40. && !targetPermanent.TopCard.CanNotBeAffected(activateClass);
  41. }
  42. ActivateClass engage = CardEffectCommons.EngageEffect(
  43. targetPermanent: targetPermanent,
  44. isInheritedEffect: false,
  45. condition: CanUseCondition,
  46. rootCardEffect: activateClass,
  47. card: targetPermanent.TopCard);
  48. AddEffectToPermanent(
  49. targetPermanent: targetPermanent,
  50. effectDuration: effectDuration,
  51. card: card,
  52. cardEffect: engage,
  53. timing: EffectTiming.OnEndTurn);
  54. if (!targetPermanent.TopCard.CanNotBeAffected(activateClass))
  55. {
  56. yield return ContinuousController.instance.StartCoroutine(GManager.instance.GetComponent<Effects>().CreateBuffEffect(targetPermanent));
  57. }
  58. }
  59. #endregion
  60. #region Trigger effect of [Engage]
  61. public static ActivateClass EngageEffect(
  62. Permanent targetPermanent,
  63. bool isInheritedEffect,
  64. Func<bool> condition,
  65. ICardEffect rootCardEffect,
  66. CardSource card,
  67. Func<IEnumerator> beforeOnAttackCoroutine = null)
  68. {
  69. if (targetPermanent == null) return null;
  70. if (targetPermanent.TopCard == null) return null;
  71. if (card == null) return null;
  72. ActivateClass activateClass = new ActivateClass();
  73. activateClass.SetUpICardEffect("Engage", CanUseCondition, card);
  74. activateClass.SetUpActivateClass(CanActivateCondition, ActivateCoroutine, -1, true, EffectDescription());
  75. activateClass.SetIsInheritedEffect(isInheritedEffect);
  76. string EffectDescription()
  77. {
  78. return $"{DataBase.EngageEffectDescription()}";
  79. }
  80. if (rootCardEffect != null)
  81. {
  82. activateClass.SetIsInheritedEffect(false);
  83. activateClass.SetEffectSourcePermanent(targetPermanent);
  84. activateClass.SetRootCardEffect(rootCardEffect);
  85. }
  86. bool CanUseCondition(Hashtable hashtable)
  87. {
  88. return CardEffectCommons.IsOwnerTurn(card);
  89. }
  90. bool CanActivateCondition(Hashtable hashtable)
  91. {
  92. return CardEffectCommons.CanActivateEngage(targetPermanent.TopCard, activateClass)
  93. && (condition == null
  94. || condition());
  95. }
  96. IEnumerator ActivateCoroutine(Hashtable _hashtable)
  97. {
  98. return CardEffectCommons.EngageProcess(targetPermanent.TopCard, activateClass, beforeOnAttackCoroutine);
  99. }
  100. return activateClass;
  101. }
  102. #endregion
  103. }