From e7c9cdb1111be0eb1250f5ed83e051687c30fd7f Mon Sep 17 00:00:00 2001 From: tool4EvEr Date: Wed, 20 Oct 2021 21:13:23 +0200 Subject: [PATCH 1/2] Fix AI refusing Gilded Drake trigger when no targets --- .../java/forge/ai/ability/ControlExchangeAi.java | 13 +++++++------ .../java/forge/game/ability/effects/DigEffect.java | 4 ++-- .../game/ability/effects/DigMultipleEffect.java | 2 +- .../achievements/AchievementCollection.java | 6 ++---- 4 files changed, 12 insertions(+), 13 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/ControlExchangeAi.java b/forge-ai/src/main/java/forge/ai/ability/ControlExchangeAi.java index 78bdef0ceee..e8fff9b3ba5 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ControlExchangeAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ControlExchangeAi.java @@ -30,7 +30,7 @@ public class ControlExchangeAi extends SpellAbilityAi { sa.resetTargets(); CardCollection list = - CardLists.getValidCards(AiAttackController.choosePreferredDefenderPlayer(ai).getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), ai, sa.getHostCard(), sa); + CardLists.getValidCards(ai.getOpponents().getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), ai, sa.getHostCard(), sa); // AI won't try to grab cards that are filtered out of AI decks on purpose list = CardLists.filter(list, new Predicate() { @Override @@ -65,7 +65,7 @@ public class ControlExchangeAi extends SpellAbilityAi { } } else { if (mandatory) { - return chkAIDrawback(sa, aiPlayer); + return chkAIDrawback(sa, aiPlayer) || sa.isTargetNumberValid(); } else { return canPlayAI(aiPlayer, sa); } @@ -97,8 +97,12 @@ public class ControlExchangeAi extends SpellAbilityAi { Card best = ComputerUtilCard.getBestAI(list); + // add best Target: + // do it here already even if we don't want to play this as it might be for targeting a trigger + sa.getTargets().add(best); + // if Param has Defined, check if the best Target is better than the Defined - if (sa.hasParam("Defined")) { + if (sa.hasParam("Defined") && (!sa.isTrigger() || sa.getRootAbility().isOptionalTrigger())) { final Card object = AbilityUtils.getDefinedCards(sa.getHostCard(), sa.getParam("Defined"), sa).get(0); // TODO add evaluate Land if able final Card realBest = ComputerUtilCard.getBestAI(Lists.newArrayList(best, object)); @@ -109,9 +113,6 @@ public class ControlExchangeAi extends SpellAbilityAi { } } - // add best Target - sa.getTargets().add(best); - // second target needed (the AI's own worst) if ("TrigTwoTargets".equals(sa.getParam("AILogic"))) { return doTrigTwoTargetsLogic(aiPlayer, sa, best); 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 27d26eca314..4b1d514d412 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 @@ -72,7 +72,7 @@ public class DigEffect extends SpellAbilityEffect { int libraryPosition = sa.hasParam("LibraryPosition") ? Integer.parseInt(sa.getParam("LibraryPosition")) : -1; int destZone1ChangeNum = 1; final boolean mitosis = sa.hasParam("Mitosis"); - String changeValid = sa.hasParam("ChangeValid") ? sa.getParam("ChangeValid") : ""; + String changeValid = sa.getParamOrDefault("ChangeValid", ""); final boolean anyNumber = sa.hasParam("AnyNumber"); final int libraryPosition2 = sa.hasParam("LibraryPosition2") ? Integer.parseInt(sa.getParam("LibraryPosition2")) : -1; @@ -86,7 +86,7 @@ public class DigEffect extends SpellAbilityEffect { // These parameters are used to indicate that a dialog box must be show to the player asking if the player wants to proceed // with an optional ability, otherwise the optional ability is skipped. final boolean mayBeSkipped = sa.hasParam("PromptToSkipOptionalAbility"); - final String optionalAbilityPrompt = sa.hasParam("OptionalAbilityPrompt") ? sa.getParam("OptionalAbilityPrompt") : ""; + final String optionalAbilityPrompt = sa.getParamOrDefault("OptionalAbilityPrompt", ""); boolean remZone1 = false; boolean remZone2 = false; 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 cdf886b6541..9cdfaca6eb8 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 @@ -35,7 +35,7 @@ public class DigMultipleEffect extends SpellAbilityEffect { int libraryPosition = sa.hasParam("LibraryPosition") ? Integer.parseInt(sa.getParam("LibraryPosition")) : -1; final int libraryPosition2 = sa.hasParam("LibraryPosition2") ? Integer.parseInt(sa.getParam("LibraryPosition2")) : -1; - String changeValid = sa.hasParam("ChangeValid") ? sa.getParam("ChangeValid") : ""; + String changeValid = sa.getParamOrDefault("ChangeValid", ""); boolean chooseOptional = sa.hasParam("Optional"); CardZoneTable table = new CardZoneTable(); diff --git a/forge-gui/src/main/java/forge/localinstance/achievements/AchievementCollection.java b/forge-gui/src/main/java/forge/localinstance/achievements/AchievementCollection.java index 2b6c7c4acfc..ec4cbeb7d2a 100644 --- a/forge-gui/src/main/java/forge/localinstance/achievements/AchievementCollection.java +++ b/forge-gui/src/main/java/forge/localinstance/achievements/AchievementCollection.java @@ -102,8 +102,7 @@ public abstract class AchievementCollection implements Iterable { add(new TotalMatchWins(100, 250, 500, 1000)); if (isLimitedFormat) { //make need for speed goal more realistic for limited formats add(new NeedForSpeed(8, 6, 4, 2)); - } - else { + } else { add(new NeedForSpeed(5, 3, 1, 0)); } add(new Overkill(-25, -50, -100, -200)); @@ -114,8 +113,7 @@ public abstract class AchievementCollection implements Iterable { add(new ManaScrewed()); if (isLimitedFormat) { //lower gold and mythic thresholds based on smaller decks add(new ManaFlooded(8, 11, 14, 17)); - } - else { + } else { add(new ManaFlooded(8, 12, 18, 24)); } add(new RagsToRiches()); From cb5cf75e9e08d471117d40cf4adaeb3028df1437 Mon Sep 17 00:00:00 2001 From: tool4EvEr Date: Wed, 20 Oct 2021 23:13:38 +0200 Subject: [PATCH 2/2] Clean up --- .../forge/ai/ability/CountersPutAllAi.java | 2 +- .../java/forge/ai/ability/DamageAllAi.java | 18 +++++------------- .../java/forge/ai/ability/DestroyAllAi.java | 5 +---- .../main/java/forge/ai/ability/PumpAllAi.java | 5 +---- .../java/forge/ai/ability/RegenerateAllAi.java | 6 +----- .../main/java/forge/ai/ability/TapAllAi.java | 10 ++-------- .../main/java/forge/ai/ability/TwoPilesAi.java | 5 +---- .../main/java/forge/ai/ability/UntapAllAi.java | 5 +---- .../game/ability/effects/AnimateAllEffect.java | 6 +----- .../ability/effects/CountersPutAllEffect.java | 2 +- .../effects/CountersRemoveAllEffect.java | 2 +- .../game/ability/effects/DamageAllEffect.java | 11 ++--------- .../effects/DamagePreventAllEffect.java | 6 +----- .../game/ability/effects/DestroyAllEffect.java | 7 +------ .../game/ability/effects/FlipCoinEffect.java | 2 +- .../game/ability/effects/ManifestEffect.java | 2 +- .../ability/effects/MultiplePilesEffect.java | 11 ++--------- .../ability/effects/PeekAndRevealEffect.java | 4 ++-- .../game/ability/effects/ProtectAllEffect.java | 10 ++-------- .../game/ability/effects/PumpAllEffect.java | 5 +---- .../ability/effects/RegenerateAllEffect.java | 6 +----- .../game/ability/effects/RepeatEffect.java | 6 +----- .../game/ability/effects/SacrificeEffect.java | 1 - .../ability/effects/TapOrUntapAllEffect.java | 3 +-- .../game/ability/effects/TwoPilesEffect.java | 10 ++-------- .../game/ability/effects/UntapAllEffect.java | 8 +------- 26 files changed, 35 insertions(+), 123 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersPutAllAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersPutAllAi.java index bec9bf76058..29e9565c142 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersPutAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersPutAllAi.java @@ -37,7 +37,7 @@ public class CountersPutAllAi extends SpellAbilityAi { final boolean curse = sa.isCurse(); final TargetRestrictions tgt = sa.getTargetRestrictions(); - if ("OwnCreatsAndOtherPWs".equals(sa.getParam("AILogic"))) { + if ("OwnCreatsAndOtherPWs".equals(logic)) { hList = CardLists.getValidCards(ai.getWeakestOpponent().getCardsIn(ZoneType.Battlefield), "Creature.YouCtrl,Planeswalker.YouCtrl+Other", source.getController(), source, sa); cList = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), "Creature.YouCtrl,Planeswalker.YouCtrl+Other", source.getController(), source, sa); } else { diff --git a/forge-ai/src/main/java/forge/ai/ability/DamageAllAi.java b/forge-ai/src/main/java/forge/ai/ability/DamageAllAi.java index a465df0c34a..d21327c08c6 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageAllAi.java @@ -94,7 +94,7 @@ public class DamageAllAi extends SpellAbilityAi { private Player determineOppToKill(Player ai, SpellAbility sa, Card source, int x) { // Attempt to determine which opponent can be finished off such that the most players // are killed at the same time, given X damage tops - final String validP = sa.hasParam("ValidPlayers") ? sa.getParam("ValidPlayers") : ""; + final String validP = sa.getParamOrDefault("ValidPlayers", ""); int aiLife = ai.getLife(); Player bestOpp = null; // default opponent, if all else fails @@ -125,7 +125,7 @@ public class DamageAllAi extends SpellAbilityAi { computerList.clear(); } - final String validP = sa.hasParam("ValidPlayers") ? sa.getParam("ValidPlayers") : ""; + final String validP = sa.getParamOrDefault("ValidPlayers", ""); // TODO: if damage is dependant on mana paid, maybe have X be human's max life // Don't kill yourself if (validP.equals("Player") && (ai.getLife() <= ComputerUtilCombat.predictDamageTo(ai, dmg, source, false))) { @@ -191,7 +191,7 @@ public class DamageAllAi extends SpellAbilityAi { @Override public boolean chkAIDrawback(SpellAbility sa, Player ai) { final Card source = sa.getHostCard(); - String validP = ""; + final String validP = sa.getParamOrDefault("ValidPlayers", ""); final String damage = sa.getParam("NumDmg"); int dmg; @@ -203,10 +203,6 @@ public class DamageAllAi extends SpellAbilityAi { dmg = AbilityUtils.calculateAmount(source, damage, sa); } - if (sa.hasParam("ValidPlayers")) { - validP = sa.getParam("ValidPlayers"); - } - // Evaluate creatures getting killed Player enemy = ai.getWeakestOpponent(); final CardCollection humanList = getKillableCreatures(sa, enemy, dmg); @@ -251,7 +247,7 @@ public class DamageAllAi extends SpellAbilityAi { */ private CardCollection getKillableCreatures(final SpellAbility sa, final Player player, final int dmg) { final Card source = sa.getHostCard(); - String validC = sa.hasParam("ValidCards") ? sa.getParam("ValidCards") : ""; + String validC = sa.getParamOrDefault("ValidCards", ""); // TODO: X may be something different than X paid CardCollection list = @@ -273,7 +269,7 @@ public class DamageAllAi extends SpellAbilityAi { @Override protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) { final Card source = sa.getHostCard(); - String validP = ""; + final String validP = sa.getParamOrDefault("ValidPlayers", ""); final String damage = sa.getParam("NumDmg"); int dmg; @@ -286,10 +282,6 @@ public class DamageAllAi extends SpellAbilityAi { dmg = AbilityUtils.calculateAmount(source, damage, sa); } - if (sa.hasParam("ValidPlayers")) { - validP = sa.getParam("ValidPlayers"); - } - // Evaluate creatures getting killed Player enemy = ai.getWeakestOpponent(); final CardCollection humanList = getKillableCreatures(sa, enemy, dmg); diff --git a/forge-ai/src/main/java/forge/ai/ability/DestroyAllAi.java b/forge-ai/src/main/java/forge/ai/ability/DestroyAllAi.java index 79f88577204..990db0b9757 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DestroyAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DestroyAllAi.java @@ -81,10 +81,7 @@ public class DestroyAllAi extends SpellAbilityAi { return true; // e.g. Tetzimoc, Primal Death, where we want to cast the permanent even if the removal trigger does nothing } - String valid = ""; - if (sa.hasParam("ValidCards")) { - valid = sa.getParam("ValidCards"); - } + String valid = sa.getParamOrDefault("ValidCards", ""); if (valid.contains("X") && sa.getSVar("X").equals("Count$xPaid")) { // Set PayX here to maximum value. diff --git a/forge-ai/src/main/java/forge/ai/ability/PumpAllAi.java b/forge-ai/src/main/java/forge/ai/ability/PumpAllAi.java index 82620607240..e882a63bbe3 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PumpAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PumpAllAi.java @@ -33,7 +33,6 @@ public class PumpAllAi extends PumpAiBase { */ @Override protected boolean canPlayAI(final Player ai, final SpellAbility sa) { - String valid = ""; final Card source = sa.getHostCard(); final Game game = ai.getGame(); final Combat combat = game.getCombat(); @@ -78,9 +77,7 @@ public class PumpAllAi extends PumpAiBase { final List keywords = sa.hasParam("KW") ? Arrays.asList(sa.getParam("KW").split(" & ")) : new ArrayList<>(); final PhaseType phase = game.getPhaseHandler().getPhase(); - if (sa.hasParam("ValidCards")) { - valid = sa.getParam("ValidCards"); - } + final String valid = sa.getParamOrDefault("ValidCards", ""); CardCollection comp = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), valid, source.getController(), source, sa); CardCollection human = CardLists.getValidCards(opp.getCardsIn(ZoneType.Battlefield), valid, source.getController(), source, sa); diff --git a/forge-ai/src/main/java/forge/ai/ability/RegenerateAllAi.java b/forge-ai/src/main/java/forge/ai/ability/RegenerateAllAi.java index 0f8e35a4854..f4add7b107e 100644 --- a/forge-ai/src/main/java/forge/ai/ability/RegenerateAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/RegenerateAllAi.java @@ -26,11 +26,7 @@ public class RegenerateAllAi extends SpellAbilityAi { final Game game = ai.getGame(); // filter AIs battlefield by what I can target - String valid = ""; - - if (sa.hasParam("ValidCards")) { - valid = sa.getParam("ValidCards"); - } + final String valid = sa.getParamOrDefault("ValidCards", ""); CardCollectionView list = game.getCardsIn(ZoneType.Battlefield); list = CardLists.getValidCards(list, valid.split(","), hostCard.getController(), hostCard, sa); diff --git a/forge-ai/src/main/java/forge/ai/ability/TapAllAi.java b/forge-ai/src/main/java/forge/ai/ability/TapAllAi.java index 9f7264b55d2..dd89e45ab75 100644 --- a/forge-ai/src/main/java/forge/ai/ability/TapAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/TapAllAi.java @@ -34,10 +34,7 @@ public class TapAllAi extends SpellAbilityAi { return false; } - String valid = ""; - if (sa.hasParam("ValidCards")) { - valid = sa.getParam("ValidCards"); - } + final String valid = sa.getParamOrDefault("ValidCards", ""); CardCollectionView validTappables = game.getCardsIn(ZoneType.Battlefield); @@ -99,10 +96,7 @@ public class TapAllAi extends SpellAbilityAi { protected boolean doTriggerAINoCost(final Player ai, SpellAbility sa, boolean mandatory) { final Card source = sa.getHostCard(); - String valid = ""; - if (sa.hasParam("ValidCards")) { - valid = sa.getParam("ValidCards"); - } + final String valid = sa.getParamOrDefault("ValidCards", ""); CardCollectionView validTappables = getTapAllTargets(valid, source, sa); diff --git a/forge-ai/src/main/java/forge/ai/ability/TwoPilesAi.java b/forge-ai/src/main/java/forge/ai/ability/TwoPilesAi.java index b0416572962..9fafd25f28d 100644 --- a/forge-ai/src/main/java/forge/ai/ability/TwoPilesAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/TwoPilesAi.java @@ -24,10 +24,7 @@ public class TwoPilesAi extends SpellAbilityAi { zone = ZoneType.smartValueOf(sa.getParam("Zone")); } - String valid = ""; - if (sa.hasParam("ValidCards")) { - valid = sa.getParam("ValidCards"); - } + final String valid = sa.getParamOrDefault("ValidCards", ""); final Player opp = AiAttackController.choosePreferredDefenderPlayer(ai); diff --git a/forge-ai/src/main/java/forge/ai/ability/UntapAllAi.java b/forge-ai/src/main/java/forge/ai/ability/UntapAllAi.java index 7c53560db5c..97d70b3fafa 100644 --- a/forge-ai/src/main/java/forge/ai/ability/UntapAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/UntapAllAi.java @@ -24,11 +24,8 @@ public class UntapAllAi extends SpellAbilityAi { && source.getGame().getPhaseHandler().getPhase().isBefore(PhaseType.COMBAT_END)) { return false; } - String valid = ""; CardCollectionView list = CardLists.filter(aiPlayer.getGame().getCardsIn(ZoneType.Battlefield), CardPredicates.Presets.TAPPED); - if (sa.hasParam("ValidCards")) { - valid = sa.getParam("ValidCards"); - } + final String valid = sa.getParamOrDefault("ValidCards", ""); list = CardLists.getValidCards(list, valid.split(","), source.getController(), source, sa); // don't untap if only opponent benefits PlayerCollection goodControllers = aiPlayer.getAllies(); diff --git a/forge-game/src/main/java/forge/game/ability/effects/AnimateAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/AnimateAllEffect.java index 7c37e2a7fb9..44d0e0f8145 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/AnimateAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/AnimateAllEffect.java @@ -121,11 +121,7 @@ public class AnimateAllEffect extends AnimateEffectBase { sVars.addAll(Arrays.asList(sa.getParam("sVars").split(","))); } - String valid = ""; - - if (sa.hasParam("ValidCards")) { - valid = sa.getParam("ValidCards"); - } + final String valid = sa.getParamOrDefault("ValidCards", ""); CardCollectionView list; diff --git a/forge-game/src/main/java/forge/game/ability/effects/CountersPutAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CountersPutAllEffect.java index d80af630170..4cc5e1cda08 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CountersPutAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CountersPutAllEffect.java @@ -20,7 +20,7 @@ public class CountersPutAllEffect extends SpellAbilityEffect { final CounterType cType = CounterType.getType(sa.getParam("CounterType")); final int amount = AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("CounterNum"), sa); - final String zone = sa.hasParam("ValidZone") ? sa.getParam("ValidZone") : "Battlefield"; + final String zone = sa.getParamOrDefault("ValidZone", "Battlefield"); sb.append("Put ").append(amount).append(" ").append(cType.getName()).append(" counter"); if (amount != 1) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/CountersRemoveAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CountersRemoveAllEffect.java index e5145588050..fb80153cbd8 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CountersRemoveAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CountersRemoveAllEffect.java @@ -22,7 +22,7 @@ public class CountersRemoveAllEffect extends SpellAbilityEffect { final CounterType cType = CounterType.getType(sa.getParam("CounterType")); final int amount = AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("CounterNum"), sa); - final String zone = sa.hasParam("ValidZone") ? sa.getParam("ValidZone") : "Battlefield"; + final String zone = sa.getParamOrDefault("ValidZone", "Battlefield"); String amountString = Integer.toString(amount); if (sa.hasParam("AllCounters")) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/DamageAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DamageAllEffect.java index b1ff536f4a9..6786183cd3c 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DamageAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DamageAllEffect.java @@ -22,10 +22,7 @@ public class DamageAllEffect extends DamageBaseEffect { protected String getStackDescription(SpellAbility sa) { final StringBuilder sb = new StringBuilder(); - String desc = ""; - if (sa.hasParam("ValidDescription")) { - desc = sa.getParam("ValidDescription"); - } + final String desc = sa.getParamOrDefault("ValidDescription", ""); final String damage = sa.getParam("NumDmg"); final int dmg = AbilityUtils.calculateAmount(sa.getHostCard(), damage, sa); @@ -63,11 +60,7 @@ public class DamageAllEffect extends DamageBaseEffect { //Remember params from this effect have been moved to dealDamage in GameAction Player targetPlayer = sa.getTargets().getFirstTargetedPlayer(); - String players = ""; - - if (sa.hasParam("ValidPlayers")) { - players = sa.getParam("ValidPlayers"); - } + final String players = sa.getParamOrDefault("ValidPlayers", ""); CardCollectionView list; if (sa.hasParam("ValidCards")) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/DamagePreventAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DamagePreventAllEffect.java index 91e904ac804..4142ca1f3d3 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DamagePreventAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DamagePreventAllEffect.java @@ -15,11 +15,7 @@ public class DamagePreventAllEffect extends DamagePreventEffectBase { final Game game = sa.getActivatingPlayer().getGame(); final int numDam = AbilityUtils.calculateAmount(source, sa.getParam("Amount"), sa); - String players = ""; - - if (sa.hasParam("ValidPlayers")) { - players = sa.getParam("ValidPlayers"); - } + final String players = sa.getParamOrDefault("ValidPlayers", ""); if (sa.hasParam("ValidCards")) { CardCollectionView list = game.getCardsIn(ZoneType.Battlefield); diff --git a/forge-game/src/main/java/forge/game/ability/effects/DestroyAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DestroyAllEffect.java index 4f0acaa45be..8f82c5e08bb 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DestroyAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DestroyAllEffect.java @@ -24,7 +24,6 @@ public class DestroyAllEffect extends SpellAbilityEffect { @Override protected String getStackDescription(SpellAbility sa) { - if (sa.hasParam("SpellDescription")) { return sa.getParam("SpellDescription"); } @@ -51,11 +50,7 @@ public class DestroyAllEffect extends SpellAbilityEffect { Player targetPlayer = sa.getTargets().getFirstTargetedPlayer(); - String valid = ""; - - if (sa.hasParam("ValidCards")) { - valid = sa.getParam("ValidCards"); - } + String valid = sa.getParamOrDefault("ValidCards", ""); // Ugh. If calculateAmount needs to be called with DestroyAll it _needs_ // to use the X variable diff --git a/forge-game/src/main/java/forge/game/ability/effects/FlipCoinEffect.java b/forge-game/src/main/java/forge/game/ability/effects/FlipCoinEffect.java index 58194ece00b..19b06893824 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/FlipCoinEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/FlipCoinEffect.java @@ -60,7 +60,7 @@ public class FlipCoinEffect extends SpellAbilityEffect { } final boolean noCall = sa.hasParam("NoCall"); - String varName = sa.hasParam("SaveNumFlipsToSVar") ? sa.getParam("SaveNumFlipsToSVar") : "X"; + String varName = sa.getParamOrDefault("SaveNumFlipsToSVar", "X"); boolean victory = false; int amount = 1; if (sa.hasParam("Amount")) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/ManifestEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ManifestEffect.java index adb4ef97dc2..5c84eb8d5d7 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ManifestEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ManifestEffect.java @@ -27,7 +27,7 @@ public class ManifestEffect extends SpellAbilityEffect { final int amount = sa.hasParam("Amount") ? AbilityUtils.calculateAmount(source, sa.getParam("Amount"), sa) : 1; // Most commonly "defined" is Top of Library - final String defined = sa.hasParam("Defined") ? sa.getParam("Defined") : "TopOfLibrary"; + final String defined = sa.getParamOrDefault("Defined", "TopOfLibrary"); CardCollectionView lastStateBattlefield = game.copyLastStateBattlefield(); CardCollectionView lastStateGraveyard = game.copyLastStateGraveyard(); diff --git a/forge-game/src/main/java/forge/game/ability/effects/MultiplePilesEffect.java b/forge-game/src/main/java/forge/game/ability/effects/MultiplePilesEffect.java index c9c10e36a73..30821255082 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/MultiplePilesEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/MultiplePilesEffect.java @@ -31,12 +31,8 @@ public class MultiplePilesEffect extends SpellAbilityEffect { final StringBuilder sb = new StringBuilder(); final List tgtPlayers = getTargetPlayers(sa); - - String valid = ""; String piles = sa.getParam("Piles"); - if (sa.hasParam("ValidCards")) { - valid = sa.getParam("ValidCards"); - } + final String valid = sa.getParamOrDefault("ValidCards", ""); sb.append("Separate all ").append(valid).append(" cards "); @@ -58,10 +54,7 @@ public class MultiplePilesEffect extends SpellAbilityEffect { final int piles = Integer.parseInt(sa.getParam("Piles")); final Map> record = Maps.newHashMap(); - String valid = ""; - if (sa.hasParam("ValidCards")) { - valid = sa.getParam("ValidCards"); - } + final String valid = sa.getParamOrDefault("ValidCards", ""); final TargetRestrictions tgt = sa.getTargetRestrictions(); final List tgtPlayers = getTargetPlayers(sa); diff --git a/forge-game/src/main/java/forge/game/ability/effects/PeekAndRevealEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PeekAndRevealEffect.java index 8e249fc3a66..ff9f2bd49c9 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PeekAndRevealEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PeekAndRevealEffect.java @@ -37,8 +37,8 @@ public class PeekAndRevealEffect extends SpellAbilityEffect { Card source = sa.getHostCard(); final boolean rememberRevealed = sa.hasParam("RememberRevealed"); final boolean imprintRevealed = sa.hasParam("ImprintRevealed"); - String revealValid = sa.hasParam("RevealValid") ? sa.getParam("RevealValid") : "Card"; - String peekAmount = sa.hasParam("PeekAmount") ? sa.getParam("PeekAmount") : "1"; + String revealValid = sa.getParamOrDefault("RevealValid", "Card"); + String peekAmount = sa.getParamOrDefault("PeekAmount", "1"); int numPeek = AbilityUtils.calculateAmount(sa.getHostCard(), peekAmount, sa); // Right now, this is only used on your own library. diff --git a/forge-game/src/main/java/forge/game/ability/effects/ProtectAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ProtectAllEffect.java index 75e48fe6c60..f7e111cb6ef 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ProtectAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ProtectAllEffect.java @@ -82,10 +82,7 @@ public class ProtectAllEffect extends SpellAbilityEffect { } // Deal with permanents - String valid = ""; - if (sa.hasParam("ValidCards")) { - valid = sa.getParam("ValidCards"); - } + final String valid = sa.getParamOrDefault("ValidCards", ""); if (!valid.equals("")) { CardCollectionView list = game.getCardsIn(ZoneType.Battlefield); list = CardLists.getValidCards(list, valid, sa.getActivatingPlayer(), host, sa); @@ -113,10 +110,7 @@ public class ProtectAllEffect extends SpellAbilityEffect { } // Deal with Players - String players = ""; - if (sa.hasParam("ValidPlayers")) { - players = sa.getParam("ValidPlayers"); - } + final String players = sa.getParamOrDefault("ValidPlayers", ""); if (!players.equals("")) { final List playerList = AbilityUtils.getDefinedPlayers(host, players, sa); for (final Player player : playerList) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/PumpAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PumpAllEffect.java index e6c9a5f40af..44d33726de5 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PumpAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PumpAllEffect.java @@ -137,10 +137,7 @@ public class PumpAllEffect extends SpellAbilityEffect { list = tgtPlayers.getCardsIn(affectedZones); } - String valid = ""; - if (sa.hasParam("ValidCards")) { - valid = sa.getParam("ValidCards"); - } + final String valid = sa.getParamOrDefault("ValidCards", ""); list = AbilityUtils.filterListByType(list, valid, sa); diff --git a/forge-game/src/main/java/forge/game/ability/effects/RegenerateAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/RegenerateAllEffect.java index 055c3ea4cac..f936eb2e662 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/RegenerateAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/RegenerateAllEffect.java @@ -26,11 +26,7 @@ public class RegenerateAllEffect extends RegenerateBaseEffect { public void resolve(SpellAbility sa) { final Card hostCard = sa.getHostCard(); final Game game = hostCard.getGame(); - String valid = ""; - - if (sa.hasParam("ValidCards")) { - valid = sa.getParam("ValidCards"); - } + final String valid = sa.getParamOrDefault("ValidCards", ""); CardCollectionView list = game.getCardsIn(ZoneType.Battlefield); list = CardLists.getValidCards(list, valid.split(","), hostCard.getController(), hostCard, sa); diff --git a/forge-game/src/main/java/forge/game/ability/effects/RepeatEffect.java b/forge-game/src/main/java/forge/game/ability/effects/RepeatEffect.java index 421cc34859e..43cb3018645 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/RepeatEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/RepeatEffect.java @@ -76,11 +76,7 @@ public class RepeatEffect extends SpellAbilityEffect { if (sa.hasParam("RepeatPresent")) { final String repeatPresent = sa.getParam("RepeatPresent"); - - String repeatCompare = "GE1"; - if (sa.hasParam("RepeatCompare")) { - repeatCompare = sa.getParam("RepeatCompare"); - } + String repeatCompare = sa.getParamOrDefault("RepeatCompare", "GE1"); CardCollectionView list; if (sa.hasParam("RepeatDefined")) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/SacrificeEffect.java b/forge-game/src/main/java/forge/game/ability/effects/SacrificeEffect.java index dbc2fdf43df..da413a82838 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/SacrificeEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/SacrificeEffect.java @@ -243,7 +243,6 @@ public class SacrificeEffect extends SpellAbilityEffect { removeCandidates(validTargets, validTargetsList, union, index + 1, included, amount); - CardCollection candidate = validTargetsList.get(index); if (candidate.isEmpty()) { return; diff --git a/forge-game/src/main/java/forge/game/ability/effects/TapOrUntapAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/TapOrUntapAllEffect.java index 4eeb2082f4e..a041728e6d1 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/TapOrUntapAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/TapOrUntapAllEffect.java @@ -28,8 +28,7 @@ public class TapOrUntapAllEffect extends SpellAbilityEffect { if (sa.hasParam("ValidMessage")) { sb.append(sa.getParam("ValidMessage")); - } - else { + } else { final List tgtCards = getTargetCards(sa); sb.append(StringUtils.join(tgtCards, ", ")); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/TwoPilesEffect.java b/forge-game/src/main/java/forge/game/ability/effects/TwoPilesEffect.java index d13f4e576f3..746d6190d3e 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/TwoPilesEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/TwoPilesEffect.java @@ -26,10 +26,7 @@ public class TwoPilesEffect extends SpellAbilityEffect { final List tgtPlayers = getTargetPlayers(sa); - String valid = ""; - if (sa.hasParam("ValidCards")) { - valid = sa.getParam("ValidCards"); - } + final String valid = sa.getParamOrDefault("ValidCards", ""); sb.append("Separate all ").append(valid).append(" cards "); @@ -54,10 +51,7 @@ public class TwoPilesEffect extends SpellAbilityEffect { zone = ZoneType.smartValueOf(sa.getParam("Zone")); } - String valid = "Card"; - if (sa.hasParam("ValidCards")) { - valid = sa.getParam("ValidCards"); - } + final String valid = sa.getParamOrDefault("ValidCards", ""); final TargetRestrictions tgt = sa.getTargetRestrictions(); final List tgtPlayers = getTargetPlayers(sa); diff --git a/forge-game/src/main/java/forge/game/ability/effects/UntapAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/UntapAllEffect.java index b5399762c6a..89e5ec12511 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/UntapAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/UntapAllEffect.java @@ -24,15 +24,9 @@ public class UntapAllEffect extends SpellAbilityEffect { @Override public void resolve(SpellAbility sa) { final Card card = sa.getHostCard(); - - String valid = ""; CardCollectionView list; - List tgtPlayers = getTargetPlayers(sa); - - if (sa.hasParam("ValidCards")) { - valid = sa.getParam("ValidCards"); - } + final String valid = sa.getParamOrDefault("ValidCards", ""); if (!sa.usesTargeting() && !sa.hasParam("Defined")) { list = sa.getActivatingPlayer().getGame().getCardsIn(ZoneType.Battlefield);