diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java index 2f39a64fbf5..1c1b88a4313 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java @@ -875,7 +875,7 @@ public class ComputerUtilCost { } } - val = ObjectUtils.min(val, abCost.getMaxForNonManaX(root, ai, false)); + val = ObjectUtils.min(val, abCost.getMaxForNonManaX(root, ai, effect)); if (val != null && val > 0) { // filter cost parts for preferences, don't choose X > than possible preferences diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java index 667aee15d71..30e5a8a8112 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java @@ -768,8 +768,9 @@ public class CountersPutAi extends CountersAi { list = AbilityUtils.getDefinedCards(source, sa.getParam("Defined"), sa); if (amountStr.equals("X") - && root.getXManaCostPaid() != null /* SubAbility on something that already had set PayX, e.g. Endless One ETB counters */ - && sa.hasParam(amountStr) && sa.getSVar(amountStr).equals("Count$xPaid")) { + && root.getXManaCostPaid() == null + && source.getXManaCostPaid() == 0 /* SubAbility on something that already had set PayX, e.g. Endless One ETB counters */ + && sa.hasSVar(amountStr) && sa.getSVar(amountStr).equals("Count$xPaid")) { // detect if there's more than one X in the cost (Hangarback Walker, Walking Ballista, etc.) SpellAbility testSa = sa; diff --git a/forge-ai/src/main/java/forge/ai/ability/TokenAi.java b/forge-ai/src/main/java/forge/ai/ability/TokenAi.java index 16af0fbd221..83e73ffa0a1 100644 --- a/forge-ai/src/main/java/forge/ai/ability/TokenAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/TokenAi.java @@ -273,6 +273,12 @@ public class TokenAi extends SpellAbilityAi { } } + if (mandatory) { + // Necessary because the AI goes into this method twice, first to set up targets (with mandatory=true) + // and then the second time to confirm the trigger (where mandatory may be set to false). + return true; + } + Card actualToken = spawnToken(ai, sa); String tokenPower = sa.getParamOrDefault("TokenPower", actualToken.getBasePowerString()); String tokenToughness = sa.getParamOrDefault("TokenToughness", actualToken.getBaseToughnessString()); @@ -293,12 +299,6 @@ public class TokenAi extends SpellAbilityAi { } } - if (mandatory) { - // Necessary because the AI goes into this method twice, first to set up targets (with mandatory=true) - // and then the second time to confirm the trigger (where mandatory may be set to false). - return true; - } - if ("OnlyOnAlliedAttack".equals(sa.getParam("AILogic"))) { Combat combat = ai.getGame().getCombat(); return combat != null && combat.getAttackingPlayer() != null diff --git a/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java index 1cd26f2d896..9c729f8f036 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java @@ -115,7 +115,7 @@ public class DigEffect extends SpellAbilityEffect { final Game game = player.getGame(); final Player cont = host.getController(); Player chooser = player; - int numToDig = AbilityUtils.calculateAmount(host, sa.getParam("DigNum"), sa); + int digNum = AbilityUtils.calculateAmount(host, sa.getParam("DigNum"), sa); final ZoneType srcZone = sa.hasParam("SourceZone") ? ZoneType.smartValueOf(sa.getParam("SourceZone")) : ZoneType.Library; @@ -189,7 +189,7 @@ public class DigEffect extends SpellAbilityEffect { final CardCollection rest = new CardCollection(); final PlayerZone sourceZone = p.getZone(srcZone); - numToDig = Math.min(numToDig, sourceZone.size()); + int numToDig = Math.min(digNum, sourceZone.size()); for (int i = 0; i < numToDig; i++) { top.add(sourceZone.get(i)); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/DigMultipleEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DigMultipleEffect.java index c50f0bc854b..d9b4ddf3e6b 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DigMultipleEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DigMultipleEffect.java @@ -26,7 +26,7 @@ public class DigMultipleEffect extends SpellAbilityEffect { final Card host = sa.getHostCard(); final Player player = sa.getActivatingPlayer(); final Game game = player.getGame(); - int numToDig = AbilityUtils.calculateAmount(host, sa.getParam("DigNum"), sa); + int digNum = AbilityUtils.calculateAmount(host, sa.getParam("DigNum"), sa); final ZoneType srcZone = sa.hasParam("SourceZone") ? ZoneType.smartValueOf(sa.getParam("SourceZone")) : ZoneType.Library; @@ -47,7 +47,7 @@ public class DigMultipleEffect extends SpellAbilityEffect { final CardCollection rest = new CardCollection(); final PlayerZone sourceZone = chooser.getZone(srcZone); - numToDig = Math.min(numToDig, sourceZone.size()); + int numToDig = Math.min(digNum, sourceZone.size()); for (int i = 0; i < numToDig; i++) { top.add(sourceZone.get(i)); } diff --git a/forge-game/src/main/java/forge/game/card/CardProperty.java b/forge-game/src/main/java/forge/game/card/CardProperty.java index 032a2da5943..72d58c91372 100644 --- a/forge-game/src/main/java/forge/game/card/CardProperty.java +++ b/forge-game/src/main/java/forge/game/card/CardProperty.java @@ -65,10 +65,6 @@ public class CardProperty { if (card.sharesNameWith(name)) { return false; } - } else if (property.startsWith("sameName")) { - if (!card.sharesNameWith(source)) { - return false; - } } else if (property.equals("NamedCard")) { if (!card.sharesNameWith(source.getNamedCard())) { return false; @@ -813,6 +809,10 @@ public class CardProperty { return false; } else if (property.equals("canProduceMana")) { return !card.getManaAbilities().isEmpty(); + } else if (property.startsWith("sameName")) { + if (!card.sharesNameWith(source)) { + return false; + } } else if (property.startsWith("sharesNameWith")) { if (property.equals("sharesNameWith")) { if (!card.sharesNameWith(source)) { diff --git a/forge-game/src/main/java/forge/game/card/CardUtil.java b/forge-game/src/main/java/forge/game/card/CardUtil.java index c0ae01befe5..311a7fc9a5c 100644 --- a/forge-game/src/main/java/forge/game/card/CardUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardUtil.java @@ -315,6 +315,7 @@ public final class CardUtil { } newCopy.setCastFrom(in.getCastFrom()); + newCopy.setExiledBy(in.getExiledBy()); newCopy.setExiledWith(getLKICopy(in.getExiledWith(), cachedMap)); if (in.getGame().getCombat() != null && in.isPermanent()) { diff --git a/forge-game/src/main/java/forge/game/keyword/Trample.java b/forge-game/src/main/java/forge/game/keyword/Trample.java index 1d8eb7a4564..b2c94c5a818 100644 --- a/forge-game/src/main/java/forge/game/keyword/Trample.java +++ b/forge-game/src/main/java/forge/game/keyword/Trample.java @@ -2,7 +2,7 @@ package forge.game.keyword; import java.util.Collection; -public class Trample extends KeywordInstance { +public class Trample extends KeywordInstance { private String type = ""; @Override