From 87c7e8bbdda25e2a55720a4d0a3a47ce4e5c852d Mon Sep 17 00:00:00 2001 From: Sol Date: Wed, 20 Apr 2016 17:47:28 +0000 Subject: [PATCH] Large Commit: Passing in SpellAbilities into isValid/hasProperty to fix Harness the Storm not being possible otherwise. Fixes a bunch of javadoc errors --- .../src/main/java/forge/ai/AiController.java | 9 ++- .../main/java/forge/ai/AiCostDecision.java | 23 ++++---- .../src/main/java/forge/ai/ComputerUtil.java | 38 ++++++------- .../main/java/forge/ai/ComputerUtilCard.java | 19 +------ .../java/forge/ai/ComputerUtilCombat.java | 31 ++++------ .../main/java/forge/ai/ComputerUtilCost.java | 11 ++-- .../main/java/forge/ai/ability/AnimateAi.java | 9 +-- .../main/java/forge/ai/ability/AttachAi.java | 16 ++---- .../forge/ai/ability/BecomesBlockedAi.java | 2 +- .../main/java/forge/ai/ability/BidLifeAi.java | 2 +- .../java/forge/ai/ability/ChangeZoneAi.java | 42 ++++---------- .../java/forge/ai/ability/ChooseSourceAi.java | 4 +- .../forge/ai/ability/ControlExchangeAi.java | 7 ++- .../java/forge/ai/ability/ControlGainAi.java | 2 +- .../forge/ai/ability/CopyPermanentAi.java | 3 +- .../main/java/forge/ai/ability/CounterAi.java | 2 +- .../java/forge/ai/ability/CountersMoveAi.java | 4 +- .../java/forge/ai/ability/CountersPutAi.java | 8 +-- .../ai/ability/CountersPutOrRemoveAi.java | 2 +- .../java/forge/ai/ability/DamageAllAi.java | 2 +- .../java/forge/ai/ability/DamageDealAi.java | 2 +- .../forge/ai/ability/DamagePreventAi.java | 10 ++-- .../main/java/forge/ai/ability/DebuffAi.java | 19 +++---- .../main/java/forge/ai/ability/DestroyAi.java | 2 +- .../java/forge/ai/ability/DestroyAllAi.java | 12 ++-- .../java/forge/ai/ability/DigUntilAi.java | 2 +- .../main/java/forge/ai/ability/EffectAi.java | 2 +- .../java/forge/ai/ability/MustBlockAi.java | 2 +- .../main/java/forge/ai/ability/PhasesAi.java | 2 +- .../main/java/forge/ai/ability/PlayAi.java | 4 +- .../forge/ai/ability/PowerExchangeAi.java | 4 +- .../main/java/forge/ai/ability/ProtectAi.java | 9 +-- .../main/java/forge/ai/ability/PumpAi.java | 6 +- .../java/forge/ai/ability/RegenerateAi.java | 4 +- .../forge/ai/ability/RegenerateAllAi.java | 2 +- .../java/forge/ai/ability/SacrificeAi.java | 6 +- .../java/forge/ai/ability/SacrificeAllAi.java | 4 +- .../main/java/forge/ai/ability/TapAiBase.java | 19 +++---- .../main/java/forge/ai/ability/TokenAi.java | 6 +- .../main/java/forge/ai/ability/UntapAi.java | 15 ++--- .../java/forge/ai/ability/UntapAllAi.java | 2 +- .../main/java/forge/game/CardTraitBase.java | 6 +- .../src/main/java/forge/game/GameObject.java | 11 ++-- .../java/forge/game/ability/AbilityUtils.java | 12 ++-- .../ability/effects/AnimateAllEffect.java | 2 +- .../game/ability/effects/AttachEffect.java | 8 +-- .../ability/effects/ChangeTargetsEffect.java | 4 +- .../ability/effects/CopyPermanentEffect.java | 2 +- .../game/ability/effects/CounterEffect.java | 5 +- .../effects/DamagePreventAllEffect.java | 2 +- .../forge/game/ability/effects/DigEffect.java | 8 +-- .../game/ability/effects/DigUntilEffect.java | 2 +- .../game/ability/effects/DiscardEffect.java | 5 +- .../game/ability/effects/PlayEffect.java | 2 +- .../ability/effects/RegenerateAllEffect.java | 2 +- .../game/ability/effects/RepeatEffect.java | 8 +-- .../ability/effects/RestartGameEffect.java | 2 +- .../ability/effects/UnattachAllEffect.java | 2 +- .../game/ability/effects/UntapAllEffect.java | 2 +- .../src/main/java/forge/game/card/Card.java | 56 +++++++++++-------- .../java/forge/game/card/CardFactoryUtil.java | 30 +++++----- .../main/java/forge/game/card/CardLists.java | 24 +++----- .../java/forge/game/card/CardPredicates.java | 4 +- .../main/java/forge/game/card/CardUtil.java | 6 +- .../java/forge/game/combat/CombatUtil.java | 10 +--- .../java/forge/game/cost/CostDiscard.java | 2 +- .../main/java/forge/game/cost/CostDraw.java | 2 +- .../main/java/forge/game/cost/CostExile.java | 2 +- .../forge/game/cost/CostExileFromStack.java | 2 +- .../game/cost/CostExiledMoveToGrave.java | 2 +- .../java/forge/game/cost/CostGainControl.java | 2 +- .../java/forge/game/cost/CostGainLife.java | 2 +- .../forge/game/cost/CostPutCardToLib.java | 2 +- .../java/forge/game/cost/CostPutCounter.java | 3 +- .../forge/game/cost/CostRemoveAnyCounter.java | 2 +- .../forge/game/cost/CostRemoveCounter.java | 2 +- .../main/java/forge/game/cost/CostReturn.java | 2 +- .../main/java/forge/game/cost/CostReveal.java | 2 +- .../java/forge/game/cost/CostSacrifice.java | 2 +- .../java/forge/game/cost/CostTapType.java | 2 +- .../java/forge/game/cost/CostUntapType.java | 2 +- .../forge/game/mana/ManaCostAdjustment.java | 18 +++--- .../src/main/java/forge/game/phase/Untap.java | 6 +- .../main/java/forge/game/player/Player.java | 8 +-- .../game/spellability/AbilityManaPart.java | 15 ++--- .../forge/game/spellability/SpellAbility.java | 26 ++++++--- .../spellability/SpellAbilityCondition.java | 4 +- .../spellability/SpellAbilityRestriction.java | 2 +- .../game/spellability/TargetRestrictions.java | 10 ++-- .../game/staticability/StaticAbility.java | 4 +- .../StaticAbilityCantAttackBlock.java | 18 +++--- .../StaticAbilityCantBeCast.java | 12 ++-- .../StaticAbilityCantTarget.java | 6 +- .../StaticAbilityContinuous.java | 6 +- .../staticability/StaticAbilityETBTapped.java | 2 +- .../StaticAbilityPreventDamage.java | 4 +- .../main/java/forge/game/trigger/Trigger.java | 2 +- .../forge/game/trigger/TriggerAttached.java | 2 +- .../forge/game/trigger/TriggerAttacks.java | 2 +- .../forge/game/trigger/TriggerChampioned.java | 4 +- .../trigger/TriggerChangesController.java | 2 +- .../game/trigger/TriggerChangesZone.java | 2 +- .../trigger/TriggerCombatDamageDoneOnce.java | 2 +- .../game/trigger/TriggerCounterAdded.java | 2 +- .../game/trigger/TriggerCounterAddedOnce.java | 2 +- .../game/trigger/TriggerCounterRemoved.java | 2 +- .../forge/game/trigger/TriggerDamageDone.java | 2 +- .../trigger/TriggerDealtCombatDamageOnce.java | 2 +- .../forge/game/trigger/TriggerDevoured.java | 2 +- .../java/forge/game/trigger/TriggerDrawn.java | 2 +- .../forge/game/trigger/TriggerEvolved.java | 2 +- .../forge/game/trigger/TriggerExploited.java | 4 +- .../java/forge/game/trigger/TriggerFight.java | 2 +- .../trigger/TriggerPayCumulativeUpkeep.java | 2 +- .../forge/game/trigger/TriggerPayEcho.java | 2 +- .../forge/game/trigger/TriggerPhaseIn.java | 2 +- .../forge/game/trigger/TriggerPhaseOut.java | 2 +- .../game/trigger/TriggerPlaneswalkedFrom.java | 2 +- .../game/trigger/TriggerPlaneswalkedTo.java | 2 +- .../forge/game/trigger/TriggerSacrificed.java | 4 +- .../game/trigger/TriggerSpellAbilityCast.java | 2 +- .../java/forge/game/trigger/TriggerTaps.java | 2 +- .../game/trigger/TriggerTapsForMana.java | 6 +- .../forge/game/trigger/TriggerUnequip.java | 4 +- .../forge/game/trigger/TriggerUntaps.java | 2 +- .../res/cardsfolder/h/harness_the_storm.txt | 2 +- .../java/forge/player/HumanCostDecision.java | 35 +++++++----- .../src/main/java/forge/player/HumanPlay.java | 10 ++-- .../forge/player/PlayerControllerHuman.java | 2 +- 129 files changed, 408 insertions(+), 470 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index f5fed692b1b..e5dabdfc26b 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -375,7 +375,7 @@ public class AiController { public boolean apply(final Card c) { if (!c.getSVar("NeedsToPlay").isEmpty()) { final String needsToPlay = c.getSVar("NeedsToPlay"); - CardCollection list = CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), needsToPlay.split(","), c.getController(), c); + CardCollection list = CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), needsToPlay.split(","), c.getController(), c, null); if (list.isEmpty()) { return false; } @@ -697,7 +697,7 @@ public class AiController { SpellAbility effectExile = AbilityFactory.getAbility(card.getSVar("TrigExile"), card); final ZoneType origin = ZoneType.listValueOf(effectExile.getParam("Origin")).get(0); final TargetRestrictions tgt = effectExile.getTargetRestrictions(); - final CardCollection list = CardLists.getValidCards(game.getCardsIn(origin), tgt.getValidTgts(), player, card); + final CardCollection list = CardLists.getValidCards(game.getCardsIn(origin), tgt.getValidTgts(), player, card, effectExile); CardCollection targets = CardLists.getTargetableCards(list, sa); if (sa.getHostCard().getName().equals("Suspension Field")) { //existing "exile until leaves" enchantments only target opponent's permanents @@ -794,7 +794,7 @@ public class AiController { final String needsToPlay = card.getSVar("NeedsToPlay"); CardCollectionView list = game.getCardsIn(ZoneType.Battlefield); - list = CardLists.getValidCards(list, needsToPlay.split(","), card.getController(), card); + list = CardLists.getValidCards(list, needsToPlay.split(","), card.getController(), card, null); if (list.isEmpty()) { return AiPlayDecision.MissingNeededCards; } @@ -917,7 +917,7 @@ public class AiController { public CardCollection getCardsToDiscard(final int numDiscard, final String[] uTypes, final SpellAbility sa) { CardCollection hand = new CardCollection(player.getCardsIn(ZoneType.Hand)); if ((uTypes != null) && (sa != null)) { - hand = CardLists.getValidCards(hand, uTypes, sa.getActivatingPlayer(), sa.getHostCard()); + hand = CardLists.getValidCards(hand, uTypes, sa.getActivatingPlayer(), sa.getHostCard(), sa); } return getCardsToDiscard(numDiscard, numDiscard, hand, sa); } @@ -1356,7 +1356,6 @@ public class AiController { * Ai should run. * * @param sa the sa - * @param ai * @return true, if successful */ public final boolean aiShouldRun(final ReplacementEffect effect, final SpellAbility sa) { diff --git a/forge-ai/src/main/java/forge/ai/AiCostDecision.java b/forge-ai/src/main/java/forge/ai/AiCostDecision.java index 7a53821bc35..2ad507feb9d 100644 --- a/forge-ai/src/main/java/forge/ai/AiCostDecision.java +++ b/forge-ai/src/main/java/forge/ai/AiCostDecision.java @@ -173,7 +173,7 @@ public class AiCostDecision extends CostDecisionMakerBase { List chosen = new ArrayList(); for (SpellAbilityStackInstance si :source.getGame().getStack()) { SpellAbility sp = si.getSpellAbility(true).getRootAbility(); - if (si.getSourceCard().isValid(cost.getType().split(";"), source.getController(), source)) { + if (si.getSourceCard().isValid(cost.getType().split(";"), source.getController(), source, sp)) { chosen.add(sp); } } @@ -189,7 +189,7 @@ public class AiCostDecision extends CostDecisionMakerBase { c = AbilityUtils.calculateAmount(source, cost.getAmount(), ability); } - CardCollection typeList = CardLists.getValidCards(player.getGame().getCardsIn(ZoneType.Exile), cost.getType().split(";"), player, source); + CardCollection typeList = CardLists.getValidCards(player.getGame().getCardsIn(ZoneType.Exile), cost.getType().split(";"), player, source, ability); if (typeList.size() < c) { return null; @@ -230,7 +230,7 @@ public class AiCostDecision extends CostDecisionMakerBase { c = AbilityUtils.calculateAmount(source, cost.getAmount(), ability); } - final CardCollection typeList = CardLists.getValidCards(player.getGame().getCardsIn(ZoneType.Battlefield), cost.getType().split(";"), player, source); + final CardCollection typeList = CardLists.getValidCards(player.getGame().getCardsIn(ZoneType.Battlefield), cost.getType().split(";"), player, source, ability); if (typeList.size() < c) { return null; @@ -329,7 +329,7 @@ public class AiCostDecision extends CostDecisionMakerBase { c = AbilityUtils.calculateAmount(source, cost.getAmount(), ability); } - list = CardLists.getValidCards(list, cost.getType().split(";"), player, source); + list = CardLists.getValidCards(list, cost.getType().split(";"), player, source, ability); if (cost.isSameZone()) { // Jotun Grunt @@ -356,7 +356,8 @@ public class AiCostDecision extends CostDecisionMakerBase { return PaymentDecision.card(source); } - final CardCollection typeList = CardLists.getValidCards(player.getGame().getCardsIn(ZoneType.Battlefield), cost.getType().split(";"), player, source); + final CardCollection typeList = CardLists.getValidCards(player.getGame().getCardsIn(ZoneType.Battlefield), + cost.getType().split(";"), player, source, ability); Card card; if (cost.getType().equals("Creature.YouCtrl")) { @@ -382,7 +383,8 @@ public class AiCostDecision extends CostDecisionMakerBase { final String sVar = ability.getSVar(amount); if (sVar.equals("XChoice")) { CardCollectionView typeList = - CardLists.getValidCards(player.getCardsIn(ZoneType.Battlefield), cost.getType().split(";"), ability.getActivatingPlayer(), ability.getHostCard()); + CardLists.getValidCards(player.getCardsIn(ZoneType.Battlefield), cost.getType().split(";"), + ability.getActivatingPlayer(), ability.getHostCard(), ability); typeList = CardLists.filter(typeList, Presets.UNTAPPED); c = typeList.size(); source.setSVar("ChosenX", "Number$" + Integer.toString(c)); @@ -467,7 +469,7 @@ public class AiCostDecision extends CostDecisionMakerBase { return null; } - hand = CardLists.getValidCards(hand, type.split(";"), player, source); + hand = CardLists.getValidCards(hand, type.split(";"), player, source, ability); Integer c = cost.convertAmount(); if (c == null) { final String sVar = ability.getSVar(cost.getAmount()); @@ -488,7 +490,7 @@ public class AiCostDecision extends CostDecisionMakerBase { final int c = AbilityUtils.calculateAmount(source, amount, ability); final String type = cost.getType(); - CardCollectionView typeList = CardLists.getValidCards(player.getCardsIn(ZoneType.Battlefield), type.split(";"), player, source); + CardCollectionView typeList = CardLists.getValidCards(player.getCardsIn(ZoneType.Battlefield), type.split(";"), player, source, ability); CardCollectionView hperms = CardLists.filter(typeList, new Predicate() { @Override public boolean apply(final Card crd) { @@ -539,7 +541,7 @@ public class AiCostDecision extends CostDecisionMakerBase { if (type.equals("OriginalHost")) { typeList = new CardCollection(ability.getOriginalHost()); } else { - typeList = CardLists.getValidCards(player.getCardsIn(cost.zone), type.split(";"), player, source); + typeList = CardLists.getValidCards(player.getCardsIn(cost.zone), type.split(";"), player, source, ability); } for (Card card : typeList) { if (card.getCounters(cost.counter) >= c) { @@ -564,7 +566,8 @@ public class AiCostDecision extends CostDecisionMakerBase { if (c == null) { final String sVar = ability.getSVar(amount); if (sVar.equals("XChoice")) { - CardCollection typeList = CardLists.getValidCards(player.getGame().getCardsIn(ZoneType.Battlefield), cost.getType().split(";"), player, ability.getHostCard()); + CardCollection typeList = CardLists.getValidCards(player.getGame().getCardsIn(ZoneType.Battlefield), + cost.getType().split(";"), player, ability.getHostCard(), ability); if (!cost.canUntapSource) { typeList.remove(source); } diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtil.java b/forge-ai/src/main/java/forge/ai/ComputerUtil.java index 063f97a8cf7..4c0a0465f9b 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtil.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtil.java @@ -278,7 +278,7 @@ public class ComputerUtil { if (activate != null) { final String[] prefValid = activate.getSVar("AIPreference").split("\\$"); if (prefValid[0].equals(pref)) { - final CardCollection prefList = CardLists.getValidCards(typeList, prefValid[1].split(","), activate.getController(), activate); + final CardCollection prefList = CardLists.getValidCards(typeList, prefValid[1].split(","), activate.getController(), activate, null); if (prefList.size() != 0) { CardLists.shuffle(prefList); return prefList.get(0); @@ -371,7 +371,7 @@ public class ComputerUtil { } public static CardCollection chooseSacrificeType(final Player ai, final String type, final Card source, final Card target, final int amount) { - CardCollection typeList = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), type.split(";"), source.getController(), source); + CardCollection typeList = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), type.split(";"), source.getController(), source, null); if (ai.hasKeyword("You can't sacrifice creatures to cast spells or activate abilities.")) { typeList = CardLists.getNotType(typeList, "Creature"); } @@ -404,7 +404,7 @@ public class ComputerUtil { public static CardCollection chooseExileFrom(final Player ai, final ZoneType zone, final String type, final Card activate, final Card target, final int amount) { - CardCollection typeList = CardLists.getValidCards(ai.getCardsIn(zone), type.split(";"), activate.getController(), activate); + CardCollection typeList = CardLists.getValidCards(ai.getCardsIn(zone), type.split(";"), activate.getController(), activate, null); if ((target != null) && target.getController() == ai && typeList.contains(target)) { typeList.remove(target); // don't exile the card we're pumping @@ -425,7 +425,7 @@ public class ComputerUtil { public static CardCollection choosePutToLibraryFrom(final Player ai, final ZoneType zone, final String type, final Card activate, final Card target, final int amount) { - CardCollection typeList = CardLists.getValidCards(ai.getCardsIn(zone), type.split(";"), activate.getController(), activate); + CardCollection typeList = CardLists.getValidCards(ai.getCardsIn(zone), type.split(";"), activate.getController(), activate, null); if ((target != null) && target.getController() == ai && typeList.contains(target)) { typeList.remove(target); // don't move the card we're pumping @@ -450,7 +450,7 @@ public class ComputerUtil { public static CardCollection chooseTapType(final Player ai, final String type, final Card activate, final boolean tap, final int amount) { CardCollection typeList = - CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), type.split(";"), activate.getController(), activate); + CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), type.split(";"), activate.getController(), activate, null); // is this needed? typeList = CardLists.filter(typeList, Presets.UNTAPPED); @@ -475,7 +475,7 @@ public class ComputerUtil { public static CardCollection chooseUntapType(final Player ai, final String type, final Card activate, final boolean untap, final int amount) { CardCollection typeList = - CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), type.split(";"), activate.getController(), activate); + CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), type.split(";"), activate.getController(), activate, null); // is this needed? typeList = CardLists.filter(typeList, Presets.TAPPED); @@ -500,7 +500,7 @@ public class ComputerUtil { public static CardCollection chooseReturnType(final Player ai, final String type, final Card activate, final Card target, final int amount) { final CardCollection typeList = - CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), type.split(";"), activate.getController(), activate); + CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), type.split(";"), activate.getController(), activate, null); if ((target != null) && target.getController() == ai && typeList.contains(target)) { // don't bounce the card we're pumping typeList.remove(target); @@ -661,7 +661,7 @@ public class ComputerUtil { final TargetRestrictions tgt = sa.getTargetRestrictions(); if (tgt != null) { - if (CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), controller, sa.getHostCard()).contains(card)) { + if (CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), controller, sa.getHostCard(), sa).contains(card)) { return true; } } else if (AbilityUtils.getDefinedCards(sa.getHostCard(), sa.getParam("Defined"), sa).contains(card)) { @@ -699,7 +699,7 @@ public class ComputerUtil { } final TargetRestrictions tgt = sa.getTargetRestrictions(); if (tgt != null) { - if (CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), controller, sa.getHostCard()).contains(card)) { + if (CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), controller, sa.getHostCard(), null).contains(card)) { prevented += AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("Amount"), sa); } @@ -768,7 +768,7 @@ public class ComputerUtil { if (buffedcard.hasSVar("BuffedBy")) { final String buffedby = buffedcard.getSVar("BuffedBy"); final String[] bffdby = buffedby.split(","); - if (card.isValid(bffdby, buffedcard.getController(), buffedcard)) { + if (card.isValid(bffdby, buffedcard.getController(), buffedcard, sa)) { return true; } } @@ -797,7 +797,7 @@ public class ComputerUtil { if (buffedcard.hasSVar("AntiBuffedBy")) { final String buffedby = buffedcard.getSVar("AntiBuffedBy"); final String[] bffdby = buffedby.split(","); - if (card.isValid(bffdby, buffedcard.getController(), buffedcard)) { + if (card.isValid(bffdby, buffedcard.getController(), buffedcard, sa)) { return true; } } @@ -884,7 +884,7 @@ public class ComputerUtil { // not castable for at least one other turn. return true; } else if (landsInPlay.size() > 5 && discard.getCMC() <= 1 - && !discard.hasProperty("hasXCost", ai, null)) { + && !discard.hasProperty("hasXCost", ai, null, null)) { // Probably don't need small stuff now. return true; } @@ -929,7 +929,7 @@ public class ComputerUtil { if (buffedCard.hasSVar("BuffedBy")) { final String buffedby = buffedCard.getSVar("BuffedBy"); final String[] bffdby = buffedby.split(","); - if (source.isValid(bffdby, buffedCard.getController(), buffedCard)) { + if (source.isValid(bffdby, buffedCard.getController(), buffedCard, sa)) { return true; } } @@ -949,7 +949,7 @@ public class ComputerUtil { if (buffedcard.hasSVar("AntiBuffedBy")) { final String buffedby = buffedcard.getSVar("AntiBuffedBy"); final String[] bffdby = buffedby.split(","); - if (source.isValid(bffdby, buffedcard.getController(), buffedcard)) { + if (source.isValid(bffdby, buffedcard.getController(), buffedcard, sa)) { return true; } } @@ -1008,7 +1008,7 @@ public class ComputerUtil { } final CardCollection typeList = - CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), type.split(","), source.getController(), source); + CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), type.split(","), source.getController(), source, sa); for (Card c : typeList) { if (c.getSVar("SacMe").equals("6")) { return true; @@ -1150,7 +1150,7 @@ public class ComputerUtil { objects = AbilityUtils.getDefinedObjects(source, topStack.getParam("Defined"), topStack); } else if (topStack.hasParam("ValidCards")) { CardCollectionView battleField = aiPlayer.getCardsIn(ZoneType.Battlefield); - objects = CardLists.getValidCards(battleField, topStack.getParam("ValidCards").split(","), source.getController(), source); + objects = CardLists.getValidCards(battleField, topStack.getParam("ValidCards").split(","), source.getController(), source, topStack); } else { return threatened; } @@ -1797,13 +1797,13 @@ public class ComputerUtil { continue; } if (trigParams.containsKey("ValidCard")) { - if (!card.isValid(trigParams.get("ValidCard"), source.getController(), source)) { + if (!card.isValid(trigParams.get("ValidCard"), source.getController(), source, sa)) { continue; } } if (trigParams.containsKey("ValidActivatingPlayer")) { - if (!player.isValid(trigParams.get("ValidActivatingPlayer"), source.getController(), source)) { + if (!player.isValid(trigParams.get("ValidActivatingPlayer"), source.getController(), source, sa)) { continue; } } @@ -1869,7 +1869,7 @@ public class ComputerUtil { continue; } if (trigParams.containsKey("ValidCard")) { - if (!permanent.isValid(trigParams.get("ValidCard"), source.getController(), source)) { + if (!permanent.isValid(trigParams.get("ValidCard"), source.getController(), source, null)) { continue; } } diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java index 4ebd4e48f50..2fd8162d96a 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java @@ -73,7 +73,6 @@ public class ComputerUtilCard { *

* * @param list - * a {@link forge.CardList} object. */ public static void sortByEvaluateCreature(final CardCollection list) { Collections.sort(list, ComputerUtilCard.EvaluateCreatureComparator); @@ -86,7 +85,6 @@ public class ComputerUtilCard { *

* * @param list - * a {@link forge.CardList} object. * @return a {@link forge.game.card.Card} object. */ public static Card getBestArtifactAI(final List list) { @@ -119,7 +117,6 @@ public class ComputerUtilCard { *

* * @param list - * a {@link forge.CardList} object. * @param spell * a {@link forge.game.card.Card} object. * @param targeted @@ -148,7 +145,6 @@ public class ComputerUtilCard { *

* * @param list - * a {@link forge.CardList} object. * @return a {@link forge.game.card.Card} object. */ public static Card getBestLandAI(final Iterable list) { @@ -199,8 +195,7 @@ public class ComputerUtilCard { * getCheapestPermanentAI. *

* - * @param list - * a {@link forge.CardList} object. + * @param all * @param spell * a {@link forge.game.card.Card} object. * @param targeted @@ -240,7 +235,6 @@ public class ComputerUtilCard { *

* * @param list - * a {@link forge.CardList} object. * @return a {@link forge.game.card.Card} object. */ public static Card getBestAI(final Iterable list) { @@ -274,7 +268,6 @@ public class ComputerUtilCard { *

* * @param list - * a {@link forge.CardList} object. * @return a {@link forge.game.card.Card} object. */ public static Card getWorstCreatureAI(final Iterable list) { @@ -288,7 +281,6 @@ public class ComputerUtilCard { *

* * @param list - * a {@link forge.CardList} object. * @return a {@link forge.game.card.Card} object. */ public static Card getBestCreatureToBounceAI(final CardCollectionView list) { @@ -314,7 +306,6 @@ public class ComputerUtilCard { *

* * @param list - * a {@link forge.CardList} object. * @return a {@link forge.game.card.Card} object. */ public static Card getWorstAI(final Iterable list) { @@ -327,7 +318,6 @@ public class ComputerUtilCard { *

* * @param list - * a {@link forge.CardList} object. * @param biasEnch * a boolean. * @param biasLand @@ -586,7 +576,6 @@ public class ComputerUtilCard { *

* * @param list - * a {@link forge.CardList} object. * @return a {@link java.lang.String} object. */ public static String getMostProminentCreatureType(final CardCollectionView list) { @@ -630,7 +619,6 @@ public class ComputerUtilCard { *

* * @param list - * a {@link forge.CardList} object. * @return a {@link java.lang.String} object. */ public static String getMostProminentColor(final Iterable list) { @@ -690,7 +678,6 @@ public class ComputerUtilCard { *

* * @param lands - * a {@link forge.CardList} object. * @return a {@link forge.game.card.Card} object. */ public static Card getWorstLand(final List lands) { @@ -1310,7 +1297,7 @@ public class ComputerUtilCard { continue; } final String valid = params.get("Affected"); - if (!vCard.isValid(valid, c.getController(), c)) { + if (!vCard.isValid(valid, c.getController(), c, null)) { continue; } if (params.containsKey("AddPower")) { @@ -1359,7 +1346,7 @@ public class ComputerUtilCard { return false; } - CardCollection targetables = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), ai, sa.getHostCard()); + CardCollection targetables = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), ai, sa.getHostCard(), sa); targetables = CardLists.getTargetableCards(targetables, sa); targetables = ComputerUtil.getSafeTargets(ai, sa, targetables); for (final Card c : targetables) { diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java index 1c4cc84b580..dc9d940bd4a 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java @@ -69,8 +69,6 @@ public class ComputerUtilCombat { * * @param attacker * a {@link forge.game.card.Card} object. - * @param def - * the defending {@link GameEntity}. * @return a boolean. */ public static boolean canAttackNextTurn(final Card attacker) { @@ -89,7 +87,7 @@ public class ComputerUtilCombat { * * @param atacker * a {@link forge.game.card.Card} object. - * @param def + * @param defender * the defending {@link GameEntity}. * @return a boolean. */ @@ -206,8 +204,6 @@ public class ComputerUtilCombat { * a {@link forge.game.card.Card} object. * @param attacked * a {@link forge.game.player.Player} object. - * @param combat - * a {@link forge.game.combat.Combat} object. * @return a int. */ public static int poisonIfUnblocked(final Card attacker, final Player attacked) { @@ -233,7 +229,6 @@ public class ComputerUtilCombat { *

* * @param attackers - * a {@link forge.CardList} object. * @param attacked * a {@link forge.game.player.Player} object. * @return a int. @@ -253,7 +248,6 @@ public class ComputerUtilCombat { *

* * @param attackers - * a {@link forge.CardList} object. * @param attacked * a {@link forge.game.player.Player} object. * @return a int. @@ -474,7 +468,6 @@ public class ComputerUtilCombat { * @param attacker * a {@link forge.game.card.Card} object. * @param defenders - * a {@link forge.CardList} object. * @return a int. */ public static int totalDamageOfBlockers(final Card attacker, final List defenders) { @@ -589,7 +582,6 @@ public class ComputerUtilCombat { * @param attacker * a {@link forge.game.card.Card} object. * @param defenders - * a {@link forge.CardList} object. * @return a int. */ public static int totalShieldDamage(final Card attacker, final List defenders) { @@ -612,7 +604,7 @@ public class ComputerUtilCombat { * * @param attacker * a {@link forge.game.card.Card} object. - * @param defender + * @param blocker * a {@link forge.game.card.Card} object. * @return a int. */ @@ -886,7 +878,7 @@ public class ComputerUtilCombat { continue; } final String valid = params.get("Affected").replace("blocking", "Creature"); - if (!blocker.isValid(valid, card.getController(), card)) { + if (!blocker.isValid(valid, card.getController(), card, null)) { continue; } if (params.containsKey("AddPower")) { @@ -1223,7 +1215,7 @@ public class ComputerUtilCombat { continue; } final String valid = params.get("Affected").replace("attacking", "Creature"); - if (!attacker.isValid(valid, card.getController(), card)) { + if (!attacker.isValid(valid, card.getController(), card, null)) { continue; } if (params.containsKey("AddPower")) { @@ -1267,9 +1259,9 @@ public class ComputerUtilCombat { list.add(attacker); } if (abilityParams.containsKey("ValidCards")) { - if (attacker.isValid(abilityParams.get("ValidCards").split(","), source.getController(), source) + if (attacker.isValid(abilityParams.get("ValidCards").split(","), source.getController(), source, null) || attacker.isValid(abilityParams.get("ValidCards").replace("attacking+", "").split(","), - source.getController(), source)) { + source.getController(), source, null)) { list.add(attacker); } } @@ -1396,7 +1388,7 @@ public class ComputerUtilCombat { continue; } final String valid = params.get("Affected").replace("attacking", "Creature"); - if (!attacker.isValid(valid, card.getController(), card)) { + if (!attacker.isValid(valid, card.getController(), card, null)) { continue; } if (params.containsKey("AddToughness")) { @@ -1459,9 +1451,9 @@ public class ComputerUtilCombat { list.add(attacker); } if (abilityParams.containsKey("ValidCards")) { - if (attacker.isValid(abilityParams.get("ValidCards").split(","), source.getController(), source) + if (attacker.isValid(abilityParams.get("ValidCards").split(","), source.getController(), source, null) || attacker.isValid(abilityParams.get("ValidCards").replace("attacking+", "").split(","), - source.getController(), source)) { + source.getController(), source, null)) { list.add(attacker); } } @@ -1966,7 +1958,6 @@ public class ComputerUtilCombat { * @param attacker * a {@link forge.game.card.Card} object. * @param block - * a {@link forge.CardList} object. * @param dmgCanDeal * a int. * @param defender @@ -2169,11 +2160,11 @@ public class ComputerUtilCombat { continue; } if (params.containsKey("ValidSource") - && !source.isValid(params.get("ValidSource"), ca.getController(), ca)) { + && !source.isValid(params.get("ValidSource"), ca.getController(), ca, null)) { continue; } if (params.containsKey("ValidTarget") - && !target.isValid(params.get("ValidTarget"), ca.getController(), ca)) { + && !target.isValid(params.get("ValidTarget"), ca.getController(), ca, null)) { continue; } if (params.containsKey("IsCombat")) { diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java index 364283429e8..663e230f57c 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java @@ -108,7 +108,7 @@ public class ComputerUtilCost { if (type.equals("CARDNAME") && source.getAbilityText().contains("Bloodrush")) { continue; } - final CardCollection typeList = CardLists.getValidCards(ai.getCardsIn(ZoneType.Hand), type.split(","), source.getController(), source); + final CardCollection typeList = CardLists.getValidCards(ai.getCardsIn(ZoneType.Hand), type.split(","), source.getController(), source, null); if (typeList.size() > ai.getMaxHandSize()) { continue; } @@ -217,7 +217,7 @@ public class ComputerUtilCost { continue; } - final CardCollection typeList = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), type.split(","), source.getController(), source); + final CardCollection typeList = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), type.split(","), source.getController(), source, null); if (ComputerUtil.getCardPreference(ai, source, "SacCost", typeList) == null) { return false; } @@ -257,7 +257,7 @@ public class ComputerUtilCost { continue; } - final CardCollection typeList = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), type.split(","), source.getController(), source); + final CardCollection typeList = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), type.split(","), source.getController(), source, null); if (ComputerUtil.getCardPreference(ai, source, "SacCost", typeList) == null) { return false; } @@ -321,8 +321,7 @@ public class ComputerUtilCost { * * @param hostCard * a {@link forge.game.card.Card} object. - * @param costString - * a {@link java.lang.String} object. + * @param cost * @return a boolean. */ public static boolean shouldPayCost(final Player ai, final Card hostCard, final Cost cost) { @@ -368,7 +367,7 @@ public class ComputerUtilCost { final String snem = c.getSVar("AI_SpellsNeedExtraMana"); if (!StringUtils.isBlank(snem)) { String[] parts = TextUtil.split(snem, ' '); - boolean meetsRestriction = parts.length == 1 || player.isValid(parts[1], c.getController(), c); + boolean meetsRestriction = parts.length == 1 || player.isValid(parts[1], c.getController(), c, sa); if(!meetsRestriction) continue; diff --git a/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java b/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java index 3cd6dd78736..0aafb1c8f50 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java @@ -76,14 +76,15 @@ public class AnimateAi extends SpellAbilityAi { num = (num == null) ? "1" : num; final int nToSac = AbilityUtils.calculateAmount(topStack.getHostCard(), num, topStack); CardCollection list = - CardLists.getValidCards(aiPlayer.getCardsIn(ZoneType.Battlefield), valid.split(","), aiPlayer.getOpponent(), topStack.getHostCard()); + CardLists.getValidCards(aiPlayer.getCardsIn(ZoneType.Battlefield), valid.split(","), + aiPlayer.getOpponent(), topStack.getHostCard(), topStack); list = CardLists.filter(list, CardPredicates.canBeSacrificedBy(topStack)); ComputerUtilCard.sortByEvaluateCreature(list); if (!list.isEmpty() && list.size() == nToSac && ComputerUtilCost.canPayCost(sa, aiPlayer)) { Card animatedCopy = CardFactory.copyCard(source, true); becomeAnimated(animatedCopy, source.hasSickness(), sa); list.add(animatedCopy); - list = CardLists.getValidCards(list, valid.split(","), aiPlayer.getOpponent(), topStack.getHostCard()); + list = CardLists.getValidCards(list, valid.split(","), aiPlayer.getOpponent(), topStack.getHostCard(), topStack); list = CardLists.filter(list, CardPredicates.canBeSacrificedBy(topStack)); if (ComputerUtilCard.evaluateCreature(animatedCopy) < ComputerUtilCard.evaluateCreature(list.get(0)) && list.contains(animatedCopy)) { @@ -98,7 +99,7 @@ public class AnimateAi extends SpellAbilityAi { if (ph.getPlayerTurn().isOpponentOf(aiPlayer) || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS)) { return false; } - List list = CardLists.getValidCards(aiPlayer.getCreaturesInPlay(), tgt.getValidTgts(), aiPlayer, source); + List list = CardLists.getValidCards(aiPlayer.getCreaturesInPlay(), tgt.getValidTgts(), aiPlayer, source, sa); for (Card c : list) { if (ComputerUtilCard.doesCreatureAttackAI(aiPlayer, c)) { sa.getTargets().add(c); @@ -237,7 +238,7 @@ public class AnimateAi extends SpellAbilityAi { final TargetRestrictions tgt = sa.getTargetRestrictions(); final Card animateSource = sa.getHostCard(); CardCollectionView list = aiPlayer.getGame().getCardsIn(tgt.getZone()); - list = CardLists.getValidCards(list, tgt.getValidTgts(), sa.getActivatingPlayer(), animateSource); + list = CardLists.getValidCards(list, tgt.getValidTgts(), sa.getActivatingPlayer(), animateSource, sa); CardCollection prefList = CardLists.getValidCards(list, sa.getParam("AITgts"), sa.getActivatingPlayer(), animateSource); if (!prefList.isEmpty()){ CardLists.shuffle(prefList); diff --git a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java index 1156ded127c..1dbbd932ced 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java @@ -81,7 +81,7 @@ public class AttachAi extends SpellAbilityAi { final SpellAbility effectExile = AbilityFactory.getAbility(source.getSVar("TrigExile"), source); final ZoneType origin = ZoneType.listValueOf(effectExile.getParam("Origin")).get(0); final TargetRestrictions exile_tgt = effectExile.getTargetRestrictions(); - final CardCollection list = CardLists.getValidCards(ai.getGame().getCardsIn(origin), exile_tgt.getValidTgts(), ai, source); + final CardCollection list = CardLists.getValidCards(ai.getGame().getCardsIn(origin), exile_tgt.getValidTgts(), ai, source, effectExile); final CardCollection targets = CardLists.filter(list, new Predicate() { @Override public boolean apply(final Card c) { @@ -283,9 +283,7 @@ public class AttachAi extends SpellAbilityAi { /** * Attach to player ai preferences. - * - * @param af - * the af + * * @param sa * the sa * @param mandatory @@ -695,8 +693,6 @@ public class AttachAi extends SpellAbilityAi { * the sa * @param mandatory * the mandatory - * @param af - * the af * * @return true, if successful */ @@ -766,9 +762,7 @@ public class AttachAi extends SpellAbilityAi { /** * Attach preference. - * - * @param af - * the af + * * @param sa * the sa * @param sa @@ -1051,7 +1045,7 @@ public class AttachAi extends SpellAbilityAi { if (tgt == null) { list = AbilityUtils.getDefinedCards(sa.getHostCard(), sa.getParam("Defined"), sa); } else { - list = CardLists.getValidCards(aiPlayer.getGame().getCardsIn(tgt.getZone()), tgt.getValidTgts(), sa.getActivatingPlayer(), attachSource); + list = CardLists.getValidCards(aiPlayer.getGame().getCardsIn(tgt.getZone()), tgt.getValidTgts(), sa.getActivatingPlayer(), attachSource, sa); // TODO If Attaching without casting, don't need to actually target. // I believe this is the only case where mandatory will be true, so just // check that when starting that work @@ -1370,7 +1364,7 @@ public class AttachAi extends SpellAbilityAi { /** * Checks if it is useful to execute the attach action given the current context. * - * @param card + * @param c * the card * @param sa SpellAbility * @return true, if the action is useful (beneficial) in the current minimal context (Card vs. Attach SpellAbility) diff --git a/forge-ai/src/main/java/forge/ai/ability/BecomesBlockedAi.java b/forge-ai/src/main/java/forge/ai/ability/BecomesBlockedAi.java index 2767de90979..fe3dcb2e7a5 100644 --- a/forge-ai/src/main/java/forge/ai/ability/BecomesBlockedAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/BecomesBlockedAi.java @@ -28,7 +28,7 @@ public class BecomesBlockedAi extends SpellAbilityAi { if (tgt != null) { sa.resetTargets(); CardCollection list = CardLists.filterControlledBy(game.getCardsIn(ZoneType.Battlefield), aiPlayer.getOpponents()); - list = CardLists.getValidCards(list, tgt.getValidTgts(), source.getController(), source); + list = CardLists.getValidCards(list, tgt.getValidTgts(), source.getController(), source, sa); list = CardLists.getTargetableCards(list, sa); list = CardLists.getNotKeyword(list, "Trample"); diff --git a/forge-ai/src/main/java/forge/ai/ability/BidLifeAi.java b/forge-ai/src/main/java/forge/ai/ability/BidLifeAi.java index 54c4926bd8b..db112ce9f2d 100644 --- a/forge-ai/src/main/java/forge/ai/ability/BidLifeAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/BidLifeAi.java @@ -25,7 +25,7 @@ public class BidLifeAi extends SpellAbilityAi { sa.resetTargets(); if (tgt.canTgtCreature()) { List list = CardLists.getTargetableCards(aiPlayer.getOpponent().getCardsIn(ZoneType.Battlefield), sa); - list = CardLists.getValidCards(list, tgt.getValidTgts(), source.getController(), source); + list = CardLists.getValidCards(list, tgt.getValidTgts(), source.getController(), source, sa); if (list.isEmpty()) { return false; } diff --git a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java index 3d953a5e099..601bad8c86e 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java @@ -42,8 +42,6 @@ public class ChangeZoneAi extends SpellAbilityAi { *

* @param sa * a {@link forge.game.spellability.SpellAbility} object. - * @param af - * a {@link forge.game.ability.AbilityFactory} object. * * @return a boolean. */ @@ -81,8 +79,6 @@ public class ChangeZoneAi extends SpellAbilityAi { *

* @param sa * a {@link forge.game.spellability.SpellAbility} object. - * @param af - * a {@link forge.game.ability.AbilityFactory} object. * * @return a boolean. */ @@ -109,8 +105,6 @@ public class ChangeZoneAi extends SpellAbilityAi { * a {@link forge.game.spellability.SpellAbility} object. * @param mandatory * a boolean. - * @param af - * a {@link forge.game.ability.AbilityFactory} object. * * @return a boolean. */ @@ -144,9 +138,7 @@ public class ChangeZoneAi extends SpellAbilityAi { *

* changeHiddenOriginCanPlayAI. *

- * - * @param af - * a {@link forge.game.ability.AbilityFactory} object. + * * @param sa * a {@link forge.game.spellability.SpellAbility} object. * @return a boolean. @@ -349,9 +341,7 @@ public class ChangeZoneAi extends SpellAbilityAi { *

* changeHiddenOriginPlayDrawbackAI. *

- * - * @param af - * a {@link forge.game.ability.AbilityFactory} object. + * * @param sa * a {@link forge.game.spellability.SpellAbility} object. * @return a boolean. @@ -379,9 +369,7 @@ public class ChangeZoneAi extends SpellAbilityAi { *

* changeHiddenTriggerAI. *

- * - * @param af - * a {@link forge.game.ability.AbilityFactory} object. + * * @param sa * a {@link forge.game.spellability.SpellAbility} object. * @param mandatory @@ -465,7 +453,7 @@ public class ChangeZoneAi extends SpellAbilityAi { * @param ai * * @param list - * a {@link forge.CardList} object. + * a List object. * @return a {@link forge.game.card.Card} object. */ private static Card basicManaFixing(final Player ai, final List list) { // Search for a Basic Land @@ -560,9 +548,7 @@ public class ChangeZoneAi extends SpellAbilityAi { *

* changeKnownOriginCanPlayAI. *

- * - * @param af - * a {@link forge.game.ability.AbilityFactory} object. + * * @param sa * a {@link forge.game.spellability.SpellAbility} object. * @return a boolean. @@ -689,9 +675,7 @@ public class ChangeZoneAi extends SpellAbilityAi { *

* changeKnownOriginPlayDrawbackAI. *

- * - * @param af - * a {@link forge.game.ability.AbilityFactory} object. + * * @param sa * a {@link forge.game.spellability.SpellAbility} object. * @return a boolean. @@ -708,9 +692,7 @@ public class ChangeZoneAi extends SpellAbilityAi { *

* changeKnownPreferredTarget. *

- * - * @param af - * a {@link forge.game.ability.AbilityFactory} object. + * * @param sa * a {@link forge.game.spellability.SpellAbility} object. * @param mandatory @@ -735,7 +717,7 @@ public class ChangeZoneAi extends SpellAbilityAi { } sa.resetTargets(); - CardCollection list = CardLists.getValidCards(game.getCardsIn(origin), tgt.getValidTgts(), ai, source); + CardCollection list = CardLists.getValidCards(game.getCardsIn(origin), tgt.getValidTgts(), ai, source, sa); list = CardLists.getTargetableCards(list, sa); if (sa.hasParam("AITgts")) { list = CardLists.getValidCards(list, sa.getParam("AITgts"), ai, source); @@ -753,7 +735,7 @@ public class ChangeZoneAi extends SpellAbilityAi { @Override public boolean apply(final Card c) { for (Card card : game.getCardsIn(ZoneType.Battlefield)) { - if (card.isValid(sa.getParam("AttachedTo"), ai, c)) { + if (card.isValid(sa.getParam("AttachedTo"), ai, c, sa)) { return true; } } @@ -1114,7 +1096,7 @@ public class ChangeZoneAi extends SpellAbilityAi { final ZoneType destination = ZoneType.smartValueOf(sa.getParam("Destination")); final TargetRestrictions tgt = sa.getTargetRestrictions(); - CardCollection list = CardLists.getValidCards(ai.getGame().getCardsIn(origin), tgt.getValidTgts(), ai, source); + CardCollection list = CardLists.getValidCards(ai.getGame().getCardsIn(origin), tgt.getValidTgts(), ai, source, sa); // Narrow down the list: if (origin.equals(ZoneType.Battlefield)) { @@ -1203,9 +1185,7 @@ public class ChangeZoneAi extends SpellAbilityAi { *

* changeKnownOriginTriggerAI. *

- * - * @param af - * a {@link forge.game.ability.AbilityFactory} object. + * * @param sa * a {@link forge.game.spellability.SpellAbility} object. * @param mandatory diff --git a/forge-ai/src/main/java/forge/ai/ability/ChooseSourceAi.java b/forge-ai/src/main/java/forge/ai/ability/ChooseSourceAi.java index a82cb8fedbe..d3b119a7676 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChooseSourceAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChooseSourceAi.java @@ -74,7 +74,7 @@ public class ChooseSourceAi extends SpellAbilityAi { if (sa.getParam("AILogic").equals("NeedsPrevention")) { if (!game.getStack().isEmpty()) { final SpellAbility topStack = game.getStack().peekAbility(); - if (sa.hasParam("Choices") && !topStack.getHostCard().isValid(sa.getParam("Choices"), ai, source)) { + if (sa.hasParam("Choices") && !topStack.getHostCard().isValid(sa.getParam("Choices"), ai, source, sa)) { return false; } final ApiType threatApi = topStack.getApi(); @@ -161,7 +161,7 @@ public class ChooseSourceAi extends SpellAbilityAi { final Card source = si.getSourceCard(); final SpellAbility abilityOnStack = si.getSpellAbility(true); - if (sa.hasParam("Choices") && !abilityOnStack.getHostCard().isValid(sa.getParam("Choices"), ai, sa.getHostCard())) { + if (sa.hasParam("Choices") && !abilityOnStack.getHostCard().isValid(sa.getParam("Choices"), ai, sa.getHostCard(), sa)) { continue; } final ApiType threatApi = abilityOnStack.getApi(); 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 410b210c059..2b98717c546 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ControlExchangeAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ControlExchangeAi.java @@ -31,7 +31,7 @@ public class ControlExchangeAi extends SpellAbilityAi { sa.resetTargets(); List list = - CardLists.getValidCards(ai.getOpponent().getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), ai, sa.getHostCard()); + CardLists.getValidCards(ai.getOpponent().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() { @@ -46,7 +46,7 @@ public class ControlExchangeAi extends SpellAbilityAi { object2 = AbilityUtils.getDefinedCards(sa.getHostCard(), sa.getParam("Defined"), sa).get(0); } else if (tgt.getMinTargets(sa.getHostCard(), sa) > 1) { CardCollectionView list2 = ai.getCardsIn(ZoneType.Battlefield); - list2 = CardLists.getValidCards(list2, tgt.getValidTgts(), ai, sa.getHostCard()); + list2 = CardLists.getValidCards(list2, tgt.getValidTgts(), ai, sa.getHostCard(), sa); object2 = ComputerUtilCard.getWorstAI(list2); sa.getTargets().add(object2); } @@ -69,7 +69,8 @@ public class ControlExchangeAi extends SpellAbilityAi { } } else { if (mandatory) { - CardCollection list2 = CardLists.getValidCards(aiPlayer.getGame().getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), aiPlayer, sa.getHostCard()); + CardCollection list2 = CardLists.getValidCards(aiPlayer.getGame().getCardsIn(ZoneType.Battlefield), + tgt.getValidTgts(), aiPlayer, sa.getHostCard(), sa); while (!list2.isEmpty()) { Card best = ComputerUtilCard.getBestAI(list2); if (sa.canTarget(best)) { diff --git a/forge-ai/src/main/java/forge/ai/ability/ControlGainAi.java b/forge-ai/src/main/java/forge/ai/ability/ControlGainAi.java index 38d4f71b22d..568c15eddd3 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ControlGainAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ControlGainAi.java @@ -119,7 +119,7 @@ public class ControlGainAi extends SpellAbilityAi { } CardCollection list = - CardLists.getValidCards(opp.getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), sa.getActivatingPlayer(), sa.getHostCard()); + CardLists.getValidCards(opp.getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), sa.getActivatingPlayer(), 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() { diff --git a/forge-ai/src/main/java/forge/ai/ability/CopyPermanentAi.java b/forge-ai/src/main/java/forge/ai/ability/CopyPermanentAi.java index 0d0589681a6..3f21575c0e8 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CopyPermanentAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CopyPermanentAi.java @@ -57,7 +57,8 @@ public class CopyPermanentAi extends SpellAbilityAi { if (abTgt != null) { sa.resetTargets(); - CardCollection list = CardLists.getValidCards(aiPlayer.getGame().getCardsIn(abTgt.getZone()), abTgt.getValidTgts(), source.getController(), source); + CardCollection list = CardLists.getValidCards(aiPlayer.getGame().getCardsIn(abTgt.getZone()), + abTgt.getValidTgts(), source.getController(), source, sa); list = CardLists.getTargetableCards(list, sa); list = CardLists.filter(list, new Predicate() { @Override diff --git a/forge-ai/src/main/java/forge/ai/ability/CounterAi.java b/forge-ai/src/main/java/forge/ai/ability/CounterAi.java index 927425f7d21..6a75a47f25b 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CounterAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CounterAi.java @@ -48,7 +48,7 @@ public class CounterAi extends SpellAbilityAi { return false; } if (sa.hasParam("AITgts") && (topSA.getHostCard() == null - || !topSA.getHostCard().isValid(sa.getParam("AITgts"), sa.getActivatingPlayer(), source))) { + || !topSA.getHostCard().isValid(sa.getParam("AITgts"), sa.getActivatingPlayer(), source, sa))) { return false; } diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersMoveAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersMoveAi.java index aecba1eede2..90185dd397b 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersMoveAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersMoveAi.java @@ -79,12 +79,12 @@ public class CountersMoveAi extends SpellAbilityAi { } else { // targeted final Player player = sa.isCurse() ? ai.getOpponent() : ai; CardCollectionView list = CardLists.getTargetableCards(player.getCardsIn(ZoneType.Battlefield), sa); - list = CardLists.getValidCards(list, abTgt.getValidTgts(), host.getController(), host); + list = CardLists.getValidCards(list, abTgt.getValidTgts(), host.getController(), host, sa); if (list.isEmpty() && mandatory) { // If there isn't any prefered cards to target, gotta choose // non-preferred ones list = CardLists.getTargetableCards(player.getOpponent().getCardsIn(ZoneType.Battlefield), sa); - list = CardLists.getValidCards(list, abTgt.getValidTgts(), host.getController(), host); + list = CardLists.getValidCards(list, abTgt.getValidTgts(), host.getController(), host, sa); preferred = false; } // Not mandatory, or the the list was regenerated and is still 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 433a1527a28..8a7640d918f 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java @@ -211,7 +211,7 @@ public class CountersPutAi extends SpellAbilityAi { } }); - list = CardLists.getValidCards(list, abTgt.getValidTgts(), source.getController(), source); + list = CardLists.getValidCards(list, abTgt.getValidTgts(), source.getController(), source, sa); if (list.size() < abTgt.getMinTargets(source, sa)) { return false; @@ -365,7 +365,7 @@ public class CountersPutAi extends SpellAbilityAi { if (abTgt != null) { CardCollection list = - CardLists.getValidCards(player.getCardsIn(ZoneType.Battlefield), abTgt.getValidTgts(), source.getController(), source); + CardLists.getValidCards(player.getCardsIn(ZoneType.Battlefield), abTgt.getValidTgts(), source.getController(), source, sa); if (list.size() == 0) { return false; @@ -454,7 +454,7 @@ public class CountersPutAi extends SpellAbilityAi { } } else { list = CardLists.getTargetableCards(player.getCardsIn(ZoneType.Battlefield), sa); - list = CardLists.getValidCards(list, abTgt.getValidTgts(), source.getController(), source); + list = CardLists.getValidCards(list, abTgt.getValidTgts(), source.getController(), source, sa); int totalTargets = list.size(); @@ -468,7 +468,7 @@ public class CountersPutAi extends SpellAbilityAi { if (list.isEmpty() && preferred) { // If it's required to choose targets and the list is empty, get a new list list = CardLists.getTargetableCards(player.getOpponent().getCardsIn(ZoneType.Battlefield), sa); - list = CardLists.getValidCards(list, abTgt.getValidTgts(), source.getController(), source); + list = CardLists.getValidCards(list, abTgt.getValidTgts(), source.getController(), source, sa); preferred = false; } } diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersPutOrRemoveAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersPutOrRemoveAi.java index 2c6b3025706..6544eabf646 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersPutOrRemoveAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersPutOrRemoveAi.java @@ -51,7 +51,7 @@ public class CountersPutOrRemoveAi extends SpellAbilityAi { List zones = ZoneType.listValueOf(sa.getParamOrDefault("TgtZones", "Battlefield")); List validCards = CardLists.getValidCards(ai.getGame().getCardsIn(zones), - tgt.getValidTgts(), sa.getActivatingPlayer(), sa.getHostCard()); + tgt.getValidTgts(), sa.getActivatingPlayer(), sa.getHostCard(), sa); if (validCards.isEmpty()) { return false; 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 98bd477e405..f6b3e4a5e52 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageAllAi.java @@ -186,7 +186,7 @@ public class DamageAllAi extends SpellAbilityAi { // TODO: X may be something different than X paid CardCollection list = - CardLists.getValidCards(player.getCardsIn(ZoneType.Battlefield), validC.split(","), source.getController(), source); + CardLists.getValidCards(player.getCardsIn(ZoneType.Battlefield), validC.split(","), source.getController(), source, sa); final Predicate filterKillable = new Predicate() { @Override diff --git a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java index ee8f732680b..e5d3a402658 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java @@ -167,7 +167,7 @@ public class DamageDealAi extends DamageAiBase { } final TargetRestrictions tgt = sa.getTargetRestrictions(); final Card source = sa.getHostCard(); - List hPlay = CardLists.getValidCards(pl.getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), ai, source); + List hPlay = CardLists.getValidCards(pl.getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), ai, source, sa); final List objects = Lists.newArrayList(sa.getTargets().getTargets()); if (sa.hasParam("TargetUnique")) { diff --git a/forge-ai/src/main/java/forge/ai/ability/DamagePreventAi.java b/forge-ai/src/main/java/forge/ai/ability/DamagePreventAi.java index 1dc875f8875..7bc8c6e204e 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamagePreventAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamagePreventAi.java @@ -102,7 +102,7 @@ public class DamagePreventAi extends SpellAbilityAi { } final List threatenedTargets = new ArrayList(); // filter AIs battlefield by what I can target - List targetables = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), ai, hostCard); + List targetables = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), ai, hostCard, sa); targetables = CardLists.getTargetableCards(targetables, sa); for (final Card c : targetables) { @@ -129,7 +129,7 @@ public class DamagePreventAi extends SpellAbilityAi { } else { // filter AIs battlefield by what I can target CardCollectionView targetables = ai.getCardsIn(ZoneType.Battlefield); - targetables = CardLists.getValidCards(targetables, tgt.getValidTgts(), ai, hostCard); + targetables = CardLists.getValidCards(targetables, tgt.getValidTgts(), ai, hostCard, sa); targetables = CardLists.getTargetableCards(targetables, sa); if (targetables.isEmpty()) { @@ -171,9 +171,7 @@ public class DamagePreventAi extends SpellAbilityAi { *

* preventDamageMandatoryTarget. *

- * - * @param af - * a {@link forge.game.ability.AbilityFactory} object. + * * @param sa * a {@link forge.game.spellability.SpellAbility} object. * @param mandatory @@ -186,7 +184,7 @@ public class DamagePreventAi extends SpellAbilityAi { // filter AIs battlefield by what I can target final Game game = ai.getGame(); CardCollectionView targetables = game.getCardsIn(ZoneType.Battlefield); - targetables = CardLists.getValidCards(targetables, tgt.getValidTgts(), ai, sa.getHostCard()); + targetables = CardLists.getValidCards(targetables, tgt.getValidTgts(), ai, sa.getHostCard(), sa); final List compTargetables = CardLists.filterControlledBy(targetables, ai); Card target = null; diff --git a/forge-ai/src/main/java/forge/ai/ability/DebuffAi.java b/forge-ai/src/main/java/forge/ai/ability/DebuffAi.java index 6fd6387823a..36adb9f60c0 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DebuffAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DebuffAi.java @@ -107,9 +107,7 @@ public class DebuffAi extends SpellAbilityAi { *

* debuffTgtAI. *

- * - * @param af - * a {@link forge.game.ability.AbilityFactory} object. + * * @param sa * a {@link forge.game.spellability.SpellAbility} object. * @param kws @@ -127,7 +125,7 @@ public class DebuffAi extends SpellAbilityAi { final TargetRestrictions tgt = sa.getTargetRestrictions(); sa.resetTargets(); CardCollection list = getCurseCreatures(ai, sa, kws == null ? Lists.newArrayList() : kws); - list = CardLists.getValidCards(list, tgt.getValidTgts(), sa.getActivatingPlayer(), sa.getHostCard()); + list = CardLists.getValidCards(list, tgt.getValidTgts(), sa.getActivatingPlayer(), sa.getHostCard(), sa); // several uses here: // 1. make human creatures lose evasion when they are attacking @@ -170,14 +168,12 @@ public class DebuffAi extends SpellAbilityAi { *

* getCurseCreatures. *

- * - * @param af - * a {@link forge.game.ability.AbilityFactory} object. + * * @param sa * a {@link forge.game.spellability.SpellAbility} object. * @param kws * a {@link java.util.ArrayList} object. - * @return a {@link forge.CardList} object. + * @return a CardCollection. */ private CardCollection getCurseCreatures(final Player ai, final SpellAbility sa, final List kws) { final Player opp = ai.getOpponent(); @@ -198,9 +194,7 @@ public class DebuffAi extends SpellAbilityAi { *

* debuffMandatoryTarget. *

- * - * @param af - * a {@link forge.game.ability.AbilityFactory} object. + * * @param sa * a {@link forge.game.spellability.SpellAbility} object. * @param mandatory @@ -209,7 +203,8 @@ public class DebuffAi extends SpellAbilityAi { */ private boolean debuffMandatoryTarget(final Player ai, final SpellAbility sa, final boolean mandatory) { final TargetRestrictions tgt = sa.getTargetRestrictions(); - CardCollection list = CardLists.getValidCards(ai.getGame().getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), sa.getActivatingPlayer(), sa.getHostCard()); + CardCollection list = CardLists.getValidCards(ai.getGame().getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), + sa.getActivatingPlayer(), sa.getHostCard(), sa); if (list.size() < tgt.getMinTargets(sa.getHostCard(), sa)) { sa.resetTargets(); diff --git a/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java b/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java index 11cc9779731..060b5574510 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java @@ -246,7 +246,7 @@ public class DestroyAi extends SpellAbilityAi { sa.resetTargets(); CardCollection list = CardLists.getTargetableCards(ai.getGame().getCardsIn(ZoneType.Battlefield), sa); - list = CardLists.getValidCards(list, tgt.getValidTgts(), source.getController(), source); + list = CardLists.getValidCards(list, tgt.getValidTgts(), source.getController(), source, sa); if (list.isEmpty() || list.size() < tgt.getMinTargets(sa.getHostCard(), sa)) { return false; 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 985bee04bba..fbcdb40549c 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DestroyAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DestroyAllAi.java @@ -35,8 +35,10 @@ public class DestroyAllAi extends SpellAbilityAi { if (sa.hasParam("ValidCards")) { valid = sa.getParam("ValidCards"); } - CardCollection humanlist = CardLists.getValidCards(ai.getOpponent().getCardsIn(ZoneType.Battlefield), valid.split(","), source.getController(), source); - CardCollection computerlist = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), valid.split(","), source.getController(), source); + CardCollection humanlist = CardLists.getValidCards(ai.getOpponent().getCardsIn(ZoneType.Battlefield), + valid.split(","), source.getController(), source, sa); + CardCollection computerlist = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), valid.split(","), + source.getController(), source, sa); if (sa.usesTargeting()) { sa.resetTargets(); @@ -94,8 +96,10 @@ public class DestroyAllAi extends SpellAbilityAi { valid = valid.replace("X", Integer.toString(xPay)); } - CardCollection humanlist = CardLists.getValidCards(ai.getOpponent().getCardsIn(ZoneType.Battlefield), valid.split(","), source.getController(), source); - CardCollection computerlist = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), valid.split(","), source.getController(), source); + CardCollection humanlist = CardLists.getValidCards(ai.getOpponent().getCardsIn(ZoneType.Battlefield), + valid.split(","), source.getController(), source, sa); + CardCollection computerlist = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), valid.split(","), + source.getController(), source, sa); if (sa.usesTargeting()) { sa.resetTargets(); sa.getTargets().add(ai.getOpponent()); diff --git a/forge-ai/src/main/java/forge/ai/ability/DigUntilAi.java b/forge-ai/src/main/java/forge/ai/ability/DigUntilAi.java index 19b0db8e4f9..b7583b7d29a 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DigUntilAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DigUntilAi.java @@ -42,7 +42,7 @@ public class DigUntilAi extends SpellAbilityAi { } else { if (sa.hasParam("Valid")) { final String valid = sa.getParam("Valid"); - if (CardLists.getValidCards(ai.getCardsIn(ZoneType.Library), valid.split(","), source.getController(), source).isEmpty()) { + if (CardLists.getValidCards(ai.getCardsIn(ZoneType.Library), valid.split(","), source.getController(), source, sa).isEmpty()) { return false; } } diff --git a/forge-ai/src/main/java/forge/ai/ability/EffectAi.java b/forge-ai/src/main/java/forge/ai/ability/EffectAi.java index 3df92465231..3b3236043c4 100644 --- a/forge-ai/src/main/java/forge/ai/ability/EffectAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/EffectAi.java @@ -74,7 +74,7 @@ public class EffectAi extends SpellAbilityAi { } } else { List list = game.getCombat().getAttackers(); - list = CardLists.getValidCards(list, tgt.getValidTgts(), sa.getActivatingPlayer(), sa.getHostCard()); + list = CardLists.getValidCards(list, tgt.getValidTgts(), sa.getActivatingPlayer(), sa.getHostCard(), sa); list = CardLists.getTargetableCards(list, sa); Card target = ComputerUtilCard.getBestCreatureAI(list); if (target == null) { diff --git a/forge-ai/src/main/java/forge/ai/ability/MustBlockAi.java b/forge-ai/src/main/java/forge/ai/ability/MustBlockAi.java index 27d7279993f..d941bcef30d 100644 --- a/forge-ai/src/main/java/forge/ai/ability/MustBlockAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/MustBlockAi.java @@ -62,7 +62,7 @@ public class MustBlockAi extends SpellAbilityAi { if (abTgt != null) { List list = CardLists.filter(ai.getOpponent().getCardsIn(ZoneType.Battlefield), CardPredicates.Presets.CREATURES); list = CardLists.getTargetableCards(list, sa); - list = CardLists.getValidCards(list, abTgt.getValidTgts(), source.getController(), source); + list = CardLists.getValidCards(list, abTgt.getValidTgts(), source.getController(), source, sa); list = CardLists.filter(list, new Predicate() { @Override public boolean apply(final Card c) { diff --git a/forge-ai/src/main/java/forge/ai/ability/PhasesAi.java b/forge-ai/src/main/java/forge/ai/ability/PhasesAi.java index f4f319a8565..a8ec32a442d 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PhasesAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PhasesAi.java @@ -107,7 +107,7 @@ public class PhasesAi extends SpellAbilityAi { final TargetRestrictions tgt = sa.getTargetRestrictions(); CardCollectionView list = game.getCardsIn(ZoneType.Battlefield); - list = CardLists.getTargetableCards(CardLists.getValidCards(list, tgt.getValidTgts(), source.getController(), source), sa); + list = CardLists.getTargetableCards(CardLists.getValidCards(list, tgt.getValidTgts(), source.getController(), source, sa), sa); return false; } diff --git a/forge-ai/src/main/java/forge/ai/ability/PlayAi.java b/forge-ai/src/main/java/forge/ai/ability/PlayAi.java index b03e0e29442..1de32e16c52 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PlayAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PlayAi.java @@ -63,7 +63,7 @@ public class PlayAi extends SpellAbilityAi { final TargetRestrictions tgt = sa.getTargetRestrictions(); if (tgt != null) { ZoneType zone = tgt.getZone().get(0); - cards = CardLists.getValidCards(ai.getGame().getCardsIn(zone), tgt.getValidTgts(), ai, source); + cards = CardLists.getValidCards(ai.getGame().getCardsIn(zone), tgt.getValidTgts(), ai, source, sa); if (cards.isEmpty()) { return false; } @@ -85,8 +85,6 @@ public class PlayAi extends SpellAbilityAi { * a {@link forge.game.spellability.SpellAbility} object. * @param mandatory * a boolean. - * @param af - * a {@link forge.game.ability.AbilityFactory} object. * * @return a boolean. */ diff --git a/forge-ai/src/main/java/forge/ai/ability/PowerExchangeAi.java b/forge-ai/src/main/java/forge/ai/ability/PowerExchangeAi.java index 6cb140a9e71..bcb9a9b89e2 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PowerExchangeAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PowerExchangeAi.java @@ -31,7 +31,7 @@ public class PowerExchangeAi extends SpellAbilityAi { sa.resetTargets(); List list = - CardLists.getValidCards(ai.getOpponent().getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), ai, sa.getHostCard()); + CardLists.getValidCards(ai.getOpponent().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() { @@ -47,7 +47,7 @@ public class PowerExchangeAi extends SpellAbilityAi { c2 = AbilityUtils.getDefinedCards(sa.getHostCard(), sa.getParam("Defined"), sa).get(0); } else if (tgt.getMinTargets(sa.getHostCard(), sa) > 1) { - CardCollection list2 = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), ai, sa.getHostCard()); + CardCollection list2 = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), ai, sa.getHostCard(), sa); CardLists.sortByPowerAsc(list2); Collections.reverse(list2); c2 = list2.isEmpty() ? null : list2.get(0); diff --git a/forge-ai/src/main/java/forge/ai/ability/ProtectAi.java b/forge-ai/src/main/java/forge/ai/ability/ProtectAi.java index cfe8b9e7de7..4047e6bff90 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ProtectAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ProtectAi.java @@ -99,10 +99,7 @@ public class ProtectAi extends SpellAbilityAi { *

* getProtectCreatures. *

- * - * @param af - * a {@link forge.game.ability.AbilityFactory} object. - * @return a {@link forge.CardList} object. + * */ public static CardCollection getProtectCreatures(final Player ai, final SpellAbility sa) { final List gains = ProtectEffect.getProtectionList(sa); @@ -252,7 +249,7 @@ public class ProtectAi extends SpellAbilityAi { sa.resetTargets(); CardCollection list = getProtectCreatures(ai, sa); - list = CardLists.getValidCards(list, tgt.getValidTgts(), sa.getActivatingPlayer(), sa.getHostCard()); + list = CardLists.getValidCards(list, tgt.getValidTgts(), sa.getActivatingPlayer(), sa.getHostCard(), sa); if (game.getStack().isEmpty()) { // If the cost is tapping, don't activate before declare @@ -306,7 +303,7 @@ public class ProtectAi extends SpellAbilityAi { final Game game = ai.getGame(); final TargetRestrictions tgt = sa.getTargetRestrictions(); - CardCollection list = CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), sa.getActivatingPlayer(), sa.getHostCard()); + CardCollection list = CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), sa.getActivatingPlayer(), sa.getHostCard(), sa); if (list.size() < tgt.getMinTargets(sa.getHostCard(), sa)) { sa.resetTargets(); diff --git a/forge-ai/src/main/java/forge/ai/ability/PumpAi.java b/forge-ai/src/main/java/forge/ai/ability/PumpAi.java index ba656ebe2f2..93bc3352603 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PumpAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PumpAi.java @@ -240,7 +240,7 @@ public class PumpAi extends PumpAiBase { CardCollection list; if (sa.hasParam("AILogic")) { if (sa.getParam("AILogic").equals("HighestPower")) { - list = CardLists.getValidCards(CardLists.filter(game.getCardsIn(ZoneType.Battlefield), Presets.CREATURES), tgt.getValidTgts(), ai, source); + list = CardLists.getValidCards(CardLists.filter(game.getCardsIn(ZoneType.Battlefield), Presets.CREATURES), tgt.getValidTgts(), ai, source, sa); list = CardLists.getTargetableCards(list, sa); CardLists.sortByPowerDesc(list); if (!list.isEmpty()) { @@ -274,7 +274,7 @@ public class PumpAi extends PumpAiBase { } } - list = CardLists.getValidCards(list, tgt.getValidTgts(), ai, source); + list = CardLists.getValidCards(list, tgt.getValidTgts(), ai, source, sa); if (game.getStack().isEmpty()) { // If the cost is tapping, don't activate before declare // attack/block @@ -359,7 +359,7 @@ public class PumpAi extends PumpAiBase { final Game game = ai.getGame(); final TargetRestrictions tgt = sa.getTargetRestrictions(); final Player opp = ai.getOpponent(); - CardCollection list = CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), sa.getActivatingPlayer(), sa.getHostCard()); + CardCollection list = CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), sa.getActivatingPlayer(), sa.getHostCard(), sa); list = CardLists.getTargetableCards(list, sa); if (list.size() < tgt.getMinTargets(sa.getHostCard(), sa)) { diff --git a/forge-ai/src/main/java/forge/ai/ability/RegenerateAi.java b/forge-ai/src/main/java/forge/ai/ability/RegenerateAi.java index cd566a32a60..6809d3663ad 100644 --- a/forge-ai/src/main/java/forge/ai/ability/RegenerateAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/RegenerateAi.java @@ -115,7 +115,7 @@ public class RegenerateAi extends SpellAbilityAi { } else { sa.resetTargets(); // filter AIs battlefield by what I can target - List targetables = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), ai, hostCard); + List targetables = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), ai, hostCard, sa); targetables = CardLists.getTargetableCards(targetables, sa); if (targetables.size() == 0) { @@ -184,7 +184,7 @@ public class RegenerateAi extends SpellAbilityAi { sa.resetTargets(); // filter AIs battlefield by what I can target CardCollectionView targetables = game.getCardsIn(ZoneType.Battlefield); - targetables = CardLists.getValidCards(targetables, tgt.getValidTgts(), ai, hostCard); + targetables = CardLists.getValidCards(targetables, tgt.getValidTgts(), ai, hostCard, sa); targetables = CardLists.getTargetableCards(targetables, sa); final List compTargetables = CardLists.filterControlledBy(targetables, ai); 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 8694b9d7094..1ced7a46d1f 100644 --- a/forge-ai/src/main/java/forge/ai/ability/RegenerateAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/RegenerateAllAi.java @@ -50,7 +50,7 @@ public class RegenerateAllAi extends SpellAbilityAi { } CardCollectionView list = game.getCardsIn(ZoneType.Battlefield); - list = CardLists.getValidCards(list, valid.split(","), hostCard.getController(), hostCard); + list = CardLists.getValidCards(list, valid.split(","), hostCard.getController(), hostCard, sa); list = CardLists.filter(list, CardPredicates.isController(ai)); if (list.size() == 0) { diff --git a/forge-ai/src/main/java/forge/ai/ability/SacrificeAi.java b/forge-ai/src/main/java/forge/ai/ability/SacrificeAi.java index f53b57c6300..8ba80021120 100644 --- a/forge-ai/src/main/java/forge/ai/ability/SacrificeAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/SacrificeAi.java @@ -72,7 +72,7 @@ public class SacrificeAi extends SpellAbilityAi { final int amount = AbilityUtils.calculateAmount(sa.getHostCard(), num, sa); List list = - CardLists.getValidCards(ai.getOpponent().getCardsIn(ZoneType.Battlefield), valid.split(","), sa.getActivatingPlayer(), sa.getHostCard()); + CardLists.getValidCards(ai.getOpponent().getCardsIn(ZoneType.Battlefield), valid.split(","), sa.getActivatingPlayer(), sa.getHostCard(), sa); for (Card c : list) { if (c.hasSVar("SacMe") && Integer.parseInt(c.getSVar("SacMe")) > 3) { return false; @@ -126,7 +126,7 @@ public class SacrificeAi extends SpellAbilityAi { } List humanList = - CardLists.getValidCards(opp.getCardsIn(ZoneType.Battlefield), valid.split(","), sa.getActivatingPlayer(), sa.getHostCard()); + CardLists.getValidCards(opp.getCardsIn(ZoneType.Battlefield), valid.split(","), sa.getActivatingPlayer(), sa.getHostCard(), sa); // Since all of the cards have remAIDeck:True, I enabled 1 for 1 // (or X for X) trades for special decks @@ -135,7 +135,7 @@ public class SacrificeAi extends SpellAbilityAi { } } else if (defined.equals("You")) { List computerList = - CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), valid.split(","), sa.getActivatingPlayer(), sa.getHostCard()); + CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), valid.split(","), sa.getActivatingPlayer(), sa.getHostCard(), sa); for (Card c : computerList) { if (c.hasSVar("SacMe") || ComputerUtilCard.evaluateCreature(c) <= 135) { return true; diff --git a/forge-ai/src/main/java/forge/ai/ability/SacrificeAllAi.java b/forge-ai/src/main/java/forge/ai/ability/SacrificeAllAi.java index 3479bbbf90a..856637b1640 100644 --- a/forge-ai/src/main/java/forge/ai/ability/SacrificeAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/SacrificeAllAi.java @@ -38,9 +38,9 @@ public class SacrificeAllAi extends SpellAbilityAi { } CardCollection humanlist = - CardLists.getValidCards(ai.getOpponent().getCardsIn(ZoneType.Battlefield), valid.split(","), source.getController(), source); + CardLists.getValidCards(ai.getOpponent().getCardsIn(ZoneType.Battlefield), valid.split(","), source.getController(), source, sa); CardCollection computerlist = - CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), valid.split(","), source.getController(), source); + CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), valid.split(","), source.getController(), source, sa); if (abCost != null) { // AI currently disabled for some costs diff --git a/forge-ai/src/main/java/forge/ai/ability/TapAiBase.java b/forge-ai/src/main/java/forge/ai/ability/TapAiBase.java index d35a73fd222..f77533c1ce4 100644 --- a/forge-ai/src/main/java/forge/ai/ability/TapAiBase.java +++ b/forge-ai/src/main/java/forge/ai/ability/TapAiBase.java @@ -29,12 +29,11 @@ public abstract class TapAiBase extends SpellAbilityAi { * tapTargetList. *

* - * @param af - * a {@link forge.game.ability.AbilityFactory} object. + * @param sa * a {@link forge.game.spellability.SpellAbility} object. * @param tapList - * a {@link forge.CardList} object. + * a CardCollection object. * @param mandatory * a boolean. * @return a boolean. @@ -105,8 +104,6 @@ public abstract class TapAiBase extends SpellAbilityAi { * a {@link forge.game.card.Card} object. * @param tgt * a {@link forge.game.spellability.TargetRestrictions} object. - * @param af - * a {@link forge.game.ability.AbilityFactory} object. * @param sa * a {@link forge.game.spellability.SpellAbility} object. * @param mandatory @@ -117,7 +114,7 @@ public abstract class TapAiBase extends SpellAbilityAi { final Player opp = ai.getOpponent(); final Game game = ai.getGame(); CardCollection tapList = CardLists.filterControlledBy(game.getCardsIn(ZoneType.Battlefield), ai.getOpponents()); - tapList = CardLists.getValidCards(tapList, tgt.getValidTgts(), source.getController(), source); + tapList = CardLists.getValidCards(tapList, tgt.getValidTgts(), source.getController(), source, sa); tapList = CardLists.getTargetableCards(tapList, sa); tapList = CardLists.filter(tapList, Presets.UNTAPPED); tapList = CardLists.filter(tapList, new Predicate() { @@ -139,7 +136,7 @@ public abstract class TapAiBase extends SpellAbilityAi { //use broader approach when the cost is a positive thing if (tapList.isEmpty() && ComputerUtil.activateForCost(sa, ai)) { tapList = CardLists.filterControlledBy(game.getCardsIn(ZoneType.Battlefield), ai.getOpponents()); - tapList = CardLists.getValidCards(tapList, tgt.getValidTgts(), source.getController(), source); + tapList = CardLists.getValidCards(tapList, tgt.getValidTgts(), source.getController(), source, sa); tapList = CardLists.getTargetableCards(tapList, sa); tapList = CardLists.filter(tapList, new Predicate() { @Override @@ -252,9 +249,7 @@ public abstract class TapAiBase extends SpellAbilityAi { *

* tapUnpreferredTargeting. *

- * - * @param af - * a {@link forge.game.ability.AbilityFactory} object. + * * @param sa * a {@link forge.game.spellability.SpellAbility} object. * @param mandatory @@ -266,7 +261,7 @@ public abstract class TapAiBase extends SpellAbilityAi { final TargetRestrictions tgt = sa.getTargetRestrictions(); final Game game = ai.getGame(); - CardCollection list = CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), source.getController(), source); + CardCollection list = CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), source.getController(), source, sa); list = CardLists.getTargetableCards(list, sa); // try to tap anything controlled by the computer @@ -281,7 +276,7 @@ public abstract class TapAiBase extends SpellAbilityAi { // filter by enchantments and planeswalkers, their tapped state doesn't matter. final String[] tappablePermanents = { "Enchantment", "Planeswalker" }; - tapList = CardLists.getValidCards(list, tappablePermanents, source.getController(), source); + tapList = CardLists.getValidCards(list, tappablePermanents, source.getController(), source, sa); if (tapTargetList(ai, sa, tapList, mandatory)) { return true; 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 34a47655303..588c075b33a 100644 --- a/forge-ai/src/main/java/forge/ai/ability/TokenAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/TokenAi.java @@ -181,7 +181,7 @@ public class TokenAi extends SpellAbilityAi { } else { //Flash Foliage CardCollection list = CardLists.filterControlledBy(game.getCardsIn(ZoneType.Battlefield), ai.getOpponents()); - list = CardLists.getValidCards(list, tgt.getValidTgts(), source.getController(), source); + list = CardLists.getValidCards(list, tgt.getValidTgts(), source.getController(), source, sa); list = CardLists.getTargetableCards(list, sa); CardCollection betterList = CardLists.filter(list, new Predicate() { @Override @@ -233,14 +233,14 @@ public class TokenAi extends SpellAbilityAi { num = (num == null) ? "1" : num; final int nToSac = AbilityUtils.calculateAmount(topStack.getHostCard(), num, topStack); CardCollection list = - CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), valid.split(","), opp, topStack.getHostCard()); + CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), valid.split(","), opp, topStack.getHostCard(), sa); list = CardLists.filter(list, CardPredicates.canBeSacrificedBy(topStack)); if (!list.isEmpty() && nTokens > 0 && list.size() == nToSac) { //only care about saving single creature for now ComputerUtilCard.sortByEvaluateCreature(list); Card token = spawnToken(ai, sa); if (token != null) { list.add(token); - list = CardLists.getValidCards(list, valid.split(","), ai.getOpponent(), topStack.getHostCard()); + list = CardLists.getValidCards(list, valid.split(","), ai.getOpponent(), topStack.getHostCard(), sa); list = CardLists.filter(list, CardPredicates.canBeSacrificedBy(topStack)); if (ComputerUtilCard.evaluateCreature(token) < ComputerUtilCard.evaluateCreature(list.get(0)) && list.contains(token)) { diff --git a/forge-ai/src/main/java/forge/ai/ability/UntapAi.java b/forge-ai/src/main/java/forge/ai/ability/UntapAi.java index b0b084cc4aa..00d33b54a66 100644 --- a/forge-ai/src/main/java/forge/ai/ability/UntapAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/UntapAi.java @@ -109,8 +109,6 @@ public class UntapAi extends SpellAbilityAi { * * @param tgt * a {@link forge.game.spellability.TargetRestrictions} object. - * @param af - * a {@link forge.game.ability.AbilityFactory} object. * @param sa * a {@link forge.game.spellability.SpellAbility} object. * @param mandatory @@ -127,7 +125,7 @@ public class UntapAi extends SpellAbilityAi { } CardCollection list = CardLists.getTargetableCards(targetController.getCardsIn(ZoneType.Battlefield), sa); - list = CardLists.getValidCards(list, tgt.getValidTgts(), source.getController(), source); + list = CardLists.getValidCards(list, tgt.getValidTgts(), source.getController(), source, sa); if (list.isEmpty()) { return false; @@ -137,7 +135,7 @@ public class UntapAi extends SpellAbilityAi { // filter out enchantments and planeswalkers, their tapped state doesn't // matter. final String[] tappablePermanents = { "Creature", "Land", "Artifact" }; - untapList = CardLists.getValidCards(untapList, tappablePermanents, source.getController(), source); + untapList = CardLists.getValidCards(untapList, tappablePermanents, source.getController(), source, sa); while (sa.getTargets().getNumTargeted() < tgt.getMaxTargets(sa.getHostCard(), sa)) { Card choice = null; @@ -198,9 +196,7 @@ public class UntapAi extends SpellAbilityAi { *

* untapUnpreferredTargeting. *

- * - * @param af - * a {@link forge.game.ability.AbilityFactory} object. + * * @param sa * a {@link forge.game.spellability.SpellAbility} object. * @param mandatory @@ -211,13 +207,14 @@ public class UntapAi extends SpellAbilityAi { final Card source = sa.getHostCard(); final TargetRestrictions tgt = sa.getTargetRestrictions(); - CardCollection list = CardLists.getValidCards(sa.getActivatingPlayer().getGame().getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), source.getController(), source); + CardCollection list = CardLists.getValidCards(source.getGame().getCardsIn(ZoneType.Battlefield), + tgt.getValidTgts(), source.getController(), source, sa); list = CardLists.getTargetableCards(list, sa); // filter by enchantments and planeswalkers, their tapped state doesn't // matter. final String[] tappablePermanents = { "Enchantment", "Planeswalker" }; - CardCollection tapList = CardLists.getValidCards(list, tappablePermanents, source.getController(), source); + CardCollection tapList = CardLists.getValidCards(list, tappablePermanents, source.getController(), source, sa); if (untapTargetList(source, tgt, sa, mandatory, tapList)) { return true; 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 c063733f5f9..078c1fafef8 100644 --- a/forge-ai/src/main/java/forge/ai/ability/UntapAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/UntapAllAi.java @@ -27,7 +27,7 @@ public class UntapAllAi extends SpellAbilityAi { if (sa.hasParam("ValidCards")) { valid = sa.getParam("ValidCards"); } - list = CardLists.getValidCards(list, valid.split(","), source.getController(), source); + list = CardLists.getValidCards(list, valid.split(","), source.getController(), source, sa); return !list.isEmpty(); } return false; diff --git a/forge-game/src/main/java/forge/game/CardTraitBase.java b/forge-game/src/main/java/forge/game/CardTraitBase.java index ddc5424e96d..9dfd833d26d 100644 --- a/forge-game/src/main/java/forge/game/CardTraitBase.java +++ b/forge-game/src/main/java/forge/game/CardTraitBase.java @@ -132,7 +132,7 @@ public abstract class CardTraitBase extends GameObject implements IHasCardView { public static boolean matchesValid(final Object o, final String[] valids, final Card srcCard) { if (o instanceof GameEntity) { final GameEntity c = (GameEntity) o; - return c.isValid(valids, srcCard.getController(), srcCard); + return c.isValid(valids, srcCard.getController(), srcCard, null); } return false; @@ -240,7 +240,7 @@ public abstract class CardTraitBase extends GameObject implements IHasCardView { } } - list = CardLists.getValidCards(list, sIsPresent.split(","), this.getHostCard().getController(), this.getHostCard()); + list = CardLists.getValidCards(list, sIsPresent.split(","), this.getHostCard().getController(), this.getHostCard(), null); int right = 1; final String rightString = presentCompare.substring(2); @@ -281,7 +281,7 @@ public abstract class CardTraitBase extends GameObject implements IHasCardView { } } - list = CardLists.getValidCards(list, sIsPresent.split(","), this.getHostCard().getController(), this.getHostCard()); + list = CardLists.getValidCards(list, sIsPresent.split(","), this.getHostCard().getController(), this.getHostCard(), null); int right = 1; final String rightString = presentCompare.substring(2); diff --git a/forge-game/src/main/java/forge/game/GameObject.java b/forge-game/src/main/java/forge/game/GameObject.java index 7e8af9f36a5..610a9d4617d 100644 --- a/forge-game/src/main/java/forge/game/GameObject.java +++ b/forge-game/src/main/java/forge/game/GameObject.java @@ -19,11 +19,12 @@ public abstract class GameObject { * the source controller * @param source * the source + * @param spellAbility * @return true, if is valid */ - public boolean isValid(final String[] restrictions, final Player sourceController, final Card source) { + public boolean isValid(final String[] restrictions, final Player sourceController, final Card source, SpellAbility spellAbility) { for (final String restriction : restrictions) { - if (this.isValid(restriction, sourceController, source)) { + if (this.isValid(restriction, sourceController, source, spellAbility)) { return true; } } @@ -39,9 +40,10 @@ public abstract class GameObject { * the source controller * @param source * the source + * @param spellAbility * @return true, if is valid */ - public boolean isValid(final String restriction, final Player sourceController, final Card source) { + public boolean isValid(final String restriction, final Player sourceController, final Card source, SpellAbility spellAbility) { return false; } @@ -54,9 +56,10 @@ public abstract class GameObject { * the source controller * @param source * the source + * @param spellAbility * @return true, if successful */ - public boolean hasProperty(final String property, final Player sourceController, final Card source) { + public boolean hasProperty(final String property, final Player sourceController, final Card source, SpellAbility spellAbility) { return false; } } \ No newline at end of file diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java index a165fc967df..02189e5f3c3 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -274,17 +274,17 @@ public class AbilityUtils { } else if (defined.startsWith("Valid ")) { String validDefined = defined.substring("Valid ".length()); - list = CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), validDefined.split(","), hostCard.getController(), hostCard); + list = CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), validDefined.split(","), hostCard.getController(), hostCard, sa); } else if (defined.startsWith("ValidAll ")) { String validDefined = defined.substring("ValidAll ".length()); - list = CardLists.getValidCards(game.getCardsInGame(), validDefined.split(","), hostCard.getController(), hostCard); + list = CardLists.getValidCards(game.getCardsInGame(), validDefined.split(","), hostCard.getController(), hostCard, sa); } else if (defined.startsWith("Valid")) { String[] s = defined.split(" "); String zone = s[0].substring("Valid".length()); String validDefined = s[1]; - list = CardLists.getValidCards(game.getCardsIn(ZoneType.smartValueOf(zone)), validDefined.split(","), hostCard.getController(), hostCard); + list = CardLists.getValidCards(game.getCardsIn(ZoneType.smartValueOf(zone)), validDefined.split(","), hostCard.getController(), hostCard, sa); } else { return cards; @@ -432,7 +432,7 @@ public class AbilityUtils { else if (hType.startsWith("Property") && ability instanceof SpellAbility) { String defined = hType.split("Property")[1]; for (Player p : game.getPlayersInTurnOrder()) { - if (p.hasProperty(defined, ((SpellAbility)ability).getActivatingPlayer(), ability.getHostCard())) { + if (p.hasProperty(defined, ((SpellAbility)ability).getActivatingPlayer(), ability.getHostCard(), (SpellAbility)ability)) { players.add(p); } } @@ -785,7 +785,7 @@ public class AbilityUtils { String var = sa.getParam("AbilityCount"); valid = valid.replace(var, Integer.toString(calculateAmount(source, var, sa))); } - return CardLists.getValidCards(list, valid.split(","), sa.getActivatingPlayer(), source); + return CardLists.getValidCards(list, valid.split(","), sa.getActivatingPlayer(), source, sa); } /** @@ -1106,7 +1106,7 @@ public class AbilityUtils { } else { for (Player p : game.getPlayersInTurnOrder()) { - if (p.isValid(defined, sa.getActivatingPlayer(), sa.getHostCard())) { + if (p.isValid(defined, sa.getActivatingPlayer(), sa.getHostCard(), null)) { players.add(p); } } 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 9328bf6625f..3018031278a 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 @@ -142,7 +142,7 @@ public class AnimateAllEffect extends AnimateEffectBase { list = tgtPlayers.get(0).getCardsIn(ZoneType.Battlefield); } - list = CardLists.getValidCards(list, valid.split(","), host.getController(), host); + list = CardLists.getValidCards(list, valid.split(","), host.getController(), host, sa); for (final Card c : list) { doAnimate(c, sa, power, toughness, types, removeTypes, finalDesc, diff --git a/forge-game/src/main/java/forge/game/ability/effects/AttachEffect.java b/forge-game/src/main/java/forge/game/ability/effects/AttachEffect.java index 091773ef6c9..88da24a109f 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/AttachEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/AttachEffect.java @@ -84,8 +84,6 @@ public class AttachEffect extends SpellAbilityEffect { * the card * @param o * the o - * @param af - * the af */ public static void handleAttachment(final Card card, final Object o, final SpellAbility sa) { @@ -126,8 +124,6 @@ public class AttachEffect extends SpellAbilityEffect { * the card * @param tgt * the tgt - * @param gainControl - * the gain control */ public static void handleAura(final Card card, final GameEntity tgt) { if (card.isEnchanting()) { @@ -196,7 +192,7 @@ public class AttachEffect extends SpellAbilityEffect { final FCollection players = new FCollection(); for (Player player : game.getPlayers()) { - if (player.isValid(tgt.getValidTgts(), aura.getActivatingPlayer(), source)) { + if (player.isValid(tgt.getValidTgts(), aura.getActivatingPlayer(), source, null)) { players.add(player); } } @@ -208,7 +204,7 @@ public class AttachEffect extends SpellAbilityEffect { } else { CardCollectionView list = game.getCardsIn(tgt.getZone()); - list = CardLists.getValidCards(list, tgt.getValidTgts(), aura.getActivatingPlayer(), source); + list = CardLists.getValidCards(list, tgt.getValidTgts(), aura.getActivatingPlayer(), source, aura); if (list.isEmpty()) { return false; } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeTargetsEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeTargetsEffect.java index c3cdd033ff3..24109738fd8 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChangeTargetsEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeTargetsEffect.java @@ -112,10 +112,10 @@ public class ChangeTargetsEffect extends SpellAbilityEffect { if (null != newTarget) { if (sa.hasParam("TargetRestriction")) { if (newTarget.getFirstTargetedCard() != null && newTarget.getFirstTargetedCard(). - isValid(sa.getParam("TargetRestriction").split(","), activator, sa.getHostCard())) { + isValid(sa.getParam("TargetRestriction").split(","), activator, sa.getHostCard(), sa)) { changingTgtSI.updateTarget(newTarget); } else if (newTarget.getFirstTargetedPlayer() != null && newTarget.getFirstTargetedPlayer(). - isValid(sa.getParam("TargetRestriction").split(","), activator, sa.getHostCard())) { + isValid(sa.getParam("TargetRestriction").split(","), activator, sa.getHostCard(), sa)) { changingTgtSI.updateTarget(newTarget); } } else { diff --git a/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java index 80224228b33..e0431d43ace 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java @@ -118,7 +118,7 @@ public class CopyPermanentEffect extends SpellAbilityEffect { final PaperCard cp = Aggregates.random(copysource); Card possibleCard = Card.fromPaperCard(cp, sa.getActivatingPlayer()); // Need to temporarily set the Owner so the Game is set - if (possibleCard.isValid(valid, hostCard.getController(), hostCard)) { + if (possibleCard.isValid(valid, hostCard.getController(), hostCard, sa)) { choice.add(possibleCard); copysource.remove(cp); ncopied -= 1; diff --git a/forge-game/src/main/java/forge/game/ability/effects/CounterEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CounterEffect.java index 9f2a5f7d4fc..f9a4ec4a5b2 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CounterEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CounterEffect.java @@ -31,7 +31,7 @@ public class CounterEffect extends SpellAbilityEffect { continue; } if (sa.hasParam("AllValid")) { - if (!spell.getHostCard().isValid(sa.getParam("AllValid"), sa.getActivatingPlayer(), sa.getHostCard())) { + if (!spell.getHostCard().isValid(sa.getParam("AllValid"), sa.getActivatingPlayer(), sa.getHostCard(), sa)) { continue; } } @@ -76,7 +76,7 @@ public class CounterEffect extends SpellAbilityEffect { continue; } if (sa.hasParam("AllValid")) { - if (!spell.getHostCard().isValid(sa.getParam("AllValid"), sa.getActivatingPlayer(), sa.getHostCard())) { + if (!spell.getHostCard().isValid(sa.getParam("AllValid"), sa.getActivatingPlayer(), sa.getHostCard(), sa)) { continue; } } @@ -145,7 +145,6 @@ public class CounterEffect extends SpellAbilityEffect { * @param si * a {@link forge.game.spellability.SpellAbilityStackInstance} * object. - * @param sa */ private static void removeFromStack(final SpellAbility tgtSA, final SpellAbility srcSA, final SpellAbilityStackInstance si) { 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 fd03a9514e6..b51de3435d4 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 @@ -32,7 +32,7 @@ public class DamagePreventAllEffect extends SpellAbilityEffect { if (!players.equals("")) { for (final Player p : game.getPlayers()) { - if (p.isValid(players, source.getController(), source)) { + if (p.isValid(players, source.getController(), source, sa)) { p.addPreventNextDamage(numDam); } } 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 027ad473d4d..1cbddaffe4f 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 @@ -182,9 +182,9 @@ public class DigEffect extends SpellAbilityEffect { if (changeValid.contains("ChosenType")) { changeValid = changeValid.replace("ChosenType", host.getChosenType()); } - valid = CardLists.getValidCards(top, changeValid.split(","), host.getController(), host); + valid = CardLists.getValidCards(top, changeValid.split(","), host.getController(), host, sa); if (!andOrValid.equals("")) { - andOrCards = CardLists.getValidCards(top, andOrValid.split(","), host.getController(), host); + andOrCards = CardLists.getValidCards(top, andOrValid.split(","), host.getController(), host, sa); andOrCards.removeAll((Collection)valid); valid.addAll(andOrCards); } @@ -275,10 +275,10 @@ public class DigEffect extends SpellAbilityEffect { valid.remove(chosen); if (!andOrValid.equals("")) { andOrCards.remove(chosen); - if (!chosen.isValid(andOrValid.split(","), host.getController(), host)) { + if (!chosen.isValid(andOrValid.split(","), host.getController(), host, sa)) { valid = new CardCollection(andOrCards); } - else if (!chosen.isValid(changeValid.split(","), host.getController(), host)) { + else if (!chosen.isValid(changeValid.split(","), host.getController(), host, sa)) { valid.removeAll((Collection)andOrCards); } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/DigUntilEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DigUntilEffect.java index 2a8b9af1d71..d2ed9dcc0d7 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DigUntilEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DigUntilEffect.java @@ -124,7 +124,7 @@ public class DigUntilEffect extends SpellAbilityEffect { for (int i = 0; i < maxToDig; i++) { final Card c = library.get(i); revealed.add(c); - if (c.isValid(type, sa.getActivatingPlayer(), host)) { + if (c.isValid(type, sa.getActivatingPlayer(), host, sa)) { found.add(c); if (remember) { host.addRemembered(c); diff --git a/forge-game/src/main/java/forge/game/ability/effects/DiscardEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DiscardEffect.java index 5f2eee8be97..bae5a408fe7 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DiscardEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DiscardEffect.java @@ -210,7 +210,7 @@ public class DiscardEffect extends SpellAbilityEffect { valid = valid.replace("X", Integer.toString(AbilityUtils.calculateAmount(source, "X", sa))); } - List dPChHand = CardLists.getValidCards(dPHand, valid.split(","), source.getController(), source); + List dPChHand = CardLists.getValidCards(dPHand, valid.split(","), source.getController(), source, sa); dPChHand = CardLists.filter(dPChHand, Presets.NON_TOKEN); // Reveal cards that will be discarded? for (final Card c : dPChHand) { @@ -230,7 +230,7 @@ public class DiscardEffect extends SpellAbilityEffect { } final String valid = sa.hasParam("DiscardValid") ? sa.getParam("DiscardValid") : "Card"; String[] dValid = valid.split(","); - CardCollection validCards = CardLists.getValidCards(dPHand, dValid, source.getController(), source); + CardCollection validCards = CardLists.getValidCards(dPHand, dValid, source.getController(), source, sa); Player chooser = p; if (mode.equals("RevealYouChoose")) { @@ -267,6 +267,5 @@ public class DiscardEffect extends SpellAbilityEffect { source.addRemembered(c); } } - } // discardResolve() } 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 666c2289927..8fc658445a2 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 @@ -103,7 +103,7 @@ public class PlayEffect extends SpellAbilityEffect { // Need to temporarily set the Owner so the Game is set possibleCard.setOwner(sa.getActivatingPlayer()); - if (possibleCard.isValid(valid, source.getController(), source)) { + if (possibleCard.isValid(valid, source.getController(), source, sa)) { choice.add(possibleCard); copysource.remove(cp); ncopied -= 1; 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 cb4c109b2f3..1635c3d8b8f 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 @@ -28,7 +28,7 @@ public class RegenerateAllEffect extends SpellAbilityEffect { } CardCollectionView list = game.getCardsIn(ZoneType.Battlefield); - list = CardLists.getValidCards(list, valid.split(","), hostCard.getController(), hostCard); + list = CardLists.getValidCards(list, valid.split(","), hostCard.getController(), hostCard, sa); for (final Card c : list) { final GameCommand untilEOT = new GameCommand() { 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 2e7e68db031..3c0066fdfc7 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 @@ -59,10 +59,8 @@ public class RepeatEffect extends SpellAbilityEffect { *

* checkRepeatConditions. *

- * - * @param AF - * a {@link forge.game.ability.AbilityFactory} object. - * @param SA + * + * @param sa * a {@link forge.game.spellability.SpellAbility} object. */ private static boolean checkRepeatConditions(final SpellAbility sa) { @@ -85,7 +83,7 @@ public class RepeatEffect extends SpellAbilityEffect { else { list = game.getCardsIn(ZoneType.Battlefield); } - list = CardLists.getValidCards(list, repeatPresent.split(","), sa.getActivatingPlayer(), sa.getHostCard()); + list = CardLists.getValidCards(list, repeatPresent.split(","), sa.getActivatingPlayer(), sa.getHostCard(), sa); int right; final String rightString = repeatCompare.substring(2); diff --git a/forge-game/src/main/java/forge/game/ability/effects/RestartGameEffect.java b/forge-game/src/main/java/forge/game/ability/effects/RestartGameEffect.java index e16f5a1babc..c840ec21c04 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/RestartGameEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/RestartGameEffect.java @@ -43,7 +43,7 @@ public class RestartGameEffect extends SpellAbilityEffect { List filteredCards = null; if (leaveZone != null) { filteredCards = CardLists.filter(p.getCardsIn(leaveZone), - CardPredicates.restriction(leaveRestriction.split(","), p, sa.getHostCard())); + CardPredicates.restriction(leaveRestriction.split(","), p, sa.getHostCard(), null)); newLibrary.addAll(filteredCards); } playerLibraries.put(p, newLibrary); diff --git a/forge-game/src/main/java/forge/game/ability/effects/UnattachAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/UnattachAllEffect.java index 8b9e48a43c4..394576a0319 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/UnattachAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/UnattachAllEffect.java @@ -158,7 +158,7 @@ public class UnattachAllEffect extends SpellAbilityEffect { String valid = sa.getParam("UnattachValid"); CardCollectionView unattachList = game.getCardsIn(ZoneType.Battlefield); - unattachList = CardLists.getValidCards(unattachList, valid.split(","), source.getController(), source); + unattachList = CardLists.getValidCards(unattachList, valid.split(","), source.getController(), source, sa); for (final Card c : unattachList) { handleUnattachment((GameEntity) o, c); } 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 d9d668c89a5..c028875a347 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 @@ -43,7 +43,7 @@ public class UntapAllEffect extends SpellAbilityEffect { } list = list2; } - list = CardLists.getValidCards(list, valid.split(","), card.getController(), card); + list = CardLists.getValidCards(list, valid.split(","), card.getController(), card, sa); boolean remember = sa.hasParam("RememberUntapped"); for (Card c : list) { diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 5fb5ac3e6cc..c009440c599 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -2328,7 +2328,7 @@ public class Card extends GameEntity implements Comparable { final String parse = getKeywords().get(keywordPosition); final String[] k = parse.split(" ", 2); final String[] restrictions = k[1].split(","); - if (c.isValid(restrictions, getController(), this)) { + if (c.isValid(restrictions, getController(), this, null)) { getGame().getGameLog().add(GameLogEntryType.STACK_RESOLVE, "Trying to equip " + c.getName() + " but it can't be equipped."); return; } @@ -3570,7 +3570,7 @@ public class Card extends GameEntity implements Comparable { // Takes one argument like Permanent.Blue+withFlying @Override - public final boolean isValid(final String restriction, final Player sourceController, final Card source) { + public final boolean isValid(final String restriction, final Player sourceController, final Card source, SpellAbility spellAbility) { if (isImmutable() && !source.isRemembered(this)) { // special case exclusion return false; } @@ -3599,7 +3599,7 @@ public class Card extends GameEntity implements Comparable { final String excR = incR[1]; final String[] exRs = excR.split("\\+"); // Exclusive Restrictions are ... for (String exR : exRs) { - if (!hasProperty(exR, sourceController, source)) { + if (!hasProperty(exR, sourceController, source, spellAbility)) { return testFailed; } } @@ -3609,7 +3609,7 @@ public class Card extends GameEntity implements Comparable { // Takes arguments like Blue or withFlying @Override - public boolean hasProperty(final String property, final Player sourceController, final Card source) { + public boolean hasProperty(final String property, final Player sourceController, final Card source, SpellAbility spellAbility) { final Game game = getGame(); final Combat combat = game.getCombat(); final Card lki = getGame().getChangeZoneLKIInfo(this); @@ -3850,12 +3850,12 @@ public class Card extends GameEntity implements Comparable { } } else if (property.startsWith("OwnedBy")) { final String valid = property.substring(8); - if (!getOwner().isValid(valid, sourceController, source)) { + if (!getOwner().isValid(valid, sourceController, source, spellAbility)) { return false; } } else if (property.startsWith("ControlledBy")) { final String valid = property.substring(13); - if (!controller.isValid(valid, sourceController, source)) { + if (!controller.isValid(valid, sourceController, source, spellAbility)) { return false; } } else if (property.startsWith("OwnerDoesntControl")) { @@ -3918,9 +3918,9 @@ public class Card extends GameEntity implements Comparable { return false; } } else { - if ((enchanting == null || !enchanting.isValid(restriction, sourceController, source)) - && (equipping == null || !equipping.isValid(restriction, sourceController, source)) - && (fortifying == null || !fortifying.isValid(restriction, sourceController, source))) { + if ((enchanting == null || !enchanting.isValid(restriction, sourceController, source, spellAbility)) + && (equipping == null || !equipping.isValid(restriction, sourceController, source, spellAbility)) + && (fortifying == null || !fortifying.isValid(restriction, sourceController, source, spellAbility))) { return false; } } @@ -3967,7 +3967,7 @@ public class Card extends GameEntity implements Comparable { break; default: // EnchantedBy Aura.Other for (final Card aura : getEnchantedBy(false)) { - if (aura.isValid(restriction, sourceController, source)) { + if (aura.isValid(restriction, sourceController, source, spellAbility)) { return true; } } @@ -4227,7 +4227,7 @@ public class Card extends GameEntity implements Comparable { break; default: for (final Card card : sourceController.getCardsIn(ZoneType.Battlefield)) { - if (card.isValid(restriction, sourceController, source) && sharesColorWith(card)) { + if (card.isValid(restriction, sourceController, source, spellAbility) && sharesColorWith(card)) { return true; } } @@ -4254,7 +4254,7 @@ public class Card extends GameEntity implements Comparable { } else { final String restriction = property.split("notSharesColorWith ")[1]; for (final Card card : sourceController.getCardsIn(ZoneType.Battlefield)) { - if (card.isValid(restriction, sourceController, source) && sharesColorWith(card)) { + if (card.isValid(restriction, sourceController, source, spellAbility) && sharesColorWith(card)) { return false; } } @@ -4315,7 +4315,7 @@ public class Card extends GameEntity implements Comparable { default: boolean shares = false; for (final Card card : sourceController.getCardsIn(ZoneType.Battlefield)) { - if (card.isValid(restriction, sourceController, source) && sharesCreatureTypeWith(card)) { + if (card.isValid(restriction, sourceController, source, spellAbility) && sharesCreatureTypeWith(card)) { shares = true; } } @@ -4449,6 +4449,16 @@ public class Card extends GameEntity implements Comparable { } } return false; + } else if (restriction.equals("TriggeredCard")) { + if (spellAbility == null) { + System.out.println("Looking at TriggeredCard but no SA?"); + } else { + Card triggeredCard = ((Card)spellAbility.getTriggeringObject("Card")); + if (triggeredCard != null && getName().equals(triggeredCard.getName())) { + return true; + } + } + return false; } } } else if (property.startsWith("doesNotShareNameWith")) { @@ -4546,7 +4556,7 @@ public class Card extends GameEntity implements Comparable { Player p = null; if (res.length > 1) { for (Player pl : game.getPlayers()) { - if (pl.isValid(res[1], sourceController, source)) { + if (pl.isValid(res[1], sourceController, source, spellAbility)) { p = pl; break; } @@ -5558,11 +5568,11 @@ public class Card extends GameEntity implements Comparable { continue; } if (params.containsKey("ValidSource") - && !source.isValid(params.get("ValidSource"), ca.getController(), ca)) { + && !source.isValid(params.get("ValidSource"), ca.getController(), ca, null)) { continue; } if (params.containsKey("ValidTarget") - && !isValid(params.get("ValidTarget"), ca.getController(), ca)) { + && !isValid(params.get("ValidTarget"), ca.getController(), ca, null)) { continue; } if (params.containsKey("IsCombat")) { @@ -5641,7 +5651,7 @@ public class Card extends GameEntity implements Comparable { if (kw.startsWith("PreventAllDamageBy")) { String valid = getKeywords().get(getKeywordPosition("PreventAllDamageBy")); valid = valid.split(" ", 2)[1]; - if (source.isValid(valid, getController(), this)) { + if (source.isValid(valid, getController(), this, null)) { return 0; } } @@ -6156,8 +6166,8 @@ public class Card extends GameEntity implements Comparable { final String characteristic = kws[1]; final String[] characteristics = characteristic.split(","); final String exception = kws.length > 3 ? kws[3] : null; // check "This effect cannot remove sth" - if (source.isValid(characteristics, getController(), this) - && (!checkSBA || exception == null || !source.isValid(exception, getController(), this))) { + if (source.isValid(characteristics, getController(), this, null) + && (!checkSBA || exception == null || !source.isValid(exception, getController(), this, null))) { return true; } } else if (kw.equals("Protection from colored spells")) { @@ -6300,7 +6310,7 @@ public class Card extends GameEntity implements Comparable { final String parse = source.getKeywords().get(keywordPosition); final String[] k = parse.split(":"); final String[] restrictions = k[1].split(","); - if (isValid(restrictions, source.getController(), source)) { + if (isValid(restrictions, source.getController(), source, null)) { return false; } } @@ -6326,7 +6336,7 @@ public class Card extends GameEntity implements Comparable { || (hasKeyword("CARDNAME can't be enchanted in the future.") && !isEnchantedBy(aura)) || (hasKeyword("CARDNAME can't be enchanted.") && !aura.getName().equals("Anti-Magic Aura") && !(aura.getName().equals("Consecrate Land") && aura.isInZone(ZoneType.Battlefield))) - || ((tgt != null) && !isValid(tgt.getValidTgts(), aura.getController(), aura))); + || ((tgt != null) && !isValid(tgt.getValidTgts(), aura.getController(), aura, sa))); } public final boolean canBeEquippedBy(final Card equip) { @@ -6335,13 +6345,13 @@ public class Card extends GameEntity implements Comparable { final String parse = equip.getKeywords().get(keywordPosition); final String[] k = parse.split(" ", 2); final String[] restrictions = k[1].split(","); - if (isValid(restrictions, equip.getController(), equip)) { + if (isValid(restrictions, equip.getController(), equip, null)) { return false; } } return !(hasProtectionFrom(equip) || hasKeyword("CARDNAME can't be equipped.") - || !isValid("Creature", equip.getController(), equip)); + || !isValid("Creature", equip.getController(), equip, null)); } public FCollectionView getReplacementEffects() { diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index e27914894e3..35693434c5c 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -524,7 +524,7 @@ public class CardFactoryUtil { // Reconfirm the Validity of a TgtValid, or if the Creature is still // a Creature if (tgt.doesTarget() - && !target.isValid(tgt.getValidTgts(), ability.getActivatingPlayer(), ability.getHostCard())) { + && !target.isValid(tgt.getValidTgts(), ability.getActivatingPlayer(), ability.getHostCard(), ability)) { return false; } @@ -731,7 +731,7 @@ public class CardFactoryUtil { int totPlayer = 0; String property = sq[0].substring(11); for (Player p : players) { - if (p.hasProperty(property, source.getController(), source)) { + if (p.hasProperty(property, source.getController(), source, null)) { totPlayer++; } } @@ -765,7 +765,7 @@ public class CardFactoryUtil { final List vZone = ZoneType.listValueOf(lparts[0].split("Valid")[1]); String restrictions = l[0].replace(lparts[0] + " ", ""); final String[] rest = restrictions.split(","); - CardCollection cards = CardLists.getValidCards(game.getCardsIn(vZone), rest, player, source); + CardCollection cards = CardLists.getValidCards(game.getCardsIn(vZone), rest, player, source, null); return doXMath(cards.size(), m, source); } @@ -773,7 +773,7 @@ public class CardFactoryUtil { if (l[0].startsWith("Valid ")) { final String restrictions = l[0].substring(6); final String[] rest = restrictions.split(","); - CardCollection cardsonbattlefield = CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), rest, player, source); + CardCollection cardsonbattlefield = CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), rest, player, source, null); return doXMath(cardsonbattlefield.size(), m, source); } @@ -940,7 +940,7 @@ public class CardFactoryUtil { ? game.getCardsIn(ZoneType.listValueOf(lparts[0].substring(5))) : game.getCardsIn(ZoneType.Battlefield); - CardCollection cards = CardLists.getValidCards(cardsInZones, rest, cc, c); + CardCollection cards = CardLists.getValidCards(cardsInZones, rest, cc, c, null); return doXMath(cards.size(), m, c); } @@ -951,7 +951,7 @@ public class CardFactoryUtil { if (l[0].startsWith("GreatestPower_")) { final String restriction = l[0].substring(14); final String[] rest = restriction.split(","); - CardCollection list = CardLists.getValidCards(cc.getGame().getCardsIn(ZoneType.Battlefield), rest, cc, c); + CardCollection list = CardLists.getValidCards(cc.getGame().getCardsIn(ZoneType.Battlefield), rest, cc, c, null); int highest = 0; for (final Card crd : list) { if (crd.getNetPower() > highest) { @@ -964,7 +964,7 @@ public class CardFactoryUtil { if (l[0].startsWith("GreatestToughness_")) { final String restriction = l[0].substring(18); final String[] rest = restriction.split(","); - CardCollection list = CardLists.getValidCards(cc.getGame().getCardsIn(ZoneType.Battlefield), rest, cc, c); + CardCollection list = CardLists.getValidCards(cc.getGame().getCardsIn(ZoneType.Battlefield), rest, cc, c, null); int highest = 0; for (final Card crd : list) { if (crd.getNetToughness() > highest) { @@ -977,7 +977,7 @@ public class CardFactoryUtil { if (l[0].startsWith("HighestCMC_")) { final String restriction = l[0].substring(11); final String[] rest = restriction.split(","); - CardCollection list = CardLists.getValidCards(cc.getGame().getCardsInGame(), rest, cc, c); + CardCollection list = CardLists.getValidCards(cc.getGame().getCardsInGame(), rest, cc, c, null); int highest = 0; for (final Card crd : list) { if (crd.isSplitCard()) { @@ -1001,7 +1001,7 @@ public class CardFactoryUtil { final List crdname = new ArrayList(); final String restriction = l[0].substring(19); final String[] rest = restriction.split(","); - CardCollection list = CardLists.getValidCards(cc.getGame().getCardsInGame(), rest, cc, c); + CardCollection list = CardLists.getValidCards(cc.getGame().getCardsInGame(), rest, cc, c, null); for (final Card card : list) { if (!crdname.contains(card.getName())) { crdname.add(card.getName()); @@ -1030,7 +1030,7 @@ public class CardFactoryUtil { final CounterType counterType = CounterType.valueOf(components[1]); String restrictions = components[2]; final String[] rest = restrictions.split(","); - CardCollection candidates = CardLists.getValidCards(game.getCardsInGame(), rest, cc, c); + CardCollection candidates = CardLists.getValidCards(game.getCardsInGame(), rest, cc, c, null); int added = 0; for (final Card counterSource : candidates) { @@ -1318,7 +1318,7 @@ public class CardFactoryUtil { if (sq[0].startsWith("Devoured")) { final String validDevoured = l[0].split(" ")[1]; - CardCollection cl = CardLists.getValidCards(c.getDevoured(), validDevoured.split(","), cc, c); + CardCollection cl = CardLists.getValidCards(c.getDevoured(), validDevoured.split(","), cc, c, null); return doXMath(cl.size(), m, c); } @@ -1336,7 +1336,7 @@ public class CardFactoryUtil { if (sq[0].contains("SumPower")) { final String[] restrictions = l[0].split("_"); final String[] rest = restrictions[1].split(","); - CardCollection filteredCards = CardLists.getValidCards(cc.getGame().getCardsIn(ZoneType.Battlefield), rest, cc, c); + CardCollection filteredCards = CardLists.getValidCards(cc.getGame().getCardsIn(ZoneType.Battlefield), rest, cc, c, null); return doXMath(Aggregates.sum(filteredCards, CardPredicates.Accessors.fnGetNetPower), m, c); } // Count$CardManaCost @@ -1359,7 +1359,7 @@ public class CardFactoryUtil { final String[] restrictions = l[0].split("_"); final String[] rest = restrictions[1].split(","); CardCollectionView cardsonbattlefield = game.getCardsIn(ZoneType.Battlefield); - CardCollection filteredCards = CardLists.getValidCards(cardsonbattlefield, rest, cc, c); + CardCollection filteredCards = CardLists.getValidCards(cardsonbattlefield, rest, cc, c, null); return Aggregates.sum(filteredCards, CardPredicates.Accessors.fnGetCmc); } @@ -1391,7 +1391,7 @@ public class CardFactoryUtil { final CounterType cType = CounterType.getType(restrictions[1]); final String[] validFilter = restrictions[2].split(","); CardCollectionView validCards = game.getCardsIn(ZoneType.Battlefield); - validCards = CardLists.getValidCards(validCards, validFilter, cc, c); + validCards = CardLists.getValidCards(validCards, validFilter, cc, c, null); int cCount = 0; for (final Card card : validCards) { cCount += card.getCounters(cType); @@ -2018,7 +2018,7 @@ public class CardFactoryUtil { final List protectionkw = new ArrayList(); final List allkw = new ArrayList(); - cardlist = CardLists.getValidCards(cardlist, restrictions, p, host); + cardlist = CardLists.getValidCards(cardlist, restrictions, p, host, null); for (Card c : cardlist) { for (String k : c.getKeywords()) { if (k.endsWith("walk")) { diff --git a/forge-game/src/main/java/forge/game/card/CardLists.java b/forge-game/src/main/java/forge/game/card/CardLists.java index f716fcb2410..44618ed8182 100644 --- a/forge-game/src/main/java/forge/game/card/CardLists.java +++ b/forge-game/src/main/java/forge/game/card/CardLists.java @@ -44,12 +44,10 @@ public class CardLists { *

* filterToughness. *

- * - * @param in - * a {@link forge.CardList} object. + * * @param atLeastToughness * a int. - * @return a {@link forge.CardList} object. + * @return a CardCollection */ public static CardCollection filterToughness(final Iterable in, final int atLeastToughness) { return CardLists.filter(in, new Predicate() { @@ -103,7 +101,6 @@ public class CardLists { *

* * @param list - * a {@link forge.CardList} object. */ public static void sortByCmcDesc(final List list) { Collections.sort(list, CmcComparatorInv); @@ -115,7 +112,6 @@ public class CardLists { *

* * @param list - * a {@link forge.CardList} object. */ public static void sortByToughnessAsc(final List list) { Collections.sort(list, ToughnessComparator); @@ -127,7 +123,6 @@ public class CardLists { *

* * @param list - * a {@link forge.CardList} object. */ public static void sortByPowerAsc(final List list) { Collections.sort(list, PowerComparator); @@ -140,7 +135,6 @@ public class CardLists { *

* * @param list - * a {@link forge.CardList} object. */ public static void sortByPowerDesc(final List list) { Collections.sort(list, Collections.reverseOrder(PowerComparator)); @@ -187,28 +181,28 @@ public class CardLists { return CardLists.filter(cardList, CardPredicates.isControlledByAnyOf(player)); } - public static CardCollection getValidCards(Iterable cardList, String[] restrictions, Player sourceController, Card source) { - return CardLists.filter(cardList, CardPredicates.restriction(restrictions, sourceController, source)); + public static CardCollection getValidCards(Iterable cardList, String[] restrictions, Player sourceController, Card source, SpellAbility spellAbility) { + return CardLists.filter(cardList, CardPredicates.restriction(restrictions, sourceController, source, spellAbility)); } public static List getValidCardsAsList(Iterable cardList, String[] restrictions, Player sourceController, Card source) { - return CardLists.filterAsList(cardList, CardPredicates.restriction(restrictions, sourceController, source)); + return CardLists.filterAsList(cardList, CardPredicates.restriction(restrictions, sourceController, source, null)); } public static int getValidCardCount(Iterable cardList, String[] restrictions, Player sourceController, Card source) { - return CardLists.count(cardList, CardPredicates.restriction(restrictions, sourceController, source)); + return CardLists.count(cardList, CardPredicates.restriction(restrictions, sourceController, source, null)); } public static CardCollection getValidCards(Iterable cardList, String restriction, Player sourceController, Card source) { - return CardLists.filter(cardList, CardPredicates.restriction(restriction.split(","), sourceController, source)); + return CardLists.filter(cardList, CardPredicates.restriction(restriction.split(","), sourceController, source, null)); } public static List getValidCardsAsList(Iterable cardList, String restriction, Player sourceController, Card source) { - return CardLists.filterAsList(cardList, CardPredicates.restriction(restriction.split(","), sourceController, source)); + return CardLists.filterAsList(cardList, CardPredicates.restriction(restriction.split(","), sourceController, source, null)); } public static int getValidCardCount(Iterable cardList, String restriction, Player sourceController, Card source) { - return CardLists.count(cardList, CardPredicates.restriction(restriction.split(","), sourceController, source)); + return CardLists.count(cardList, CardPredicates.restriction(restriction.split(","), sourceController, source, null)); } public static CardCollection getTargetableCards(Iterable cardList, SpellAbility source) { diff --git a/forge-game/src/main/java/forge/game/card/CardPredicates.java b/forge-game/src/main/java/forge/game/card/CardPredicates.java index 4439c878871..efec61dd337 100644 --- a/forge-game/src/main/java/forge/game/card/CardPredicates.java +++ b/forge-game/src/main/java/forge/game/card/CardPredicates.java @@ -144,11 +144,11 @@ public final class CardPredicates { }; } - public static final Predicate restriction(final String[] restrictions, final Player sourceController, final Card source) { + public static final Predicate restriction(final String[] restrictions, final Player sourceController, final Card source, final SpellAbility spellAbility) { return new Predicate() { @Override public boolean apply(final Card c) { - return (c != null) && c.isValid(restrictions, sourceController, source); + return (c != null) && c.isValid(restrictions, sourceController, source, spellAbility); } }; } 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 3505589003a..4196a0a61b9 100644 --- a/forge-game/src/main/java/forge/game/card/CardUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardUtil.java @@ -151,7 +151,6 @@ public final class CardUtil { * @param from zone coming from * @param valid a isValid expression * @param src a Card object - * @param checkLatestState a boolean, true if the latest state of the card as it left the original zone needs to be checked * @return a CardCollection that matches the given criteria */ public static CardCollection getThisTurnEntered(final ZoneType to, final ZoneType from, final String valid, final Card src) { @@ -190,7 +189,6 @@ public final class CardUtil { * @param from zone coming from * @param valid a isValid expression * @param src a Card object - * @param checkLatestState a boolean, true if the latest state of the card as it left the original zone needs to be checked * @return a CardCollection that matches the given criteria */ public static CardCollection getLastTurnEntered(final ZoneType to, final ZoneType from, final String valid, final Card src) { @@ -307,7 +305,7 @@ public final class CardUtil { continue; for(final Card c : game.getColoredCardsInPlay(MagicColor.toLongString(color))) { - if (!res.contains(c) && c.isValid(valid, source.getController(), source) && !c.equals(origin)) { + if (!res.contains(c) && c.isValid(valid, source.getController(), source, null) && !c.equals(origin)) { res.add(c); } } @@ -479,7 +477,7 @@ public final class CardUtil { final List zone = tgt.getZone(); final boolean canTgtStack = zone.contains(ZoneType.Stack); - List validCards = CardLists.getValidCards(game.getCardsIn(zone), tgt.getValidTgts(), ability.getActivatingPlayer(), ability.getHostCard()); + List validCards = CardLists.getValidCards(game.getCardsIn(zone), tgt.getValidTgts(), ability.getActivatingPlayer(), ability.getHostCard(), ability); List choices = CardLists.getTargetableCards(validCards, ability); if (canTgtStack) { // Since getTargetableCards doesn't have additional checks if one of the Zones is stack diff --git a/forge-game/src/main/java/forge/game/combat/CombatUtil.java b/forge-game/src/main/java/forge/game/combat/CombatUtil.java index adfdcfd589e..c86ffc454c6 100644 --- a/forge-game/src/main/java/forge/game/combat/CombatUtil.java +++ b/forge-game/src/main/java/forge/game/combat/CombatUtil.java @@ -157,7 +157,6 @@ public class CombatUtil { *

*

* This method doesn't check effects related to other creatures attacking - * (but see {@link CombatUtil}.{@link #canAttack(Card, GameEntity, Combat)}. *

*

* Note that a creature affected by any attacking restrictions may never be @@ -234,8 +233,6 @@ public class CombatUtil { * * @param attacker * a {@link forge.game.card.Card} object. - * @param bLast - * a boolean. */ public static boolean checkPropagandaEffects(final Game game, final Card attacker, final Combat combat) { final Cost attackCost = getAttackCost(game, attacker, combat.getDefenderByAttacker(attacker)); @@ -342,7 +339,6 @@ public class CombatUtil { * @param combat * a {@link Combat}. * @return a {@link Map}. - * @see #getRequirementsPerDefender(Card, FCollectionView, Combat, int) */ public static AttackConstraints getAllRequirements(final Combat combat) { return new AttackConstraints(combat); @@ -577,7 +573,7 @@ public class CombatUtil { final String valid = StringUtils.join(walkTypes, ","); final CardCollectionView defendingLands = defendingPlayer.getCardsIn(ZoneType.Battlefield); for (final Card c : defendingLands) { - if (c.isValid(valid.split(","), defendingPlayer, attacker)) { + if (c.isValid(valid.split(","), defendingPlayer, attacker, null)) { return true; } } @@ -946,7 +942,7 @@ public class CombatUtil { final String parse = attacker.getKeywords().get(keywordPosition).toString(); final String[] k = parse.split(" ", 2); final String[] restrictions = k[1].split(","); - if (blocker.isValid(restrictions, attacker.getController(), attacker)) { + if (blocker.isValid(restrictions, attacker.getController(), attacker, null)) { //Dragon Hunter check if (!k[1].contains("withoutReach") || !attacker.getType().hasCreatureType("Dragon") || !blocker.hasKeyword("CARDNAME can block Dragons as though it had reach.")) { @@ -967,7 +963,7 @@ public class CombatUtil { final String[] parse0 = parse.split(":"); final String[] k = parse0[0].split(" ", 2); final String[] restrictions = k[1].split(","); - if (attacker.isValid(restrictions, blocker.getController(), blocker)) { + if (attacker.isValid(restrictions, blocker.getController(), blocker, null)) { return false; } } diff --git a/forge-game/src/main/java/forge/game/cost/CostDiscard.java b/forge-game/src/main/java/forge/game/cost/CostDiscard.java index 871e188f101..eb232aaa95a 100644 --- a/forge-game/src/main/java/forge/game/cost/CostDiscard.java +++ b/forge-game/src/main/java/forge/game/cost/CostDiscard.java @@ -124,7 +124,7 @@ public class CostDiscard extends CostPartWithList { } if (!type.equals("Random") && !type.contains("X")) { // Knollspine Invocation fails to activate without the above conditional - handList = CardLists.getValidCards(handList, type.split(";"), activator, source); + handList = CardLists.getValidCards(handList, type.split(";"), activator, source, ability); } if (sameName) { for (Card c : handList) { diff --git a/forge-game/src/main/java/forge/game/cost/CostDraw.java b/forge-game/src/main/java/forge/game/cost/CostDraw.java index c1d9d3c4b88..86f989d05a3 100644 --- a/forge-game/src/main/java/forge/game/cost/CostDraw.java +++ b/forge-game/src/main/java/forge/game/cost/CostDraw.java @@ -59,7 +59,7 @@ public class CostDraw extends CostPart { List res = new ArrayList(); String type = this.getType(); for (Player p : payer.getGame().getPlayers()) { - if (p.isValid(type, payer, source) && p.canDraw()) { + if (p.isValid(type, payer, source, null) && p.canDraw()) { res.add(p); } } diff --git a/forge-game/src/main/java/forge/game/cost/CostExile.java b/forge-game/src/main/java/forge/game/cost/CostExile.java index aa8bce2193c..3ea4587e19d 100644 --- a/forge-game/src/main/java/forge/game/cost/CostExile.java +++ b/forge-game/src/main/java/forge/game/cost/CostExile.java @@ -131,7 +131,7 @@ public class CostExile extends CostPartWithList { return list.contains(source); } - list = CardLists.getValidCards(list, type.split(";"), activator, source); + list = CardLists.getValidCards(list, type.split(";"), activator, source, ability); final Integer amount = this.convertAmount(); if ((amount != null) && (list.size() < amount)) { diff --git a/forge-game/src/main/java/forge/game/cost/CostExileFromStack.java b/forge-game/src/main/java/forge/game/cost/CostExileFromStack.java index 161dd4051c6..996d1b5d9b8 100644 --- a/forge-game/src/main/java/forge/game/cost/CostExileFromStack.java +++ b/forge-game/src/main/java/forge/game/cost/CostExileFromStack.java @@ -85,7 +85,7 @@ public class CostExileFromStack extends CostPart { CardCollectionView list = activator.getCardsIn(ZoneType.Stack); - list = CardLists.getValidCards(list, type.split(";"), activator, source); + list = CardLists.getValidCards(list, type.split(";"), activator, source, ability); final Integer amount = this.convertAmount(); if ((amount != null) && (list.size() < amount)) { diff --git a/forge-game/src/main/java/forge/game/cost/CostExiledMoveToGrave.java b/forge-game/src/main/java/forge/game/cost/CostExiledMoveToGrave.java index 5c3b819274c..d8b2c05b46c 100644 --- a/forge-game/src/main/java/forge/game/cost/CostExiledMoveToGrave.java +++ b/forge-game/src/main/java/forge/game/cost/CostExiledMoveToGrave.java @@ -70,7 +70,7 @@ public class CostExiledMoveToGrave extends CostPartWithList { CardCollectionView typeList = activator.getGame().getCardsIn(ZoneType.Exile); - typeList = CardLists.getValidCards(typeList, getType().split(";"), activator, source); + typeList = CardLists.getValidCards(typeList, getType().split(";"), activator, source, ability); return typeList.size() >= i; } diff --git a/forge-game/src/main/java/forge/game/cost/CostGainControl.java b/forge-game/src/main/java/forge/game/cost/CostGainControl.java index 16dbf11b612..07b63fac99c 100644 --- a/forge-game/src/main/java/forge/game/cost/CostGainControl.java +++ b/forge-game/src/main/java/forge/game/cost/CostGainControl.java @@ -70,7 +70,7 @@ public class CostGainControl extends CostPartWithList { final Player activator = ability.getActivatingPlayer(); final Card source = ability.getHostCard(); CardCollectionView typeList = activator.getGame().getCardsIn(ZoneType.Battlefield); - typeList = CardLists.getValidCards(typeList, this.getType().split(";"), activator, source); + typeList = CardLists.getValidCards(typeList, this.getType().split(";"), activator, source, ability); Integer amount = this.convertAmount(); if (amount == null) { diff --git a/forge-game/src/main/java/forge/game/cost/CostGainLife.java b/forge-game/src/main/java/forge/game/cost/CostGainLife.java index 1264d364843..17447a0f2e4 100644 --- a/forge-game/src/main/java/forge/game/cost/CostGainLife.java +++ b/forge-game/src/main/java/forge/game/cost/CostGainLife.java @@ -65,7 +65,7 @@ public class CostGainLife extends CostPart { List res = new ArrayList(); for(Player p : payer.getGame().getPlayers()) { - if(p.isValid(getType(), payer, source)) + if(p.isValid(getType(), payer, source, null)) res.add(p); } return res; diff --git a/forge-game/src/main/java/forge/game/cost/CostPutCardToLib.java b/forge-game/src/main/java/forge/game/cost/CostPutCardToLib.java index b8d1fa48fe8..2b2395e1ffc 100644 --- a/forge-game/src/main/java/forge/game/cost/CostPutCardToLib.java +++ b/forge-game/src/main/java/forge/game/cost/CostPutCardToLib.java @@ -128,7 +128,7 @@ public class CostPutCardToLib extends CostPartWithList { typeList = activator.getCardsIn(getFrom()); } - typeList = CardLists.getValidCards(typeList, getType().split(";"), activator, source); + typeList = CardLists.getValidCards(typeList, getType().split(";"), activator, source, ability); if (typeList.size() < i) { return false; diff --git a/forge-game/src/main/java/forge/game/cost/CostPutCounter.java b/forge-game/src/main/java/forge/game/cost/CostPutCounter.java index 49ad73c9e8f..33147358f21 100644 --- a/forge-game/src/main/java/forge/game/cost/CostPutCounter.java +++ b/forge-game/src/main/java/forge/game/cost/CostPutCounter.java @@ -134,7 +134,8 @@ public class CostPutCounter extends CostPartWithList { } } else { // 3 Cards have Put a -1/-1 Counter on a Creature you control. - final List typeList = CardLists.getValidCards(activator.getGame().getCardsIn(ZoneType.Battlefield), this.getType().split(";"), activator, source); + final List typeList = CardLists.getValidCards(activator.getGame().getCardsIn(ZoneType.Battlefield), + this.getType().split(";"), activator, source, ability); if (typeList.size() == 0) { return false; diff --git a/forge-game/src/main/java/forge/game/cost/CostRemoveAnyCounter.java b/forge-game/src/main/java/forge/game/cost/CostRemoveAnyCounter.java index 662f14b3de8..01c1127e89a 100644 --- a/forge-game/src/main/java/forge/game/cost/CostRemoveAnyCounter.java +++ b/forge-game/src/main/java/forge/game/cost/CostRemoveAnyCounter.java @@ -88,7 +88,7 @@ public class CostRemoveAnyCounter extends CostPartWithList { final Player activator = ability.getActivatingPlayer(); final Card source = ability.getHostCard(); CardCollectionView validCards = activator.getCardsIn(ZoneType.Battlefield); - validCards = CardLists.getValidCards(validCards, this.getType().split(";"), activator, source); + validCards = CardLists.getValidCards(validCards, this.getType().split(";"), activator, source, ability); validCards = CardLists.filter(validCards, new Predicate() { @Override public boolean apply(final Card c) { diff --git a/forge-game/src/main/java/forge/game/cost/CostRemoveCounter.java b/forge-game/src/main/java/forge/game/cost/CostRemoveCounter.java index d4e89dccbce..7742be86b51 100644 --- a/forge-game/src/main/java/forge/game/cost/CostRemoveCounter.java +++ b/forge-game/src/main/java/forge/game/cost/CostRemoveCounter.java @@ -136,7 +136,7 @@ public class CostRemoveCounter extends CostPartWithList { if (type.equals("OriginalHost")) { typeList = Lists.newArrayList(ability.getOriginalHost()); } else { - typeList = CardLists.getValidCards(activator.getCardsIn(this.zone), type.split(";"), activator, source); + typeList = CardLists.getValidCards(activator.getCardsIn(this.zone), type.split(";"), activator, source, ability); } if (amount != null) { if (this.getTypeDescription().equals("among creatures you control")) { diff --git a/forge-game/src/main/java/forge/game/cost/CostReturn.java b/forge-game/src/main/java/forge/game/cost/CostReturn.java index be8fa487b74..cdde80a41fc 100644 --- a/forge-game/src/main/java/forge/game/cost/CostReturn.java +++ b/forge-game/src/main/java/forge/game/cost/CostReturn.java @@ -91,7 +91,7 @@ public class CostReturn extends CostPartWithList { boolean needsAnnoucement = ability.hasParam("Announce") && this.getType().contains(ability.getParam("Announce")); CardCollectionView typeList = activator.getCardsIn(ZoneType.Battlefield); - typeList = CardLists.getValidCards(typeList, this.getType().split(";"), activator, source); + typeList = CardLists.getValidCards(typeList, this.getType().split(";"), activator, source, ability); final Integer amount = this.convertAmount(); if (!needsAnnoucement && amount != null && typeList.size() < amount) { diff --git a/forge-game/src/main/java/forge/game/cost/CostReveal.java b/forge-game/src/main/java/forge/game/cost/CostReveal.java index 1b095b8acce..d5ee0f798a3 100644 --- a/forge-game/src/main/java/forge/game/cost/CostReveal.java +++ b/forge-game/src/main/java/forge/game/cost/CostReveal.java @@ -79,7 +79,7 @@ public class CostReveal extends CostPartWithList { modifiedHand.remove(source); // can't pay for itself handList = modifiedHand; } - handList = CardLists.getValidCards(handList, type.split(";"), activator, source); + handList = CardLists.getValidCards(handList, type.split(";"), activator, source, ability); if ((amount != null) && (amount > handList.size())) { // not enough cards in hand to pay return false; diff --git a/forge-game/src/main/java/forge/game/cost/CostSacrifice.java b/forge-game/src/main/java/forge/game/cost/CostSacrifice.java index b04a28b8e1c..066ba32e51d 100644 --- a/forge-game/src/main/java/forge/game/cost/CostSacrifice.java +++ b/forge-game/src/main/java/forge/game/cost/CostSacrifice.java @@ -87,7 +87,7 @@ public class CostSacrifice extends CostPartWithList { boolean needsAnnoucement = ability.hasParam("Announce") && this.getType().contains(ability.getParam("Announce")); CardCollectionView typeList = activator.getCardsIn(ZoneType.Battlefield); - typeList = CardLists.getValidCards(typeList, this.getType().split(";"), activator, source); + typeList = CardLists.getValidCards(typeList, this.getType().split(";"), activator, source, ability); final Integer amount = this.convertAmount(); if (activator.hasKeyword("You can't sacrifice creatures to cast spells or activate abilities.")) { diff --git a/forge-game/src/main/java/forge/game/cost/CostTapType.java b/forge-game/src/main/java/forge/game/cost/CostTapType.java index 200fa7d71e2..4621b38bf1b 100644 --- a/forge-game/src/main/java/forge/game/cost/CostTapType.java +++ b/forge-game/src/main/java/forge/game/cost/CostTapType.java @@ -121,7 +121,7 @@ public class CostTapType extends CostPartWithList { type = type.replace("+withTotalPowerGE" + totalP, ""); } - CardCollection typeList = CardLists.getValidCards(activator.getCardsIn(ZoneType.Battlefield), type.split(";"), activator, source); + CardCollection typeList = CardLists.getValidCards(activator.getCardsIn(ZoneType.Battlefield), type.split(";"), activator, source, ability); if (!canTapSource) { typeList.remove(source); diff --git a/forge-game/src/main/java/forge/game/cost/CostUntapType.java b/forge-game/src/main/java/forge/game/cost/CostUntapType.java index 61fc60fb7a1..d577745c640 100644 --- a/forge-game/src/main/java/forge/game/cost/CostUntapType.java +++ b/forge-game/src/main/java/forge/game/cost/CostUntapType.java @@ -74,7 +74,7 @@ public class CostUntapType extends CostPartWithList { final Player activator = ability.getActivatingPlayer(); final Card source = ability.getHostCard(); - CardCollection typeList = CardLists.getValidCards(activator.getGame().getCardsIn(ZoneType.Battlefield), getType().split(";"), activator, source); + CardCollection typeList = CardLists.getValidCards(activator.getGame().getCardsIn(ZoneType.Battlefield), getType().split(";"), activator, source, ability); if (!canUntapSource) { typeList.remove(source); diff --git a/forge-game/src/main/java/forge/game/mana/ManaCostAdjustment.java b/forge-game/src/main/java/forge/game/mana/ManaCostAdjustment.java index 1592a78ee06..3308f798037 100644 --- a/forge-game/src/main/java/forge/game/mana/ManaCostAdjustment.java +++ b/forge-game/src/main/java/forge/game/mana/ManaCostAdjustment.java @@ -205,7 +205,7 @@ public class ManaCostAdjustment { * a StaticAbility * @param sa * the SpellAbility - * @param originalCost + * @param manaCost * a ManaCost */ private static void applyRaiseCostAbility(final StaticAbility staticAbility, final SpellAbility sa, final ManaCostBeingPaid manaCost) { @@ -217,12 +217,12 @@ public class ManaCostAdjustment { if (params.containsKey("ValidCard") - && !card.isValid(params.get("ValidCard").split(","), hostCard.getController(), hostCard)) { + && !card.isValid(params.get("ValidCard").split(","), hostCard.getController(), hostCard, sa)) { return; } if (params.containsKey("Activator") && ((activator == null) - || !activator.isValid(params.get("Activator"), hostCard.getController(), hostCard))) { + || !activator.isValid(params.get("Activator"), hostCard.getController(), hostCard, sa))) { return; } @@ -286,7 +286,7 @@ public class ManaCostAdjustment { } boolean targetValid = false; for (GameObject target : sa.getTargets().getTargets()) { - if (target.isValid(params.get("ValidTarget").split(","), hostCard.getController(), hostCard)) { + if (target.isValid(params.get("ValidTarget").split(","), hostCard.getController(), hostCard, sa)) { targetValid = true; } } @@ -302,7 +302,7 @@ public class ManaCostAdjustment { boolean targetValid = false; for (SpellAbility target : sa.getTargets().getTargetSpells()) { Card targetCard = target.getHostCard(); - if (targetCard.isValid(params.get("ValidSpellTarget").split(","), hostCard.getController(), hostCard)) { + if (targetCard.isValid(params.get("ValidSpellTarget").split(","), hostCard.getController(), hostCard, sa)) { targetValid = true; } } @@ -351,7 +351,7 @@ public class ManaCostAdjustment { * a StaticAbility * @param sa * the SpellAbility - * @param originalCost + * @param manaCost * a ManaCost */ private static void applyReduceCostAbility(final StaticAbility staticAbility, final SpellAbility sa, final ManaCostBeingPaid manaCost) { @@ -367,11 +367,11 @@ public class ManaCostAdjustment { if (params.containsKey("ValidCard") - && !card.isValid(params.get("ValidCard").split(","), hostCard.getController(), hostCard)) { + && !card.isValid(params.get("ValidCard").split(","), hostCard.getController(), hostCard, sa)) { return; } if (params.containsKey("Activator") && ((activator == null) - || !activator.isValid(params.get("Activator"), hostCard.getController(), hostCard))) { + || !activator.isValid(params.get("Activator"), hostCard.getController(), hostCard, sa))) { return; } if (params.containsKey("Type")) { @@ -433,7 +433,7 @@ public class ManaCostAdjustment { } boolean targetValid = false; for (GameObject target : sa.getTargets().getTargets()) { - if (target.isValid(params.get("ValidTarget").split(","), hostCard.getController(), hostCard)) { + if (target.isValid(params.get("ValidTarget").split(","), hostCard.getController(), hostCard, sa)) { targetValid = true; } } diff --git a/forge-game/src/main/java/forge/game/phase/Untap.java b/forge-game/src/main/java/forge/game/phase/Untap.java index 73cdb29e676..775819a0137 100644 --- a/forge-game/src/main/java/forge/game/phase/Untap.java +++ b/forge-game/src/main/java/forge/game/phase/Untap.java @@ -151,7 +151,7 @@ public class Untap extends Phase { if (!Untap.canUntap(c)) { return false; } - if (c.isValid(restrict, player, null)) { + if (c.isValid(restrict, player, null, null)) { return false; } return true; @@ -175,7 +175,7 @@ public class Untap extends Phase { CardCollection restrictUntapped = new CardCollection(); CardCollection cardList = CardLists.filter(untapList, tappedCanUntap); - cardList = CardLists.getValidCards(cardList, restrict, player, null); + cardList = CardLists.getValidCards(cardList, restrict, player, null, null); while (!cardList.isEmpty()) { Map remaining = new HashMap(restrictUntap); @@ -189,7 +189,7 @@ public class Untap extends Phase { "Select a card to untap\r\n(Selected:" + restrictUntapped + ")\r\n" + "Remaining cards that can untap: " + remaining); if (chosen != null) { for (Entry rest : restrictUntap.entrySet()) { - if (chosen.isValid(rest.getKey(), player, null)) { + if (chosen.isValid(rest.getKey(), player, null, null)) { restrictUntap.put(rest.getKey(), rest.getValue().intValue() - 1); } } diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index ddf4343558a..2f5a9e2429a 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -1123,7 +1123,7 @@ public class Player extends GameEntity implements Comparable { if (kw.startsWith("Protection:")) { // uses isValid final String characteristic = kw.split(":")[1]; final String[] characteristics = characteristic.split(","); - if (source.isValid(characteristics, this, null)) { + if (source.isValid(characteristics, this, null, null)) { return true; } } @@ -1917,7 +1917,7 @@ public class Player extends GameEntity implements Comparable { } @Override - public final boolean isValid(final String restriction, final Player sourceController, final Card source) { + public final boolean isValid(final String restriction, final Player sourceController, final Card source, SpellAbility spellAbility) { final String[] incR = restriction.split("\\.", 2); if (incR[0].equals("Opponent")) { @@ -1948,7 +1948,7 @@ public class Player extends GameEntity implements Comparable { final String[] exR = excR.split("\\+"); // Exclusive Restrictions // are ... for (int j = 0; j < exR.length; j++) { - if (!hasProperty(exR[j], sourceController, source)) { + if (!hasProperty(exR[j], sourceController, source, spellAbility)) { return false; } } @@ -1957,7 +1957,7 @@ public class Player extends GameEntity implements Comparable { } @Override - public final boolean hasProperty(final String property, final Player sourceController, final Card source) { + public final boolean hasProperty(final String property, final Player sourceController, final Card source, SpellAbility spellAbility) { if (property.equals("You")) { if (!equals(sourceController)) { return false; diff --git a/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java b/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java index b71313d24be..69bd5cf8bfa 100644 --- a/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java +++ b/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java @@ -77,12 +77,6 @@ public class AbilityManaPart implements java.io.Serializable { * * @param sourceCard * a {@link forge.game.card.Card} object. - * @param parse - * a {@link java.lang.String} object. - * @param produced - * a {@link java.lang.String} object. - * @param num - * a int. */ public AbilityManaPart(final Card sourceCard, final Map params) { this.sourceCard = sourceCard; @@ -103,7 +97,7 @@ public class AbilityManaPart implements java.io.Serializable { *

* produceMana. *

- * @param ability + * @param sa */ public final void produceMana(SpellAbility sa) { this.produceMana(this.getOrigProduced(), this.getSourceCard().getController(), sa); @@ -197,7 +191,7 @@ public class AbilityManaPart implements java.io.Serializable { Card source = saBeingPaid.getHostCard(); if (source == null) return false; - return source.isValid(cannotCounterSpell, sourceCard.getController(), sourceCard); + return source.isValid(cannotCounterSpell, sourceCard.getController(), sourceCard, null); } /** @@ -224,7 +218,6 @@ public class AbilityManaPart implements java.io.Serializable { *

* getKeywords. *

- * @param saBeingPaid * * @return a {@link java.lang.String} object. */ @@ -250,7 +243,7 @@ public class AbilityManaPart implements java.io.Serializable { public void createETBCounters(Card c) { String[] parse = this.addsCounters.split("_"); // Convert random SVars if there are other cards with this effect - if (c.isValid(parse[0], c.getController(), c)) { + if (c.isValid(parse[0], c.getController(), c, null)) { String abStr = "DB$ PutCounter | Defined$ Self | CounterType$ " + parse[1] + " | ETB$ True | CounterNum$ " + parse[2] + " | SubAbility$ ManaDBETBCounters"; String dbStr = "DB$ ChangeZone | Hidden$ True | Origin$ All | Destination$ Battlefield" @@ -341,7 +334,7 @@ public class AbilityManaPart implements java.io.Serializable { if (sa.getHostCard() != null) { - if (sa.getHostCard().isValid(restriction, this.getSourceCard().getController(), this.getSourceCard())) { + if (sa.getHostCard().isValid(restriction, this.getSourceCard().getController(), this.getSourceCard(), null)) { return true; } } 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 ee5053718a6..0390a9267c1 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -212,6 +212,14 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit manaPart = manaPart0; } + public final String getSvarWithFallback(final String name) { + String var = sVars.get(name); + if (var == null) { + var = hostCard.getSVar(name); + } + return var; + } + public final String getSVar(final String name) { String var = sVars.get(name); if (var == null) { @@ -397,7 +405,7 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit paidLists.get(str).add(c); } public void resetPaidHash() { - paidLists = new HashMap(); + paidLists.clear(); } public Iterable getOptionalCosts() { @@ -727,7 +735,7 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit } String[] validTgt = tr.getValidTgts(); - if (entity instanceof GameEntity && !((GameEntity) entity).isValid(validTgt, getActivatingPlayer(), getHostCard())) { + if (entity instanceof GameEntity && !((GameEntity) entity).isValid(validTgt, getActivatingPlayer(), getHostCard(), this)) { return false; } } @@ -1098,7 +1106,7 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit public boolean canTargetSpellAbility(final SpellAbility topSA) { final TargetRestrictions tgt = getTargetRestrictions(); - if (hasParam("TargetType") && !topSA.isValid(getParam("TargetType").split(","), getActivatingPlayer(), getHostCard())) { + if (hasParam("TargetType") && !topSA.isValid(getParam("TargetType").split(","), getActivatingPlayer(), getHostCard(), this)) { return false; } @@ -1115,7 +1123,7 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit boolean result = false; for (final GameObject o : matchTgt.getTargets()) { - if (o.isValid(splitTargetRestrictions.split(","), getActivatingPlayer(), getHostCard())) { + if (o.isValid(splitTargetRestrictions.split(","), getActivatingPlayer(), getHostCard(), this)) { result = true; break; } @@ -1131,7 +1139,7 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit continue; } for (final GameObject o : matchTgt.getTargets()) { - if (o.isValid(splitTargetRestrictions.split(","), getActivatingPlayer(), getHostCard())) { + if (o.isValid(splitTargetRestrictions.split(","), getActivatingPlayer(), getHostCard(), this)) { result = true; break; } @@ -1161,12 +1169,12 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit } } - return topSA.getHostCard().isValid(tgt.getValidTgts(), getActivatingPlayer(), getHostCard()); + return topSA.getHostCard().isValid(tgt.getValidTgts(), getActivatingPlayer(), getHostCard(), this); } // Takes one argument like Permanent.Blue+withFlying @Override - public final boolean isValid(final String restriction, final Player sourceController, final Card source) { + public final boolean isValid(final String restriction, final Player sourceController, final Card source, SpellAbility spellAbility) { // Inclusive restrictions are Card types final String[] incR = restriction.split("\\.", 2); @@ -1193,7 +1201,7 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit final String excR = incR[1]; final String[] exR = excR.split("\\+"); // Exclusive Restrictions are ... for (int j = 0; j < exR.length; j++) { - if (!hasProperty(exR[j], sourceController, source)) { + if (!hasProperty(exR[j], sourceController, source, spellAbility)) { return false; } } @@ -1203,7 +1211,7 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit // Takes arguments like Blue or withFlying @Override - public boolean hasProperty(final String property, final Player sourceController, final Card source) { + public boolean hasProperty(final String property, final Player sourceController, final Card source, SpellAbility spellAbility) { return true; } diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbilityCondition.java b/forge-game/src/main/java/forge/game/spellability/SpellAbilityCondition.java index 53cd20daf20..20a77a76045 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbilityCondition.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbilityCondition.java @@ -321,7 +321,7 @@ public class SpellAbilityCondition extends SpellAbilityVariables { list = game.getCardsIn(ZoneType.Battlefield); } - list = CardLists.getValidCards(list, this.getIsPresent().split(","), sa.getActivatingPlayer(), sa.getHostCard()); + list = CardLists.getValidCards(list, this.getIsPresent().split(","), sa.getActivatingPlayer(), sa.getHostCard(), sa); int right; final String rightString = this.getPresentCompare().substring(2); @@ -382,7 +382,7 @@ public class SpellAbilityCondition extends SpellAbilityVariables { boolean result = false; for (final GameObject o : matchTgt.getFirstTargetedSpell().getTargets().getTargets()) { - if (o.isValid(this.getTargetValidTargeting().split(","), sa.getActivatingPlayer(), sa.getHostCard())) { + if (o.isValid(this.getTargetValidTargeting().split(","), sa.getActivatingPlayer(), sa.getHostCard(), sa)) { result = true; break; } diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java b/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java index 685a9dc10e8..7b2e03b202b 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java @@ -361,7 +361,7 @@ public class SpellAbilityRestriction extends SpellAbilityVariables { if (this.getIsPresent() != null) { CardCollectionView list = game.getCardsIn(this.getPresentZone()); - list = CardLists.getValidCards(list, this.getIsPresent().split(","), activator, c); + list = CardLists.getValidCards(list, this.getIsPresent().split(","), activator, c, sa); int right = 1; final String rightString = this.getPresentCompare().substring(2); diff --git a/forge-game/src/main/java/forge/game/spellability/TargetRestrictions.java b/forge-game/src/main/java/forge/game/spellability/TargetRestrictions.java index 4edd5ca4993..88f6c7f4656 100644 --- a/forge-game/src/main/java/forge/game/spellability/TargetRestrictions.java +++ b/forge-game/src/main/java/forge/game/spellability/TargetRestrictions.java @@ -113,9 +113,7 @@ public class TargetRestrictions { *

* Constructor for Target. *

- * - * @param src - * a {@link forge.game.card.Card} object. + * * @param prompt * a {@link java.lang.String} object. * @param valid @@ -475,7 +473,7 @@ public class TargetRestrictions { return true; } else { for (final Card c : game.getCardsIn(this.tgtZone)) { - if (!c.isValid(this.validTgts, srcCard.getController(), srcCard)) { + if (!c.isValid(this.validTgts, srcCard.getController(), srcCard, sa)) { continue; } if (isTargeted && !sa.canTarget(c)) { @@ -552,7 +550,7 @@ public class TargetRestrictions { final Card srcCard = sa.getHostCard(); // should there be OrginalHost at any moment? if (this.tgtZone.contains(ZoneType.Stack)) { for (final Card c : game.getStackZone().getCards()) { - if (c.isValid(this.validTgts, srcCard.getController(), srcCard) + if (c.isValid(this.validTgts, srcCard.getController(), srcCard, sa) && (!isTargeted || sa.canTarget(c)) && !sa.getTargets().isTargeting(c)) { candidates.add(c); @@ -560,7 +558,7 @@ public class TargetRestrictions { } } else { for (final Card c : game.getCardsIn(this.tgtZone)) { - if (c.isValid(this.validTgts, srcCard.getController(), srcCard) + if (c.isValid(this.validTgts, srcCard.getController(), srcCard, sa) && (!isTargeted || sa.canTarget(c)) && !sa.getTargets().isTargeting(c)) { candidates.add(c); diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbility.java b/forge-game/src/main/java/forge/game/staticability/StaticAbility.java index 06c2e088856..97caf996ae2 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbility.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbility.java @@ -502,7 +502,7 @@ public class StaticAbility extends CardTraitBase { return false; } final Card topCard = controller.getCardsIn(ZoneType.Library).get(0); - if (!topCard.isValid(this.mapParams.get("TopCardOfLibraryIs").split(","), controller, this.hostCard)) { + if (!topCard.isValid(this.mapParams.get("TopCardOfLibraryIs").split(","), controller, this.hostCard, null)) { return false; } } @@ -580,7 +580,7 @@ public class StaticAbility extends CardTraitBase { } /** - * @param c the ignoreEffectCards to set + * @param cards the ignoreEffectCards to set */ public void setIgnoreEffectCards(final CardCollectionView cards) { ignoreEffectCards = cards; diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantAttackBlock.java b/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantAttackBlock.java index a5f876e2073..551a2b05eb2 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantAttackBlock.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantAttackBlock.java @@ -49,12 +49,12 @@ public class StaticAbilityCantAttackBlock { final Card hostCard = stAb.getHostCard(); if (params.containsKey("ValidCard") - && !card.isValid(params.get("ValidCard").split(","), hostCard.getController(), hostCard)) { + && !card.isValid(params.get("ValidCard").split(","), hostCard.getController(), hostCard, null)) { return false; } if (params.containsKey("Target") - && !target.isValid(params.get("Target").split(","), hostCard.getController(), hostCard)) { + && !target.isValid(params.get("Target").split(","), hostCard.getController(), hostCard, null)) { return false; } @@ -63,14 +63,14 @@ public class StaticAbilityCantAttackBlock { if (params.containsKey("UnlessDefenderControls")) { String type = params.get("UnlessDefenderControls"); CardCollectionView list = defender.getCardsIn(ZoneType.Battlefield); - if (Iterables.any(list, CardPredicates.restriction(type.split(","), hostCard.getController(), hostCard))) { + if (Iterables.any(list, CardPredicates.restriction(type.split(","), hostCard.getController(), hostCard, null))) { return false; } } if (params.containsKey("IfDefenderControls")) { String type = params.get("IfDefenderControls"); CardCollectionView list = defender.getCardsIn(ZoneType.Battlefield); - if (!Iterables.any(list, CardPredicates.restriction(type.split(","), hostCard.getController(), hostCard))) { + if (!Iterables.any(list, CardPredicates.restriction(type.split(","), hostCard.getController(), hostCard, null))) { return false; } } @@ -81,7 +81,7 @@ public class StaticAbilityCantAttackBlock { } if (params.containsKey("UnlessDefender")) { final String type = params.get("UnlessDefender"); - if (defender.hasProperty(type, hostCard.getController(), hostCard)) { + if (defender.hasProperty(type, hostCard.getController(), hostCard, null)) { return false; } } @@ -103,12 +103,12 @@ public class StaticAbilityCantAttackBlock { final Card hostCard = stAb.getHostCard(); if (params.containsKey("ValidCard") - && !card.isValid(params.get("ValidCard").split(","), hostCard.getController(), hostCard)) { + && !card.isValid(params.get("ValidCard").split(","), hostCard.getController(), hostCard, null)) { return null; } if (params.containsKey("Target") - && !target.isValid(params.get("Target").split(","), hostCard.getController(), hostCard)) { + && !target.isValid(params.get("Target").split(","), hostCard.getController(), hostCard, null)) { return null; } String costString = params.get("Cost"); @@ -139,12 +139,12 @@ public class StaticAbilityCantAttackBlock { final Card hostCard = stAb.getHostCard(); if (params.containsKey("ValidCard") - && !blocker.isValid(params.get("ValidCard").split(","), hostCard.getController(), hostCard)) { + && !blocker.isValid(params.get("ValidCard").split(","), hostCard.getController(), hostCard, null)) { return null; } if (params.containsKey("Attacker") && attacker != null - && !attacker.isValid(params.get("Attacker").split(","), hostCard.getController(), hostCard)) { + && !attacker.isValid(params.get("Attacker").split(","), hostCard.getController(), hostCard, null)) { return null; } String costString = params.get("Cost"); diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantBeCast.java b/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantBeCast.java index 9a472342e7f..6a6fe5d3a5d 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantBeCast.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantBeCast.java @@ -47,12 +47,12 @@ public class StaticAbilityCantBeCast { final Card hostCard = stAb.getHostCard(); if (params.containsKey("ValidCard") - && !card.isValid(params.get("ValidCard").split(","), hostCard.getController(), hostCard)) { + && !card.isValid(params.get("ValidCard").split(","), hostCard.getController(), hostCard, null)) { return false; } if (params.containsKey("Caster") && (activator != null) - && !activator.isValid(params.get("Caster"), hostCard.getController(), hostCard)) { + && !activator.isValid(params.get("Caster"), hostCard.getController(), hostCard, null)) { return false; } @@ -98,7 +98,7 @@ public class StaticAbilityCantBeCast { final Player activator = spellAbility.getActivatingPlayer(); if (params.containsKey("ValidCard") - && !card.isValid(params.get("ValidCard").split(","), hostCard.getController(), hostCard)) { + && !card.isValid(params.get("ValidCard").split(","), hostCard.getController(), hostCard, null)) { return false; } @@ -107,7 +107,7 @@ public class StaticAbilityCantBeCast { } if (params.containsKey("Activator") && (activator != null) - && !activator.isValid(params.get("Activator"), hostCard.getController(), hostCard)) { + && !activator.isValid(params.get("Activator"), hostCard.getController(), hostCard, spellAbility)) { return false; } @@ -138,12 +138,12 @@ public class StaticAbilityCantBeCast { final Card hostCard = stAb.getHostCard(); if (params.containsKey("ValidCard") - && (card == null || !card.isValid(params.get("ValidCard").split(","), hostCard.getController(), hostCard))) { + && (card == null || !card.isValid(params.get("ValidCard").split(","), hostCard.getController(), hostCard, null))) { return false; } if (params.containsKey("Player") && (player != null) - && !player.isValid(params.get("Player"), hostCard.getController(), hostCard)) { + && !player.isValid(params.get("Player"), hostCard.getController(), hostCard, null)) { return false; } diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantTarget.java b/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantTarget.java index 25826d3618a..a740853e516 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantTarget.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantTarget.java @@ -62,17 +62,17 @@ public class StaticAbilityCantTarget { } if (params.containsKey("ValidCard") - && !card.isValid(params.get("ValidCard").split(","), hostCard.getController(), hostCard)) { + && !card.isValid(params.get("ValidCard").split(","), hostCard.getController(), hostCard, null)) { return false; } if (params.containsKey("ValidSource") - && !source.isValid(params.get("ValidSource").split(","), hostCard.getController(), hostCard)) { + && !source.isValid(params.get("ValidSource").split(","), hostCard.getController(), hostCard, null)) { return false; } if (params.containsKey("Activator") && (activator != null) - && !activator.isValid(params.get("Activator"), hostCard.getController(), hostCard)) { + && !activator.isValid(params.get("Activator"), hostCard.getController(), hostCard, spellAbility)) { return false; } diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java b/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java index d316ffb4be3..3d970bc8036 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java @@ -339,7 +339,7 @@ public final class StaticAbilityContinuous { } CardCollectionView cardsIGainedAbilitiesFrom = game.getCardsIn(validZones); - cardsIGainedAbilitiesFrom = CardLists.getValidCards(cardsIGainedAbilitiesFrom, valids, hostCard.getController(), hostCard); + cardsIGainedAbilitiesFrom = CardLists.getValidCards(cardsIGainedAbilitiesFrom, valids, hostCard.getController(), hostCard, null); if (cardsIGainedAbilitiesFrom.size() > 0) { addFullAbs = new ArrayList(); @@ -671,7 +671,7 @@ public final class StaticAbilityContinuous { final String[] strngs = params.get("Affected").split(","); for (Player p : controller.getGame().getPlayersInTurnOrder()) { - if (p.isValid(strngs, controller, hostCard)) { + if (p.isValid(strngs, controller, hostCard, null)) { players.add(p); } } @@ -712,7 +712,7 @@ public final class StaticAbilityContinuous { } if (params.containsKey("Affected")) { - affectedCards = CardLists.getValidCards(affectedCards, params.get("Affected").split(","), controller, hostCard); + affectedCards = CardLists.getValidCards(affectedCards, params.get("Affected").split(","), controller, hostCard, null); } affectedCards.removeAll((List) stAb.getIgnoreEffectCards()); return affectedCards; diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbilityETBTapped.java b/forge-game/src/main/java/forge/game/staticability/StaticAbilityETBTapped.java index b1b28320224..281edbf6618 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbilityETBTapped.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityETBTapped.java @@ -40,7 +40,7 @@ public class StaticAbilityETBTapped { final Card hostCard = stAb.getHostCard(); if (params.containsKey("ValidCard") - && !card.isValid(params.get("ValidCard").split(","), hostCard.getController(), hostCard)) { + && !card.isValid(params.get("ValidCard").split(","), hostCard.getController(), hostCard, null)) { return false; } diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbilityPreventDamage.java b/forge-game/src/main/java/forge/game/staticability/StaticAbilityPreventDamage.java index 28fc7fe1ef6..1608837e826 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbilityPreventDamage.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityPreventDamage.java @@ -50,12 +50,12 @@ public class StaticAbilityPreventDamage { int restDamage = damage; if (params.containsKey("Source") - && !source.isValid(params.get("Source").split(","), hostCard.getController(), hostCard)) { + && !source.isValid(params.get("Source").split(","), hostCard.getController(), hostCard, null)) { return restDamage; } if (params.containsKey("Target") - && !target.isValid(params.get("Target").split(","), hostCard.getController(), hostCard)) { + && !target.isValid(params.get("Target").split(","), hostCard.getController(), hostCard, null)) { return restDamage; } diff --git a/forge-game/src/main/java/forge/game/trigger/Trigger.java b/forge-game/src/main/java/forge/game/trigger/Trigger.java index cad1cb7f312..1d1cbcfcdf0 100644 --- a/forge-game/src/main/java/forge/game/trigger/Trigger.java +++ b/forge-game/src/main/java/forge/game/trigger/Trigger.java @@ -284,7 +284,7 @@ public abstract class Trigger extends TriggerReplacementBase { } else if ("AttackedPlayerWithMostLife".equals(condition)) { GameEntity attacked = (GameEntity) runParams.get("Attacked"); if (attacked == null || !attacked.isValid("Player.withMostLife", - this.getHostCard().getController(), this.getHostCard())) { + this.getHostCard().getController(), this.getHostCard(), null)) { return false; } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAttached.java b/forge-game/src/main/java/forge/game/trigger/TriggerAttached.java index 67773daab52..38db20fbdc1 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttached.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttached.java @@ -54,7 +54,7 @@ public class TriggerAttached extends Trigger { if (this.mapParams.containsKey("ValidSource")) { if (!src.isValid(this.mapParams.get("ValidSource").split(","), this.getHostCard().getController(), - this.getHostCard())) { + this.getHostCard(), null)) { return false; } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAttacks.java b/forge-game/src/main/java/forge/game/trigger/TriggerAttacks.java index e5f1bdb8912..5da3e8231e8 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttacks.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttacks.java @@ -64,7 +64,7 @@ public class TriggerAttacks extends Trigger { if (this.mapParams.containsKey("Attacked")) { GameEntity attacked = (GameEntity) runParams2.get("Attacked"); if (!attacked.isValid(this.mapParams.get("Attacked").split(",") - , this.getHostCard().getController(), this.getHostCard())) { + , this.getHostCard().getController(), this.getHostCard(), null)) { return false; } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerChampioned.java b/forge-game/src/main/java/forge/game/trigger/TriggerChampioned.java index 0bfae8891c1..2604e2d55c7 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerChampioned.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerChampioned.java @@ -55,13 +55,13 @@ public class TriggerChampioned extends Trigger { if (this.mapParams.containsKey("ValidCard")) { if (!championed.isValid(this.mapParams.get("ValidCard").split(","), - this.getHostCard().getController(), this.getHostCard())) { + this.getHostCard().getController(), this.getHostCard(), null)) { return false; } } if (this.mapParams.containsKey("ValidSource")) { if (!source.isValid(this.mapParams.get("ValidSource").split(","), - this.getHostCard().getController(), this.getHostCard())) { + this.getHostCard().getController(), this.getHostCard(), null)) { return false; } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerChangesController.java b/forge-game/src/main/java/forge/game/trigger/TriggerChangesController.java index d2d417abe4e..6b52f085b30 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerChangesController.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerChangesController.java @@ -53,7 +53,7 @@ public class TriggerChangesController extends Trigger { if (this.mapParams.containsKey("ValidCard")) { if (!moved.isValid(this.mapParams.get("ValidCard").split(","), this.getHostCard().getController(), - this.getHostCard())) { + this.getHostCard(), null)) { return false; } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerChangesZone.java b/forge-game/src/main/java/forge/game/trigger/TriggerChangesZone.java index aa885f04866..a8b1feee7f8 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerChangesZone.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerChangesZone.java @@ -85,7 +85,7 @@ public class TriggerChangesZone extends Trigger { if (this.mapParams.containsKey("ValidCard")) { final Card moved = (Card) runParams2.get("Card"); if (!moved.isValid(this.mapParams.get("ValidCard").split(","), this.getHostCard().getController(), - this.getHostCard())) { + this.getHostCard(), null)) { return false; } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerCombatDamageDoneOnce.java b/forge-game/src/main/java/forge/game/trigger/TriggerCombatDamageDoneOnce.java index a2cc7c5ad08..16f567c2fd0 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerCombatDamageDoneOnce.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerCombatDamageDoneOnce.java @@ -59,7 +59,7 @@ public class TriggerCombatDamageDoneOnce extends Trigger { if (this.mapParams.containsKey("ValidSource")) { boolean valid = false; for (Card c : srcs) { - if (c.isValid(this.mapParams.get("ValidSource").split(","), this.getHostCard().getController(),this.getHostCard())) { + if (c.isValid(this.mapParams.get("ValidSource").split(","), this.getHostCard().getController(),this.getHostCard(), null)) { valid = true; } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerCounterAdded.java b/forge-game/src/main/java/forge/game/trigger/TriggerCounterAdded.java index 3cf5b6e6542..eb9264e7a6f 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerCounterAdded.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerCounterAdded.java @@ -55,7 +55,7 @@ public class TriggerCounterAdded extends Trigger { if (this.mapParams.containsKey("ValidCard")) { if (!addedTo.isValid(this.mapParams.get("ValidCard").split(","), this.getHostCard().getController(), - this.getHostCard())) { + this.getHostCard(), null)) { return false; } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerCounterAddedOnce.java b/forge-game/src/main/java/forge/game/trigger/TriggerCounterAddedOnce.java index 3653f0ea6a6..3f139d0e2ea 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerCounterAddedOnce.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerCounterAddedOnce.java @@ -55,7 +55,7 @@ public class TriggerCounterAddedOnce extends Trigger { if (this.mapParams.containsKey("ValidCard")) { if (!addedTo.isValid(this.mapParams.get("ValidCard").split(","), this.getHostCard().getController(), - this.getHostCard())) { + this.getHostCard(), null)) { return false; } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerCounterRemoved.java b/forge-game/src/main/java/forge/game/trigger/TriggerCounterRemoved.java index 75522ebfbd3..bd5ece1a443 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerCounterRemoved.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerCounterRemoved.java @@ -56,7 +56,7 @@ public class TriggerCounterRemoved extends Trigger { if (this.mapParams.containsKey("ValidCard")) { if (!addedTo.isValid(this.mapParams.get("ValidCard").split(","), this.getHostCard().getController(), - this.getHostCard())) { + this.getHostCard(), null)) { return false; } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDamageDone.java b/forge-game/src/main/java/forge/game/trigger/TriggerDamageDone.java index 5e474ba2794..dd3aa7a713f 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDamageDone.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDamageDone.java @@ -55,7 +55,7 @@ public class TriggerDamageDone extends Trigger { if (this.mapParams.containsKey("ValidSource")) { if (!src.isValid(this.mapParams.get("ValidSource").split(","), this.getHostCard().getController(), - this.getHostCard())) { + this.getHostCard(), null)) { return false; } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDealtCombatDamageOnce.java b/forge-game/src/main/java/forge/game/trigger/TriggerDealtCombatDamageOnce.java index d6cbf467888..d498a582215 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDealtCombatDamageOnce.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDealtCombatDamageOnce.java @@ -60,7 +60,7 @@ public class TriggerDealtCombatDamageOnce extends Trigger { if (this.mapParams.containsKey("ValidTarget")) { boolean valid = false; for (GameEntity c : tgt) { - if (c.isValid(this.mapParams.get("ValidTarget").split(","), this.getHostCard().getController(),this.getHostCard())) { + if (c.isValid(this.mapParams.get("ValidTarget").split(","), this.getHostCard().getController(),this.getHostCard(), null)) { valid = true; } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDevoured.java b/forge-game/src/main/java/forge/game/trigger/TriggerDevoured.java index 6002f4b98e1..7d5bd513b9f 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDevoured.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDevoured.java @@ -52,7 +52,7 @@ public class TriggerDevoured extends Trigger { final Card sac = (Card) runParams2.get("Devoured"); if (this.mapParams.containsKey("ValidDevoured")) { if (!sac.isValid(this.mapParams.get("ValidDevoured").split(","), this.getHostCard().getController(), - this.getHostCard())) { + this.getHostCard(), null)) { return false; } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDrawn.java b/forge-game/src/main/java/forge/game/trigger/TriggerDrawn.java index 6c2cab62fe0..a03cc760acd 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDrawn.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDrawn.java @@ -54,7 +54,7 @@ public class TriggerDrawn extends Trigger { if (this.mapParams.containsKey("ValidCard")) { if (!draw.isValid(this.mapParams.get("ValidCard").split(","), this.getHostCard().getController(), - this.getHostCard())) { + this.getHostCard(), null)) { return false; } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerEvolved.java b/forge-game/src/main/java/forge/game/trigger/TriggerEvolved.java index 95daba1d0a3..117ad5fdf2a 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerEvolved.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerEvolved.java @@ -52,7 +52,7 @@ public class TriggerEvolved extends Trigger { final Card sac = (Card) runParams2.get("Card"); if (this.mapParams.containsKey("ValidCard")) { if (!sac.isValid(this.mapParams.get("ValidCard").split(","), this.getHostCard().getController(), - this.getHostCard())) { + this.getHostCard(), null)) { return false; } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerExploited.java b/forge-game/src/main/java/forge/game/trigger/TriggerExploited.java index 1de368877bc..4ea8bae856b 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerExploited.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerExploited.java @@ -55,13 +55,13 @@ public class TriggerExploited extends Trigger { if (this.mapParams.containsKey("ValidCard")) { if (!exploited.isValid(this.mapParams.get("ValidCard").split(","), - this.getHostCard().getController(), this.getHostCard())) { + this.getHostCard().getController(), this.getHostCard(), null)) { return false; } } if (this.mapParams.containsKey("ValidSource")) { if (!source.isValid(this.mapParams.get("ValidSource").split(","), - this.getHostCard().getController(), this.getHostCard())) { + this.getHostCard().getController(), this.getHostCard(), null)) { return false; } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerFight.java b/forge-game/src/main/java/forge/game/trigger/TriggerFight.java index 55519520217..1a7e752a865 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerFight.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerFight.java @@ -54,7 +54,7 @@ public class TriggerFight extends Trigger { if (this.mapParams.containsKey("ValidCard")) { if (!fighter.isValid(this.mapParams.get("ValidCard").split(","), - this.getHostCard().getController(), this.getHostCard())) { + this.getHostCard().getController(), this.getHostCard(), null)) { return false; } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerPayCumulativeUpkeep.java b/forge-game/src/main/java/forge/game/trigger/TriggerPayCumulativeUpkeep.java index 7d19453dc0c..a76c3112b3f 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPayCumulativeUpkeep.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPayCumulativeUpkeep.java @@ -58,7 +58,7 @@ public class TriggerPayCumulativeUpkeep extends Trigger { final Card card = (Card) runParams2.get("Card"); if (this.mapParams.containsKey("ValidCard")) { if (!card.isValid(this.mapParams.get("ValidCard").split(","), this.getHostCard().getController(), - this.getHostCard())) { + this.getHostCard(), null)) { return false; } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerPayEcho.java b/forge-game/src/main/java/forge/game/trigger/TriggerPayEcho.java index c3033fec37b..744b56c83ba 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPayEcho.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPayEcho.java @@ -58,7 +58,7 @@ public class TriggerPayEcho extends Trigger { final Card card = (Card) runParams2.get("Card"); if (this.mapParams.containsKey("ValidCard")) { if (!card.isValid(this.mapParams.get("ValidCard").split(","), this.getHostCard().getController(), - this.getHostCard())) { + this.getHostCard(), null)) { return false; } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerPhaseIn.java b/forge-game/src/main/java/forge/game/trigger/TriggerPhaseIn.java index 8b5ec22f143..14df6564a97 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPhaseIn.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPhaseIn.java @@ -18,7 +18,7 @@ public class TriggerPhaseIn extends Trigger { if (this.mapParams.containsKey("ValidCard")) { if (!phaser.isValid(this.mapParams.get("ValidCard").split(","), this.getHostCard().getController(), - this.getHostCard())) { + this.getHostCard(), null)) { return false; } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerPhaseOut.java b/forge-game/src/main/java/forge/game/trigger/TriggerPhaseOut.java index b85f3ba1b25..0e5a827a1c6 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPhaseOut.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPhaseOut.java @@ -24,7 +24,7 @@ public class TriggerPhaseOut extends Trigger { return false; } } else if (!phaser.isValid(this.mapParams.get("ValidCard").split(","), this.getHostCard().getController(), - this.getHostCard())) { + this.getHostCard(), null)) { return false; } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerPlaneswalkedFrom.java b/forge-game/src/main/java/forge/game/trigger/TriggerPlaneswalkedFrom.java index 45ace5d067d..8709b42538f 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPlaneswalkedFrom.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPlaneswalkedFrom.java @@ -37,7 +37,7 @@ public class TriggerPlaneswalkedFrom extends Trigger { final CardCollection moved = (CardCollection) runParams2.get("Cards"); for(Card c : moved) { if (c.isValid(this.mapParams.get("ValidCard").split(","), this - .getHostCard().getController(), this.getHostCard())) { + .getHostCard().getController(), this.getHostCard(), null)) { return true; } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerPlaneswalkedTo.java b/forge-game/src/main/java/forge/game/trigger/TriggerPlaneswalkedTo.java index ebd89c2d1b3..272d8b53179 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPlaneswalkedTo.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPlaneswalkedTo.java @@ -37,7 +37,7 @@ public class TriggerPlaneswalkedTo extends Trigger { for(Card moved : (Iterable)runParams2.get("Cards")) { if (moved.isValid(this.mapParams.get("ValidCard").split(","), this.getHostCard().getController(), - this.getHostCard())) { + this.getHostCard(), null)) { return true; } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerSacrificed.java b/forge-game/src/main/java/forge/game/trigger/TriggerSacrificed.java index 68889b90f13..5c6631923bb 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerSacrificed.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerSacrificed.java @@ -59,13 +59,13 @@ public class TriggerSacrificed extends Trigger { } if (this.mapParams.containsKey("ValidCard")) { if (!sac.isValid(this.mapParams.get("ValidCard").split(","), this.getHostCard().getController(), - this.getHostCard())) { + this.getHostCard(), null)) { return false; } } if (this.mapParams.containsKey("ValidSourceController")) { if (sourceSA == null || !sourceSA.getActivatingPlayer().isValid(this.mapParams.get("ValidSourceController"), - this.getHostCard().getController(), this.getHostCard())) { + this.getHostCard().getController(), this.getHostCard(), null)) { return false; } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCast.java b/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCast.java index 4efa883caf0..0b01c0a81b5 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCast.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCast.java @@ -132,7 +132,7 @@ public class TriggerSpellAbilityCast extends Trigger { while (sa != null && !validTgtFound) { for (final Card tgt : sa.getTargets().getTargetCards()) { if (tgt.isValid(this.mapParams.get("TargetsValid").split(","), this.getHostCard() - .getController(), this.getHostCard())) { + .getController(), this.getHostCard(), null)) { validTgtFound = true; break; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerTaps.java b/forge-game/src/main/java/forge/game/trigger/TriggerTaps.java index b954784514d..b1bff87bae1 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerTaps.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerTaps.java @@ -55,7 +55,7 @@ public class TriggerTaps extends Trigger { if (this.mapParams.containsKey("ValidCard")) { if (!tapper.isValid(this.mapParams.get("ValidCard").split(","), this.getHostCard().getController(), - this.getHostCard())) { + this.getHostCard(), null)) { return false; } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerTapsForMana.java b/forge-game/src/main/java/forge/game/trigger/TriggerTapsForMana.java index 68aa7e4b963..af408cf6604 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerTapsForMana.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerTapsForMana.java @@ -63,14 +63,14 @@ public class TriggerTapsForMana extends Trigger { if (this.mapParams.containsKey("ValidCard")) { final Card tapper = (Card) runParams2.get("Card"); if (!tapper.isValid(this.mapParams.get("ValidCard").split(","), this.getHostCard().getController(), - this.getHostCard())) { + this.getHostCard(), null)) { return false; } } if (this.mapParams.containsKey("Player")) { final Player player = (Player) runParams2.get("Player"); - if (!player.isValid(this.mapParams.get("Player").split(","), this.getHostCard().getController(), this.getHostCard())) { + if (!player.isValid(this.mapParams.get("Player").split(","), this.getHostCard().getController(), this.getHostCard(), null)) { return false; } } @@ -79,7 +79,7 @@ public class TriggerTapsForMana extends Trigger { final SpellAbility sa = (SpellAbility) runParams2.get("AbilityMana"); if (sa == null) return false; final Player activator = sa.getActivatingPlayer(); - if (!activator.isValid(this.mapParams.get("Activator").split(","), this.getHostCard().getController(), this.getHostCard())) { + if (!activator.isValid(this.mapParams.get("Activator").split(","), this.getHostCard().getController(), this.getHostCard(), null)) { return false; } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerUnequip.java b/forge-game/src/main/java/forge/game/trigger/TriggerUnequip.java index 2b444034f53..ba2f52ae518 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerUnequip.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerUnequip.java @@ -54,14 +54,14 @@ public class TriggerUnequip extends Trigger { if (this.mapParams.containsKey("ValidCard")) { if (!equipped.isValid(this.mapParams.get("ValidCard").split(","), this.getHostCard().getController(), - this.getHostCard())) { + this.getHostCard(), null)) { return false; } } if (this.mapParams.containsKey("ValidEquipment")) { if (!equipment.isValid(this.mapParams.get("ValidEquipment").split(","), this.getHostCard() - .getController(), this.getHostCard())) { + .getController(), this.getHostCard(), null)) { return false; } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerUntaps.java b/forge-game/src/main/java/forge/game/trigger/TriggerUntaps.java index 36ed47ccbd7..7c583f1467d 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerUntaps.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerUntaps.java @@ -55,7 +55,7 @@ public class TriggerUntaps extends Trigger { if (this.mapParams.containsKey("ValidCard")) { if (!untapper.isValid(this.mapParams.get("ValidCard").split(","), this.getHostCard().getController(), - this.getHostCard())) { + this.getHostCard(), null)) { return false; } } diff --git a/forge-gui/res/cardsfolder/h/harness_the_storm.txt b/forge-gui/res/cardsfolder/h/harness_the_storm.txt index 57d0319dfc0..10bd5fa6f3f 100644 --- a/forge-gui/res/cardsfolder/h/harness_the_storm.txt +++ b/forge-gui/res/cardsfolder/h/harness_the_storm.txt @@ -1,7 +1,7 @@ Name:Harness the Storm ManaCost:2 R Types:Enchantment -T:Mode$ SpellCast | ValidCard$ Instant.wasCastFromHand,Sorcery.wasCastFromHand | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever you cast an instant or sorcery spell from your hand, you may cast target card with the same name as that spell from your graveyard. (you still pay its costs.) +T:Mode$ SpellCast | ValidCard$ Instant.wasCastFromHand,Sorcery.wasCastFromHand | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever you cast an instant or sorcery spell from your hand, you may cast target card with the same name as that spell from your graveyard. (You still pay its costs.) SVar:TrigPump:AB$ Pump | Cost$ 0 | TgtZone$ Graveyard | ValidTgts$ Instant.YouCtrl+sharesNameWith TriggeredCard,Sorcery.YouCtrl+sharesNameWith TriggeredCard | TgtPrompt$ Choose target instant or sorcery from your graveyard | PumpZone$ Graveyard | SubAbility$ TrigPlay SVar:TrigPlay:DB$ Play | Defined$ Targeted | Optional$ True SVar:NonStackingEffect:True diff --git a/forge-gui/src/main/java/forge/player/HumanCostDecision.java b/forge-gui/src/main/java/forge/player/HumanCostDecision.java index 8381c008948..e9f49259365 100644 --- a/forge-gui/src/main/java/forge/player/HumanCostDecision.java +++ b/forge-gui/src/main/java/forge/player/HumanCostDecision.java @@ -143,7 +143,7 @@ public class HumanCostDecision extends CostDecisionMakerBase { } if (discardType.contains("+WithSameName")) { final String type = discardType.replace("+WithSameName", ""); - hand = CardLists.getValidCards(hand, type.split(";"), player, source); + hand = CardLists.getValidCards(hand, type.split(";"), player, source, ability); final CardCollectionView landList2 = hand; hand = CardLists.filter(hand, new Predicate() { @Override @@ -180,7 +180,7 @@ public class HumanCostDecision extends CostDecisionMakerBase { final String type = new String(discardType); final String[] validType = type.split(";"); - hand = CardLists.getValidCards(hand, validType, player, source); + hand = CardLists.getValidCards(hand, validType, player, source, ability); if (c == null) { final String sVar = ability.getSVar(amount); @@ -276,7 +276,7 @@ public class HumanCostDecision extends CostDecisionMakerBase { if (type.equals("All")) { return PaymentDecision.card(list); } - list = CardLists.getValidCards(list, type.split(";"), player, source); + list = CardLists.getValidCards(list, type.split(";"), player, source, ability); if (c == null) { final String sVar = ability.getSVar(amount); // Generalize this @@ -357,7 +357,7 @@ public class HumanCostDecision extends CostDecisionMakerBase { for (final SpellAbilityStackInstance si : game.getStack()) { final Card stC = si.getSourceCard(); final SpellAbility stSA = si.getSpellAbility(true).getRootAbility(); - if (stC.isValid(cost.getType().split(";"), ability.getActivatingPlayer(), source) && stSA.isSpell()) { + if (stC.isValid(cost.getType().split(";"), ability.getActivatingPlayer(), source, ability) && stSA.isSpell()) { saList.add(stSA); if (stC.isCopiedSpell()) { descList.add(stSA.getStackDescription() + " (Copied Spell)"); @@ -448,7 +448,8 @@ public class HumanCostDecision extends CostDecisionMakerBase { } final Player activator = ability.getActivatingPlayer(); - final CardCollection list = CardLists.getValidCards(activator.getGame().getCardsIn(ZoneType.Exile), cost.getType().split(";"), activator, source); + final CardCollection list = CardLists.getValidCards(activator.getGame().getCardsIn(ZoneType.Exile), + cost.getType().split(";"), activator, source, ability); if (list.size() < c) { return null; @@ -491,7 +492,7 @@ public class HumanCostDecision extends CostDecisionMakerBase { c = AbilityUtils.calculateAmount(source, amount, ability); } final CardCollectionView list = player.getCardsIn(ZoneType.Battlefield); - final CardCollectionView validCards = CardLists.getValidCards(list, cost.getType().split(";"), player, source); + final CardCollectionView validCards = CardLists.getValidCards(list, cost.getType().split(";"), player, source, ability); final InputSelectCardsFromList inp = new InputSelectCardsFromList(controller, c, validCards); final String desc = cost.getTypeDescription() == null ? cost.getType() : cost.getTypeDescription(); @@ -610,7 +611,8 @@ public class HumanCostDecision extends CostDecisionMakerBase { } } - final CardCollection list = CardLists.getValidCards(cost.sameZone ? player.getGame().getCardsIn(cost.getFrom()) : player.getCardsIn(cost.getFrom()), cost.getType().split(";"), player, source); + final CardCollection list = CardLists.getValidCards(cost.sameZone ? player.getGame().getCardsIn(cost.getFrom()) : + player.getCardsIn(cost.getFrom()), cost.getType().split(";"), player, source, ability); if (cost.from == ZoneType.Hand) { final InputSelectCardsFromList inp = new InputSelectCardsFromList(controller, c, c, list); @@ -691,7 +693,8 @@ public class HumanCostDecision extends CostDecisionMakerBase { } // Cards to use this branch: Scarscale Ritual, Wandering Mage - each adds only one counter - final CardCollectionView typeList = CardLists.getValidCards(player.getCardsIn(ZoneType.Battlefield), cost.getType().split(";"), player, ability.getHostCard()); + final CardCollectionView typeList = CardLists.getValidCards(player.getCardsIn(ZoneType.Battlefield), + cost.getType().split(";"), player, ability.getHostCard(), ability); final InputSelectCardsFromList inp = new InputSelectCardsFromList(controller, 1, 1, typeList); inp.setMessage("Put " + Lang.nounWithAmount(c, cost.getCounter().getName() + " counter") + " on " + cost.getDescriptiveType()); @@ -727,7 +730,8 @@ public class HumanCostDecision extends CostDecisionMakerBase { } } else { - final CardCollectionView validCards = CardLists.getValidCards(ability.getActivatingPlayer().getCardsIn(ZoneType.Battlefield), cost.getType().split(";"), ability.getActivatingPlayer(), ability.getHostCard()); + final CardCollectionView validCards = CardLists.getValidCards(ability.getActivatingPlayer().getCardsIn(ZoneType.Battlefield), + cost.getType().split(";"), player, source, ability); final InputSelectCardsFromList inp = new InputSelectCardsFromList(controller, c, c, validCards); inp.setCancelAllowed(true); @@ -788,7 +792,7 @@ public class HumanCostDecision extends CostDecisionMakerBase { Integer num = cost.convertAmount(); CardCollectionView hand = player.getCardsIn(ZoneType.Hand); - hand = CardLists.getValidCards(hand, cost.getType().split(";"), player, ability.getHostCard()); + hand = CardLists.getValidCards(hand, cost.getType().split(";"), player, source, ability); if (num == null) { final String sVar = ability.getSVar(amount); @@ -823,7 +827,7 @@ public class HumanCostDecision extends CostDecisionMakerBase { } CardCollectionView list = new CardCollection(player.getCardsIn(ZoneType.Battlefield)); - list = CardLists.getValidCards(list, type.split(";"), player, source); + list = CardLists.getValidCards(list, type.split(";"), player, source, ability); list = CardLists.filter(list, new Predicate() { @@ -971,7 +975,7 @@ public class HumanCostDecision extends CostDecisionMakerBase { return PaymentDecision.card(ability.getOriginalHost(), cntRemoved >= 0 ? cntRemoved : maxCounters); } - final CardCollectionView validCards = CardLists.getValidCards(player.getCardsIn(cost.zone), type.split(";"), player, source); + final CardCollectionView validCards = CardLists.getValidCards(player.getCardsIn(cost.zone), type.split(";"), player, source, ability); if (cost.zone.equals(ZoneType.Battlefield)) { if (cntRemoved == 0) { return PaymentDecision.card(source, 0); @@ -1019,7 +1023,7 @@ public class HumanCostDecision extends CostDecisionMakerBase { final String type = cost.getType(); CardCollectionView list = CardLists.filter(player.getCardsIn(ZoneType.Battlefield), CardPredicates.canBeSacrificedBy(ability)); - list = CardLists.getValidCards(list, type.split(";"), player, source); + list = CardLists.getValidCards(list, type.split(";"), player, source, ability); if (player.hasKeyword("You can't sacrifice creatures to cast spells or activate abilities.")) { list = CardLists.getNotType(list, "Creature"); } @@ -1092,7 +1096,8 @@ public class HumanCostDecision extends CostDecisionMakerBase { type = type.replace("+withTotalPowerGE" + totalP, ""); } - CardCollection typeList = CardLists.getValidCards(player.getCardsIn(ZoneType.Battlefield), type.split(";"), player, ability.getHostCard()); + CardCollection typeList = CardLists.getValidCards(player.getCardsIn(ZoneType.Battlefield), type.split(";"), player, + source, ability); typeList = CardLists.filter(typeList, Presets.UNTAPPED); if (c == null && !amount.equals("Any")) { final String sVar = ability.getSVar(amount); @@ -1174,7 +1179,7 @@ public class HumanCostDecision extends CostDecisionMakerBase { @Override public PaymentDecision visit(final CostUntapType cost) { CardCollection typeList = CardLists.getValidCards(player.getGame().getCardsIn(ZoneType.Battlefield), cost.getType().split(";"), - player, ability.getHostCard()); + player, source, ability); typeList = CardLists.filter(typeList, Presets.TAPPED); if (!cost.canUntapSource) { typeList.remove(source); diff --git a/forge-gui/src/main/java/forge/player/HumanPlay.java b/forge-gui/src/main/java/forge/player/HumanPlay.java index dabfccb696a..3258a76c8dc 100644 --- a/forge-gui/src/main/java/forge/player/HumanPlay.java +++ b/forge-gui/src/main/java/forge/player/HumanPlay.java @@ -322,7 +322,7 @@ public class HumanPlay { List res = new ArrayList(); String type = part.getType(); for (Player player : p.getGame().getPlayers()) { - if (player.isValid(type, p, source) && player.canDraw()) { + if (player.isValid(type, p, source, sourceAbility) && player.canDraw()) { res.add(player); } } @@ -412,7 +412,7 @@ public class HumanPlay { } else { CardCollectionView list = p.getGame().getCardsIn(ZoneType.Battlefield); - list = CardLists.getValidCards(list, part.getType().split(";"), p, source); + list = CardLists.getValidCards(list, part.getType().split(";"), p, source, sourceAbility); if (list.isEmpty()) { return false; } if (!p.getController().confirmPayment(part, "Do you want to put " + Lang.nounWithAmount(amount, counterType.getName() + " counter") + " on " + part.getTypeDescription() + "?")) { return false; @@ -460,7 +460,7 @@ public class HumanPlay { return false; } - list = CardLists.getValidCards(list, part.getType().split(";"), p, source); + list = CardLists.getValidCards(list, part.getType().split(";"), p, source, sourceAbility); while (amount > 0) { final CounterType counterType; list = CardLists.filter(list, new Predicate() { @@ -510,7 +510,7 @@ public class HumanPlay { else { CostExile costExile = (CostExile) part; ZoneType from = costExile.getFrom(); - List list = CardLists.getValidCards(p.getCardsIn(from), part.getType().split(";"), p, source); + List list = CardLists.getValidCards(p.getCardsIn(from), part.getType().split(";"), p, source, sourceAbility); final int nNeeded = getAmountFromPart(costPart, source, sourceAbility); if (list.size() < nNeeded) { return false; @@ -549,7 +549,7 @@ public class HumanPlay { else { listView = p.getCardsIn(from); } - CardCollection list = CardLists.getValidCards(listView, part.getType().split(";"), p, source); + CardCollection list = CardLists.getValidCards(listView, part.getType().split(";"), p, source, sourceAbility); if (sameZone) { // Jotun Grunt FCollectionView players = p.getGame().getPlayers(); diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index 0151f462a34..db34e9994c2 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -1352,7 +1352,7 @@ public class PlayerControllerHuman while (true) { final PaperCard cp = chooseSinglePaperCard(sa, message, cpp, sa.getHostCard().getName()); final Card instanceForPlayer = Card.fromPaperCard(cp, player); // the Card instance for test needs a game to be tested - if (instanceForPlayer.isValid(valid, sa.getHostCard().getController(), sa.getHostCard())) { + if (instanceForPlayer.isValid(valid, sa.getHostCard().getController(), sa.getHostCard(), sa)) { return cp.getName(); } }