From 7fc85a47be505571960f496b1453089e2e53bb43 Mon Sep 17 00:00:00 2001 From: Lyu Zong-Hong Date: Sun, 28 Mar 2021 15:09:01 +0900 Subject: [PATCH] Update Word of Command mana payment check conditions --- .../main/java/forge/ai/ComputerUtilMana.java | 2 +- .../src/main/java/forge/game/ForgeScript.java | 26 ++++++++++++------- .../game/ability/effects/PlayEffect.java | 8 +++++- .../forge/game/spellability/SpellAbility.java | 9 +++++++ .../main/java/forge/game/zone/MagicStack.java | 1 + .../gamemodes/match/input/InputPayMana.java | 6 ++--- .../input/InputPayManaOfCostPayment.java | 4 +++ 7 files changed, 41 insertions(+), 15 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java index 2e7127f7aa0..877a75af6a9 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java @@ -1531,7 +1531,7 @@ public class ComputerUtilMana { public boolean apply(final Card c) { for (final SpellAbility am : getAIPlayableMana(c)) { am.setActivatingPlayer(ai); - if (!checkPlayable || am.canPlay()) { + if (!checkPlayable || (am.canPlay() && am.checkRestrictions(ai))) { return true; } } diff --git a/forge-game/src/main/java/forge/game/ForgeScript.java b/forge-game/src/main/java/forge/game/ForgeScript.java index ac712839495..356b41acf38 100644 --- a/forge-game/src/main/java/forge/game/ForgeScript.java +++ b/forge-game/src/main/java/forge/game/ForgeScript.java @@ -2,12 +2,13 @@ package forge.game; import forge.card.ColorSet; import forge.card.MagicColor; +import forge.card.mana.ManaAtom; import forge.game.ability.AbilityUtils; import forge.game.card.Card; import forge.game.card.CardState; import forge.game.cost.Cost; +import forge.game.mana.ManaCostBeingPaid; import forge.game.player.Player; -import forge.game.spellability.AbilityManaPart; import forge.game.spellability.SpellAbility; import forge.game.staticability.StaticAbility; import forge.util.Expressions; @@ -191,17 +192,24 @@ public class ForgeScript { return false; } } else if (property.equals("ManaAbilityCantPaidFor")) { - if (!sa.isManaAbility()) { + SpellAbility paidFor = sourceController.getPaidForSA(); + if (paidFor == null) { return false; } - SpellAbility paidFor = sourceController.getPaidForSA(); - do { - AbilityManaPart mana = sa.getManaPart(); - if (paidFor != null && mana.meetsManaRestrictions(paidFor) && !mana.getExpressChoice().isEmpty()) { - return false; + ManaCostBeingPaid manaCost = paidFor.getManaCostBeingPaid(); + // The following code is taken from InputPayMana.java, to determine if this mana ability can pay for SA currently being paid + byte colorCanUse = 0; + for (final byte color : ManaAtom.MANATYPES) { + if (manaCost.isAnyPartPayableWith(color, sourceController.getManaPool())) { + colorCanUse |= color; } - sa = sa.getSubAbility(); - } while(sa != null); + } + if (manaCost.isAnyPartPayableWith((byte) ManaAtom.GENERIC, sourceController.getManaPool())) { + colorCanUse |= ManaAtom.GENERIC; + } + if (sa.isManaAbilityFor(paidFor, colorCanUse)) { + return false; + } } else if (sa.getHostCard() != null) { return sa.getHostCard().hasProperty(property, sourceController, source, spellAbility); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java index 4da7d9620ba..4afc6797b24 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java @@ -22,6 +22,7 @@ import forge.game.card.Card; import forge.game.card.CardCollection; import forge.game.card.CardFactoryUtil; import forge.game.cost.Cost; +import forge.game.mana.ManaCostBeingPaid; import forge.game.player.Player; import forge.game.replacement.ReplacementEffect; import forge.game.replacement.ReplacementHandler; @@ -312,7 +313,11 @@ public class PlayEffect extends SpellAbilityEffect { tgtSA.setSVar("IsCastFromPlayEffect", "True"); // Add controlled by player to target SA so when the spell is resolving, the controller would be changed again - tgtSA.setControlledByPlayer(controlledByTimeStamp, controlledByPlayer); + if (controlledByPlayer != null) { + tgtSA.setControlledByPlayer(controlledByTimeStamp, controlledByPlayer); + activator.pushPaidForSA(tgtSA); + tgtSA.setManaCostBeingPaid(new ManaCostBeingPaid(tgtSA.getPayCosts().getCostMana().getManaCostFor(tgtSA), tgtSA.getPayCosts().getCostMana().getRestiction())); + } if (controller.getController().playSaFromPlayEffect(tgtSA)) { if (remember) { @@ -335,6 +340,7 @@ public class PlayEffect extends SpellAbilityEffect { // Remove controlled by player if any if (controlledByPlayer != null) { activator.removeController(controlledByTimeStamp); + activator.popPaidForSA(); } } // end resolve diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java index 84617e32ce2..cd0e1746df2 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -63,6 +63,7 @@ import forge.game.cost.CostRemoveCounter; import forge.game.event.GameEventCardStatsChanged; import forge.game.keyword.Keyword; import forge.game.mana.Mana; +import forge.game.mana.ManaCostBeingPaid; import forge.game.player.Player; import forge.game.player.PlayerCollection; import forge.game.replacement.ReplacementEffect; @@ -110,6 +111,7 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit private Player activatingPlayer = null; private Player targetingPlayer = null; private Pair controlledByPlayer = null; + private ManaCostBeingPaid manaCostBeingPaid = null; private SpellAbility grantorOriginal = null; private StaticAbility grantorStatic = null; @@ -474,6 +476,13 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit } } + public ManaCostBeingPaid getManaCostBeingPaid() { + return manaCostBeingPaid; + } + public void setManaCostBeingPaid(ManaCostBeingPaid costBeingPaid) { + manaCostBeingPaid = costBeingPaid; + } + public boolean isSpell() { return false; } public boolean isAbility() { return true; } public boolean isActivatedAbility() { return false; } diff --git a/forge-game/src/main/java/forge/game/zone/MagicStack.java b/forge-game/src/main/java/forge/game/zone/MagicStack.java index 64cda5bb6c0..c5dc7e71a3b 100644 --- a/forge-game/src/main/java/forge/game/zone/MagicStack.java +++ b/forge-game/src/main/java/forge/game/zone/MagicStack.java @@ -518,6 +518,7 @@ public class MagicStack /* extends MyObservable */ implements Iterable