diff --git a/forge-ai/src/main/java/forge/ai/AiBlockController.java b/forge-ai/src/main/java/forge/ai/AiBlockController.java index 6a238e13baf..d7925fd2792 100644 --- a/forge-ai/src/main/java/forge/ai/AiBlockController.java +++ b/forge-ai/src/main/java/forge/ai/AiBlockController.java @@ -20,7 +20,6 @@ package forge.ai; import com.google.common.base.Predicate; import com.google.common.base.Predicates; import forge.card.CardStateName; -import forge.game.CardTraitBase; import forge.game.GameEntity; import forge.game.card.*; import forge.game.combat.Combat; @@ -263,14 +262,14 @@ public class AiBlockController { if (mode == TriggerType.DamageDone) { if ((!trigParams.containsKey("ValidSource") - || CardTraitBase.matchesValid(attacker, trigParams.get("ValidSource").split(","), attacker)) + || trigger.matchesValid(attacker, trigParams.get("ValidSource").split(","))) && attacker.getNetCombatDamage() > 0 && (!trigParams.containsKey("ValidTarget") - || CardTraitBase.matchesValid(combat.getDefenderByAttacker(attacker), trigParams.get("ValidTarget").split(","), attacker))) { + || trigger.matchesValid(combat.getDefenderByAttacker(attacker), trigParams.get("ValidTarget").split(",")))) { value += 50; } } else if (mode == TriggerType.AttackerUnblocked) { - if (CardTraitBase.matchesValid(attacker, trigParams.get("ValidCard").split(","), attacker)) { + if (trigger.matchesValid(attacker, trigParams.get("ValidCard").split(","))) { value += 50; } } diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtil.java b/forge-ai/src/main/java/forge/ai/ComputerUtil.java index 387734cf125..795b2d959e0 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtil.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtil.java @@ -2056,8 +2056,8 @@ public class ComputerUtil { final CardCollection candidates = new CardCollection(); final CardCollectionView handList = ai.getCardsIn(ZoneType.Hand); - final CardCollection lands = CardLists.getValidCards(handList, "Card.Land", ai, null); - final CardCollection nonLands = CardLists.getValidCards(handList, "Card.nonLand", ai, null); + final CardCollection lands = CardLists.getValidCards(handList, "Card.Land", ai, null, null); + final CardCollection nonLands = CardLists.getValidCards(handList, "Card.nonLand", ai, null, null); CardLists.sortByCmcDesc(nonLands); if (lands.size() >= 3 && lands.size() <= 4) { @@ -2996,7 +2996,7 @@ public class ComputerUtil { } }); } else { - list = CardLists.getValidCards(srcList, sa.getParam("AITgts"), sa.getActivatingPlayer(), source); + list = CardLists.getValidCards(srcList, sa.getParam("AITgts"), sa.getActivatingPlayer(), source, sa); } if (!list.isEmpty() || sa.hasParam("AITgtsStrict") || alwaysStrict) { diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java index fe240b141db..d37e8ccedff 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java @@ -25,7 +25,6 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.common.collect.Maps; -import forge.game.CardTraitBase; import forge.game.Game; import forge.game.GameEntity; import forge.game.ability.AbilityKey; @@ -790,9 +789,9 @@ public class ComputerUtilCombat { return false; // The trigger should have triggered already } if (trigParams.containsKey("ValidCard")) { - if (!CardTraitBase.matchesValid(attacker, trigParams.get("ValidCard").split(","), source) - && !(combat.isAttacking(source) && CardTraitBase.matchesValid(source, - trigParams.get("ValidCard").split(","), source) + if (!trigger.matchesValid(attacker, trigParams.get("ValidCard").split(",")) + && !(combat.isAttacking(source) && trigger.matchesValid(source, + trigParams.get("ValidCard").split(",")) && !trigParams.containsKey("Alone"))) { return false; } @@ -800,7 +799,7 @@ public class ComputerUtilCombat { if (trigParams.containsKey("Attacked")) { if (combat.isAttacking(attacker)) { GameEntity attacked = combat.getDefenderByAttacker(attacker); - if (!CardTraitBase.matchesValid(attacked, trigParams.get("Attacked").split(","), source)) { + if (!trigger.matchesValid(attacked, trigParams.get("Attacked").split(","))) { return false; } } else { @@ -820,7 +819,7 @@ public class ComputerUtilCombat { if ((defender == null) && mode == TriggerType.AttackerUnblocked) { willTrigger = true; if (trigParams.containsKey("ValidCard")) { - if (!CardTraitBase.matchesValid(attacker, trigParams.get("ValidCard").split(","), source)) { + if (!trigger.matchesValid(attacker, trigParams.get("ValidCard").split(","))) { return false; } } @@ -842,7 +841,7 @@ public class ComputerUtilCombat { return false; } } - if (!CardTraitBase.matchesValid(attacker, validBlocked.split(","), source)) { + if (!trigger.matchesValid(attacker, validBlocked.split(","))) { return false; } } @@ -856,35 +855,35 @@ public class ComputerUtilCombat { return false; } } - if (!CardTraitBase.matchesValid(defender, validBlocker.split(","), source)) { + if (!trigger.matchesValid(defender, validBlocker.split(","))) { return false; } } } else if (mode == TriggerType.AttackerBlocked || mode == TriggerType.AttackerBlockedByCreature) { willTrigger = true; if (trigParams.containsKey("ValidBlocker")) { - if (!CardTraitBase.matchesValid(defender, trigParams.get("ValidBlocker").split(","), source)) { + if (!trigger.matchesValid(defender, trigParams.get("ValidBlocker").split(","))) { return false; } } if (trigParams.containsKey("ValidCard")) { - if (!CardTraitBase.matchesValid(attacker, trigParams.get("ValidCard").split(","), source)) { + if (!trigger.matchesValid(attacker, trigParams.get("ValidCard").split(","))) { return false; } } } else if (mode == TriggerType.DamageDone) { willTrigger = true; if (trigParams.containsKey("ValidSource")) { - if (!(CardTraitBase.matchesValid(defender, trigParams.get("ValidSource").split(","), source) + if (!(trigger.matchesValid(defender, trigParams.get("ValidSource").split(",")) && defender.getNetCombatDamage() > 0 && (!trigParams.containsKey("ValidTarget") - || CardTraitBase.matchesValid(attacker, trigParams.get("ValidTarget").split(","), source)))) { + || trigger.matchesValid(attacker, trigParams.get("ValidTarget").split(","))))) { return false; } - if (!(CardTraitBase.matchesValid(attacker, trigParams.get("ValidSource").split(","), source) + if (!(trigger.matchesValid(attacker, trigParams.get("ValidSource").split(",")) && attacker.getNetCombatDamage() > 0 && (!trigParams.containsKey("ValidTarget") - || CardTraitBase.matchesValid(defender, trigParams.get("ValidTarget").split(","), source)))) { + || trigger.matchesValid(defender, trigParams.get("ValidTarget").split(","))))) { return false; } } diff --git a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java index 06192d87258..9fc64c9d3fd 100644 --- a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java +++ b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java @@ -1159,7 +1159,7 @@ public class PlayerControllerAi extends PlayerController { } else if (logic.equals("MostProminentInHumanDeck")) { return ComputerUtilCard.getMostProminentCardName(oppLibrary); } else if (logic.equals("MostProminentCreatureInComputerDeck")) { - CardCollectionView cards = CardLists.getValidCards(aiLibrary, "Creature", player, sa.getHostCard()); + CardCollectionView cards = CardLists.getValidCards(aiLibrary, "Creature", player, sa.getHostCard(), sa); return ComputerUtilCard.getMostProminentCardName(cards); } else if (logic.equals("BestCreatureInComputerDeck")) { Card bestCreature = ComputerUtilCard.getBestCreatureAI(aiLibrary); @@ -1167,7 +1167,7 @@ public class PlayerControllerAi extends PlayerController { } else if (logic.equals("RandomInComputerDeck")) { return Aggregates.random(aiLibrary).getName(); } else if (logic.equals("MostProminentSpellInComputerDeck")) { - CardCollectionView cards = CardLists.getValidCards(aiLibrary, "Card.Instant,Card.Sorcery", player, sa.getHostCard()); + CardCollectionView cards = CardLists.getValidCards(aiLibrary, "Card.Instant,Card.Sorcery", player, sa.getHostCard(), sa); return ComputerUtilCard.getMostProminentCardName(cards); } else if (logic.equals("CursedScroll")) { return SpecialCardAi.CursedScroll.chooseCard(player, sa); 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 cee3174323f..17cf3deab63 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java @@ -357,7 +357,7 @@ public class ChangeZoneAi extends SpellAbilityAi { if (type != null && p == ai) { // AI only "knows" about his information - list = CardLists.getValidCards(list, type, source.getController(), source); + list = CardLists.getValidCards(list, type, source.getController(), source, sa); list = CardLists.filter(list, new Predicate() { @Override public boolean apply(final Card c) { @@ -370,7 +370,7 @@ public class ChangeZoneAi extends SpellAbilityAi { } // TODO: prevent ai seaching its own library when Ob Nixilis, Unshackled is in play if (origin != null && origin.isKnown()) { - list = CardLists.getValidCards(list, type, source.getController(), source); + list = CardLists.getValidCards(list, type, source.getController(), source, sa); } if (!activateForCost && list.isEmpty()) { @@ -1107,7 +1107,7 @@ public class ChangeZoneAi extends SpellAbilityAi { // Only care about combatants during combat if (game.getPhaseHandler().inCombat() && origin.contains(ZoneType.Battlefield)) { - CardCollection newList = CardLists.getValidCards(list, "Card.attacking,Card.blocking", null, null); + CardCollection newList = CardLists.getValidCards(list, "Card.attacking,Card.blocking", null, null, null); if (!newList.isEmpty() || !sa.isTrigger()) { list = newList; } @@ -1705,7 +1705,7 @@ public class ChangeZoneAi extends SpellAbilityAi { Card source = sa.getHostCard(); String definedSac = StringUtils.split(source.getSVar("AIPreference"), "$")[1]; - CardCollection listToSac = CardLists.filter(ai.getCardsIn(ZoneType.Battlefield), CardPredicates.restriction(definedSac.split(","), ai, source, sa)); + CardCollection listToSac = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), definedSac, ai, source, sa); listToSac.sort(Collections.reverseOrder(CardLists.CmcComparatorInv)); CardCollection listToRet = CardLists.filter(ai.getCardsIn(ZoneType.Graveyard), Presets.CREATURES); @@ -1742,7 +1742,7 @@ public class ChangeZoneAi extends SpellAbilityAi { String definedGoal = sa.getParam("ChangeType"); boolean anyCMC = !definedGoal.contains(".cmc"); - CardCollection listToSac = CardLists.filter(ai.getCardsIn(ZoneType.Battlefield), CardPredicates.restriction(definedSac.split(","), ai, source, sa)); + CardCollection listToSac = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), definedSac, ai, source, sa); listToSac.sort(!sacWorst ? CardLists.CmcComparatorInv : Collections.reverseOrder(CardLists.CmcComparatorInv)); for (Card sacCandidate : listToSac) { @@ -1756,12 +1756,12 @@ public class ChangeZoneAi extends SpellAbilityAi { curGoal = definedGoal.replace("X", String.format("%d", goalCMC)); } - CardCollection listGoal = CardLists.filter(ai.getCardsIn(ZoneType.Library), CardPredicates.restriction(curGoal.split(","), ai, source, sa)); + CardCollection listGoal = CardLists.getValidCards(ai.getCardsIn(ZoneType.Library), curGoal, ai, source, sa); if (!anyCMC) { - listGoal = CardLists.getValidCards(listGoal, curGoal, source.getController(), source); + listGoal = CardLists.getValidCards(listGoal, curGoal, source.getController(), source, sa); } else { - listGoal = CardLists.getValidCards(listGoal, curGoal + (curGoal.contains(".") ? "+" : ".") + "cmcGE" + goalCMC, source.getController(), source); + listGoal = CardLists.getValidCards(listGoal, curGoal + (curGoal.contains(".") ? "+" : ".") + "cmcGE" + goalCMC, source.getController(), source, sa); } listGoal = CardLists.filter(listGoal, new Predicate() { diff --git a/forge-ai/src/main/java/forge/ai/ability/ChooseCardAi.java b/forge-ai/src/main/java/forge/ai/ability/ChooseCardAi.java index a25c0e71424..18586b6a20a 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChooseCardAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChooseCardAi.java @@ -66,7 +66,7 @@ public class ChooseCardAi extends SpellAbilityAi { } CardCollectionView choices = ai.getGame().getCardsIn(choiceZone); if (sa.hasParam("Choices")) { - choices = CardLists.getValidCards(choices, sa.getParam("Choices"), host.getController(), host); + choices = CardLists.getValidCards(choices, sa.getParam("Choices"), host.getController(), host, sa); } if (sa.hasParam("TargetControls")) { choices = CardLists.filterControlledBy(choices, ai.getOpponents()); @@ -79,7 +79,7 @@ public class ChooseCardAi extends SpellAbilityAi { final String filter = aiLogic.equals("Clone") ? "Permanent.YouDontCtrl,Permanent.nonLegendary" : "Permanent.YouDontCtrl+notnamedVesuva,Permanent.nonLegendary+notnamedVesuva"; - choices = CardLists.getValidCards(choices, filter, host.getController(), host); + choices = CardLists.getValidCards(choices, filter, host.getController(), host, sa); return !choices.isEmpty(); } else if (aiLogic.equals("Never")) { return false; @@ -112,7 +112,7 @@ public class ChooseCardAi extends SpellAbilityAi { return !choices.isEmpty(); } else if (aiLogic.equals("RandomNonLand")) { - return !CardLists.getValidCards(choices, "Card.nonLand", host.getController(), host).isEmpty(); + return !CardLists.getValidCards(choices, "Card.nonLand", host.getController(), host, sa).isEmpty(); } else if (aiLogic.equals("Duneblast")) { CardCollection aiCreatures = ai.getCreaturesInPlay(); CardCollection oppCreatures = ai.getWeakestOpponent().getCreaturesInPlay(); @@ -186,7 +186,7 @@ public class ChooseCardAi extends SpellAbilityAi { choice = null; } } else if ("RandomNonLand".equals(logic)) { - options = CardLists.getValidCards(options, "Card.nonLand", host.getController(), host); + options = CardLists.getValidCards(options, "Card.nonLand", host.getController(), host, sa); choice = Aggregates.random(options); } else if (logic.equals("Untap")) { final String filter = "Permanent.YouCtrl,Permanent.tapped"; 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 7781490d425..8d2bf970e0e 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChooseSourceAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChooseSourceAi.java @@ -105,7 +105,7 @@ public class ChooseSourceAi extends SpellAbilityAi { } CardCollectionView choices = game.getCardsIn(ZoneType.Battlefield); if (sa.hasParam("Choices")) { - choices = CardLists.getValidCards(choices, sa.getParam("Choices"), host.getController(), host); + choices = CardLists.getValidCards(choices, sa.getParam("Choices"), host.getController(), host, sa); } final Combat combat = game.getCombat(); choices = CardLists.filter(choices, new Predicate() { diff --git a/forge-ai/src/main/java/forge/ai/ability/CloneAi.java b/forge-ai/src/main/java/forge/ai/ability/CloneAi.java index 3a3de604029..a97839b66ab 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CloneAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CloneAi.java @@ -124,11 +124,11 @@ public class CloneAi extends SpellAbilityAi { private boolean cloneTgtAI(final SpellAbility sa) { // Specific logic for cards if ("CloneAttacker".equals(sa.getParam("AILogic"))) { - CardCollection valid = CardLists.getValidCards(sa.getHostCard().getController().getCardsIn(ZoneType.Battlefield), sa.getParam("ValidTgts"), sa.getHostCard().getController(), sa.getHostCard()); + CardCollection valid = CardLists.getValidCards(sa.getHostCard().getController().getCardsIn(ZoneType.Battlefield), sa.getParam("ValidTgts"), sa.getHostCard().getController(), sa.getHostCard(), sa); sa.getTargets().add(ComputerUtilCard.getBestCreatureAI(valid)); return true; } else if ("CloneBestCreature".equals(sa.getParam("AILogic"))) { - CardCollection valid = CardLists.getValidCards(sa.getHostCard().getController().getGame().getCardsIn(ZoneType.Battlefield), sa.getParam("ValidTgts"), sa.getHostCard().getController(), sa.getHostCard()); + CardCollection valid = CardLists.getValidCards(sa.getHostCard().getController().getGame().getCardsIn(ZoneType.Battlefield), sa.getParam("ValidTgts"), sa.getHostCard().getController(), sa.getHostCard(), sa); sa.getTargets().add(ComputerUtilCard.getBestCreatureAI(valid)); return true; } 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 3b31616a6d4..3bc49b3f392 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CopyPermanentAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CopyPermanentAi.java @@ -173,7 +173,7 @@ public class CopyPermanentAi extends SpellAbilityAi { } else if (sa.hasParam("Choices")) { // only check for options, does not select there CardCollectionView choices = game.getCardsIn(ZoneType.Battlefield); - choices = CardLists.getValidCards(choices, sa.getParam("Choices"), activator, host); + choices = CardLists.getValidCards(choices, sa.getParam("Choices"), activator, host, sa); Collection betterChoices = getBetterOptions(aiPlayer, sa, choices, !mandatory); if (betterChoices.isEmpty()) { return mandatory; diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersPutAllAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersPutAllAi.java index 87d25eaa100..ce72b27f805 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersPutAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersPutAllAi.java @@ -38,11 +38,11 @@ public class CountersPutAllAi extends SpellAbilityAi { final TargetRestrictions tgt = sa.getTargetRestrictions(); if ("OwnCreatsAndOtherPWs".equals(sa.getParam("AILogic"))) { - hList = CardLists.getValidCards(ai.getWeakestOpponent().getCardsIn(ZoneType.Battlefield), "Creature.YouCtrl,Planeswalker.YouCtrl+Other", source.getController(), source); - cList = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), "Creature.YouCtrl,Planeswalker.YouCtrl+Other", source.getController(), source); + hList = CardLists.getValidCards(ai.getWeakestOpponent().getCardsIn(ZoneType.Battlefield), "Creature.YouCtrl,Planeswalker.YouCtrl+Other", source.getController(), source, sa); + cList = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), "Creature.YouCtrl,Planeswalker.YouCtrl+Other", source.getController(), source, sa); } else { - hList = CardLists.getValidCards(ai.getWeakestOpponent().getCardsIn(ZoneType.Battlefield), valid, source.getController(), source); - cList = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), valid, source.getController(), source); + hList = CardLists.getValidCards(ai.getWeakestOpponent().getCardsIn(ZoneType.Battlefield), valid, source.getController(), source, sa); + cList = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), valid, source.getController(), source, sa); } if (abCost != null) { 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 471cf90696f..ee015483a26 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java @@ -161,7 +161,7 @@ public class DamageDealAi extends DamageAiBase { } } else if ("WildHunt".equals(logic)) { // This dummy ability will just deal 0 damage, but holds the logic for the AI for Master of Wild Hunt - List wolves = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), "Creature.Wolf+untapped+YouCtrl+Other", ai, source); + List wolves = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), "Creature.Wolf+untapped+YouCtrl+Other", ai, source, sa); dmg = Aggregates.sum(wolves, CardPredicates.Accessors.fnGetNetPower); } else if ("Triskelion".equals(logic)) { final int n = source.getCounters(CounterEnumType.P1P1); diff --git a/forge-ai/src/main/java/forge/ai/ability/ManifestAi.java b/forge-ai/src/main/java/forge/ai/ability/ManifestAi.java index 7ab70c49801..79e7fad1e2d 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ManifestAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ManifestAi.java @@ -141,7 +141,7 @@ public class ManifestAi extends SpellAbilityAi { } CardCollection choices = new CardCollection(game.getCardsIn(choiceZone)); if (sa.hasParam("Choices")) { - choices = CardLists.getValidCards(choices, sa.getParam("Choices"), ai, host); + choices = CardLists.getValidCards(choices, sa.getParam("Choices"), ai, host, sa); } if (choices.isEmpty()) { return false; diff --git a/forge-ai/src/main/java/forge/ai/ability/PumpAllAi.java b/forge-ai/src/main/java/forge/ai/ability/PumpAllAi.java index 0189574dc65..98bd675ed51 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PumpAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PumpAllAi.java @@ -69,8 +69,8 @@ public class PumpAllAi extends PumpAiBase { } final Player opp = ai.getWeakestOpponent(); - CardCollection comp = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), valid, source.getController(), source); - CardCollection human = CardLists.getValidCards(opp.getCardsIn(ZoneType.Battlefield), valid, source.getController(), source); + CardCollection comp = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), valid, source.getController(), source, sa); + CardCollection human = CardLists.getValidCards(opp.getCardsIn(ZoneType.Battlefield), valid, source.getController(), source, sa); final TargetRestrictions tgt = sa.getTargetRestrictions(); if (tgt != null && sa.canTarget(opp) && sa.hasParam("IsCurse")) { @@ -144,7 +144,7 @@ public class PumpAllAi extends PumpAiBase { return (ComputerUtilCard.evaluateCreatureList(comp) + 200) < ComputerUtilCard.evaluateCreatureList(human); } // end Curse - return !CardLists.getValidCards(getPumpCreatures(ai, sa, defense, power, keywords, false), valid, source.getController(), source).isEmpty(); + return !CardLists.getValidCards(getPumpCreatures(ai, sa, defense, power, keywords, false), valid, source.getController(), source, sa).isEmpty(); } // pumpAllCanPlayAI() @Override diff --git a/forge-ai/src/main/java/forge/ai/ability/TapAllAi.java b/forge-ai/src/main/java/forge/ai/ability/TapAllAi.java index 8361e437dcd..43ba7f68d0f 100644 --- a/forge-ai/src/main/java/forge/ai/ability/TapAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/TapAllAi.java @@ -48,7 +48,7 @@ public class TapAllAi extends SpellAbilityAi { validTappables = opp.getCardsIn(ZoneType.Battlefield); } - validTappables = CardLists.getValidCards(validTappables, valid, source.getController(), source); + validTappables = CardLists.getValidCards(validTappables, valid, source.getController(), source, sa); validTappables = CardLists.filter(validTappables, Presets.UNTAPPED); if (sa.hasParam("AILogic")) { @@ -98,10 +98,10 @@ public class TapAllAi extends SpellAbilityAi { return true; } - private CardCollectionView getTapAllTargets(final String valid, final Card source) { + private CardCollectionView getTapAllTargets(final String valid, final Card source, SpellAbility sa) { final Game game = source.getGame(); CardCollectionView tmpList = game.getCardsIn(ZoneType.Battlefield); - tmpList = CardLists.getValidCards(tmpList, valid, source.getController(), source); + tmpList = CardLists.getValidCards(tmpList, valid, source.getController(), source, sa); tmpList = CardLists.filter(tmpList, Presets.UNTAPPED); return tmpList; } @@ -115,7 +115,7 @@ public class TapAllAi extends SpellAbilityAi { valid = sa.getParam("ValidCards"); } - CardCollectionView validTappables = getTapAllTargets(valid, source); + CardCollectionView validTappables = getTapAllTargets(valid, source, sa); final TargetRestrictions tgt = sa.getTargetRestrictions(); diff --git a/forge-ai/src/main/java/forge/ai/ability/TwoPilesAi.java b/forge-ai/src/main/java/forge/ai/ability/TwoPilesAi.java index 0b1ac1ad906..b871171de7b 100644 --- a/forge-ai/src/main/java/forge/ai/ability/TwoPilesAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/TwoPilesAi.java @@ -50,7 +50,7 @@ public class TwoPilesAi extends SpellAbilityAi { else { pool = p.getCardsIn(zone); } - pool = CardLists.getValidCards(pool, valid, card.getController(), card); + pool = CardLists.getValidCards(pool, valid, card.getController(), card, sa); int size = pool.size(); return size > 2; } diff --git a/forge-ai/src/main/java/forge/ai/ability/VoteAi.java b/forge-ai/src/main/java/forge/ai/ability/VoteAi.java index 33d23dd3b22..c31126beb28 100644 --- a/forge-ai/src/main/java/forge/ai/ability/VoteAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/VoteAi.java @@ -24,7 +24,7 @@ public class VoteAi extends SpellAbilityAi { return true; } else if ("Judgment".equals(logic)) { return !CardLists.getValidCards(host.getGame().getCardsIn(ZoneType.Battlefield), - sa.getParam("VoteCard"), host.getController(), host).isEmpty(); + sa.getParam("VoteCard"), host.getController(), host, sa).isEmpty(); } else if ("Torture".equals(logic)) { return aiPlayer.getGame().getPhaseHandler().getPhase().isAfter(PhaseType.MAIN1); } diff --git a/forge-ai/src/main/java/forge/ai/ability/ZoneExchangeAi.java b/forge-ai/src/main/java/forge/ai/ability/ZoneExchangeAi.java index 613ad8d8af9..fe9fff071d5 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ZoneExchangeAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ZoneExchangeAi.java @@ -31,7 +31,7 @@ public class ZoneExchangeAi extends SpellAbilityAi { final ZoneType zone2 = sa.hasParam("Zone2") ? ZoneType.smartValueOf(sa.getParam("Zone2")) : ZoneType.Hand; CardCollection list = new CardCollection(ai.getCardsIn(zone2)); if (type != null) { - list = CardLists.getValidCards(list, type, ai, source); + list = CardLists.getValidCards(list, type, ai, source, sa); } object2 = ComputerUtilCard.getBestAI(list); if (object1 == null || object2 == null || !object1.isInZone(zone1) || !object1.getOwner().equals(ai)) { diff --git a/forge-game/src/main/java/forge/game/CardTraitBase.java b/forge-game/src/main/java/forge/game/CardTraitBase.java index b5711814373..d42471e0bf3 100644 --- a/forge-game/src/main/java/forge/game/CardTraitBase.java +++ b/forge-game/src/main/java/forge/game/CardTraitBase.java @@ -159,15 +159,32 @@ public abstract class CardTraitBase extends GameObject implements IHasCardView, * a {@link forge.game.card.Card} object. * @return a boolean. */ - public static boolean matchesValid(final Object o, final String[] valids, final Card srcCard) { + public boolean matchesValid(final Object o, final String[] valids, final Card srcCard) { if (o instanceof GameObject) { final GameObject c = (GameObject) o; - return c.isValid(valids, srcCard.getController(), srcCard, null); + return c.isValid(valids, srcCard.getController(), srcCard, this); + } else if (o instanceof Iterable) { + for (Object o2 : (Iterable)o) { + if (matchesValid(o2, valids, srcCard)) { + return true; + } + } } return false; } + public boolean matchesValid(final Object o, final String[] valids) { + return matchesValid(o, valids, getHostCard()); + } + + public boolean matchesValidParam(String param, final Object o) { + if (hasParam(param) && !matchesValid(o, getParam(param).split(","))) { + return false; + } + return true; + } + /** * Sets the suppressed. * @@ -312,7 +329,7 @@ public abstract class CardTraitBase extends GameObject implements IHasCardView, list.addAll(p.getCardsIn(presentZone)); } } - list = CardLists.getValidCards(list, sIsPresent.split(","), this.getHostCard().getController(), this.getHostCard(), null); + list = CardLists.getValidCards(list, sIsPresent.split(","), this.getHostCard().getController(), this.getHostCard(), this); final String rightString = presentCompare.substring(2); @@ -349,7 +366,7 @@ public abstract class CardTraitBase extends GameObject implements IHasCardView, } } - list = CardLists.getValidCards(list, sIsPresent.split(","), this.getHostCard().getController(), this.getHostCard(), null); + list = CardLists.getValidCards(list, sIsPresent.split(","), this.getHostCard().getController(), this.getHostCard(), this); final String rightString = presentCompare.substring(2); int right = AbilityUtils.calculateAmount(getHostCard(), rightString, this); @@ -361,32 +378,29 @@ public abstract class CardTraitBase extends GameObject implements IHasCardView, } if (params.containsKey("CheckDefinedPlayer")) { - SpellAbility mockAbility = this.getHostCard().getFirstSpellAbility(); - mockAbility.setActivatingPlayer(hostController); final String sIsPresent = params.get("CheckDefinedPlayer"); - int playersize = AbilityUtils.getDefinedPlayers(game.getCardState(this.getHostCard()), sIsPresent, - mockAbility).size(); + int playersize = AbilityUtils.getDefinedPlayers(getHostCard(), sIsPresent, this).size(); String comparator = "GE1"; if (params.containsKey("DefinedPlayerCompare")) { comparator = params.get("DefinedPlayerCompare"); } final String svarOperator = comparator.substring(0, 2); final String svarOperand = comparator.substring(2); - final int operandValue = AbilityUtils.calculateAmount(game.getCardState(this.getHostCard()), svarOperand, this); + final int operandValue = AbilityUtils.calculateAmount(getHostCard(), svarOperand, this); if (!Expressions.compare(playersize, svarOperator, operandValue)) { return false; } } if (params.containsKey("CheckSVar")) { - final int sVar = AbilityUtils.calculateAmount(game.getCardState(this.getHostCard()), params.get("CheckSVar"), this); + final int sVar = AbilityUtils.calculateAmount(getHostCard(), params.get("CheckSVar"), this); String comparator = "GE1"; if (params.containsKey("SVarCompare")) { comparator = params.get("SVarCompare"); } final String svarOperator = comparator.substring(0, 2); final String svarOperand = comparator.substring(2); - final int operandValue = AbilityUtils.calculateAmount(game.getCardState(this.getHostCard()), svarOperand, this); + final int operandValue = AbilityUtils.calculateAmount(getHostCard(), svarOperand, this); if (!Expressions.compare(sVar, svarOperator, operandValue)) { return false; } diff --git a/forge-game/src/main/java/forge/game/ForgeScript.java b/forge-game/src/main/java/forge/game/ForgeScript.java index 3b061b84642..ea64739495d 100644 --- a/forge-game/src/main/java/forge/game/ForgeScript.java +++ b/forge-game/src/main/java/forge/game/ForgeScript.java @@ -14,7 +14,7 @@ import forge.util.Expressions; public class ForgeScript { public static boolean cardStateHasProperty(CardState cardState, String property, Player sourceController, - Card source, SpellAbility spellAbility) { + Card source, CardTraitBase spellAbility) { final boolean isColorlessSource = cardState.getCard().hasKeyword("Colorless Damage Source", cardState); final ColorSet colors = cardState.getCard().determineColor(cardState); @@ -125,7 +125,7 @@ public class ForgeScript { public static boolean spellAbilityHasProperty(SpellAbility sa, String property, Player sourceController, - Card source, SpellAbility spellAbility) { + Card source, CardTraitBase spellAbility) { if (property.equals("ManaAbility")) { return sa.isManaAbility(); } else if (property.equals("nonManaAbility")) { diff --git a/forge-game/src/main/java/forge/game/Game.java b/forge-game/src/main/java/forge/game/Game.java index da2387e4302..3d5e7c34a02 100644 --- a/forge-game/src/main/java/forge/game/Game.java +++ b/forge-game/src/main/java/forge/game/Game.java @@ -1042,15 +1042,15 @@ public class Game { } } - public int getCounterAddedThisTurn(CounterType cType, String validPlayer, String validCard, Card source, Player sourceController, SpellAbility spellAbility) { + public int getCounterAddedThisTurn(CounterType cType, String validPlayer, String validCard, Card source, Player sourceController, CardTraitBase ctb) { int result = 0; if (!countersAddedThisTurn.containsRow(cType)) { return result; } for (Map.Entry>> e : countersAddedThisTurn.row(cType).entrySet()) { - if (e.getKey().isValid(validPlayer.split(","), sourceController, source, spellAbility)) { + if (e.getKey().isValid(validPlayer.split(","), sourceController, source, ctb)) { for (Pair p : e.getValue()) { - if (p.getKey().isValid(validCard.split(","), sourceController, source, spellAbility)) { + if (p.getKey().isValid(validCard.split(","), sourceController, source, ctb)) { result += p.getValue(); } } diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index 386c7cec020..b4ac8c50bcb 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -1149,7 +1149,7 @@ public class GameAction { } if (c.hasKeyword("The number of loyalty counters on CARDNAME is equal to the number of Beebles you control.")) { - int beeble = CardLists.getValidCardCount(game.getCardsIn(ZoneType.Battlefield), "Beeble.YouCtrl", c.getController(), c); + int beeble = CardLists.getValidCardCount(game.getCardsIn(ZoneType.Battlefield), "Beeble.YouCtrl", c.getController(), c, null); int loyal = c.getCounters(CounterEnumType.LOYALTY); if (loyal < beeble) { GameEntityCounterTable counterTable = new GameEntityCounterTable(); diff --git a/forge-game/src/main/java/forge/game/GameEntityCounterTable.java b/forge-game/src/main/java/forge/game/GameEntityCounterTable.java index 6e8c7051552..cea3fda90cc 100644 --- a/forge-game/src/main/java/forge/game/GameEntityCounterTable.java +++ b/forge-game/src/main/java/forge/game/GameEntityCounterTable.java @@ -10,7 +10,6 @@ import com.google.common.collect.Table; import forge.game.ability.AbilityKey; import forge.game.card.Card; import forge.game.card.CounterType; -import forge.game.spellability.SpellAbility; import forge.game.trigger.TriggerType; public class GameEntityCounterTable extends ForwardingTable { @@ -63,7 +62,7 @@ public class GameEntityCounterTable extends ForwardingTable filterTable(CounterType type, String valid, Card host, SpellAbility sa) { + public Map filterTable(CounterType type, String valid, Card host, CardTraitBase sa) { Map result = Maps.newHashMap(); for (Map.Entry e : column(type).entrySet()) { diff --git a/forge-game/src/main/java/forge/game/GameObject.java b/forge-game/src/main/java/forge/game/GameObject.java index dc9688fb0da..bf5141cd913 100644 --- a/forge-game/src/main/java/forge/game/GameObject.java +++ b/forge-game/src/main/java/forge/game/GameObject.java @@ -22,7 +22,7 @@ public abstract class GameObject { * @param spellAbility * @return true, if is valid */ - public boolean isValid(final String[] restrictions, final Player sourceController, final Card source, SpellAbility spellAbility) { + public boolean isValid(final String[] restrictions, final Player sourceController, final Card source, CardTraitBase spellAbility) { for (final String restriction : restrictions) { if (this.isValid(restriction, sourceController, source, spellAbility)) { return true; @@ -43,7 +43,7 @@ public abstract class GameObject { * @param spellAbility * @return true, if is valid */ - public boolean isValid(final String restriction, final Player sourceController, final Card source, SpellAbility spellAbility) { + public boolean isValid(final String restriction, final Player sourceController, final Card source, CardTraitBase spellAbility) { return false; } @@ -59,7 +59,7 @@ public abstract class GameObject { * @param spellAbility * @return true, if successful */ - public boolean hasProperty(final String property, final Player sourceController, final Card source, SpellAbility spellAbility) { + public boolean hasProperty(final String property, final Player sourceController, final Card source, CardTraitBase spellAbility) { return false; } } \ No newline at end of file diff --git a/forge-game/src/main/java/forge/game/GameObjectPredicates.java b/forge-game/src/main/java/forge/game/GameObjectPredicates.java index 9331bcb6a89..69d4d11a830 100644 --- a/forge-game/src/main/java/forge/game/GameObjectPredicates.java +++ b/forge-game/src/main/java/forge/game/GameObjectPredicates.java @@ -21,7 +21,6 @@ import com.google.common.base.Predicate; import forge.game.card.Card; import forge.game.player.Player; -import forge.game.spellability.SpellAbility; /** @@ -33,7 +32,7 @@ import forge.game.spellability.SpellAbility; */ public final class GameObjectPredicates { - public static final Predicate restriction(final String[] restrictions, final Player sourceController, final Card source, final SpellAbility spellAbility) { + public static final Predicate restriction(final String[] restrictions, final Player sourceController, final Card source, final CardTraitBase spellAbility) { return new Predicate() { @Override public boolean apply(final GameObject c) { 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 3f66eac4066..b60dc3a70da 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -18,7 +18,6 @@ import forge.game.CardTraitBase; import forge.game.Game; import forge.game.GameEntity; import forge.game.GameObject; -import forge.game.TriggerReplacementBase; import forge.game.ability.AbilityFactory.AbilityRecordType; import forge.game.card.*; import forge.game.cost.Cost; @@ -86,7 +85,7 @@ public class AbilityUtils { // But then we only need update one function at a time once the casting is // everywhere. // Probably will move to One function solution sometime in the future - public static CardCollection getDefinedCards(final Card hostCard, final String def, final SpellAbility sa) { + public static CardCollection getDefinedCards(final Card hostCard, final String def, final CardTraitBase sa) { CardCollection cards = new CardCollection(); String defined = (def == null) ? "Self" : applyAbilityTextChangeEffects(def, sa); // default to Self final String[] incR = defined.split("\\.", 2); @@ -101,7 +100,11 @@ public class AbilityUtils { c = game.getCardState(hostCard); } else if (defined.equals("OriginalHost")) { - c = sa.getRootAbility().getOriginalHost(); + if (sa instanceof SpellAbility) { + c = ((SpellAbility)sa).getRootAbility().getOriginalHost(); + } else { + c = sa.getOriginalHost(); + } } else if (defined.equals("EffectSource")) { if (hostCard.isEmblem() || hostCard.getType().hasSubtype("Effect")) { @@ -129,10 +132,12 @@ public class AbilityUtils { } else if (defined.equals("Enchanted")) { c = hostCard.getEnchantingCard(); - if ((c == null) && (sa != null) && (sa.getRootAbility() != null) - && (sa.getRootAbility().getPaidList("Sacrificed") != null) - && !sa.getRootAbility().getPaidList("Sacrificed").isEmpty()) { - c = sa.getRootAbility().getPaidList("Sacrificed").get(0).getEnchantingCard(); + if (c == null && sa instanceof SpellAbility) { + SpellAbility root = ((SpellAbility)sa).getRootAbility(); + CardCollection sacrificed = root.getPaidList("Sacrificed"); + if (sacrificed != null && !sacrificed.isEmpty()) { + c = sacrificed.getFirst().getEnchantingCard(); + } } } else if (defined.endsWith("OfLibrary")) { @@ -144,26 +149,26 @@ public class AbilityUtils { return cards; } } - else if (defined.equals("Targeted")) { - final SpellAbility saTargeting = sa.getSATargetingCard(); + else if (defined.equals("Targeted") && sa instanceof SpellAbility) { + final SpellAbility saTargeting = ((SpellAbility)sa).getSATargetingCard(); if (saTargeting != null) { Iterables.addAll(cards, saTargeting.getTargets().getTargetCards()); } } - else if (defined.equals("ThisTargetedCard")) { // do not add parent targeted - if (sa != null && sa.getTargets() != null) { - Iterables.addAll(cards, sa.getTargets().getTargetCards()); + else if (defined.equals("ThisTargetedCard") && sa instanceof SpellAbility) { // do not add parent targeted + if (((SpellAbility)sa).getTargets() != null) { + Iterables.addAll(cards, ((SpellAbility)sa).getTargets().getTargetCards()); } } - else if (defined.equals("ParentTarget")) { - final SpellAbility parent = sa.getParentTargetingCard(); + else if (defined.equals("ParentTarget") && sa instanceof SpellAbility) { + final SpellAbility parent = ((SpellAbility)sa).getParentTargetingCard(); if (parent != null) { Iterables.addAll(cards, parent.getTargets().getTargetCards()); } } - else if (defined.startsWith("Triggered") && (sa != null)) { - final SpellAbility root = sa.getRootAbility(); + else if (defined.startsWith("Triggered") && sa instanceof SpellAbility) { + final SpellAbility root = ((SpellAbility)sa).getRootAbility(); if (defined.contains("LKICopy")) { //Triggered*LKICopy int lkiPosition = defined.indexOf("LKICopy"); AbilityKey type = AbilityKey.fromString(defined.substring(9, lkiPosition)); @@ -192,8 +197,8 @@ public class AbilityUtils { } } } - else if (defined.startsWith("Replaced") && (sa != null)) { - final SpellAbility root = sa.getRootAbility(); + else if (defined.startsWith("Replaced") && sa instanceof SpellAbility) { + final SpellAbility root = ((SpellAbility)sa).getRootAbility(); AbilityKey type = AbilityKey.fromString(defined.substring(8)); final Object crd = root.getReplacingObject(type); @@ -239,8 +244,8 @@ public class AbilityUtils { cards.add((Card) o); } } - } else if (defined.equals("DelayTriggerRememberedLKI")) { - SpellAbility root = sa.getRootAbility(); + } else if (defined.equals("DelayTriggerRememberedLKI") && sa instanceof SpellAbility) { + SpellAbility root = ((SpellAbility)sa).getRootAbility(); if (root != null) { for (Object o : root.getTriggerRemembered()) { if (o instanceof Card) { @@ -250,8 +255,8 @@ public class AbilityUtils { } else { System.err.println("Warning: couldn't find trigger SA in the chain of SpellAbility " + sa); } - } else if (defined.equals("DelayTriggerRemembered")) { - SpellAbility root = sa.getRootAbility(); + } else if (defined.equals("DelayTriggerRemembered") && sa instanceof SpellAbility) { + SpellAbility root = ((SpellAbility)sa).getRootAbility(); if (root != null) { for (Object o : root.getTriggerRemembered()) { if (o instanceof Card) { @@ -313,31 +318,36 @@ public class AbilityUtils { } } else { CardCollection list = null; - if (defined.startsWith("SacrificedCards")) { - list = sa.getRootAbility().getPaidList("SacrificedCards"); - } else if (defined.startsWith("Sacrificed")) { - list = sa.getRootAbility().getPaidList("Sacrificed"); - } else if (defined.startsWith("Revealed")) { - list = sa.getRootAbility().getPaidList("Revealed"); - } else if (defined.startsWith("DiscardedCards")) { - list = sa.getRootAbility().getPaidList("DiscardedCards"); - } else if (defined.startsWith("Discarded")) { - list = sa.getRootAbility().getPaidList("Discarded"); - } else if (defined.startsWith("ExiledCards")) { - list = sa.getRootAbility().getPaidList("ExiledCards"); - } else if (defined.startsWith("Exiled")) { - list = sa.getRootAbility().getPaidList("Exiled"); - } else if (defined.startsWith("Milled")) { - list = sa.getRootAbility().getPaidList("Milled"); - } else if (defined.startsWith("TappedCards")) { - list = sa.getRootAbility().getPaidList("TappedCards"); - } else if (defined.startsWith("Tapped")) { - list = sa.getRootAbility().getPaidList("Tapped"); - } else if (defined.startsWith("UntappedCards")) { - list = sa.getRootAbility().getPaidList("UntappedCards"); - } else if (defined.startsWith("Untapped")) { - list = sa.getRootAbility().getPaidList("Untapped"); - } else if (defined.startsWith("Valid ")) { + if (sa instanceof SpellAbility) { + SpellAbility root = ((SpellAbility)sa).getRootAbility(); + if (defined.startsWith("SacrificedCards")) { + list = root.getPaidList("SacrificedCards"); + } else if (defined.startsWith("Sacrificed")) { + list = root.getPaidList("Sacrificed"); + } else if (defined.startsWith("Revealed")) { + list = root.getPaidList("Revealed"); + } else if (defined.startsWith("DiscardedCards")) { + list = root.getPaidList("DiscardedCards"); + } else if (defined.startsWith("Discarded")) { + list = root.getPaidList("Discarded"); + } else if (defined.startsWith("ExiledCards")) { + list = root.getPaidList("ExiledCards"); + } else if (defined.startsWith("Exiled")) { + list = root.getPaidList("Exiled"); + } else if (defined.startsWith("Milled")) { + list = root.getPaidList("Milled"); + } else if (defined.startsWith("TappedCards")) { + list = root.getPaidList("TappedCards"); + } else if (defined.startsWith("Tapped")) { + list = root.getPaidList("Tapped"); + } else if (defined.startsWith("UntappedCards")) { + list = root.getPaidList("UntappedCards"); + } else if (defined.startsWith("Untapped")) { + list = root.getPaidList("Untapped"); + } + } + + if (defined.startsWith("Valid ")) { String validDefined = defined.substring("Valid ".length()); list = CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), validDefined.split(","), hostCard.getController(), hostCard, sa); } else if (defined.startsWith("ValidAll ")) { @@ -348,8 +358,6 @@ public class AbilityUtils { String zone = s[0].substring("Valid".length()); String validDefined = s[1]; list = CardLists.getValidCards(game.getCardsIn(ZoneType.smartValueOf(zone)), validDefined.split(","), hostCard.getController(), hostCard, sa); - } else { - return cards; } if (list != null) { @@ -806,7 +814,7 @@ public class AbilityUtils { * a {@link forge.game.spellability.SpellAbility} object. * @return a {@link java.util.ArrayList} object. */ - public static FCollection getDefinedObjects(final Card card, final String def, final SpellAbility sa) { + public static FCollection getDefinedObjects(final Card card, final String def, final CardTraitBase sa) { final FCollection objects = new FCollection<>(); final String defined = (def == null) ? "Self" : def; @@ -816,7 +824,7 @@ public class AbilityUtils { return objects; } - public static FCollection getDefinedEntities(final Card card, final String def, final SpellAbility sa) { + public static FCollection getDefinedEntities(final Card card, final String def, final CardTraitBase sa) { final FCollection objects = new FCollection<>(); final String defined = (def == null) ? "Self" : def; @@ -965,32 +973,32 @@ public class AbilityUtils { * a {@link forge.game.spellability.SpellAbility} object. * @return a {@link java.util.ArrayList} object. */ - public static PlayerCollection getDefinedPlayers(final Card card, final String def, final SpellAbility sa) { + public static PlayerCollection getDefinedPlayers(final Card card, final String def, final CardTraitBase sa) { final PlayerCollection players = new PlayerCollection(); final String defined = (def == null) ? "You" : applyAbilityTextChangeEffects(def, sa); final Game game = card == null ? null : card.getGame(); - final Player player = sa == null ? card.getController() : sa.getActivatingPlayer(); + final Player player = sa instanceof SpellAbility ? ((SpellAbility)sa).getActivatingPlayer() : card.getController(); if (defined.equals("TargetedOrController")) { players.addAll(getDefinedPlayers(card, "Targeted", sa)); players.addAll(getDefinedPlayers(card, "TargetedController", sa)); } - else if (defined.equals("Targeted") || defined.equals("TargetedPlayer")) { - final SpellAbility saTargeting = sa.getSATargetingPlayer(); + else if ((defined.equals("Targeted") || defined.equals("TargetedPlayer")) && sa instanceof SpellAbility) { + final SpellAbility saTargeting = ((SpellAbility)sa).getSATargetingPlayer(); if (saTargeting != null) { players.addAll(saTargeting.getTargets().getTargetPlayers()); } } - else if (defined.equals("ParentTarget")) { - final SpellAbility parent = sa.getParentTargetingPlayer(); + else if (defined.equals("ParentTarget") && sa instanceof SpellAbility) { + final SpellAbility parent = ((SpellAbility)sa).getParentTargetingPlayer(); if (parent != null) { players.addAll(parent.getTargets().getTargetPlayers()); } } - else if (defined.equals("ThisTargetedPlayer")) { // do not add parent targeted - if (sa != null && sa.getTargets() != null) { - Iterables.addAll(players, sa.getTargets().getTargetPlayers()); + else if (defined.equals("ThisTargetedPlayer") && sa instanceof SpellAbility) { // do not add parent targeted + if (((SpellAbility)sa).getTargets() != null) { + Iterables.addAll(players, ((SpellAbility)sa).getTargets().getTargetPlayers()); } } else if (defined.equals("TargetedController")) { @@ -1006,11 +1014,11 @@ public class AbilityUtils { players.add(c.getOwner()); } } - else if (defined.equals("TargetedAndYou")) { - final SpellAbility saTargeting = sa.getSATargetingPlayer(); + else if (defined.equals("TargetedAndYou") && sa instanceof SpellAbility) { + final SpellAbility saTargeting = ((SpellAbility)sa).getSATargetingPlayer(); if (saTargeting != null) { players.addAll(saTargeting.getTargets().getTargetPlayers()); - players.add(sa.getActivatingPlayer()); + players.add(((SpellAbility)sa).getActivatingPlayer()); } } else if (defined.equals("ParentTargetedController")) { @@ -1024,8 +1032,8 @@ public class AbilityUtils { else if (defined.startsWith("Remembered")) { addPlayer(card.getRemembered(), defined, players); } - else if (defined.startsWith("DelayTriggerRemembered")) { - SpellAbility root = sa.getRootAbility(); + else if (defined.startsWith("DelayTriggerRemembered") && sa instanceof SpellAbility) { + SpellAbility root = ((SpellAbility)sa).getRootAbility(); if (root != null) { addPlayer(root.getTriggerRemembered(), defined, players); } else { @@ -1042,12 +1050,12 @@ public class AbilityUtils { players.add(rem.getOwner()); } } - else if (defined.startsWith("Triggered")) { + else if (defined.startsWith("Triggered") && sa instanceof SpellAbility) { String defParsed = defined.endsWith("AndYou") ? defined.substring(0, defined.indexOf("AndYou")) : defined; if (defined.endsWith("AndYou")) { - players.add(sa.getActivatingPlayer()); + players.add(((SpellAbility)sa).getActivatingPlayer()); } - final SpellAbility root = sa.getRootAbility(); + final SpellAbility root = ((SpellAbility)sa).getRootAbility(); Object o = null; if (defParsed.endsWith("Controller")) { String triggeringType = defParsed.substring(9); @@ -1108,8 +1116,8 @@ public class AbilityUtils { players.addAll(player.getOpponents()); players.removeAll(getDefinedPlayers(card, defined.substring(6), sa)); } - else if (defined.startsWith("Replaced")) { - final SpellAbility root = sa.getRootAbility(); + else if (defined.startsWith("Replaced") && sa instanceof SpellAbility) { + final SpellAbility root = ((SpellAbility)sa).getRootAbility(); Object o = null; if (defined.endsWith("Controller")) { String replacingType = defined.substring(8); @@ -1252,7 +1260,7 @@ public class AbilityUtils { * @return a {@link java.util.ArrayList} object. */ public static FCollection getDefinedSpellAbilities(final Card card, final String def, - final SpellAbility sa) { + final CardTraitBase sa) { final FCollection sas = new FCollection<>(); final String defined = (def == null) ? "Self" : applyAbilityTextChangeEffects(def, sa); // default to Self final Game game = card.getGame(); @@ -1261,14 +1269,14 @@ public class AbilityUtils { // TODO - this probably needs to be fleshed out a bit, but the basics // work - if (defined.equals("Self")) { - s = sa; + if (defined.equals("Self") && sa instanceof SpellAbility) { + s = (SpellAbility)sa; } - else if (defined.equals("Parent")) { - s = sa.getRootAbility(); + else if (defined.equals("Parent") && sa instanceof SpellAbility) { + s = ((SpellAbility)sa).getRootAbility(); } - else if (defined.equals("Targeted")) { - final SpellAbility saTargeting = sa.getSATargetingSA(); + else if (defined.equals("Targeted") && sa instanceof SpellAbility) { + final SpellAbility saTargeting = ((SpellAbility)sa).getSATargetingSA(); if (saTargeting != null) { for (SpellAbility targetSpell : saTargeting.getTargets().getTargetSpells()) { SpellAbilityStackInstance stackInstance = game.getStack().getInstanceFromSpellAbility(targetSpell); @@ -1284,8 +1292,8 @@ public class AbilityUtils { } } } - else if (defined.startsWith("Triggered")) { - final SpellAbility root = sa.getRootAbility(); + else if (defined.startsWith("Triggered") && sa instanceof SpellAbility) { + final SpellAbility root = ((SpellAbility)sa).getRootAbility(); final String triggeringType = defined.substring(9); final Object o = root.getTriggeringObject(AbilityKey.fromString(triggeringType)); @@ -1584,6 +1592,7 @@ public class AbilityUtils { final String s2 = AbilityUtils.applyAbilityTextChangeEffects(s, ctb); final String[] l = s2.split("/"); final String expr = CardFactoryUtil.extractOperators(s2); + final Player player = ctb instanceof SpellAbility ? ((SpellAbility)ctb).getActivatingPlayer() : ctb.getHostCard().getController(); final String[] sq; sq = l[0].split("\\."); @@ -1781,13 +1790,6 @@ public class AbilityUtils { } } - if (l[0].startsWith("CountersAddedThisTurn")) { - final String[] parts = l[0].split(" "); - CounterType cType = CounterType.getType(parts[1]); - - return CardFactoryUtil.doXMath(game.getCounterAddedThisTurn(cType, parts[2], parts[3], c, sa.getActivatingPlayer(), sa), expr, c); - } - if (sq[0].startsWith("CastTotalManaSpent")) { return CardFactoryUtil.doXMath(c.getCastSA() != null ? c.getCastSA().getTotalManaSpent() : 0, expr, c); } @@ -1804,12 +1806,13 @@ public class AbilityUtils { return CardFactoryUtil.doXMath(v, expr, c); } } - if (ctb instanceof TriggerReplacementBase) { + + if (ctb instanceof CardTraitBase) { if (l[0].startsWith("CountersAddedThisTurn")) { final String[] parts = l[0].split(" "); CounterType cType = CounterType.getType(parts[1]); - return CardFactoryUtil.doXMath(game.getCounterAddedThisTurn(cType, parts[2], parts[3], c, ctb.getHostCard().getController(), null), expr, c); + return CardFactoryUtil.doXMath(game.getCounterAddedThisTurn(cType, parts[2], parts[3], c, player, ctb), expr, c); } } } 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 2e7ee9eb139..9c7cb2bc908 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 @@ -199,7 +199,7 @@ public class AttachEffect extends SpellAbilityEffect { final FCollection players = new FCollection<>(); for (Player player : game.getPlayers()) { - if (player.isValid(tgt.getValidTgts(), aura.getActivatingPlayer(), source, null)) { + if (player.isValid(tgt.getValidTgts(), aura.getActivatingPlayer(), source, aura)) { players.add(player); } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/BalanceEffect.java b/forge-game/src/main/java/forge/game/ability/effects/BalanceEffect.java index 83a0eaadad5..cf0be288275 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/BalanceEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/BalanceEffect.java @@ -41,7 +41,7 @@ public class BalanceEffect extends SpellAbilityEffect { for(int i = 0; i < players.size(); i++) { // Find the minimum of each Valid per player - validCards.add(CardLists.getValidCards(players.get(i).getCardsIn(zone), valid, activator, source)); + validCards.add(CardLists.getValidCards(players.get(i).getCardsIn(zone), valid, activator, source, sa)); min = Math.min(min, validCards.get(i).size()); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneAllEffect.java index 08c356ac3f3..e3179745c88 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneAllEffect.java @@ -79,7 +79,7 @@ public class ChangeZoneAllEffect extends SpellAbilityEffect { } if (origin.contains(ZoneType.Library) && sa.hasParam("Search") && sa.getActivatingPlayer().canSearchLibraryWith(sa, null)) { - CardCollection libCards = CardLists.getValidCards(cards, "Card.inZoneLibrary", sa.getActivatingPlayer(), source); + CardCollection libCards = CardLists.getValidCards(cards, "Card.inZoneLibrary", sa.getActivatingPlayer(), source, sa); CardCollection libCardsYouOwn = CardLists.filterControlledBy(libCards, sa.getActivatingPlayer()); if (!libCardsYouOwn.isEmpty()) { // Only searching one's own library would fire Archive Trap's altcost sa.getActivatingPlayer().incLibrarySearched(); @@ -93,7 +93,7 @@ public class ChangeZoneAllEffect extends SpellAbilityEffect { game.getTriggerHandler().runTrigger(TriggerType.SearchedLibrary, runParams, false); } if (origin.contains(ZoneType.Hand) && sa.hasParam("Search")) { - CardCollection handCards = CardLists.filterControlledBy(CardLists.getValidCards(cards, "Card.inZoneHand", sa.getActivatingPlayer(), source), + CardCollection handCards = CardLists.filterControlledBy(CardLists.getValidCards(cards, "Card.inZoneHand", sa.getActivatingPlayer(), source, sa), sa.getActivatingPlayer().getOpponents()); if (!handCards.isEmpty()) { sa.getActivatingPlayer().getController().reveal(handCards, ZoneType.Hand, handCards.get(0).getOwner()); diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java index 25e2ff9b3a0..eb0ee56b4f2 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java @@ -583,7 +583,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { if (sa.hasParam("AttachedTo")) { CardCollection list = AbilityUtils.getDefinedCards(hostCard, sa.getParam("AttachedTo"), sa); if (list.isEmpty()) { - list = CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), sa.getParam("AttachedTo"), gameCard.getController(), gameCard); + list = CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), sa.getParam("AttachedTo"), gameCard.getController(), gameCard, sa); } if (!list.isEmpty()) { Map params = Maps.newHashMap(); @@ -1104,7 +1104,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { } if (totalcmc != null) { if (totcmc >= 0) { - fetchList = CardLists.getValidCards(fetchList, "Card.cmcLE" + totcmc, source.getController(), source); + fetchList = CardLists.getValidCards(fetchList, "Card.cmcLE" + totcmc, source.getController(), source, sa); } } @@ -1213,7 +1213,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { if (sa.hasParam("AttachedTo")) { CardCollection list = AbilityUtils.getDefinedCards(source, sa.getParam("AttachedTo"), sa); if (list.isEmpty()) { - list = CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), sa.getParam("AttachedTo"), c.getController(), c); + list = CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), sa.getParam("AttachedTo"), c.getController(), c, sa); } if (!list.isEmpty()) { Card attachedTo = null; diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChooseCardNameEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChooseCardNameEffect.java index 6526ab32cd2..0d6804b7237 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChooseCardNameEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChooseCardNameEffect.java @@ -99,7 +99,7 @@ public class ChooseCardNameEffect extends SpellAbilityEffect { } } else if (chooseFromDefined) { CardCollection choices = AbilityUtils.getDefinedCards(host, sa.getParam("ChooseFromDefinedCards"), sa); - choices = CardLists.getValidCards(choices, valid, host.getController(), host); + choices = CardLists.getValidCards(choices, valid, host.getController(), host, sa); List faces = Lists.newArrayList(); // get Card for (final Card c : choices) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChooseSourceEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChooseSourceEffect.java index 34004b1a310..9a05ed7d74c 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChooseSourceEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChooseSourceEffect.java @@ -10,7 +10,6 @@ import forge.game.card.CardLists; import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbilityStackInstance; -import forge.game.spellability.TargetRestrictions; import forge.game.zone.ZoneType; import forge.util.Localizer; @@ -36,7 +35,6 @@ public class ChooseSourceEffect extends SpellAbilityEffect { final Card host = sa.getHostCard(); final Game game = sa.getActivatingPlayer().getGame(); - final TargetRestrictions tgt = sa.getTargetRestrictions(); final List tgtPlayers = getTargetPlayers(sa); CardCollection stackSources = new CardCollection(); @@ -85,11 +83,11 @@ public class ChooseSourceEffect extends SpellAbilityEffect { } if (sa.hasParam("Choices")) { - permanentSources = CardLists.getValidCards(permanentSources, sa.getParam("Choices"), host.getController(), host); + permanentSources = CardLists.getValidCards(permanentSources, sa.getParam("Choices"), host.getController(), host, sa); - stackSources = CardLists.getValidCards(stackSources, sa.getParam("Choices"), host.getController(), host); - referencedSources = CardLists.getValidCards(referencedSources, sa.getParam("Choices"), host.getController(), host); - commandZoneSources = CardLists.getValidCards(commandZoneSources, sa.getParam("Choices"), host.getController(), host); + stackSources = CardLists.getValidCards(stackSources, sa.getParam("Choices"), host.getController(), host, sa); + referencedSources = CardLists.getValidCards(referencedSources, sa.getParam("Choices"), host.getController(), host, sa); + commandZoneSources = CardLists.getValidCards(commandZoneSources, sa.getParam("Choices"), host.getController(), host, sa); } if (sa.hasParam("TargetControls")) { permanentSources = CardLists.filterControlledBy(permanentSources, tgtPlayers.get(0)); @@ -133,7 +131,7 @@ public class ChooseSourceEffect extends SpellAbilityEffect { for (final Player p : tgtPlayers) { final CardCollection chosen = new CardCollection(); - if (tgt == null || p.canBeTargetedBy(sa)) { + if (!sa.usesTargeting() || p.canBeTargetedBy(sa)) { for (int i = 0; i < validAmount; i++) { final String choiceTitle = sa.hasParam("ChoiceTitle") ? sa.getParam("ChoiceTitle") : Localizer.getInstance().getMessage("lblChooseSource") + " "; Card o = null; diff --git a/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java index 719c4f63ad4..ee4a201cf1e 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java @@ -81,7 +81,7 @@ public class CloneEffect extends SpellAbilityEffect { } } - choices = CardLists.getValidCards(choices, sa.getParam("Choices"), activator, host); + choices = CardLists.getValidCards(choices, sa.getParam("Choices"), activator, host, sa); String title = sa.hasParam("ChoiceTitle") ? sa.getParam("ChoiceTitle") : Localizer.getInstance().getMessage("lblChooseaCard") + " "; cardToCopy = activator.getController().chooseSingleEntityForEffect(choices, sa, title, false, null); diff --git a/forge-game/src/main/java/forge/game/ability/effects/ControlGainVariantEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ControlGainVariantEffect.java index b5e861c8cf7..f4118e23a37 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ControlGainVariantEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ControlGainVariantEffect.java @@ -44,7 +44,7 @@ public class ControlGainVariantEffect extends SpellAbilityEffect { } CardCollection tgtCards = CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), - sa.getParam("AllValid"), source.getController(), source); + sa.getParam("AllValid"), source.getController(), source, sa); if ("NextPlayerInChosenDirection".equals(controller) && (source.getChosenDirection() != null) ) {// Aminatou, the Fateshifter for (final Player p : players) { 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 33cbabcf1d8..289f8687e78 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 @@ -136,7 +136,7 @@ public class CopyPermanentEffect extends TokenEffectBase { // For Mimic Vat with mutated creature, need to choose one imprinted card CardCollectionView choices = sa.hasParam("Defined") ? getDefinedCardsOrTargeted(sa) : game.getCardsIn(ZoneType.Battlefield); - choices = CardLists.getValidCards(choices, sa.getParam("Choices"), activator, host); + choices = CardLists.getValidCards(choices, sa.getParam("Choices"), activator, host, sa); if (!choices.isEmpty()) { String title = sa.hasParam("ChoiceTitle") ? sa.getParam("ChoiceTitle") : Localizer.getInstance().getMessage("lblChooseaCard"); diff --git a/forge-game/src/main/java/forge/game/ability/effects/CountersPutAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CountersPutAllEffect.java index 4d69ba3d4e1..736a95da3aa 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CountersPutAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CountersPutAllEffect.java @@ -51,7 +51,7 @@ public class CountersPutAllEffect extends SpellAbilityEffect { } CardCollectionView cards = game.getCardsIn(zone); - cards = CardLists.getValidCards(cards, valid, host.getController(), sa.getHostCard()); + cards = CardLists.getValidCards(cards, valid, host.getController(), sa.getHostCard(), sa); if (sa.usesTargeting()) { final Player pl = sa.getTargets().getFirstTargetedPlayer(); diff --git a/forge-game/src/main/java/forge/game/ability/effects/CountersRemoveAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CountersRemoveAllEffect.java index 61ecba8da14..dfe7a8afb7a 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CountersRemoveAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CountersRemoveAllEffect.java @@ -52,7 +52,7 @@ public class CountersRemoveAllEffect extends SpellAbilityEffect { final Game game = sa.getActivatingPlayer().getGame(); CardCollectionView cards = game.getCardsIn(zone); - cards = CardLists.getValidCards(cards, valid, sa.getHostCard().getController(), sa.getHostCard()); + cards = CardLists.getValidCards(cards, valid, sa.getHostCard().getController(), sa.getHostCard(), sa); if (sa.usesTargeting()) { final Player pl = sa.getTargets().getFirstTargetedPlayer(); diff --git a/forge-game/src/main/java/forge/game/ability/effects/DamageEachEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DamageEachEffect.java index 913b6e979a2..2a8347f95b9 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DamageEachEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DamageEachEffect.java @@ -66,7 +66,7 @@ public class DamageEachEffect extends DamageBaseEffect { FCollectionView sources = game.getCardsIn(ZoneType.Battlefield); if (sa.hasParam("ValidCards")) { - sources = CardLists.getValidCards(sources, sa.getParam("ValidCards"), card.getController(), card); + sources = CardLists.getValidCards(sources, sa.getParam("ValidCards"), card.getController(), card, sa); } final List tgts = getTargets(sa, "DefinedPlayers"); 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 c58532ed15f..21231fe8584 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 @@ -135,7 +135,7 @@ public class DigEffect extends SpellAbilityEffect { } else if (sa.hasParam("RevealValid")) { final String revealValid = sa.getParam("RevealValid"); - final CardCollection toReveal = CardLists.getValidCards(top, revealValid, host.getController(), host); + final CardCollection toReveal = CardLists.getValidCards(top, revealValid, host.getController(), host, sa); if (!toReveal.isEmpty()) { game.getAction().reveal(toReveal, host.getController()); if (sa.hasParam("RememberRevealed")) { 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 890a6a57712..18fd4f984fb 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 @@ -179,7 +179,7 @@ public class DiscardEffect extends SpellAbilityEffect { if (!p.canDiscardBy(sa)) { continue; } - CardCollectionView dPHand = CardLists.getValidCards(p.getCardsIn(ZoneType.Hand), "Card.IsNotRemembered", p, source); + CardCollectionView dPHand = CardLists.getValidCards(p.getCardsIn(ZoneType.Hand), "Card.IsNotRemembered", p, source, sa); if (dPHand.size() > 1) { dPHand = GameActionUtil.orderCardsByTheirOwners(game, dPHand, ZoneType.Graveyard, sa); } @@ -207,7 +207,7 @@ public class DiscardEffect extends SpellAbilityEffect { if (runDiscard) { final String valid = sa.hasParam("DiscardValid") ? sa.getParam("DiscardValid") : "Card"; - List list = CardLists.getValidCards(p.getCardsIn(ZoneType.Hand), valid, source.getController(), source); + List list = CardLists.getValidCards(p.getCardsIn(ZoneType.Hand), valid, source.getController(), source, sa); list = CardLists.filter(list, Presets.NON_TOKEN); CardCollection toDiscard = new CardCollection(); for (int i = 0; i < numCards; i++) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/ManifestEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ManifestEffect.java index e4c0b312ee0..afa5ff2840e 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ManifestEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ManifestEffect.java @@ -33,7 +33,7 @@ public class ManifestEffect extends SpellAbilityEffect { } CardCollection choices = new CardCollection(game.getCardsIn(choiceZone)); if (sa.hasParam("Choices")) { - choices = CardLists.getValidCards(choices, sa.getParam("Choices"), activator, source); + choices = CardLists.getValidCards(choices, sa.getParam("Choices"), activator, source, sa); } if (choices.isEmpty()) { continue; diff --git a/forge-game/src/main/java/forge/game/ability/effects/MultiplePilesEffect.java b/forge-game/src/main/java/forge/game/ability/effects/MultiplePilesEffect.java index d38c971d04b..a659f2fea1d 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/MultiplePilesEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/MultiplePilesEffect.java @@ -80,7 +80,7 @@ public class MultiplePilesEffect extends SpellAbilityEffect { } else { pool = new CardCollection(p.getCardsIn(zone)); } - pool = CardLists.getValidCards(pool, valid, source.getController(), source); + pool = CardLists.getValidCards(pool, valid, source.getController(), source, sa); List pileList = Lists.newArrayList(); diff --git a/forge-game/src/main/java/forge/game/ability/effects/MustBlockEffect.java b/forge-game/src/main/java/forge/game/ability/effects/MustBlockEffect.java index 1a950048965..655a0005b45 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/MustBlockEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/MustBlockEffect.java @@ -41,7 +41,7 @@ public class MustBlockEffect extends SpellAbilityEffect { } CardCollectionView choices = game.getCardsIn(ZoneType.Battlefield); - choices = CardLists.getValidCards(choices, sa.getParam("Choices"), activator, host); + choices = CardLists.getValidCards(choices, sa.getParam("Choices"), activator, host, sa); if (!choices.isEmpty()) { String title = sa.hasParam("ChoiceTitle") ? sa.getParam("ChoiceTitle") : Localizer.getInstance().getMessage("lblChooseaCard") +" "; Map params = Maps.newHashMap(); diff --git a/forge-game/src/main/java/forge/game/ability/effects/PeekAndRevealEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PeekAndRevealEffect.java index bfcab69c0a8..b9e88a9ec51 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PeekAndRevealEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PeekAndRevealEffect.java @@ -54,7 +54,7 @@ public class PeekAndRevealEffect extends SpellAbilityEffect { peekCards.add(library.get(i)); } - CardCollectionView revealableCards = CardLists.getValidCards(peekCards, revealValid, sa.getActivatingPlayer(), sa.getHostCard()); + CardCollectionView revealableCards = CardLists.getValidCards(peekCards, revealValid, sa.getActivatingPlayer(), sa.getHostCard(), sa); boolean doReveal = !sa.hasParam("NoReveal") && !revealableCards.isEmpty(); if (!sa.hasParam("NoPeek")) { peekingPlayer.getController().reveal(peekCards, ZoneType.Library, peekingPlayer, CardTranslation.getTranslatedName(source.getName()) + " - " + Localizer.getInstance().getMessage("lblRevealingCardFrom") + " "); diff --git a/forge-game/src/main/java/forge/game/ability/effects/ProtectAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ProtectAllEffect.java index 5a037887b68..30ec45b2e90 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ProtectAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ProtectAllEffect.java @@ -87,7 +87,7 @@ public class ProtectAllEffect extends SpellAbilityEffect { } if (!valid.equals("")) { CardCollectionView list = game.getCardsIn(ZoneType.Battlefield); - list = CardLists.getValidCards(list, valid, sa.getActivatingPlayer(), host); + list = CardLists.getValidCards(list, valid, sa.getActivatingPlayer(), host, sa); for (final Card tgtC : list) { if (tgtC.isInPlay()) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/RepeatEachEffect.java b/forge-game/src/main/java/forge/game/ability/effects/RepeatEachEffect.java index 6e1f0782511..ba61da94f50 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/RepeatEachEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/RepeatEachEffect.java @@ -54,7 +54,7 @@ public class RepeatEachEffect extends SpellAbilityEffect { zone.add(ZoneType.Battlefield); } repeatCards = CardLists.getValidCards(game.getCardsIn(zone), - sa.getParam("RepeatCards"), source.getController(), source); + sa.getParam("RepeatCards"), source.getController(), source, sa); } else if (sa.hasParam(("RepeatSpellAbilities"))) { repeatSas = Lists.newArrayList(); @@ -70,7 +70,7 @@ public class RepeatEachEffect extends SpellAbilityEffect { repeatCards = AbilityUtils.getDefinedCards(source, sa.getParam("DefinedCards"), sa); if (sa.hasParam("AdditionalRestriction")) { // lki cards might not be in game repeatCards = CardLists.getValidCards(repeatCards, - sa.getParam("AdditionalRestriction"), source.getController(), source); + sa.getParam("AdditionalRestriction"), source.getController(), source, sa); } } boolean loopOverCards = repeatCards != null && !repeatCards.isEmpty(); 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 a9ae2fa758f..1f911bbf429 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 @@ -42,7 +42,7 @@ public class RestartGameEffect extends SpellAbilityEffect { CardCollection newLibrary = new CardCollection(p.getCardsIn(restartZones, false)); List filteredCards = null; if (leaveZone != null) { - filteredCards = CardLists.getValidCards(p.getCardsIn(leaveZone), leaveRestriction.split(","), p, sa.getHostCard(), null); + filteredCards = CardLists.getValidCards(p.getCardsIn(leaveZone), leaveRestriction, p, sa.getHostCard(), sa); newLibrary.addAll(filteredCards); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/RevealEffect.java b/forge-game/src/main/java/forge/game/ability/effects/RevealEffect.java index 8aefd31a571..872fc5c664e 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/RevealEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/RevealEffect.java @@ -53,7 +53,7 @@ public class RevealEffect extends SpellAbilityEffect { CardCollection valid = new CardCollection(cardsInHand); if (sa.hasParam("RevealValid")) { - valid = CardLists.getValidCards(valid, sa.getParam("RevealValid"), p, host); + valid = CardLists.getValidCards(valid, sa.getParam("RevealValid"), p, host, sa); } if (valid.isEmpty()) diff --git a/forge-game/src/main/java/forge/game/ability/effects/TwoPilesEffect.java b/forge-game/src/main/java/forge/game/ability/effects/TwoPilesEffect.java index 500be595980..5c9efa9e3d0 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/TwoPilesEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/TwoPilesEffect.java @@ -83,7 +83,7 @@ public class TwoPilesEffect extends SpellAbilityEffect { } else { pool0 = p.getCardsIn(zone); } - CardCollection pool = CardLists.getValidCards(pool0, valid, card.getController(), card); + CardCollection pool = CardLists.getValidCards(pool0, valid, card.getController(), card, sa); int size = pool.size(); if (size == 0) { return; diff --git a/forge-game/src/main/java/forge/game/ability/effects/UntapEffect.java b/forge-game/src/main/java/forge/game/ability/effects/UntapEffect.java index 0b12f681a9d..ec58540d227 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/UntapEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/UntapEffect.java @@ -72,7 +72,7 @@ public class UntapEffect extends SpellAbilityEffect { for (final Player p : AbilityUtils.getDefinedPlayers(sa.getHostCard(), sa.getParam("Defined"), sa)) { CardCollectionView list = CardLists.getValidCards(p.getGame().getCardsIn(ZoneType.Battlefield), - valid, sa.getActivatingPlayer(), sa.getHostCard()); + valid, sa.getActivatingPlayer(), sa.getHostCard(), sa); list = CardLists.filter(list, Presets.TAPPED); final CardCollectionView selected = p.getController().chooseCardsForEffect(list, sa, Localizer.getInstance().getMessage("lblSelectCardToUntap"), mandatory ? num : 0, num, !mandatory, null); diff --git a/forge-game/src/main/java/forge/game/ability/effects/VoteEffect.java b/forge-game/src/main/java/forge/game/ability/effects/VoteEffect.java index 9a611532836..415650827c0 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/VoteEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/VoteEffect.java @@ -59,7 +59,7 @@ public class VoteEffect extends SpellAbilityEffect { voteType.addAll(Arrays.asList(sa.getParam("VoteType").split(","))); } else if (sa.hasParam("VoteCard")) { ZoneType zone = sa.hasParam("Zone") ? ZoneType.smartValueOf(sa.getParam("Zone")) : ZoneType.Battlefield; - voteType.addAll(CardLists.getValidCards(game.getCardsIn(zone), sa.getParam("VoteCard"), host.getController(), host)); + voteType.addAll(CardLists.getValidCards(game.getCardsIn(zone), sa.getParam("VoteCard"), host.getController(), host, sa)); } if (voteType.isEmpty()) { return; diff --git a/forge-game/src/main/java/forge/game/ability/effects/ZoneExchangeEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ZoneExchangeEffect.java index b2a41fed62d..694fa05e8aa 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ZoneExchangeEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ZoneExchangeEffect.java @@ -64,7 +64,7 @@ public class ZoneExchangeEffect extends SpellAbilityEffect { filter = "Card"; } - list = CardLists.getValidCards(list, filter, p, source); + list = CardLists.getValidCards(list, filter, p, source, sa); if (list.isEmpty()) { // Nothing to exchange the object? return; 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 a22936abe18..5510f104153 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -2265,7 +2265,7 @@ public class Card extends GameEntity implements Comparable, IHasSVars { continue; } final Card host = stAb.getHostCard(); - if (isValid(stAb.getParam("ValidAttacker").split(","), host.getController(), host, null)) { + if (isValid(stAb.getParam("ValidAttacker").split(","), host.getController(), host, stAb)) { String currentName = (host.getName()); String desc1 = TextUtil.fastReplace(stAb.toString(), "CARDNAME", currentName); String desc = TextUtil.fastReplace(desc1,"NICKNAME", currentName.split(",")[0]); @@ -4678,7 +4678,7 @@ public class Card extends GameEntity implements Comparable, IHasSVars { // Takes one argument like Permanent.Blue+withFlying @Override - public final boolean isValid(final String restriction, final Player sourceController, final Card source, SpellAbility spellAbility) { + public final boolean isValid(final String restriction, final Player sourceController, final Card source, CardTraitBase spellAbility) { if (isImmutable() && source != null && !source.isRemembered(this) && !(restriction.startsWith("Emblem") || restriction.startsWith("Effect"))) { // special case exclusion return false; @@ -4718,7 +4718,7 @@ public class Card extends GameEntity implements Comparable, IHasSVars { // Takes arguments like Blue or withFlying @Override - public boolean hasProperty(final String property, final Player sourceController, final Card source, SpellAbility spellAbility) { + public boolean hasProperty(final String property, final Player sourceController, final Card source, CardTraitBase spellAbility) { return CardProperty.cardHasProperty(this, property, sourceController, source, spellAbility); } diff --git a/forge-game/src/main/java/forge/game/card/CardDamageMap.java b/forge-game/src/main/java/forge/game/card/CardDamageMap.java index 141327d4592..09f8a83d014 100644 --- a/forge-game/src/main/java/forge/game/card/CardDamageMap.java +++ b/forge-game/src/main/java/forge/game/card/CardDamageMap.java @@ -13,6 +13,7 @@ import com.google.common.collect.Maps; import com.google.common.collect.Sets; import com.google.common.collect.Table; +import forge.game.CardTraitBase; import forge.game.Game; import forge.game.GameEntity; import forge.game.GameObjectPredicates; @@ -114,7 +115,7 @@ public class CardDamageMap extends ForwardingTable { return result; } - public CardDamageMap filteredMap(String validSource, String validTarget, Card host, SpellAbility sa) { + public CardDamageMap filteredMap(String validSource, String validTarget, Card host, CardTraitBase sa) { CardDamageMap result = new CardDamageMap(); Set filteredSource = null; Set filteredTarget = null; 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 47b965d42ae..039a634db18 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -821,13 +821,13 @@ public class CardFactoryUtil { if (l[0].startsWith("MostProminentCreatureType")) { String restriction = l[0].split(" ")[1]; - CardCollection list = CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), restriction, cc, c); + CardCollection list = CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), restriction, cc, c, null); return doXMath(getMostProminentCreatureTypeSize(list), m, c); } if (l[0].startsWith("SecondMostProminentColor")) { String restriction = l[0].split(" ")[1]; - CardCollection list = CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), restriction, cc, c); + CardCollection list = CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), restriction, cc, c, null); int[] colorSize = SortColorsFromList(list); return doXMath(colorSize[colorSize.length - 2], m, c); } @@ -986,7 +986,7 @@ public class CardFactoryUtil { if (sq[0].contains("YourDamageSourcesThisTurn")) { Iterable allSrc = cc.getAssignedDamageSources(); String restriction = sq[0].split(" ")[1]; - CardCollection filtered = CardLists.getValidCards(allSrc, restriction, cc, c); + CardCollection filtered = CardLists.getValidCards(allSrc, restriction, cc, c, null); return doXMath(filtered.size(), m, c); } @@ -1831,7 +1831,7 @@ public class CardFactoryUtil { final String[] splitString = string.split("/", 2); String valid = splitString[0].substring(6); - final List list = CardLists.getValidCardsAsList(paidList, valid, source.getController(), source); + final List list = CardLists.getValidCardsAsList(paidList, valid, source.getController(), source, null); return doXMath(list.size(), splitString.length > 1 ? splitString[1] : null, source); } 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 84c89a2a8bd..e99723f2fc3 100644 --- a/forge-game/src/main/java/forge/game/card/CardLists.java +++ b/forge-game/src/main/java/forge/game/card/CardLists.java @@ -26,6 +26,7 @@ import com.google.common.base.Predicates; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; +import forge.game.CardTraitBase; import forge.game.keyword.Keyword; import forge.game.player.Player; import forge.game.spellability.SpellAbility; @@ -212,32 +213,20 @@ public class CardLists { return CardLists.filterAsList(cardList, CardPredicates.isControlledByAnyOf(player)); } - public static CardCollection getValidCards(Iterable cardList, String[] restrictions, Player sourceController, Card source, SpellAbility spellAbility) { + public static CardCollection getValidCards(Iterable cardList, String[] restrictions, Player sourceController, Card source, CardTraitBase 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, null)); - } - - public static int getValidCardCount(Iterable cardList, String[] restrictions, Player sourceController, Card 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, null)); - } - - public static CardCollection getValidCards(Iterable cardList, String restriction, Player sourceController, Card source, SpellAbility sa) { + public static CardCollection getValidCards(Iterable cardList, String restriction, Player sourceController, Card source, CardTraitBase sa) { return CardLists.filter(cardList, CardPredicates.restriction(restriction.split(","), sourceController, source, sa)); } - public static List getValidCardsAsList(Iterable cardList, String restriction, Player sourceController, Card source) { - return CardLists.filterAsList(cardList, CardPredicates.restriction(restriction.split(","), sourceController, source, null)); + public static List getValidCardsAsList(Iterable cardList, String restriction, Player sourceController, Card source, CardTraitBase sa) { + return CardLists.filterAsList(cardList, CardPredicates.restriction(restriction.split(","), sourceController, source, sa)); } - public static int getValidCardCount(Iterable cardList, String restriction, Player sourceController, Card source) { - return CardLists.count(cardList, CardPredicates.restriction(restriction.split(","), sourceController, source, null)); + public static int getValidCardCount(Iterable cardList, String restriction, Player sourceController, Card source, CardTraitBase sa) { + return CardLists.count(cardList, CardPredicates.restriction(restriction.split(","), sourceController, source, sa)); } 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 80684efc9d2..ed1d9a3fb2c 100644 --- a/forge-game/src/main/java/forge/game/card/CardPredicates.java +++ b/forge-game/src/main/java/forge/game/card/CardPredicates.java @@ -22,6 +22,7 @@ import java.util.Comparator; import com.google.common.base.Function; import com.google.common.base.Predicate; +import forge.game.CardTraitBase; import forge.game.combat.CombatUtil; import forge.game.keyword.Keyword; import forge.game.keyword.KeywordInterface; @@ -207,7 +208,7 @@ public final class CardPredicates { }; } - public static final Predicate restriction(final String[] restrictions, final Player sourceController, final Card source, final SpellAbility spellAbility) { + public static final Predicate restriction(final String[] restrictions, final Player sourceController, final Card source, final CardTraitBase spellAbility) { return new Predicate() { @Override public boolean apply(final Card c) { diff --git a/forge-game/src/main/java/forge/game/card/CardProperty.java b/forge-game/src/main/java/forge/game/card/CardProperty.java index fbf89d97c0d..f5666c97f13 100644 --- a/forge-game/src/main/java/forge/game/card/CardProperty.java +++ b/forge-game/src/main/java/forge/game/card/CardProperty.java @@ -7,6 +7,7 @@ import forge.card.ColorSet; import forge.card.MagicColor; import forge.card.mana.ManaCost; import forge.card.mana.ManaCostShard; +import forge.game.CardTraitBase; import forge.game.Direction; import forge.game.EvenOdd; import forge.game.Game; @@ -35,7 +36,7 @@ import java.util.List; public class CardProperty { - public static boolean cardHasProperty(Card card, String property, Player sourceController, Card source, SpellAbility spellAbility) { + public static boolean cardHasProperty(Card card, String property, Player sourceController, Card source, CardTraitBase spellAbility) { final Game game = card.getGame(); final Combat combat = game.getCombat(); // lki can't be null but it does return this @@ -407,8 +408,8 @@ public class CardProperty { if (!card.equals(source.getEffectSource())) { return false; } - } else if (property.equals("CanBeSacrificedBy")) { - if (!card.canBeSacrificedBy(spellAbility)) { + } else if (property.equals("CanBeSacrificedBy") && spellAbility instanceof SpellAbility) { + if (!card.canBeSacrificedBy((SpellAbility)spellAbility)) { return false; } } else if (property.startsWith("AttachedBy")) { @@ -886,13 +887,13 @@ public class CardProperty { } else { final String restriction = property.split("sharesNameWith ")[1]; if (restriction.equals("YourGraveyard")) { - return !CardLists.filter(sourceController.getCardsIn(ZoneType.Graveyard), CardPredicates.sharesNameWith(card)).isEmpty(); + return Iterables.any(sourceController.getCardsIn(ZoneType.Graveyard), CardPredicates.sharesNameWith(card)); } else if (restriction.equals(ZoneType.Graveyard.toString())) { - return !CardLists.filter(game.getCardsIn(ZoneType.Graveyard), CardPredicates.sharesNameWith(card)).isEmpty(); + return Iterables.any(game.getCardsIn(ZoneType.Graveyard), CardPredicates.sharesNameWith(card)); } else if (restriction.equals(ZoneType.Battlefield.toString())) { - return !CardLists.filter(game.getCardsIn(ZoneType.Battlefield), CardPredicates.sharesNameWith(card)).isEmpty(); + return Iterables.any(game.getCardsIn(ZoneType.Battlefield), CardPredicates.sharesNameWith(card)); } else if (restriction.equals("ThisTurnCast")) { - return !CardLists.filter(CardUtil.getThisTurnCast("Card", source), CardPredicates.sharesNameWith(card)).isEmpty(); + return Iterables.any(CardUtil.getThisTurnCast("Card", source), CardPredicates.sharesNameWith(card)); } else if (restriction.equals("MovedToGrave")) { for (final SpellAbility sa : source.getCurrentState().getNonManaAbilities()) { final SpellAbility root = sa.getRootAbility(); @@ -915,10 +916,10 @@ public class CardProperty { return !CardLists.filter(game.getCardsIn(ZoneType.Battlefield), Presets.NON_TOKEN, CardPredicates.sharesNameWith(card)).isEmpty(); } else if (restriction.equals("TriggeredCard")) { - if (spellAbility == null) { + if (!(spellAbility instanceof SpellAbility)) { System.out.println("Looking at TriggeredCard but no SA?"); } else { - Card triggeredCard = ((Card) spellAbility.getTriggeringObject(AbilityKey.Card)); + Card triggeredCard = ((Card)((SpellAbility)spellAbility).getTriggeringObject(AbilityKey.Card)); if (triggeredCard != null && card.sharesNameWith(triggeredCard)) { return true; } @@ -939,9 +940,9 @@ public class CardProperty { final String restriction = property.split("doesNotShareNameWith ")[1]; if (restriction.startsWith("Remembered") || restriction.startsWith("Imprinted")) { CardCollection list = AbilityUtils.getDefinedCards(source, restriction, spellAbility); - return CardLists.filter(list, CardPredicates.sharesNameWith(card)).isEmpty(); + return !Iterables.any(list, CardPredicates.sharesNameWith(card)); } else if (restriction.equals("YourGraveyard")) { - return CardLists.filter(sourceController.getCardsIn(ZoneType.Graveyard), CardPredicates.sharesNameWith(card)).isEmpty(); + return !Iterables.any(sourceController.getCardsIn(ZoneType.Graveyard), CardPredicates.sharesNameWith(card)); } else if (restriction.equals("OtherYourBattlefield")) { // Obviously it's going to share a name with itself, so consider that in the CardCollection list = CardLists.filter(sourceController.getCardsIn(ZoneType.Battlefield), CardPredicates.sharesNameWith(card)); @@ -1807,8 +1808,11 @@ public class CardProperty { return false; } else if (property.startsWith("NotTriggered")) { final String key = property.substring("NotTriggered".length()); - Object obj = spellAbility.getTriggeringObject(AbilityKey.fromString(key)); - if (card.equals(obj)) { + if (spellAbility instanceof SpellAbility) { + if (card.equals(((SpellAbility)spellAbility).getTriggeringObject(AbilityKey.fromString(key)))) { + return false; + } + } else { return false; } } else if (property.startsWith("NotDefined")) { @@ -1817,6 +1821,9 @@ public class CardProperty { return false; } } else if (property.equals("CanPayManaCost")) { + if (!(spellAbility instanceof SpellAbility)) { + return false; + } final class CheckCanPayManaCost { private List manaPaid; private List manaCost; @@ -1857,7 +1864,7 @@ public class CardProperty { return false; } boolean check() { - manaPaid = Lists.newArrayList(spellAbility.getPayingMana()); + manaPaid = Lists.newArrayList(((SpellAbility)spellAbility).getPayingMana()); manaCost = Lists.newArrayList(card.getManaCost()); Collections.sort(manaCost); //It seems the above codes didn't add generic mana cost ? diff --git a/forge-game/src/main/java/forge/game/card/CardState.java b/forge-game/src/main/java/forge/game/card/CardState.java index dd27b678a01..708a20ec035 100644 --- a/forge-game/src/main/java/forge/game/card/CardState.java +++ b/forge-game/src/main/java/forge/game/card/CardState.java @@ -640,7 +640,7 @@ public class CardState extends GameObject implements IHasSVars { * @see forge.game.GameObject#hasProperty(java.lang.String, forge.game.player.Player, forge.game.card.Card, forge.game.spellability.SpellAbility) */ @Override - public boolean hasProperty(String property, Player sourceController, Card source, SpellAbility spellAbility) { + public boolean hasProperty(String property, Player sourceController, Card source, CardTraitBase spellAbility) { return ForgeScript.cardStateHasProperty(this, property, 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 0eb227ae96f..5198cfe69f5 100644 --- a/forge-game/src/main/java/forge/game/card/CardUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardUtil.java @@ -119,7 +119,7 @@ public final class CardUtil { else { res.addAll(game.getStackZone().getCardsAddedThisTurn(from)); } - res = CardLists.getValidCardsAsList(res, valid, src.getController(), src); + res = CardLists.getValidCardsAsList(res, valid, src.getController(), src, null); return res; } @@ -143,16 +143,16 @@ public final class CardUtil { else { res.addAll(game.getStackZone().getCardsAddedLastTurn(from)); } - res = CardLists.getValidCardsAsList(res, valid, src.getController(), src); + res = CardLists.getValidCardsAsList(res, valid, src.getController(), src, null); return res; } public static List getThisTurnCast(final String valid, final Card src) { - return CardLists.getValidCardsAsList(src.getGame().getStack().getSpellsCastThisTurn(), valid, src.getController(), src); + return CardLists.getValidCardsAsList(src.getGame().getStack().getSpellsCastThisTurn(), valid, src.getController(), src, null); } public static List getLastTurnCast(final String valid, final Card src) { - return CardLists.getValidCardsAsList(src.getGame().getStack().getSpellsCastLastTurn(), valid, src.getController(), src); + return CardLists.getValidCardsAsList(src.getGame().getStack().getSpellsCastLastTurn(), valid, src.getController(), src, null); } @@ -410,7 +410,7 @@ public final class CardUtil { sa.setActivatingPlayer(sa.getHostCard().getController()); } final Game game = sa.getActivatingPlayer().getGame(); - cards = CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), validCard, abMana.getActivatingPlayer(), card); + cards = CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), validCard, abMana.getActivatingPlayer(), card, sa); } // remove anything cards that is already in parents diff --git a/forge-game/src/main/java/forge/game/card/CardZoneTable.java b/forge-game/src/main/java/forge/game/card/CardZoneTable.java index 9ad790b5126..ef0925b4839 100644 --- a/forge-game/src/main/java/forge/game/card/CardZoneTable.java +++ b/forge-game/src/main/java/forge/game/card/CardZoneTable.java @@ -10,9 +10,9 @@ import com.google.common.collect.HashBasedTable; import com.google.common.collect.Iterables; import com.google.common.collect.Table; +import forge.game.CardTraitBase; import forge.game.Game; import forge.game.ability.AbilityKey; -import forge.game.spellability.SpellAbility; import forge.game.trigger.TriggerType; import forge.game.zone.ZoneType; @@ -61,7 +61,7 @@ public class CardZoneTable extends ForwardingTable origin, ZoneType destination, String valid, Card host, SpellAbility sa) { + public CardCollection filterCards(Iterable origin, ZoneType destination, String valid, Card host, CardTraitBase sa) { CardCollection allCards = new CardCollection(); if (destination != null) { if (!containsColumn(destination)) { diff --git a/forge-game/src/main/java/forge/game/combat/AttackingBand.java b/forge-game/src/main/java/forge/game/combat/AttackingBand.java index 3e9f861600f..96ca2ad84e2 100644 --- a/forge-game/src/main/java/forge/game/combat/AttackingBand.java +++ b/forge-game/src/main/java/forge/game/combat/AttackingBand.java @@ -55,7 +55,7 @@ public class AttackingBand { // Check if a bands with other keyword exists in band, and each creature in the band fits the valid quality if (!CardLists.getKeyword(band, keyword).isEmpty() && - CardLists.getValidCards(band, valid, source.getController(), source).size() == band.size()) { + CardLists.getValidCards(band, valid, source.getController(), source, null).size() == band.size()) { return true; } } 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 298816baf72..f665514681d 100644 --- a/forge-game/src/main/java/forge/game/combat/CombatUtil.java +++ b/forge-game/src/main/java/forge/game/combat/CombatUtil.java @@ -833,7 +833,7 @@ public class CombatUtil { if (keyword.startsWith("MustBeBlockedBy ")) { final String valid = keyword.substring("MustBeBlockedBy ".length()); if (blocker.isValid(valid, null, null, null) && - CardLists.getValidCardCount(combat.getBlockers(attacker), valid, null, null) == 0) { + CardLists.getValidCardCount(combat.getBlockers(attacker), valid, null, null, null) == 0) { attackersWithLure.add(attacker); break; } @@ -954,7 +954,7 @@ public class CombatUtil { if (keyword.startsWith("MustBeBlockedBy ")) { final String valid = keyword.substring("MustBeBlockedBy ".length()); if (blocker.isValid(valid, null, null, null) && - CardLists.getValidCardCount(combat.getBlockers(attacker), valid, null, null) == 0) { + CardLists.getValidCardCount(combat.getBlockers(attacker), valid, null, null, null) == 0) { mustBeBlockedBy = true; break; } diff --git a/forge-game/src/main/java/forge/game/cost/CostAdjustment.java b/forge-game/src/main/java/forge/game/cost/CostAdjustment.java index 80e7da18b82..4b861642602 100644 --- a/forge-game/src/main/java/forge/game/cost/CostAdjustment.java +++ b/forge-game/src/main/java/forge/game/cost/CostAdjustment.java @@ -421,17 +421,13 @@ public class CostAdjustment { final Card card = sa.getHostCard(); final Game game = hostCard.getGame(); - if (st.hasParam("ValidCard") - && !card.isValid(st.getParam("ValidCard").split(","), controller, hostCard, sa)) { + if (st.hasParam("ValidCard") && !st.matchesValid(card, st.getParam("ValidCard").split(","))) { return false; } - if (st.hasParam("ValidSpell")) { - if (!sa.isValid(st.getParam("ValidSpell").split(","), controller, hostCard, sa)) { - return false; - } + if (st.hasParam("ValidSpell") && !st.matchesValid(sa, st.getParam("ValidSpell").split(","))) { + return false; } - if (st.hasParam("Activator") && ((activator == null) - || !activator.isValid(st.getParam("Activator"), controller, hostCard, sa))) { + if (st.hasParam("Activator") && !st.matchesValid(activator, st.getParam("Activator").split(","))) { return false; } if (st.hasParam("NonActivatorTurn") && ((activator == null) @@ -458,7 +454,7 @@ public class CostAdjustment { if (st.hasParam("ValidSpell")) { list = CardLists.filterAsList(list, CardPredicates.castSA( - SpellAbilityPredicates.isValid(st.getParam("ValidSpell").split(","), controller, hostCard, sa)) + SpellAbilityPredicates.isValid(st.getParam("ValidSpell").split(","), controller, hostCard, st)) ); } diff --git a/forge-game/src/main/java/forge/game/cost/CostUnattach.java b/forge-game/src/main/java/forge/game/cost/CostUnattach.java index d4ab4bd8b76..b80030ea5f5 100644 --- a/forge-game/src/main/java/forge/game/cost/CostUnattach.java +++ b/forge-game/src/main/java/forge/game/cost/CostUnattach.java @@ -79,7 +79,7 @@ public class CostUnattach extends CostPartWithList { Card originalEquipment = ability.getOriginalHost(); return originalEquipment.isEquipping(); } else { - return CardLists.getValidCards(source.getEquippedBy(), type, payer, source).size() > 0; + return CardLists.getValidCards(source.getEquippedBy(), type, payer, source, ability).size() > 0; } } @@ -95,7 +95,7 @@ public class CostUnattach extends CostPartWithList { return originalEquipment; } } else { - List attachees = CardLists.getValidCards(source.getEquippedBy(), this.getType(), activator, source); + List attachees = CardLists.getValidCards(source.getEquippedBy(), this.getType(), activator, source, ability); if (attachees.size() > 0) { // Just pick the first one, although maybe give a dialog return attachees.get(0); 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 e69b1cc2687..bb926a0866a 100644 --- a/forge-game/src/main/java/forge/game/phase/Untap.java +++ b/forge-game/src/main/java/forge/game/phase/Untap.java @@ -182,7 +182,7 @@ public class Untap extends Phase { Map remaining = Maps.newHashMap(restrictUntap); for (Entry entry : remaining.entrySet()) { if (entry.getValue() == 0) { - cardList.removeAll(CardLists.getValidCards(cardList, entry.getKey(), player, null)); + cardList.removeAll(CardLists.getValidCards(cardList, entry.getKey(), player, null, null)); restrictUntap.remove(entry.getKey()); } } 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 1149ee3cf98..60a3ca5ab58 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -2242,7 +2242,7 @@ public class Player extends GameEntity implements Comparable { } @Override - public final boolean isValid(final String restriction, final Player sourceController, final Card source, SpellAbility spellAbility) { + public final boolean isValid(final String restriction, final Player sourceController, final Card source, CardTraitBase spellAbility) { final String[] incR = restriction.split("\\.", 2); @@ -2283,7 +2283,7 @@ public class Player extends GameEntity implements Comparable { } @Override - public final boolean hasProperty(final String property, final Player sourceController, final Card source, SpellAbility spellAbility) { + public final boolean hasProperty(final String property, final Player sourceController, final Card source, CardTraitBase spellAbility) { return PlayerProperty.playerHasProperty(this, property, sourceController, source, spellAbility); } diff --git a/forge-game/src/main/java/forge/game/player/PlayerProperty.java b/forge-game/src/main/java/forge/game/player/PlayerProperty.java index 6d9265d04e9..6c414ca7b2a 100644 --- a/forge-game/src/main/java/forge/game/player/PlayerProperty.java +++ b/forge-game/src/main/java/forge/game/player/PlayerProperty.java @@ -1,12 +1,12 @@ package forge.game.player; +import forge.game.CardTraitBase; import forge.game.Game; import forge.game.ability.AbilityUtils; import forge.game.card.Card; import forge.game.card.CardCollectionView; import forge.game.card.CardLists; import forge.game.card.CardPredicates; -import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; import forge.util.Expressions; import forge.util.TextUtil; @@ -16,7 +16,7 @@ import java.util.List; public class PlayerProperty { - public static boolean playerHasProperty(Player player, String property, Player sourceController, Card source, SpellAbility spellAbility) { + public static boolean playerHasProperty(Player player, String property, Player sourceController, Card source, CardTraitBase spellAbility) { Game game = player.getGame(); if (property.equals("You")) { @@ -236,7 +236,7 @@ public class PlayerProperty { } } else if (property.startsWith("controls")) { final String[] type = property.substring(8).split("_"); - final CardCollectionView list = CardLists.getValidCards(player.getCardsIn(ZoneType.Battlefield), type[0], sourceController, source); + final CardCollectionView list = CardLists.getValidCards(player.getCardsIn(ZoneType.Battlefield), type[0], sourceController, source, spellAbility); String comparator = type[1]; int y = AbilityUtils.calculateAmount(source, comparator.substring(2), null); if (!Expressions.compare(list.size(), comparator, y)) { @@ -244,7 +244,7 @@ public class PlayerProperty { } } else if (property.startsWith("HasCardsIn")) { // HasCardsIn[zonetype]_[cardtype]_[comparator] final String[] type = property.substring(10).split("_"); - final CardCollectionView list = CardLists.getValidCards(player.getCardsIn(ZoneType.smartValueOf(type[0])), type[1], sourceController, source); + final CardCollectionView list = CardLists.getValidCards(player.getCardsIn(ZoneType.smartValueOf(type[0])), type[1], sourceController, source, spellAbility); String comparator = type[2]; int y = AbilityUtils.calculateAmount(source, comparator.substring(2), null); if (!Expressions.compare(list.size(), comparator, y)) { diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceAddCounter.java b/forge-game/src/main/java/forge/game/replacement/ReplaceAddCounter.java index 55cd031279b..b4431b89851 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceAddCounter.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceAddCounter.java @@ -40,32 +40,18 @@ public class ReplaceAddCounter extends ReplacementEffect { } } - if (hasParam("ValidCard")) { - Object o = runParams.get(AbilityKey.Affected); - if (!(o instanceof Card)) { - return false; - } - if (!matchesValid(o, getParam("ValidCard").split(","), getHostCard())) { - return false; - } - } else if (hasParam("ValidPlayer")) { - Object o = runParams.get(AbilityKey.Affected); - if (!(o instanceof Player)) { - return false; - } - if (!matchesValid(o, getParam("ValidPlayer").split(","), getHostCard())) { - return false; - } - } else if (hasParam("ValidObject")) { - if (!matchesValid(runParams.get(AbilityKey.Affected), getParam("ValidObject").split(","), getHostCard())) { - return false; - } + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Affected))) { + return false; + } + if (!matchesValidParam("ValidPlayer", runParams.get(AbilityKey.Affected))) { + return false; + } + if (!matchesValidParam("ValidObject", runParams.get(AbilityKey.Affected))) { + return false; } - if (hasParam("ValidSource")) { - if (!matchesValid(runParams.get(AbilityKey.Source), getParam("ValidSource").split(","), getHostCard())) { - return false; - } + if (!matchesValidParam("ValidSource", runParams.get(AbilityKey.Source))) { + return false; } if (hasParam("ValidCounterType")) { diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceAssignDealDamage.java b/forge-game/src/main/java/forge/game/replacement/ReplaceAssignDealDamage.java index 52512122e10..da8bc685c4a 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceAssignDealDamage.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceAssignDealDamage.java @@ -27,10 +27,8 @@ public class ReplaceAssignDealDamage extends ReplacementEffect { */ @Override public boolean canReplace(Map runParams) { - if (hasParam("ValidCard")) { - if (!matchesValid(runParams.get(AbilityKey.Affected), getParam("ValidCard").split(","), this.getHostCard())) { - return false; - } + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Affected))) { + return false; } return true; diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceAttached.java b/forge-game/src/main/java/forge/game/replacement/ReplaceAttached.java index 6bdf445fbed..d9cb0d2b702 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceAttached.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceAttached.java @@ -27,15 +27,11 @@ public class ReplaceAttached extends ReplacementEffect { */ @Override public boolean canReplace(Map runParams) { - if (hasParam("ValidCard")) { - if (!matchesValid(runParams.get(AbilityKey.Affected), getParam("ValidCard").split(","), this.getHostCard())) { - return false; - } + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Affected))) { + return false; } - if (hasParam("ValidTarget")) { - if (!matchesValid(runParams.get(AbilityKey.AttachTarget), getParam("ValidTarget").split(","), this.getHostCard())) { - return false; - } + if (!matchesValidParam("ValidTarget", runParams.get(AbilityKey.AttachTarget))) { + return false; } return true; } diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceBeginTurn.java b/forge-game/src/main/java/forge/game/replacement/ReplaceBeginTurn.java index ce01a8e1453..4b702e32577 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceBeginTurn.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceBeginTurn.java @@ -14,10 +14,8 @@ public class ReplaceBeginTurn extends ReplacementEffect { @Override public boolean canReplace(Map runParams) { - if (hasParam("ValidPlayer")) { - if (!matchesValid(runParams.get(AbilityKey.Affected), getParam("ValidPlayer").split(","), getHostCard())) { - return false; - } + if (!matchesValidParam("ValidPlayer", runParams.get(AbilityKey.Affected))) { + return false; } if (hasParam("ExtraTurn")) { if (!(boolean) runParams.get(AbilityKey.ExtraTurn)) { diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceCopySpell.java b/forge-game/src/main/java/forge/game/replacement/ReplaceCopySpell.java index 7fec930bf0a..c188ae46a80 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceCopySpell.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceCopySpell.java @@ -20,15 +20,11 @@ public class ReplaceCopySpell extends ReplacementEffect { if (((int) runParams.get(AbilityKey.Amount)) <= 0) { return false; } - if (hasParam("ValidPlayer")) { - if (!matchesValid(runParams.get(AbilityKey.Affected), getParam("ValidPlayer").split(","), getHostCard())) { - return false; - } + if (!matchesValidParam("ValidPlayer", runParams.get(AbilityKey.Affected))) { + return false; } - if (hasParam("ValidSpell")) { - if (!matchesValid(runParams.get(AbilityKey.SpellAbility), getParam("ValidSpell").split(","), getHostCard())) { - return false; - } + if (!matchesValidParam("ValidSpell", runParams.get(AbilityKey.SpellAbility))) { + return false; } return true; } diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceCounter.java b/forge-game/src/main/java/forge/game/replacement/ReplaceCounter.java index c5968fd1d16..a85b1ffd557 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceCounter.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceCounter.java @@ -44,18 +44,15 @@ public class ReplaceCounter extends ReplacementEffect { */ @Override public boolean canReplace(Map runParams) { - final SpellAbility spellAbility = (SpellAbility) runParams.get(AbilityKey.TgtSA); - if (hasParam("ValidCard")) { - if (!matchesValid(runParams.get(AbilityKey.Affected), getParam("ValidCard").split(","), this.getHostCard())) { - return false; - } + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Affected))) { + return false; } - if (hasParam("ValidCause")) { - if (!matchesValid(runParams.get(AbilityKey.Cause), getParam("ValidCause").split(","), this.getHostCard())) { - return false; - } + if (!matchesValidParam("ValidCause", runParams.get(AbilityKey.Cause))) { + return false; } + if (hasParam("ValidType")) { + final SpellAbility spellAbility = (SpellAbility) runParams.get(AbilityKey.TgtSA); String type = getParam("ValidType"); if (type.equals("Spell") && !spellAbility.isSpell()) { return false; diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceDamage.java b/forge-game/src/main/java/forge/game/replacement/ReplaceDamage.java index c0d8e1ebcb0..44aa17d5fd9 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceDamage.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceDamage.java @@ -58,40 +58,24 @@ public class ReplaceDamage extends ReplacementEffect { // If no actual damage is dealt, there is nothing to replace return false; } - if (hasParam("ValidSource")) { - String validSource = getParam("ValidSource"); - validSource = AbilityUtils.applyAbilityTextChangeEffects(validSource, this); - if (!matchesValid(runParams.get(AbilityKey.DamageSource), validSource.split(","), getHostCard())) { - return false; - } + if (!matchesValidParam("ValidSource", runParams.get(AbilityKey.DamageSource))) { + return false; } - if (hasParam("ValidTarget")) { - String validTarget = getParam("ValidTarget"); - validTarget = AbilityUtils.applyAbilityTextChangeEffects(validTarget, this); - if (!matchesValid(runParams.get(AbilityKey.Affected), validTarget.split(","), getHostCard())) { - return false; - } + if (!matchesValidParam("ValidTarget", runParams.get(AbilityKey.Affected))) { + return false; } - if (hasParam("ValidCause")) { - if (!runParams.containsKey(AbilityKey.Cause)) { - return false; - } + if (!matchesValidParam("ValidCause", runParams.get(AbilityKey.Cause))) { + return false; + } + if (hasParam("CauseIsSource")) { SpellAbility cause = (SpellAbility) runParams.get(AbilityKey.Cause); - String validCause = getParam("ValidCause"); - validCause = AbilityUtils.applyAbilityTextChangeEffects(validCause, this); - if (!matchesValid(cause, validCause.split(","), getHostCard())) { + if (!cause.getHostCard().equals(runParams.get(AbilityKey.DamageSource))) { return false; } - if (hasParam("CauseIsSource")) { - if (!cause.getHostCard().equals(runParams.get(AbilityKey.DamageSource))) { - return false; - } - } } if (hasParam("RelativeToSource")) { Card source = (Card) runParams.get(AbilityKey.DamageSource); String validRelative = getParam("RelativeToSource"); - validRelative = AbilityUtils.applyAbilityTextChangeEffects(validRelative, this); if (!matchesValid(runParams.get(AbilityKey.DamageTarget), validRelative.split(","), source)) { return false; } @@ -107,14 +91,8 @@ public class ReplaceDamage extends ReplacementEffect { } } if (hasParam("IsCombat")) { - if (getParam("IsCombat").equals("True")) { - if (!((Boolean) runParams.get(AbilityKey.IsCombat))) { - return false; - } - } else { - if ((Boolean) runParams.get(AbilityKey.IsCombat)) { - return false; - } + if (getParam("IsCombat").equals("True") != ((Boolean) runParams.get(AbilityKey.IsCombat))) { + return false; } } if (hasParam("IsEquipping") && !getHostCard().isEquipping()) { diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceDealtDamage.java b/forge-game/src/main/java/forge/game/replacement/ReplaceDealtDamage.java index d07c99a097e..a8778ab2359 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceDealtDamage.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceDealtDamage.java @@ -27,10 +27,8 @@ public class ReplaceDealtDamage extends ReplacementEffect { */ @Override public boolean canReplace(Map runParams) { - if (hasParam("ValidCard")) { - if (!matchesValid(runParams.get(AbilityKey.Affected), getParam("ValidCard").split(","), this.getHostCard())) { - return false; - } + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Affected))) { + return false; } return true; diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceDestroy.java b/forge-game/src/main/java/forge/game/replacement/ReplaceDestroy.java index e9c22681fb7..9d5094b92d0 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceDestroy.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceDestroy.java @@ -44,37 +44,30 @@ public class ReplaceDestroy extends ReplacementEffect { */ @Override public boolean canReplace(Map runParams) { - if (hasParam("ValidPlayer")) { - if (!matchesValid(runParams.get(AbilityKey.Affected), getParam("ValidPlayer").split(","), getHostCard())) { + if (!matchesValidParam("ValidPlayer", runParams.get(AbilityKey.Affected))) { + return false; + } + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Card))) { + return false; + } + + // extra check for Regeneration + if (hasParam("Regeneration")) { + Card card = (Card) runParams.get(AbilityKey.Card); + if (!runParams.containsKey(AbilityKey.Regeneration) || !(Boolean)runParams.get(AbilityKey.Regeneration)) { return false; } + if (!card.canBeShielded()) { + return false; + } + if (card.isCreature()) { + if (card.getNetToughness() <= 0) + return false; + } } - if (hasParam("ValidCard")) { - Card card = (Card)runParams.get(AbilityKey.Card); - if (!matchesValid(card, getParam("ValidCard").split(","), getHostCard())) { - return false; - } - // extra check for Regeneration - if (hasParam("Regeneration")) { - if (!runParams.containsKey(AbilityKey.Regeneration)) { - return false; - } - if (!(Boolean)runParams.get(AbilityKey.Regeneration)) { - return false; - } - if (!card.canBeShielded()) { - return false; - } - if (card.isCreature()) { - if (card.getNetToughness() <= 0) - return false; - } - } - } - if (hasParam("ValidSource")) { - if (!matchesValid(runParams.get(AbilityKey.Source), getParam("ValidSource").split(","), getHostCard())) { - return false; - } + + if (!matchesValidParam("ValidSource", runParams.get(AbilityKey.Source))) { + return false; } return true; diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceDiscard.java b/forge-game/src/main/java/forge/game/replacement/ReplaceDiscard.java index 762f38b645b..261ed35da5a 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceDiscard.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceDiscard.java @@ -44,21 +44,17 @@ public class ReplaceDiscard extends ReplacementEffect { */ @Override public boolean canReplace(Map runParams) { - if (hasParam("ValidPlayer")) { - if (!matchesValid(runParams.get(AbilityKey.Affected), getParam("ValidPlayer").split(","), this.getHostCard())) { - return false; - } + + if (!matchesValidParam("ValidPlayer", runParams.get(AbilityKey.Affected))) { + return false; } - if (hasParam("ValidCard")) { - if (!matchesValid(runParams.get(AbilityKey.Card), getParam("ValidCard").split(","), this.getHostCard())) { - return false; - } + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Card))) { + return false; } - if (hasParam("ValidSource")) { - if (!matchesValid(runParams.get(AbilityKey.Source), getParam("ValidSource").split(","), this.getHostCard())) { - return false; - } + if (!matchesValidParam("ValidSource", runParams.get(AbilityKey.Source))) { + return false; } + if (hasParam("Cycling")) { if (getParam("Cycling").equalsIgnoreCase("True") != runParams.containsKey(AbilityKey.Cycling)) { return false; diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceDraw.java b/forge-game/src/main/java/forge/game/replacement/ReplaceDraw.java index c930b352334..6191110c83d 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceDraw.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceDraw.java @@ -47,27 +47,16 @@ public class ReplaceDraw extends ReplacementEffect { */ @Override public boolean canReplace(Map runParams) { - final Game game = this.getHostCard().getGame(); - if (hasParam("ValidPlayer")) { - if (!matchesValid(runParams.get(AbilityKey.Affected), getParam("ValidPlayer").split(","), getHostCard())) { - return false; - } + if (!matchesValidParam("ValidPlayer", runParams.get(AbilityKey.Affected))) { + return false; } - - if (hasParam("ValidCause")) { - if (!runParams.containsKey(AbilityKey.Cause)) { - return false; - } - SpellAbility cause = (SpellAbility) runParams.get(AbilityKey.Cause); - if (cause == null) { - return false; - } - if (!matchesValid(cause, getParam("ValidCause").split(","), getHostCard())) { - return false; - } + if (!matchesValidParam("ValidCause", runParams.get(AbilityKey.Cause))) { + return false; } if (hasParam("NotFirstCardInDrawStep")) { + final Game game = getHostCard().getGame(); + final Player p = (Player)runParams.get(AbilityKey.Affected); if (p.numDrawnThisDrawStep() == 0 && game.getPhaseHandler().is(PhaseType.DRAW, p)) { return false; diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceDrawCards.java b/forge-game/src/main/java/forge/game/replacement/ReplaceDrawCards.java index fecf53a8bf2..5ebe5101b5c 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceDrawCards.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceDrawCards.java @@ -45,10 +45,8 @@ public class ReplaceDrawCards extends ReplacementEffect { */ @Override public boolean canReplace(Map runParams) { - if (hasParam("ValidPlayer")) { - if (!matchesValid(runParams.get(AbilityKey.Affected), getParam("ValidPlayer").split(","), this.getHostCard())) { - return false; - } + if (!matchesValidParam("ValidPlayer", runParams.get(AbilityKey.Affected))) { + return false; } if (hasParam("Number")) { final int n = (Integer)runParams.get(AbilityKey.Number); diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceGainLife.java b/forge-game/src/main/java/forge/game/replacement/ReplaceGainLife.java index 083ad7b23d2..fc8a9e87360 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceGainLife.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceGainLife.java @@ -47,15 +47,11 @@ public class ReplaceGainLife extends ReplacementEffect { if (((int)runParams.get(AbilityKey.LifeGained)) <= 0) { return false; } - if (hasParam("ValidPlayer")) { - if (!matchesValid(runParams.get(AbilityKey.Affected), getParam("ValidPlayer").split(","), this.getHostCard())) { - return false; - } + if (!matchesValidParam("ValidPlayer", runParams.get(AbilityKey.Affected))) { + return false; } - if (hasParam("ValidSource")) { - if (!matchesValid(runParams.get(AbilityKey.Source), getParam("ValidSource").split(","), this.getHostCard())) { - return false; - } + if (!matchesValidParam("ValidSource", runParams.get(AbilityKey.Source))) { + return false; } if ("True".equals(getParam("SourceController"))) { if (runParams.get(AbilityKey.Source) == null || !runParams.get(AbilityKey.Affected).equals(((Card)runParams.get(AbilityKey.Source)).getController())) { diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceGameLoss.java b/forge-game/src/main/java/forge/game/replacement/ReplaceGameLoss.java index 3860af6c119..2162a133873 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceGameLoss.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceGameLoss.java @@ -26,10 +26,8 @@ public class ReplaceGameLoss extends ReplacementEffect { */ @Override public boolean canReplace(Map runParams) { - if (hasParam("ValidPlayer")) { - if (!matchesValid(runParams.get(AbilityKey.Affected), getParam("ValidPlayer").split(","), this.getHostCard())) { - return false; - } + if (!matchesValidParam("ValidPlayer", runParams.get(AbilityKey.Affected))) { + return false; } return true; diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceMill.java b/forge-game/src/main/java/forge/game/replacement/ReplaceMill.java index e2aa8cf2009..6e9cd20f296 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceMill.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceMill.java @@ -43,11 +43,8 @@ public class ReplaceMill extends ReplacementEffect { */ @Override public boolean canReplace(Map runParams) { - - if (hasParam("ValidPlayer")) { - if (!matchesValid(runParams.get(AbilityKey.Affected), getParam("ValidPlayer").split(","), getHostCard())) { - return false; - } + if (!matchesValidParam("ValidPlayer", runParams.get(AbilityKey.Affected))) { + return false; } return true; diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceMoved.java b/forge-game/src/main/java/forge/game/replacement/ReplaceMoved.java index c0f7e71d725..3645d59d36a 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceMoved.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceMoved.java @@ -30,16 +30,17 @@ public class ReplaceMoved extends ReplacementEffect { @Override public boolean canReplace(Map runParams) { - if (hasParam("ValidCard")) { - if (!matchesValid(runParams.get(AbilityKey.Affected), getParam("ValidCard").split(","), getHostCard())) { - return false; - } + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Affected))) { + return false; } - - if (hasParam("ValidLKI")) { - if (!matchesValid(runParams.get(AbilityKey.CardLKI), getParam("ValidLKI").split(","), getHostCard())) { - return false; - } + if (!matchesValidParam("ValidLKI", runParams.get(AbilityKey.CardLKI))) { + return false; + } + if (!matchesValidParam("ValidStackSa", runParams.get(AbilityKey.StackSa))) { + return false; + } + if (!matchesValidParam("Cause", runParams.get(AbilityKey.Cause))) { + return false; } if (hasParam("Origin")) { @@ -73,24 +74,6 @@ public class ReplaceMoved extends ReplacementEffect { return false; } } - - if (hasParam("ValidStackSa")) { - if (!matchesValid(runParams.get(AbilityKey.StackSa), getParam("ValidStackSa").split(","), getHostCard())) { - return false; - } - } - - if (hasParam("Cause")) { - if (!matchesValid(runParams.get(AbilityKey.Cause), getParam("Cause").split(","), getHostCard())) { - return false; - } - } - - if (hasParam("NotCause")) { - if (matchesValid(runParams.get(AbilityKey.Cause), getParam("NotCause").split(","), getHostCard())) { - return false; - } - } if (hasParam("Cycling")) { // Cycling is by cost, not by effect so cause is null if (getParam("Cycling").equalsIgnoreCase("True") != runParams.containsKey(AbilityKey.Cycling)) { diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceProduceMana.java b/forge-game/src/main/java/forge/game/replacement/ReplaceProduceMana.java index 2c31c859b83..bade5c980ef 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceProduceMana.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceProduceMana.java @@ -32,11 +32,14 @@ public class ReplaceProduceMana extends ReplacementEffect { @Override public boolean canReplace(Map runParams) { - if (hasParam("ValidAbility")) { - final SpellAbility manaAbility = (SpellAbility) runParams.get(AbilityKey.AbilityMana); - if (!matchesValid(manaAbility, getParam("ValidAbility").split(","), getHostCard())) { - return false; - } + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Affected))) { + return false; + } + if (!matchesValidParam("ValidPlayer", runParams.get(AbilityKey.Player))) { + return false; + } + if (!matchesValidParam("ValidAbility", runParams.get(AbilityKey.AbilityMana))) { + return false; } if (hasParam("ManaAmount")) { @@ -52,18 +55,6 @@ public class ReplaceProduceMana extends ReplacementEffect { } } - if (hasParam("ValidPlayer")) { - if (!matchesValid(runParams.get(AbilityKey.Player), getParam("ValidPlayer").split(","), getHostCard())) { - return false; - } - } - - if (hasParam("ValidCard")) { - if (!matchesValid(runParams.get(AbilityKey.Affected), getParam("ValidCard").split(","), getHostCard())) { - return false; - } - } - return true; } diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceScry.java b/forge-game/src/main/java/forge/game/replacement/ReplaceScry.java index 5338d7b22fa..d340f40492b 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceScry.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceScry.java @@ -30,10 +30,8 @@ public class ReplaceScry extends ReplacementEffect { return false; } - if (hasParam("ValidPlayer")) { - if (!matchesValid(runParams.get(AbilityKey.Affected), getParam("ValidPlayer").split(","), getHostCard())) { - return false; - } + if (!matchesValidParam("ValidPlayer", runParams.get(AbilityKey.Affected))) { + return false; } return true; diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceSetInMotion.java b/forge-game/src/main/java/forge/game/replacement/ReplaceSetInMotion.java index 1b2b39f382b..ef47ae19f1c 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceSetInMotion.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceSetInMotion.java @@ -43,10 +43,8 @@ public class ReplaceSetInMotion extends ReplacementEffect { */ @Override public boolean canReplace(Map runParams) { - if (hasParam("ValidPlayer")) { - if (!matchesValid(runParams.get(AbilityKey.Affected), getParam("ValidPlayer").split(","), getHostCard())) { - return false; - } + if (!matchesValidParam("ValidPlayer", runParams.get(AbilityKey.Affected))) { + return false; } return true; diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceSurveil.java b/forge-game/src/main/java/forge/game/replacement/ReplaceSurveil.java index e7b8440e0b5..c0829305c0d 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceSurveil.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceSurveil.java @@ -30,11 +30,8 @@ public class ReplaceSurveil extends ReplacementEffect { if (((int) runParams.get(AbilityKey.SurveilNum)) <= 0) { return false; } - - if (hasParam("ValidPlayer")) { - if (!matchesValid(runParams.get(AbilityKey.Affected), getParam("ValidPlayer").split(","), this.getHostCard())) { - return false; - } + if (!matchesValidParam("ValidPlayer", runParams.get(AbilityKey.Affected))) { + return false; } return true; diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceTap.java b/forge-game/src/main/java/forge/game/replacement/ReplaceTap.java index b691dc7abd1..7febdebde22 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceTap.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceTap.java @@ -27,10 +27,8 @@ public class ReplaceTap extends ReplacementEffect { */ @Override public boolean canReplace(Map runParams) { - if (hasParam("ValidCard")) { - if (!matchesValid(runParams.get(AbilityKey.Affected), getParam("ValidCard").split(","), this.getHostCard())) { - return false; - } + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Affected))) { + return false; } return true; diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceToken.java b/forge-game/src/main/java/forge/game/replacement/ReplaceToken.java index 7204edfdcbe..3ac8f4bf75a 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceToken.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceToken.java @@ -38,22 +38,13 @@ public class ReplaceToken extends ReplacementEffect { } } - if (hasParam("ValidPlayer")) { - if (!matchesValid(runParams.get(AbilityKey.Affected), getParam("ValidPlayer").split(","), getHostCard())) { - return false; - } + if (!matchesValidParam("ValidPlayer", runParams.get(AbilityKey.Affected))) { + return false; + } + if (!matchesValidParam("ValidToken", runParams.get(AbilityKey.Affected))) { + return false; } - if (hasParam("ValidToken")) { - if (runParams.containsKey(AbilityKey.Token)) { - if (!matchesValid(runParams.get(AbilityKey.Token), getParam("ValidToken").split(","), getHostCard())) { - return false; - } - } else { - // in case RE is not updated yet - return false; - } - } return true; } diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceTurnFaceUp.java b/forge-game/src/main/java/forge/game/replacement/ReplaceTurnFaceUp.java index 3f433f38916..4b2ca33aadf 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceTurnFaceUp.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceTurnFaceUp.java @@ -27,10 +27,8 @@ public class ReplaceTurnFaceUp extends ReplacementEffect { */ @Override public boolean canReplace(Map runParams) { - if (hasParam("ValidCard")) { - if (!matchesValid(runParams.get(AbilityKey.Affected), getParam("ValidCard").split(","), this.getHostCard())) { - return false; - } + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Affected))) { + return false; } return true; } diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceUntap.java b/forge-game/src/main/java/forge/game/replacement/ReplaceUntap.java index d52c65e75b8..c3e6055fe97 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceUntap.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceUntap.java @@ -46,10 +46,8 @@ public class ReplaceUntap extends ReplacementEffect { */ @Override public boolean canReplace(Map runParams) { - if (hasParam("ValidCard")) { - if (!matchesValid(runParams.get(AbilityKey.Affected), getParam("ValidCard").split(","), this.getHostCard())) { - return false; - } + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Affected))) { + return false; } if (hasParam("UntapStep")) { final Object o = runParams.get(AbilityKey.Affected); 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 28985891bda..b01e5f54b68 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -1906,7 +1906,7 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit // Takes one argument like Permanent.Blue+withFlying @Override - public final boolean isValid(final String restriction, final Player sourceController, final Card source, SpellAbility spellAbility) { + public final boolean isValid(final String restriction, final Player sourceController, final Card source, CardTraitBase spellAbility) { // Inclusive restrictions are Card types final String[] incR = restriction.split("\\.", 2); SpellAbility root = getRootAbility(); @@ -1949,7 +1949,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, SpellAbility spellAbility) { + public boolean hasProperty(final String property, final Player sourceController, final Card source, CardTraitBase spellAbility) { return ForgeScript.spellAbilityHasProperty(this, property, sourceController, source, spellAbility); } diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbilityPredicates.java b/forge-game/src/main/java/forge/game/spellability/SpellAbilityPredicates.java index 46865d5931a..16968b3331b 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbilityPredicates.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbilityPredicates.java @@ -2,6 +2,7 @@ package forge.game.spellability; import com.google.common.base.Predicate; +import forge.game.CardTraitBase; import forge.game.CardTraitPredicates; import forge.game.ability.ApiType; import forge.game.card.Card; @@ -62,7 +63,7 @@ public final class SpellAbilityPredicates extends CardTraitPredicates { }; } - public static final Predicate isValid(String[] restrictions, Player sourceController, Card source, SpellAbility spellAbility) { + public static final Predicate isValid(String[] restrictions, Player sourceController, Card source, CardTraitBase spellAbility) { return new Predicate() { @Override public boolean apply(final SpellAbility sa) { 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 4b429e7bfa0..a9e947b9602 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java @@ -340,7 +340,7 @@ public class SpellAbilityRestriction extends SpellAbilityVariables { // legendary sorcery if (c.isSorcery() && c.getType().isLegendary() && CardLists.getValidCardCount( activator.getCardsIn(ZoneType.Battlefield), - "Creature.Legendary,Planeswalker.Legendary", c.getController(), c) <= 0) { + "Creature.Legendary,Planeswalker.Legendary", c.getController(), c, sa) <= 0) { return false; } 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 49c7e4d36e8..5d424be8b27 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbility.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbility.java @@ -554,14 +554,14 @@ public class StaticAbility extends CardTraitBase implements IIdentifiable, Clone } if (hasParam("PlayerTurn")) { - List players = AbilityUtils.getDefinedPlayers(hostCard, getParam("PlayerTurn"), null); + List players = AbilityUtils.getDefinedPlayers(hostCard, getParam("PlayerTurn"), this); if (!players.contains(ph.getPlayerTurn())) { return false; } } if (hasParam("UnlessDefinedPlayer")) { - List players = AbilityUtils.getDefinedPlayers(hostCard, getParam("UnlessDefinedPlayer"), null); + List players = AbilityUtils.getDefinedPlayers(hostCard, getParam("UnlessDefinedPlayer"), this); if (!players.isEmpty()) { return false; } @@ -572,7 +572,7 @@ public class StaticAbility extends CardTraitBase implements IIdentifiable, Clone return false; } final Card topCard = controller.getCardsIn(ZoneType.Library).get(0); - if (!topCard.isValid(getParam("TopCardOfLibraryIs").split(","), controller, this.hostCard, null)) { + if (!topCard.isValid(getParam("TopCardOfLibraryIs").split(","), controller, this.hostCard, this)) { return false; } } @@ -583,7 +583,7 @@ public class StaticAbility extends CardTraitBase implements IIdentifiable, Clone CardCollectionView list = game.getCardsIn(zone); final String present = getParam("IsPresent"); - list = CardLists.getValidCards(list, present.split(","), controller, hostCard, null); + list = CardLists.getValidCards(list, present.split(","), controller, hostCard, this); int right = 1; final String rightString = compare.substring(2); diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantAttach.java b/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantAttach.java index bbf9781fac1..7ad8ef7e0a6 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantAttach.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantAttach.java @@ -6,15 +6,11 @@ import forge.game.card.Card; public class StaticAbilityCantAttach { public static boolean applyCantAttachAbility(final StaticAbility stAb, final Card card, final GameEntity target) { - final Card hostCard = stAb.getHostCard(); - - if (stAb.hasParam("ValidCard") - && !card.isValid(stAb.getParam("ValidCard").split(","), hostCard.getController(), hostCard, null)) { + if (!stAb.matchesValidParam("ValidCard", card)) { return false; } - if (stAb.hasParam("Target") - && !target.isValid(stAb.getParam("Target").split(","), hostCard.getController(), hostCard, null)) { + if (!stAb.matchesValidParam("Target", target)) { return false; } @@ -24,7 +20,7 @@ public class StaticAbilityCantAttach { } Card tcard = (Card) target; - if (!card.isValid(stAb.getParam("ValidCardToTarget").split(","), tcard.getController(), tcard, null)) { + if (!stAb.matchesValid(card, stAb.getParam("ValidCardToTarget").split(","), tcard)) { return false; } } 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 446c2d92efd..ef1caf3b798 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantAttackBlock.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantAttackBlock.java @@ -46,13 +46,11 @@ public class StaticAbilityCantAttackBlock { public static boolean applyCantAttackAbility(final StaticAbility stAb, final Card card, final GameEntity target) { final Card hostCard = stAb.getHostCard(); - if (stAb.hasParam("ValidCard") - && !card.isValid(stAb.getParam("ValidCard").split(","), hostCard.getController(), hostCard, null)) { + if (!stAb.matchesValidParam("ValidCard", card)) { return false; } - if (stAb.hasParam("Target") - && !target.isValid(stAb.getParam("Target").split(","), hostCard.getController(), hostCard, null)) { + if (!stAb.matchesValidParam("Target", target)) { return false; } @@ -61,14 +59,14 @@ public class StaticAbilityCantAttackBlock { if (stAb.hasParam("UnlessDefenderControls")) { String type = stAb.getParam("UnlessDefenderControls"); CardCollectionView list = defender.getCardsIn(ZoneType.Battlefield); - if (Iterables.any(list, CardPredicates.restriction(type.split(","), hostCard.getController(), hostCard, null))) { + if (Iterables.any(list, CardPredicates.restriction(type.split(","), hostCard.getController(), hostCard, stAb))) { return false; } } if (stAb.hasParam("IfDefenderControls")) { String type = stAb.getParam("IfDefenderControls"); CardCollectionView list = defender.getCardsIn(ZoneType.Battlefield); - if (!Iterables.any(list, CardPredicates.restriction(type.split(","), hostCard.getController(), hostCard, null))) { + if (!Iterables.any(list, CardPredicates.restriction(type.split(","), hostCard.getController(), hostCard, stAb))) { return false; } } @@ -79,7 +77,7 @@ public class StaticAbilityCantAttackBlock { } if (stAb.hasParam("UnlessDefender")) { final String type = stAb.getParam("UnlessDefender"); - if (defender.hasProperty(type, hostCard.getController(), hostCard, null)) { + if (defender.hasProperty(type, hostCard.getController(), hostCard, stAb)) { return false; } } @@ -96,14 +94,12 @@ public class StaticAbilityCantAttackBlock { */ public static boolean applyCantBlockByAbility(final StaticAbility stAb, final Card attacker, final Card blocker) { final Card host = stAb.getHostCard(); - if (stAb.hasParam("ValidAttacker")) { - if (!attacker.isValid(stAb.getParam("ValidAttacker").split(","), host.getController(), host, null)) { - return false; - } + if (!stAb.matchesValidParam("ValidAttacker", attacker)) { + return false; } if (stAb.hasParam("ValidBlocker")) { for (final String v : stAb.getParam("ValidBlocker").split(",")) { - if (blocker.isValid(v, host.getController(), host, null)) { + if (blocker.isValid(v, host.getController(), host, stAb)) { boolean stillblock = false; //Dragon Hunter check if (v.contains("withoutReach") && blocker.hasStartOfKeyword("IfReach")) { @@ -139,13 +135,11 @@ public class StaticAbilityCantAttackBlock { public static Cost getAttackCost(final StaticAbility stAb, final Card card, final GameEntity target) { final Card hostCard = stAb.getHostCard(); - if (stAb.hasParam("ValidCard") - && !card.isValid(stAb.getParam("ValidCard").split(","), hostCard.getController(), hostCard, null)) { + if (!stAb.matchesValidParam("ValidCard", card)) { return null; } - if (stAb.hasParam("Target") - && !target.isValid(stAb.getParam("Target").split(","), hostCard.getController(), hostCard, null)) { + if (!stAb.matchesValidParam("Target", target)) { return null; } String costString = stAb.getParam("Cost"); @@ -168,13 +162,11 @@ public class StaticAbilityCantAttackBlock { public static Cost getBlockCost(final StaticAbility stAb, final Card blocker, final GameEntity attacker) { final Card hostCard = stAb.getHostCard(); - if (stAb.hasParam("ValidCard") - && !blocker.isValid(stAb.getParam("ValidCard").split(","), hostCard.getController(), hostCard, null)) { + if (!stAb.matchesValidParam("ValidCard", blocker)) { return null; } - - if (stAb.hasParam("Attacker") && attacker != null - && !attacker.isValid(stAb.getParam("Attacker").split(","), hostCard.getController(), hostCard, null)) { + + if (!stAb.matchesValidParam("Attacker", attacker)) { return null; } String costString = stAb.getParam("Cost"); @@ -186,20 +178,16 @@ public class StaticAbilityCantAttackBlock { } public static boolean applyCanAttackHasteAbility(final StaticAbility stAb, final Card card, final GameEntity target) { - final Card hostCard = stAb.getHostCard(); - if (stAb.hasParam("ValidCard") - && !card.isValid(stAb.getParam("ValidCard").split(","), hostCard.getController(), hostCard, null)) { + if (!stAb.matchesValidParam("ValidCard", card)) { return false; } - if (stAb.hasParam("ValidTarget") - && !target.isValid(stAb.getParam("ValidTarget").split(","), hostCard.getController(), hostCard, null)) { + if (!stAb.matchesValidParam("ValidTarget", target)) { return false; } final Player defender = target instanceof Card ? ((Card) target).getController() : (Player) target; - if (stAb.hasParam("ValidDefender") - && !defender.isValid(stAb.getParam("ValidDefender").split(","), hostCard.getController(), hostCard, null)) { + if (!stAb.matchesValidParam("ValidDefender", defender)) { return false; } return true; 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 a648c85e8bf..11457beb1a7 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantBeCast.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantBeCast.java @@ -98,15 +98,12 @@ public class StaticAbilityCantBeCast { * @return true, if successful */ public static boolean applyCantBeCastAbility(final StaticAbility stAb, final SpellAbility spell, final Card card, final Player activator) { - final Card hostCard = stAb.getHostCard(); - if (stAb.hasParam("ValidCard") - && !card.isValid(stAb.getParam("ValidCard").split(","), hostCard.getController(), hostCard, null)) { + if (!stAb.matchesValidParam("ValidCard", card)) { return false; } - if (stAb.hasParam("Caster") && (activator != null) - && !activator.isValid(stAb.getParam("Caster"), hostCard.getController(), hostCard, null)) { + if (!stAb.matchesValidParam("Caster", activator)) { return false; } @@ -156,15 +153,12 @@ public class StaticAbilityCantBeCast { * @return true, if successful */ public static boolean applyCantBeActivatedAbility(final StaticAbility stAb, final SpellAbility spellAbility, final Card card, final Player activator) { - final Card hostCard = stAb.getHostCard(); - if (stAb.hasParam("ValidCard") - && !card.isValid(stAb.getParam("ValidCard").split(","), hostCard.getController(), hostCard, null)) { + if (!stAb.matchesValidParam("ValidCard", card)) { return false; } - if (stAb.hasParam("ValidSA") - && !spellAbility.isValid(stAb.getParam("ValidSA").split(","), hostCard.getController(), hostCard, null)) { + if (!stAb.matchesValidParam("ValidSA", spellAbility)) { return false; } @@ -173,8 +167,7 @@ public class StaticAbilityCantBeCast { return false; } - if (stAb.hasParam("Activator") && (activator != null) - && !activator.isValid(stAb.getParam("Activator"), hostCard.getController(), hostCard, spellAbility)) { + if (!stAb.matchesValidParam("Activator", activator)) { return false; } @@ -215,10 +208,7 @@ public class StaticAbilityCantBeCast { * @return true, if successful */ public static boolean applyCantPlayLandAbility(final StaticAbility stAb, final Card card, final Player player) { - final Card hostCard = stAb.getHostCard(); - - if (stAb.hasParam("ValidCard") - && (card == null || !card.isValid(stAb.getParam("ValidCard").split(","), hostCard.getController(), hostCard, null))) { + if (!stAb.matchesValidParam("ValidCard", card)) { return false; } @@ -230,8 +220,7 @@ public class StaticAbilityCantBeCast { } } - if (stAb.hasParam("Player") && (player != null) - && !player.isValid(stAb.getParam("Player"), hostCard.getController(), hostCard, null)) { + if (!stAb.matchesValidParam("Player", player)) { return false; } diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantPreventDamage.java b/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantPreventDamage.java index a991d1cd9f5..5d34e605262 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantPreventDamage.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantPreventDamage.java @@ -8,19 +8,15 @@ public class StaticAbilityCantPreventDamage { } - public static boolean applyCantPreventDamage(final StaticAbility st, final Card source, final boolean isCombat) { - final Card hostCard = st.getHostCard(); - - if (st.hasParam("IsCombat")) { - if (st.getParamOrDefault("IsCombat", "False").equals("True") != isCombat) { + public static boolean applyCantPreventDamage(final StaticAbility stAb, final Card source, final boolean isCombat) { + if (stAb.hasParam("IsCombat")) { + if (stAb.getParamOrDefault("IsCombat", "False").equals("True") != isCombat) { return false; } } - if (st.hasParam("ValidSource")) { - if (!source.isValid(st.getParam("ValidSource").split(","), hostCard.getController(), hostCard, null)) { - return false; - } + if (!stAb.matchesValidParam("ValidSource", source)) { + return false; } return true; } diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantPutCounter.java b/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantPutCounter.java index 37952b2e563..d631550f831 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantPutCounter.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantPutCounter.java @@ -6,46 +6,38 @@ import forge.game.player.Player; public class StaticAbilityCantPutCounter { - public static boolean applyCantPutCounter(final StaticAbility staticAbility, final Card card, - final CounterType type) { - final Card hostCard = staticAbility.getHostCard(); + public static boolean applyCantPutCounter(final StaticAbility stAb, final Card card, final CounterType type) { - if (staticAbility.hasParam("CounterType")) { - CounterType t = CounterType.getType(staticAbility.getParam("CounterType")); + if (stAb.hasParam("CounterType")) { + CounterType t = CounterType.getType(stAb.getParam("CounterType")); if (t != null && !type.equals(t)) { return false; } } // for the other part - if (staticAbility.hasParam("ValidCard")) { - if (!card.isValid(staticAbility.getParam("ValidCard").split(","), hostCard.getController(), hostCard, null)) { - return false; - } - } else if (staticAbility.hasParam("ValidPlayer")) { + if (!stAb.matchesValidParam("ValidCard", card)) { + return false; + } else if (stAb.hasParam("ValidPlayer")) { // for the other part return false; } return true; } - public static boolean applyCantPutCounter(final StaticAbility staticAbility, final Player player, - final CounterType type) { - final Card hostCard = staticAbility.getHostCard(); + public static boolean applyCantPutCounter(final StaticAbility stAb, final Player player, final CounterType type) { - if (staticAbility.hasParam("CounterType")) { - CounterType t = CounterType.getType(staticAbility.getParam("CounterType")); + if (stAb.hasParam("CounterType")) { + CounterType t = CounterType.getType(stAb.getParam("CounterType")); if (t != null && !type.equals(t)) { return false; } } // for the other part - if (staticAbility.hasParam("ValidPlayer")) { - if (!player.isValid(staticAbility.getParam("ValidPlayer").split(","), hostCard.getController(), hostCard, null)) { - return false; - } - } else if (staticAbility.hasParam("ValidCard")) { + if (!stAb.matchesValidParam("ValidPlayer", player)) { + return false; + } else if (stAb.hasParam("ValidCard")) { // for the other part 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 656749c5285..2e67893bc55 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantTarget.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantTarget.java @@ -31,7 +31,7 @@ public class StaticAbilityCantTarget { /** * Apply can't target ability. * - * @param st + * @param stAb * the static ability * @param card * the card @@ -39,19 +39,18 @@ public class StaticAbilityCantTarget { * the spell/ability * @return true, if successful */ - public static boolean applyCantTargetAbility(final StaticAbility st, final Card card, + public static boolean applyCantTargetAbility(final StaticAbility stAb, final Card card, final SpellAbility spellAbility) { - final Card hostCard = st.getHostCard(); final Card source = spellAbility.getHostCard(); final Player activator = spellAbility.getActivatingPlayer(); - if (st.hasParam("ValidPlayer")) { + if (stAb.hasParam("ValidPlayer")) { return false; } - if (st.hasParam("AffectedZone")) { + if (stAb.hasParam("AffectedZone")) { boolean inZone = false; - for (final ZoneType zt : ZoneType.listValueOf(st.getParam("AffectedZone"))) { + for (final ZoneType zt : ZoneType.listValueOf(stAb.getParam("AffectedZone"))) { if (card.isInZone(zt)) { inZone = true; break; @@ -68,94 +67,86 @@ public class StaticAbilityCantTarget { } - if (st.hasParam("ValidCard") - && !card.isValid(st.getParam("ValidCard").split(","), hostCard.getController(), hostCard, null)) { + if (!stAb.matchesValidParam("ValidCard", card)) { return false; } - if (st.hasParam("Hexproof") && (activator != null)) { + if (stAb.hasParam("Hexproof") && (activator != null)) { for (KeywordInterface kw : activator.getKeywords()) { String k = kw.getOriginal(); if (k.startsWith("IgnoreHexproof")) { String[] m = k.split(":"); - if (card.isValid(m[1].split(","), activator, source, spellAbility)) { + if (card.isValid(m[1].split(","), activator, source, null)) { return false; } } } } - if (st.hasParam("Shroud") && (activator != null)) { + if (stAb.hasParam("Shroud") && (activator != null)) { for (KeywordInterface kw : activator.getKeywords()) { String k = kw.getOriginal(); if (k.startsWith("IgnoreShroud")) { String[] m = k.split(":"); - if (card.isValid(m[1].split(","), activator, source, spellAbility)) { + if (card.isValid(m[1].split(","), activator, source, null)) { return false; } } } } - return common(st, spellAbility); + return common(stAb, spellAbility); } - public static boolean applyCantTargetAbility(final StaticAbility st, final Player player, + public static boolean applyCantTargetAbility(final StaticAbility stAb, final Player player, final SpellAbility spellAbility) { - final Card hostCard = st.getHostCard(); final Card source = spellAbility.getHostCard(); final Player activator = spellAbility.getActivatingPlayer(); - if (st.hasParam("ValidCard") || st.hasParam("AffectedZone")) { + if (stAb.hasParam("ValidCard") || stAb.hasParam("AffectedZone")) { return false; } - if (st.hasParam("ValidPlayer") - && !player.isValid(st.getParam("ValidPlayer").split(","), hostCard.getController(), hostCard, null)) { + if (!stAb.matchesValidParam("ValidPlayer", player)) { return false; } - - if (st.hasParam("Hexproof") && (activator != null)) { + if (stAb.hasParam("Hexproof") && (activator != null)) { for (KeywordInterface kw : activator.getKeywords()) { String k = kw.getOriginal(); if (k.startsWith("IgnoreHexproof")) { String[] m = k.split(":"); - if (player.isValid(m[1].split(","), activator, source, spellAbility)) { + if (player.isValid(m[1].split(","), activator, source, null)) { return false; } } } } - return common(st, spellAbility); + return common(stAb, spellAbility); } - protected static boolean common(final StaticAbility st, final SpellAbility spellAbility) { - final Card hostCard = st.getHostCard(); + protected static boolean common(final StaticAbility stAb, final SpellAbility spellAbility) { final Card source = spellAbility.getHostCard(); final Player activator = spellAbility.getActivatingPlayer(); - if (st.hasParam("ValidSA") - && !spellAbility.isValid(st.getParam("ValidSA").split(","), hostCard.getController(), hostCard, spellAbility)) { + if (!stAb.matchesValidParam("ValidSA", spellAbility)) { return false; } - if (st.hasParam("ValidSource") - && !source.isValid(st.getParam("ValidSource").split(","), hostCard.getController(), hostCard, null)) { + if (!stAb.matchesValidParam("ValidSource", source)) { return false; } - if (st.hasParam("Activator") && (activator != null) - && !activator.isValid(st.getParam("Activator"), hostCard.getController(), hostCard, spellAbility)) { + if (!stAb.matchesValidParam("Activator", activator)) { return false; } if (spellAbility.hasParam("ValidTgts") && - (st.hasParam("SourceCanOnlyTarget") - && (!spellAbility.getParam("ValidTgts").contains(st.getParam("SourceCanOnlyTarget")) + (stAb.hasParam("SourceCanOnlyTarget") + && (!spellAbility.getParam("ValidTgts").contains(stAb.getParam("SourceCanOnlyTarget")) || spellAbility.getParam("ValidTgts").contains(",")) - || spellAbility.getParam("ValidTgts").contains("non" + st.getParam("SourceCanOnlyTarget") + || spellAbility.getParam("ValidTgts").contains("non" + stAb.getParam("SourceCanOnlyTarget") ) ) ){ diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbilityCastWithFlash.java b/forge-game/src/main/java/forge/game/staticability/StaticAbilityCastWithFlash.java index 08e4a883ecc..218b3996a85 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbilityCastWithFlash.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityCastWithFlash.java @@ -52,20 +52,16 @@ public class StaticAbilityCastWithFlash { public static boolean commonParts(final StaticAbility stAb, final SpellAbility sa, final Card card, final Player activator) { - final Card hostCard = stAb.getHostCard(); - if (stAb.hasParam("ValidCard") - && !card.isValid(stAb.getParam("ValidCard").split(","), hostCard.getController(), hostCard, null)) { + if (!stAb.matchesValidParam("ValidCard", card)) { return false; } - if (stAb.hasParam("ValidSA") - && !sa.isValid(stAb.getParam("ValidSA").split(","), hostCard.getController(), hostCard, null)) { + if (!stAb.matchesValidParam("ValidSA", sa)) { return false; } - if (stAb.hasParam("Caster") && (activator != null) - && !activator.isValid(stAb.getParam("Caster"), hostCard.getController(), hostCard, null)) { + if (!stAb.matchesValidParam("Caster", activator)) { return false; } return true; @@ -92,7 +88,7 @@ public class StaticAbilityCastWithFlash { } String[] valids = stAb.getParam("Targeting").split(","); - if (!Iterables.any(sa.getTargets(), GameObjectPredicates.restriction(valids, hostCard.getController(), hostCard, null))) { + if (!Iterables.any(sa.getTargets(), GameObjectPredicates.restriction(valids, hostCard.getController(), hostCard, stAb))) { 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 1608837e826..9765ef505aa 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbilityPreventDamage.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityPreventDamage.java @@ -49,13 +49,11 @@ public class StaticAbilityPreventDamage { final Card hostCard = stAb.getHostCard(); int restDamage = damage; - if (params.containsKey("Source") - && !source.isValid(params.get("Source").split(","), hostCard.getController(), hostCard, null)) { + if (params.containsKey("Source") && !stAb.matchesValid(source, params.get("Source").split(","))) { return restDamage; } - if (params.containsKey("Target") - && !target.isValid(params.get("Target").split(","), hostCard.getController(), hostCard, null)) { + if (params.containsKey("Target") && !stAb.matchesValid(target, params.get("Target").split(","))) { return restDamage; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAbandoned.java b/forge-game/src/main/java/forge/game/trigger/TriggerAbandoned.java index b55f49353e0..c646f0a23c7 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAbandoned.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAbandoned.java @@ -52,11 +52,9 @@ public class TriggerAbandoned extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - if (hasParam("ValidCard")) { - if (!matchesValid(runParams.get(AbilityKey.Scheme), getParam("ValidCard").split(","), - this.getHostCard())) { - return false; - } + + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Scheme))) { + return false; } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAdapt.java b/forge-game/src/main/java/forge/game/trigger/TriggerAdapt.java index 2dcb3de5a65..0ce58a9ec1a 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAdapt.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAdapt.java @@ -53,12 +53,8 @@ public class TriggerAdapt extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - final Card sac = (Card) runParams.get(AbilityKey.Card); - if (hasParam("ValidCard")) { - if (!sac.isValid(getParam("ValidCard").split(","), getHostCard().getController(), - getHostCard(), null)) { - return false; - } + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Card))) { + return false; } return true; } 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 65beac475be..40fd8f34f38 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttached.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttached.java @@ -54,20 +54,11 @@ public class TriggerAttached extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - final Card src = (Card) runParams.get(AbilityKey.AttachSource); - final Object tgt = runParams.get(AbilityKey.AttachTarget); - - if (hasParam("ValidSource")) { - if (!src.isValid(getParam("ValidSource").split(","), this.getHostCard().getController(), - this.getHostCard(), null)) { - return false; - } + if (!matchesValidParam("ValidSource", runParams.get(AbilityKey.AttachSource))) { + return false; } - - if (hasParam("ValidTarget")) { - if (!matchesValid(tgt, getParam("ValidTarget").split(","), this.getHostCard())) { - return false; - } + if (!matchesValidParam("ValidTarget", runParams.get(AbilityKey.AttachTarget))) { + return false; } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlocked.java b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlocked.java index 3c2b36834db..fa9ec293228 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlocked.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlocked.java @@ -55,11 +55,8 @@ public class TriggerAttackerBlocked extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - if (hasParam("ValidCard")) { - if (!matchesValid(runParams.get(AbilityKey.Attacker), getParam("ValidCard").split(","), - getHostCard())) { - return false; - } + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Attacker))) { + return false; } if (hasParam("MinBlockers")) { @@ -73,7 +70,7 @@ public class TriggerAttackerBlocked extends Trigger { int count = CardLists.getValidCardCount( (Iterable) runParams.get(AbilityKey.Blockers), getParam("ValidBlocker"), - getHostCard().getController(), getHostCard() + getHostCard().getController(), getHostCard(), this ); if ( count == 0 ) { diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlockedByCreature.java b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlockedByCreature.java index aca509fca2b..c5a93220546 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlockedByCreature.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlockedByCreature.java @@ -54,32 +54,32 @@ public class TriggerAttackerBlockedByCreature extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - final Object a = runParams.get(AbilityKey.Attacker), - b = runParams.get(AbilityKey.Blocker); - if (!(a instanceof Card && b instanceof Card)) { - return false; - } + final Object a = runParams.get(AbilityKey.Attacker), + b = runParams.get(AbilityKey.Blocker); + if (!(a instanceof Card && b instanceof Card)) { + return false; + } - final Card attacker = (Card) a, - blocker = (Card) b; + final Card attacker = (Card) a, + blocker = (Card) b; if (hasParam("ValidCard")) { - final String validCard = getParam("ValidCard"); - if (validCard.equals("LessPowerThanBlocker")) { - if (attacker.getNetPower() >= blocker.getNetPower()) { - return false; - } - } else if (!matchesValid(attacker, validCard.split(","), this.getHostCard())) { + final String validCard = getParam("ValidCard"); + if (validCard.equals("LessPowerThanBlocker")) { + if (attacker.getNetPower() >= blocker.getNetPower()) { + return false; + } + } else if (!matchesValid(attacker, validCard.split(","))) { return false; } } if (hasParam("ValidBlocker")) { - final String validBlocker = getParam("ValidBlocker"); - if (validBlocker.equals("LessPowerThanAttacker")) { + final String validBlocker = getParam("ValidBlocker"); + if (validBlocker.equals("LessPowerThanAttacker")) { if (blocker.getNetPower() >= attacker.getNetPower()) { return false; } - } else if (!matchesValid(blocker, validBlocker.split(","), this.getHostCard())) { + } else if (!matchesValid(blocker, validBlocker.split(","))) { return false; } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlockedOnce.java b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlockedOnce.java index 983e9d01f07..6087b8da847 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlockedOnce.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerBlockedOnce.java @@ -2,11 +2,8 @@ package forge.game.trigger; import java.util.Map; -import com.google.common.collect.Iterables; - import forge.game.ability.AbilityKey; import forge.game.card.Card; -import forge.game.card.CardPredicates; import forge.game.spellability.SpellAbility; import forge.util.Localizer; @@ -20,14 +17,8 @@ public class TriggerAttackerBlockedOnce extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - if (hasParam("ValidCard")) { - @SuppressWarnings("unchecked") - final Iterable srcs = (Iterable) runParams.get(AbilityKey.Attackers); - if (!Iterables.any(srcs, - CardPredicates.restriction(getParam("ValidCard").split(","), - getHostCard().getController(), getHostCard(), null))) { - return false; - } + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Attackers))) { + return false; } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblocked.java b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblocked.java index fa48e8e329a..80aac90eeca 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblocked.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblocked.java @@ -54,18 +54,14 @@ public class TriggerAttackerUnblocked extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - if (hasParam("ValidCard")) { - if (!matchesValid(runParams.get(AbilityKey.Attacker), getParam("ValidCard").split(","), - this.getHostCard())) { - return false; - } + + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Attacker))) { + return false; } - if (hasParam("ValidDefender")) { - if (!matchesValid(runParams.get(AbilityKey.Defender), getParam("ValidDefender").split(","), - this.getHostCard())) { - return false; - } + if (!matchesValidParam("ValidDefender", runParams.get(AbilityKey.Defender))) { + return false; } + return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblockedOnce.java b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblockedOnce.java index 30e89333357..b838d322950 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblockedOnce.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttackerUnblockedOnce.java @@ -17,13 +17,11 @@ */ package forge.game.trigger; -import forge.game.GameEntity; import forge.game.ability.AbilityKey; import forge.game.card.Card; import forge.game.spellability.SpellAbility; import forge.util.Localizer; -import java.util.List; import java.util.Map; /** @@ -54,32 +52,13 @@ public class TriggerAttackerUnblockedOnce extends Trigger { /** {@inheritDoc} * @param runParams*/ - @SuppressWarnings("unchecked") @Override public final boolean performTest(final Map runParams) { - if (hasParam("ValidDefenders")) { - boolean valid = false; - - final List srcs = (List) runParams.get(AbilityKey.Defenders); - for (GameEntity c : srcs) { - if (c.isValid(getParam("ValidDefenders").split(","), this.getHostCard().getController(), this.getHostCard(), null)) { - valid = true; - } - } - if (!valid) { - return false; - } - /* - if (hasParam("ValidAttackers")) { - // should be updated if a creature of a specific type attackes a defender - } - */ + if (!matchesValidParam("ValidDefenders", runParams.get(AbilityKey.Defenders))) { + return false; } - if (hasParam("ValidAttackingPlayer")) { - if (!matchesValid(runParams.get(AbilityKey.AttackingPlayer), - getParam("ValidAttackingPlayer").split(","), this.getHostCard())) { - return false; - } + if (!matchesValidParam("ValidAttackingPlayer", runParams.get(AbilityKey.AttackingPlayer))) { + return false; } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAttackersDeclared.java b/forge-game/src/main/java/forge/game/trigger/TriggerAttackersDeclared.java index 010104e4868..8acaf2d9ea3 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttackersDeclared.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttackersDeclared.java @@ -17,13 +17,11 @@ */ package forge.game.trigger; -import forge.game.GameEntity; import forge.game.ability.AbilityKey; import forge.game.card.Card; import forge.game.spellability.SpellAbility; import forge.util.Localizer; -import java.util.List; import java.util.Map; /** @@ -48,41 +46,18 @@ public class TriggerAttackersDeclared extends Trigger { /** {@inheritDoc} * @param runParams*/ - @SuppressWarnings("unchecked") @Override public final boolean performTest(final Map runParams) { - if (hasParam("AttackingPlayer")) { - if (!matchesValid(runParams.get(AbilityKey.AttackingPlayer), - getParam("AttackingPlayer").split(","), this.getHostCard())) { - return false; - } + if (!matchesValidParam("AttackingPlayer", runParams.get(AbilityKey.AttackingPlayer))) { + return false; } - if (hasParam("AttackedTarget")) { - boolean valid = false; - List list = (List) runParams.get(AbilityKey.AttackedTarget); - for (GameEntity b : list) { - if (matchesValid(b, getParam("AttackedTarget").split(","), this.getHostCard())) { - valid = true; - break; - } - } - if (!valid) { - return false; - } + if (!matchesValidParam("AttackedTarget", runParams.get(AbilityKey.AttackedTarget))) { + return false; + } + if (!matchesValidParam("ValidAttackers", runParams.get(AbilityKey.Attackers))) { + return false; } - if (hasParam("ValidAttackers")) { - boolean valid = false; - final Iterable srcs = (Iterable) runParams.get(AbilityKey.Attackers); - for (Card c : srcs) { - if (c.isValid(getParam("ValidAttackers").split(","), this.getHostCard().getController(), this.getHostCard(), null)) { - valid = true; - } - } - if (!valid) { - return false; - } - } return true; } 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 39ed08eb070..cd95b7b6eeb 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAttacks.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAttacks.java @@ -57,19 +57,13 @@ public class TriggerAttacks extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - if (hasParam("ValidCard")) { - if (!matchesValid(runParams.get(AbilityKey.Attacker), getParam("ValidCard").split(","), - this.getHostCard())) { - return false; - } + + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Attacker))) { + return false; } - if (hasParam("Attacked")) { - GameEntity attacked = (GameEntity) runParams.get(AbilityKey.Attacked); - if (!attacked.isValid(getParam("Attacked").split(",") - , this.getHostCard().getController(), this.getHostCard(), null)) { - return false; - } + if (!matchesValidParam("Attacked", runParams.get(AbilityKey.Attacked))) { + return false; } if (hasParam("Alone")) { diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerBecomeMonarch.java b/forge-game/src/main/java/forge/game/trigger/TriggerBecomeMonarch.java index ee9033a0054..dcee5a36676 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerBecomeMonarch.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerBecomeMonarch.java @@ -16,20 +16,14 @@ public class TriggerBecomeMonarch extends Trigger { @Override public boolean performTest(Map runParams) { - final Card host = this.getHostCard(); + final Card host = getHostCard(); final Game game = host.getGame(); - if (hasParam("ValidPlayer")) { - if (!matchesValid(runParams.get(AbilityKey.Player), getParam("ValidPlayer").split(","), - host)) { - return false; - } - } - if (hasParam("BeginTurn")) { - if (!matchesValid(game.getMonarchBeginTurn(), getParam("BeginTurn").split(","), - host)) { - return false; - } + if (!matchesValidParam("ValidPlayer", runParams.get(AbilityKey.Player))) { + return false; + } + if (!matchesValidParam("BeginTurn", game.getMonarchBeginTurn())) { + return false; } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerBecomeMonstrous.java b/forge-game/src/main/java/forge/game/trigger/TriggerBecomeMonstrous.java index dd08102da7a..8f0df39912a 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerBecomeMonstrous.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerBecomeMonstrous.java @@ -54,11 +54,8 @@ public class TriggerBecomeMonstrous extends Trigger { * @param runParams*/ @Override public final boolean performTest(Map runParams) { - if (hasParam("ValidCard")) { - if (!matchesValid(runParams.get(AbilityKey.Card), getParam("ValidCard").split(","), - this.getHostCard())) { - return false; - } + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Card))) { + return false; } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerBecomeRenowned.java b/forge-game/src/main/java/forge/game/trigger/TriggerBecomeRenowned.java index ad874601269..c07cd025456 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerBecomeRenowned.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerBecomeRenowned.java @@ -54,11 +54,8 @@ public class TriggerBecomeRenowned extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - if (hasParam("ValidCard")) { - if (!matchesValid(runParams.get(AbilityKey.Card), getParam("ValidCard").split(","), - this.getHostCard())) { - return false; - } + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Card))) { + return false; } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTarget.java b/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTarget.java index a77304e9dba..ef0a3a02afa 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTarget.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTarget.java @@ -73,17 +73,16 @@ public class TriggerBecomesTarget extends Trigger { return false; } String valid[] = getParam("ValidSource").split(","); - if (!matchesValid(source, valid, getHostCard())) { - if (!matchesValid(source.getHostCard(), valid, getHostCard())) { + if (!matchesValid(source, valid)) { + if (!matchesValid(source.getHostCard(), valid)) { return false; } } } - if (hasParam("ValidTarget")) { - if (!matchesValid(runParams.get(AbilityKey.Target), getParam("ValidTarget").split(","), getHostCard())) { - return false; - } + if (!matchesValidParam("ValidTarget", runParams.get(AbilityKey.Target))) { + return false; } + if (hasParam("FirstTime")) { if (!runParams.containsKey(AbilityKey.FirstTime)) { return false; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTargetOnce.java b/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTargetOnce.java index 2b071edb560..fec23184bdb 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTargetOnce.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerBecomesTargetOnce.java @@ -17,7 +17,6 @@ */ package forge.game.trigger; -import forge.game.GameObject; import forge.game.ability.AbilityKey; import forge.game.card.Card; import forge.game.spellability.SpellAbility; @@ -54,25 +53,14 @@ public class TriggerBecomesTargetOnce extends Trigger { /** {@inheritDoc} * @param runParams*/ - @SuppressWarnings("unchecked") @Override public final boolean performTest(final Map runParams) { - if (hasParam("ValidSource")) { - if (!matchesValid(((SpellAbility) runParams.get(AbilityKey.SourceSA)).getHostCard(), getParam("ValidSource").split(","), this.getHostCard())) { - return false; - } + + if (!matchesValidParam("ValidSource", ((SpellAbility) runParams.get(AbilityKey.SourceSA)).getHostCard())) { + return false; } - if (hasParam("ValidTarget")) { - boolean valid = false; - for (GameObject b : (Iterable) runParams.get(AbilityKey.Targets)) { - if (matchesValid(b, getParam("ValidTarget").split(","), this.getHostCard())) { - valid = true; - break; - } - } - if (!valid) { - return false; - } + if (!matchesValidParam("ValidTarget", runParams.get(AbilityKey.Targets))) { + return false; } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerBlocks.java b/forge-game/src/main/java/forge/game/trigger/TriggerBlocks.java index f8362c0d25b..de01d5fabca 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerBlocks.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerBlocks.java @@ -54,35 +54,13 @@ public class TriggerBlocks extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - if (hasParam("ValidCard")) { - String validBlocker = getParam("ValidCard"); - if (!matchesValid(runParams.get(AbilityKey.Blocker), validBlocker.split(","), this.getHostCard())) { - return false; - } + + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Blocker))) { + return false; } - if (hasParam("ValidBlocked")) { - final String[] validBlockedSplit = getParam("ValidBlocked").split(","); - final Object a = runParams.get(AbilityKey.Attackers); - if (!(a instanceof Iterable)) { - return false; - } - - final Iterable attackers = (Iterable) a; - boolean foundMatch = false; - for (final Object o : attackers) { - if (!(o instanceof Card)) { - continue; - } - if (matchesValid(o, validBlockedSplit, this.getHostCard())) { - foundMatch = true; - break; - } - } - - if (!foundMatch) { - return false; - } + if (!matchesValidParam("ValidBlocked", runParams.get(AbilityKey.Attackers))) { + return false; } return true; 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 d68819e5738..5380c903790 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerChampioned.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerChampioned.java @@ -55,21 +55,15 @@ public class TriggerChampioned extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - final Card championed = (Card) runParams.get(AbilityKey.Championed); - final Card source = (Card) runParams.get(AbilityKey.Card); - if (hasParam("ValidCard")) { - if (!championed.isValid(getParam("ValidCard").split(","), - this.getHostCard().getController(), this.getHostCard(), null)) { - return false; - } + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Championed))) { + return false; } - if (hasParam("ValidSource")) { - if (!source.isValid(getParam("ValidSource").split(","), - this.getHostCard().getController(), this.getHostCard(), null)) { - return false; - } + + if (!matchesValidParam("ValidSource", runParams.get(AbilityKey.Card))) { + return false; } + return true; } 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 e499c248c1e..fcda3de6956 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerChangesController.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerChangesController.java @@ -54,19 +54,12 @@ public class TriggerChangesController extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - final Card moved = (Card) runParams.get(AbilityKey.Card); - if (hasParam("ValidCard")) { - if (!moved.isValid(getParam("ValidCard").split(","), this.getHostCard().getController(), - this.getHostCard(), null)) { - return false; - } + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Card))) { + return false; } - if (hasParam("ValidOriginalController")) { - if (!matchesValid(runParams.get(AbilityKey.OriginalController), getParam("ValidOriginalController").split(","), - this.getHostCard())) { - return false; - } + if (!matchesValidParam("ValidOriginalController", runParams.get(AbilityKey.OriginalController))) { + return false; } return true; 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 ffd26a8f1d0..2924b404d42 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerChangesZone.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerChangesZone.java @@ -107,7 +107,7 @@ public class TriggerChangesZone extends Trigger { moved = (Card) runParams.get(AbilityKey.CardLKI); } - if (!matchesValid(moved, getParam("ValidCard").split(","), getHostCard())) { + if (!matchesValid(moved, getParam("ValidCard").split(","))) { return false; } } @@ -120,8 +120,8 @@ public class TriggerChangesZone extends Trigger { if (cause == null) { return false; } - if (!matchesValid(cause, getParam("ValidCause").split(","), getHostCard())) { - if (!matchesValid(cause.getHostCard(), getParam("ValidCause").split(","), getHostCard())) { + if (!matchesValid(cause, getParam("ValidCause").split(","))) { + if (!matchesValid(cause.getHostCard(), getParam("ValidCause").split(","))) { return false; } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerChangesZoneAll.java b/forge-game/src/main/java/forge/game/trigger/TriggerChangesZoneAll.java index 380f5b84d24..9cbb18ebadf 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerChangesZoneAll.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerChangesZoneAll.java @@ -53,6 +53,6 @@ public class TriggerChangesZoneAll extends Trigger { final String valid = this.getParamOrDefault("ValidCards", null); - return table.filterCards(origin, destination, valid, getHostCard(), null); + return table.filterCards(origin, destination, valid, getHostCard(), this); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerClashed.java b/forge-game/src/main/java/forge/game/trigger/TriggerClashed.java index 568405652f6..fe65f778155 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerClashed.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerClashed.java @@ -53,11 +53,8 @@ public class TriggerClashed extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - if (hasParam("ValidPlayer")) { - if (!matchesValid(runParams.get(AbilityKey.Player), getParam("ValidPlayer").split(","), - this.getHostCard())) { - return false; - } + if (!matchesValidParam("ValidPlayer", runParams.get(AbilityKey.Player))) { + return false; } if (hasParam("Won")) { 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 67db772703d..3cf55d0f868 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerCounterAdded.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerCounterAdded.java @@ -22,7 +22,6 @@ import java.util.Map; import forge.game.ability.AbilityKey; import forge.game.card.Card; import forge.game.card.CounterType; -import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.util.Expressions; import forge.util.Localizer; @@ -58,44 +57,18 @@ public class TriggerCounterAdded extends Trigger { public final boolean performTest(final Map runParams) { final CounterType addedType = (CounterType) runParams.get(AbilityKey.CounterType); - if (hasParam("ValidCard")) { - if (!runParams.containsKey(AbilityKey.Card)) - return false; - - final Card addedTo = (Card) runParams.get(AbilityKey.Card); - if (!addedTo.isValid(getParam("ValidCard").split(","), getHostCard().getController(), - getHostCard(), null)) { - return false; - } + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Card))) { + return false; } - if (hasParam("ValidPlayer")) { - if (!runParams.containsKey(AbilityKey.Player)) - return false; - - final Player addedTo = (Player) runParams.get(AbilityKey.Player); - if (!addedTo.isValid(getParam("ValidPlayer").split(","), getHostCard().getController(), - getHostCard(), null)) { - return false; - } + if (!matchesValidParam("ValidPlayer", runParams.get(AbilityKey.Player))) { + return false; } - - if (hasParam("ValidSource")) { - if (!runParams.containsKey(AbilityKey.Source)) - return false; - final Card source = (Card) runParams.get(AbilityKey.Source); - - if (source == null) { - return false; - } - - if (!source.isValid(getParam("ValidSource").split(","), getHostCard().getController(), - getHostCard(), null)) { - return false; - } + if (!matchesValidParam("ValidSource", runParams.get(AbilityKey.Source))) { + return false; } - + if (hasParam("CounterType")) { final String type = getParam("CounterType"); if (!type.equals(addedType.toString())) { diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerCounterAddedAll.java b/forge-game/src/main/java/forge/game/trigger/TriggerCounterAddedAll.java index b87d585f774..b3b34714aa4 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerCounterAddedAll.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerCounterAddedAll.java @@ -50,6 +50,6 @@ public class TriggerCounterAddedAll extends Trigger { CounterType counterType = CounterType.getType(getParam("CounterType")); String valid = getParam("Valid"); - return table.filterTable(counterType, valid, getHostCard(), null); + return table.filterTable(counterType, valid, getHostCard(), this); } } 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 5a3c28347a3..a12cab082eb 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerCounterAddedOnce.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerCounterAddedOnce.java @@ -22,7 +22,6 @@ import java.util.Map; import forge.game.ability.AbilityKey; import forge.game.card.Card; import forge.game.card.CounterType; -import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.util.Localizer; @@ -64,42 +63,14 @@ public class TriggerCounterAddedOnce extends Trigger { } } - if (hasParam("ValidCard")) { - if (!runParams.containsKey(AbilityKey.Card)) - return false; - - final Card addedTo = (Card) runParams.get(AbilityKey.Card); - if (!addedTo.isValid(getParam("ValidCard").split(","), getHostCard().getController(), - getHostCard(), null)) { - return false; - } + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Card))) { + return false; } - - if (hasParam("ValidPlayer")) { - if (!runParams.containsKey(AbilityKey.Player)) - return false; - - final Player addedTo = (Player) runParams.get(AbilityKey.Player); - if (!addedTo.isValid(getParam("ValidPlayer").split(","), getHostCard().getController(), - getHostCard(), null)) { - return false; - } + if (!matchesValidParam("ValidPlayer", runParams.get(AbilityKey.Player))) { + return false; } - - if (hasParam("ValidSource")) { - if (!runParams.containsKey(AbilityKey.Source)) - return false; - - final Player source = (Player) runParams.get(AbilityKey.Source); - - if (source == null) { - return false; - } - - if (!source.isValid(getParam("ValidSource").split(","), getHostCard().getController(), - getHostCard(), null)) { - return false; - } + if (!matchesValidParam("ValidSource", runParams.get(AbilityKey.Source))) { + return false; } return true; 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 e2623c7806b..49d00eac220 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerCounterRemoved.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerCounterRemoved.java @@ -59,11 +59,8 @@ public class TriggerCounterRemoved extends Trigger { final CounterType addedType = (CounterType) runParams.get(AbilityKey.CounterType); final Integer addedNewCounterAmount = (Integer) runParams.get(AbilityKey.NewCounterAmount); - if (hasParam("ValidCard")) { - if (!addedTo.isValid(getParam("ValidCard").split(","), this.getHostCard().getController(), - this.getHostCard(), null)) { - return false; - } + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Card))) { + return false; } if (hasParam("CounterType")) { diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerCounterRemovedOnce.java b/forge-game/src/main/java/forge/game/trigger/TriggerCounterRemovedOnce.java index 5df7ba0c723..2b8b5188ca8 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerCounterRemovedOnce.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerCounterRemovedOnce.java @@ -58,11 +58,8 @@ public class TriggerCounterRemovedOnce extends Trigger { final Card removedFrom = (Card) runParams.get(AbilityKey.Card); final CounterType removedType = (CounterType) runParams.get(AbilityKey.CounterType); - if (hasParam("ValidCard")) { - if (!removedFrom.isValid(getParam("ValidCard").split(","), this.getHostCard().getController(), - this.getHostCard(), null)) { - return false; - } + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Card))) { + return false; } if (hasParam("CounterType")) { diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerCountered.java b/forge-game/src/main/java/forge/game/trigger/TriggerCountered.java index 3e72d6df061..7bd0ede251d 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerCountered.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerCountered.java @@ -54,30 +54,16 @@ public class TriggerCountered extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - if (hasParam("ValidCard")) { - if (!matchesValid(runParams.get(AbilityKey.Card), getParam("ValidCard").split(","), - this.getHostCard())) { - return false; - } + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Card))) { + return false; + } + if (!matchesValidParam("ValidPlayer", runParams.get(AbilityKey.Player))) { + return false; + } + if (!matchesValidParam("ValidCause", runParams.get(AbilityKey.Cause))) { + return false; } - if (hasParam("ValidPlayer")) { - if (!matchesValid(runParams.get(AbilityKey.Player), getParam("ValidPlayer").split(","), - this.getHostCard())) { - return false; - } - } - - if (hasParam("ValidCause")) { - if (runParams.get(AbilityKey.Cause) == null) { - return false; - } - if (!matchesValid(runParams.get(AbilityKey.Cause), getParam("ValidCause").split(","), - this.getHostCard())) { - return false; - } - } - if (hasParam("ValidType")) { // TODO: if necessary, expand the syntax to account for multiple valid types (e.g. Spell,Ability) SpellAbility ctrdSA = (SpellAbility) runParams.get(AbilityKey.CounteredSA); diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerCrewed.java b/forge-game/src/main/java/forge/game/trigger/TriggerCrewed.java index 2c8350bbe38..bc39ae02f30 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerCrewed.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerCrewed.java @@ -2,7 +2,6 @@ package forge.game.trigger; import forge.game.ability.AbilityKey; import forge.game.card.Card; -import forge.game.card.CardCollection; import forge.game.spellability.SpellAbility; import forge.util.Localizer; @@ -16,24 +15,11 @@ public class TriggerCrewed extends Trigger { @Override public boolean performTest(Map runParams) { - if (hasParam("ValidVehicle")) { - if (!matchesValid(runParams.get(AbilityKey.Vehicle), getParam("ValidVehicle").split(","), - this.getHostCard())) { - return false; - } + if (!matchesValidParam("ValidVehicle", runParams.get(AbilityKey.Vehicle))) { + return false; } - if (hasParam("ValidCrew")) { - if (runParams.get(AbilityKey.Crew) == null) { - return false; - } - - boolean passes = false; - for (Object member : (CardCollection) runParams.get(AbilityKey.Crew)) { - passes |= matchesValid(member, getParam("ValidCrew").split(","), - this.getHostCard()); - } - if (!passes) - return passes; + if (!matchesValidParam("ValidCrew", runParams.get(AbilityKey.Crew))) { + return false; } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerCycled.java b/forge-game/src/main/java/forge/game/trigger/TriggerCycled.java index e72b72c6a60..9f0ff54762f 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerCycled.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerCycled.java @@ -19,7 +19,6 @@ package forge.game.trigger; import forge.game.ability.AbilityKey; import forge.game.card.Card; -import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.util.Localizer; @@ -68,17 +67,11 @@ public class TriggerCycled extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - if (hasParam("ValidCard")) { - if (!matchesValid(runParams.get(AbilityKey.Card), getParam("ValidCard").split(","), getHostCard())) { - return false; - } + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Card))) { + return false; } - - if (hasParam("ValidPlayer")) { - Player p = (Player) runParams.get(AbilityKey.Player); - if (!matchesValid(p, getParam("ValidPlayer").split(","), getHostCard())) { - return false; - } + if (!matchesValidParam("ValidPlayer", runParams.get(AbilityKey.Player))) { + return false; } if (hasParam("OnlyFirst")) { diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDamageAll.java b/forge-game/src/main/java/forge/game/trigger/TriggerDamageAll.java index 53f48c61cfb..12c64f89130 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDamageAll.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDamageAll.java @@ -29,13 +29,13 @@ public class TriggerDamageAll extends Trigger { } } final CardDamageMap table = (CardDamageMap) runParams.get(AbilityKey.DamageMap); - return !table.filteredMap(getParam("ValidSource"), getParam("ValidTarget"), getHostCard(), null).isEmpty(); + return !table.filteredMap(getParam("ValidSource"), getParam("ValidTarget"), getHostCard(), this).isEmpty(); } @Override public void setTriggeringObjects(SpellAbility sa, Map runParams) { CardDamageMap table = (CardDamageMap) runParams.get(AbilityKey.DamageMap); - table = table.filteredMap(getParam("ValidSource"), getParam("ValidTarget"), getHostCard(), null); + table = table.filteredMap(getParam("ValidSource"), getParam("ValidTarget"), getHostCard(), this); sa.setTriggeringObject(AbilityKey.DamageAmount, table.totalAmount()); sa.setTriggeringObject(AbilityKey.Sources, table.rowKeySet()); diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDamageDealtOnce.java b/forge-game/src/main/java/forge/game/trigger/TriggerDamageDealtOnce.java index a4faa7ced1b..51535142616 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDamageDealtOnce.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDamageDealtOnce.java @@ -59,7 +59,6 @@ public class TriggerDamageDealtOnce extends Trigger { @SuppressWarnings("unchecked") @Override public final boolean performTest(final Map runParams) { - final Card srcs = (Card) runParams.get(AbilityKey.DamageSource); if (hasParam("CombatDamage")) { if (getParam("CombatDamage").equals("True")) { @@ -81,10 +80,8 @@ public class TriggerDamageDealtOnce extends Trigger { } } - if (hasParam("ValidSource")) { - if (!matchesValid(srcs, getParam("ValidSource").split(","), getHostCard())) { - return false; - } + if (!matchesValidParam("ValidSource", runParams.get(AbilityKey.DamageSource))) { + return false; } return true; @@ -113,7 +110,7 @@ public class TriggerDamageDealtOnce extends Trigger { public int getDamageAmount(Map damageMap) { int result = 0; for (Map.Entry e : damageMap.entrySet()) { - if (!hasParam("ValidTarget") || matchesValid(e.getKey(), getParam("ValidTarget").split(","), getHostCard())) { + if (matchesValidParam("ValidTarget", e.getKey())) { result += e.getValue(); } } @@ -126,7 +123,7 @@ public class TriggerDamageDealtOnce extends Trigger { } Set result = Sets.newHashSet(); for (GameEntity e : damageMap.keySet()) { - if (matchesValid(e, getParam("ValidTarget").split(","), getHostCard())) { + if (matchesValidParam("ValidTarget", e)) { result.add(e); } } 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 1c36ef0d5e3..67c2e680c82 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDamageDone.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDamageDone.java @@ -56,16 +56,11 @@ public class TriggerDamageDone extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - if (hasParam("ValidSource")) { - if (!matchesValid(runParams.get(AbilityKey.DamageSource), getParam("ValidSource").split(","), getHostCard())) { - return false; - } + if (!matchesValidParam("ValidSource", runParams.get(AbilityKey.DamageSource))) { + return false; } - - if (hasParam("ValidTarget")) { - if (!matchesValid(runParams.get(AbilityKey.DamageTarget), getParam("ValidTarget").split(","), getHostCard())) { - return false; - } + if (!matchesValidParam("ValidTarget", runParams.get(AbilityKey.DamageTarget))) { + return false; } if (hasParam("CombatDamage")) { diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDamageDoneOnce.java b/forge-game/src/main/java/forge/game/trigger/TriggerDamageDoneOnce.java index 72b6d9c4501..2239977f8df 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDamageDoneOnce.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDamageDoneOnce.java @@ -5,7 +5,6 @@ import java.util.Set; import com.google.common.collect.Sets; -import forge.game.GameEntity; import forge.game.ability.AbilityKey; import forge.game.card.Card; import forge.game.spellability.SpellAbility; @@ -21,7 +20,6 @@ public class TriggerDamageDoneOnce extends Trigger { @SuppressWarnings("unchecked") @Override public boolean performTest(Map runParams) { - final GameEntity tgt = (GameEntity) runParams.get(AbilityKey.DamageTarget); if (hasParam("CombatDamage")) { if (getParam("CombatDamage").equals("True")) { @@ -43,14 +41,10 @@ public class TriggerDamageDoneOnce extends Trigger { } } - if (hasParam("ValidTarget")) { - if (!matchesValid(tgt, getParam("ValidTarget").split(","), getHostCard())) { - return false; - } + if (!matchesValidParam("ValidTarget", runParams.get(AbilityKey.DamageTarget))) { + return false; } - - return true; } @@ -77,7 +71,7 @@ public class TriggerDamageDoneOnce extends Trigger { public int getDamageAmount(Map damageMap) { int result = 0; for (Map.Entry e : damageMap.entrySet()) { - if (!hasParam("ValidSource") || matchesValid(e.getKey(), getParam("ValidSource").split(","), getHostCard())) { + if (matchesValidParam("ValidSource", e.getKey())) { result += e.getValue(); } } @@ -90,7 +84,7 @@ public class TriggerDamageDoneOnce extends Trigger { } Set result = Sets.newHashSet(); for (Card c : damageMap.keySet()) { - if (matchesValid(c, getParam("ValidSource").split(","), getHostCard())) { + if (matchesValid(c, getParam("ValidSource").split(","))) { result.add(c); } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDamagePrevented.java b/forge-game/src/main/java/forge/game/trigger/TriggerDamagePrevented.java index 90ee1d2f156..f64c1df746a 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDamagePrevented.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDamagePrevented.java @@ -56,20 +56,13 @@ public class TriggerDamagePrevented extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - final Card src = (Card) runParams.get(AbilityKey.DamageSource); - final Object tgt = runParams.get(AbilityKey.DamageTarget); - if (hasParam("ValidSource")) { - if (!src.isValid(getParam("ValidSource").split(","), this.getHostCard().getController(), - this.getHostCard(), null)) { - return false; - } + if (!matchesValidParam("ValidSource", runParams.get(AbilityKey.DamageSource))) { + return false; } - if (hasParam("ValidTarget")) { - if (!matchesValid(tgt, getParam("ValidTarget").split(","), this.getHostCard())) { - return false; - } + if (!matchesValidParam("ValidTarget", runParams.get(AbilityKey.DamageTarget))) { + return false; } if (hasParam("CombatDamage")) { diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDamagePreventedOnce.java b/forge-game/src/main/java/forge/game/trigger/TriggerDamagePreventedOnce.java index 0cdfb575b20..16a56200709 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDamagePreventedOnce.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDamagePreventedOnce.java @@ -55,23 +55,14 @@ public class TriggerDamagePreventedOnce extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - final Object tgt = runParams.get(AbilityKey.DamageTarget); - if (hasParam("ValidTarget")) { - if (!matchesValid(tgt, getParam("ValidTarget").split(","), this.getHostCard())) { - return false; - } + if (!matchesValidParam("ValidTarget", runParams.get(AbilityKey.DamageTarget))) { + return false; } if (hasParam("CombatDamage")) { - if (getParam("CombatDamage").equals("True")) { - if (!((Boolean) runParams.get(AbilityKey.IsCombatDamage))) { - return false; - } - } else if (getParam("CombatDamage").equals("False")) { - if (((Boolean) runParams.get(AbilityKey.IsCombatDamage))) { - return false; - } + if (getParam("CombatDamage").equals("True") != ((Boolean) runParams.get(AbilityKey.IsCombatDamage))) { + return false; } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDestroyed.java b/forge-game/src/main/java/forge/game/trigger/TriggerDestroyed.java index be79de6d14c..c76097d6535 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDestroyed.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDestroyed.java @@ -54,15 +54,11 @@ public class TriggerDestroyed extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - if (hasParam("ValidCauser")) { - if (!matchesValid(runParams.get(AbilityKey.Causer), getParam("ValidCauser").split(","), getHostCard())) { - return false; - } + if (!matchesValidParam("ValidCauser", runParams.get(AbilityKey.Causer))) { + return false; } - if (hasParam("ValidCard")) { - if (!matchesValid(runParams.get(AbilityKey.Card), getParam("ValidCard").split(","), getHostCard())) { - return false; - } + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Card))) { + return false; } return 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 c05f58bbbb4..c199a14aae9 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDevoured.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDevoured.java @@ -54,11 +54,10 @@ public class TriggerDevoured extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - final Card sac = (Card) runParams.get(AbilityKey.Devoured); - if (hasParam("ValidDevoured")) { - return sac.isValid(getParam("ValidDevoured").split(","), this.getHostCard().getController(), - this.getHostCard(), null); + if (!matchesValidParam("ValidDevoured", runParams.get(AbilityKey.Devoured))) { + return false; } + return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDiscarded.java b/forge-game/src/main/java/forge/game/trigger/TriggerDiscarded.java index f3c38da306d..28733a15e60 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDiscarded.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDiscarded.java @@ -54,29 +54,16 @@ public class TriggerDiscarded extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - if (hasParam("ValidCard")) { - if (!matchesValid(runParams.get(AbilityKey.Card), getParam("ValidCard").split(","), - this.getHostCard())) { - return false; - } + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Card))) { + return false; + } + if (!matchesValidParam("ValidPlayer", runParams.get(AbilityKey.Player))) { + return false; + } + if (!matchesValidParam("ValidCause", runParams.get(AbilityKey.Cause))) { + return false; } - if (hasParam("ValidPlayer")) { - if (!matchesValid(runParams.get(AbilityKey.Player), getParam("ValidPlayer").split(","), - this.getHostCard())) { - return false; - } - } - - if (hasParam("ValidCause")) { - if (runParams.get(AbilityKey.Cause) == null) { - return false; - } - if (!matchesValid(runParams.get(AbilityKey.Cause), getParam("ValidCause").split(","), - this.getHostCard())) { - return false; - } - } if (hasParam("IsMadness")) { Boolean madness = (Boolean) runParams.get(AbilityKey.IsMadness); if (getParam("IsMadness").equals("True") ^ madness) { diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerDiscardedAll.java b/forge-game/src/main/java/forge/game/trigger/TriggerDiscardedAll.java index cb2837e71d6..c61f90e00fa 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDiscardedAll.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDiscardedAll.java @@ -16,21 +16,11 @@ public class TriggerDiscardedAll extends Trigger { @Override public boolean performTest(Map runParams) { - if (hasParam("ValidPlayer")) { - if (!matchesValid(runParams.get(AbilityKey.Player), getParam("ValidPlayer").split(","), - this.getHostCard())) { - return false; - } + if (!matchesValidParam("ValidPlayer", runParams.get(AbilityKey.Player))) { + return false; } - - if (hasParam("ValidCause")) { - if (runParams.get(AbilityKey.Cause) == null) { - return false; - } - if (!matchesValid(runParams.get(AbilityKey.Cause), getParam("ValidCause").split(","), - this.getHostCard())) { - return false; - } + if (!matchesValidParam("ValidCause", runParams.get(AbilityKey.Cause))) { + return false; } if (hasParam("FirstTime")) { 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 742bf9b7e63..430887f2e24 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerDrawn.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerDrawn.java @@ -59,20 +59,13 @@ public class TriggerDrawn extends Trigger { @Override public final boolean performTest(final Map runParams) { final Game game = getHostCard().getGame(); - final Card draw = ((Card) runParams.get(AbilityKey.Card)); final int number = ((Integer) runParams.get(AbilityKey.Number)); - if (hasParam("ValidCard")) { - if (!draw.isValid(getParam("ValidCard").split(","), getHostCard().getController(), getHostCard(), null)) { - return false; - } + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Card))) { + return false; } - - if (hasParam("ValidPlayer")) { - if (!matchesValid(runParams.get(AbilityKey.Player), getParam("ValidPlayer").split(","), - this.getHostCard())) { - return false; - } + if (!matchesValidParam("ValidPlayer", runParams.get(AbilityKey.Player))) { + return false; } if (hasParam("Number")) { 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 14f4471e507..6bd95e77151 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerEvolved.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerEvolved.java @@ -53,10 +53,8 @@ public class TriggerEvolved extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - final Card sac = (Card) runParams.get(AbilityKey.Card); - if (hasParam("ValidCard")) { - return sac.isValid(getParam("ValidCard").split(","), getHostCard().getController(), - getHostCard(), null); + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Card))) { + return false; } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerExcessDamage.java b/forge-game/src/main/java/forge/game/trigger/TriggerExcessDamage.java index 6ebbe3c3b76..3137f9cfbaa 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerExcessDamage.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerExcessDamage.java @@ -49,16 +49,11 @@ public class TriggerExcessDamage extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - if (hasParam("ValidSource")) { - if (!matchesValid(runParams.get(AbilityKey.DamageSource), getParam("ValidSource").split(","), getHostCard())) { - return false; - } + if (!matchesValidParam("ValidSource", runParams.get(AbilityKey.DamageSource))) { + return false; } - - if (hasParam("ValidTarget")) { - if (!matchesValid(runParams.get(AbilityKey.DamageTarget), getParam("ValidTarget").split(","), getHostCard())) { - return false; - } + if (!matchesValidParam("ValidTarget", runParams.get(AbilityKey.DamageTarget))) { + return false; } if (hasParam("CombatDamage")) { diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerExerted.java b/forge-game/src/main/java/forge/game/trigger/TriggerExerted.java index 521192734d5..916efa7a0e9 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerExerted.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerExerted.java @@ -24,10 +24,8 @@ public class TriggerExerted extends Trigger { @Override public boolean performTest(Map runParams) { - final Card exerter = (Card) runParams.get(AbilityKey.Card); - if (hasParam("ValidCard")) { - return exerter.isValid(getParam("ValidCard").split(","), this.getHostCard().getController(), - this.getHostCard(), null); + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Card))) { + return false; } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerExiled.java b/forge-game/src/main/java/forge/game/trigger/TriggerExiled.java index af999023b8e..39cecbbcee2 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerExiled.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerExiled.java @@ -70,26 +70,22 @@ public class TriggerExiled extends Trigger { } } - if (hasParam("ValidCard")) { - Card moved = (Card) runParams.get(AbilityKey.Card); - - if (!moved.isValid(getParam("ValidCard").split(","), getHostCard().getController(), - getHostCard(), null)) { - return false; - } + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Card))) { + return false; } if (hasParam("ValidCause")) { - if (!runParams.containsKey(AbilityKey.Cause) ) { + if (!runParams.containsKey(AbilityKey.Cause)) { return false; } SpellAbility cause = (SpellAbility) runParams.get(AbilityKey.Cause); if (cause == null) { return false; } - if (!cause.getHostCard().isValid(getParam("ValidCause").split(","), getHostCard().getController(), - getHostCard(), null)) { - return false; + if (!matchesValid(cause, getParam("ValidCause").split(","))) { + if (!matchesValid(cause.getHostCard(), getParam("ValidCause").split(","))) { + 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 11bb2a04bde..b59e567f2a8 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerExploited.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerExploited.java @@ -55,21 +55,14 @@ public class TriggerExploited extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - final Card exploited = (Card) runParams.get(AbilityKey.Exploited); - final Card source = (Card) runParams.get(AbilityKey.Card); - if (hasParam("ValidCard")) { - if (!exploited.isValid(getParam("ValidCard").split(","), - this.getHostCard().getController(), this.getHostCard(), null)) { - return false; - } + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Exploited))) { + return false; } - if (hasParam("ValidSource")) { - if (!source.isValid(getParam("ValidSource").split(","), - this.getHostCard().getController(), this.getHostCard(), null)) { - return false; - } + if (!matchesValidParam("ValidSource", runParams.get(AbilityKey.Card))) { + return false; } + return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerExplores.java b/forge-game/src/main/java/forge/game/trigger/TriggerExplores.java index 4cef5a58ec6..83fdb3f60f8 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerExplores.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerExplores.java @@ -52,9 +52,8 @@ public class TriggerExplores extends Trigger { /** {@inheritDoc} */ @Override public final boolean performTest(final Map runParams) { - if (hasParam("ValidCard")) { - return matchesValid(runParams.get(AbilityKey.Card), getParam("ValidCard").split(","), - this.getHostCard()); + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Card))) { + return false; } return true; 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 406c9d90fa4..522530f4277 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerFight.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerFight.java @@ -55,11 +55,8 @@ public class TriggerFight extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - final Card fighter = (Card) runParams.get(AbilityKey.Fighter); - - if (hasParam("ValidCard")) { - return fighter.isValid(getParam("ValidCard").split(","), - getHostCard().getController(), getHostCard(), null); + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Fighter))) { + return false; } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerFightOnce.java b/forge-game/src/main/java/forge/game/trigger/TriggerFightOnce.java index 4630c5e44ff..270d74a83b4 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerFightOnce.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerFightOnce.java @@ -19,15 +19,12 @@ package forge.game.trigger; import forge.game.ability.AbilityKey; import forge.game.card.Card; -import forge.game.card.CardPredicates; import forge.game.spellability.SpellAbility; import forge.util.Localizer; import java.util.List; import java.util.Map; -import com.google.common.collect.Iterables; - public class TriggerFightOnce extends Trigger { /** @@ -50,15 +47,8 @@ public class TriggerFightOnce extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - @SuppressWarnings("unchecked") - final List fighters = (List) runParams.get(AbilityKey.Fighters); - - if (hasParam("ValidCard")) { - if (!Iterables.any(fighters, - CardPredicates.restriction(getParam("ValidCard").split(","), - getHostCard().getController(), getHostCard(), null))) { - return false; - } + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Fighters))) { + return false; } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerFlippedCoin.java b/forge-game/src/main/java/forge/game/trigger/TriggerFlippedCoin.java index 9ddf84f268b..66c0d28bd56 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerFlippedCoin.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerFlippedCoin.java @@ -54,11 +54,8 @@ public class TriggerFlippedCoin extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - if (hasParam("ValidPlayer")) { - if (!matchesValid(runParams.get(AbilityKey.Player), getParam("ValidPlayer").split(","), - this.getHostCard())) { - return false; - } + if (!matchesValidParam("ValidPlayer", runParams.get(AbilityKey.Player))) { + return false; } if (hasParam("ValidResult")) { final boolean result = (Boolean) runParams.get(AbilityKey.Result); diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerForetell.java b/forge-game/src/main/java/forge/game/trigger/TriggerForetell.java index b051315ffff..97f2046a362 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerForetell.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerForetell.java @@ -19,7 +19,6 @@ package forge.game.trigger; import forge.game.ability.AbilityKey; import forge.game.card.Card; -import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.util.Localizer; @@ -60,11 +59,8 @@ public class TriggerForetell extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - Player p = (Player) runParams.get(AbilityKey.Player); - if (hasParam("ValidPlayer")) { - if (!matchesValid(p, getParam("ValidPlayer").split(","), getHostCard())) { - return false; - } + if (!matchesValidParam("ValidPlayer", runParams.get(AbilityKey.Player))) { + return false; } if (hasParam("OnlyFirst")) { diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerInvestigated.java b/forge-game/src/main/java/forge/game/trigger/TriggerInvestigated.java index 3ce7d750926..dd3c636dbf1 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerInvestigated.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerInvestigated.java @@ -19,7 +19,6 @@ package forge.game.trigger; import forge.game.ability.AbilityKey; import forge.game.card.Card; -import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.util.Localizer; @@ -68,13 +67,10 @@ public class TriggerInvestigated extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - Player p = (Player) runParams.get(AbilityKey.Player); - if (hasParam("ValidPlayer")) { - if (!matchesValid(p, getParam("ValidPlayer").split(","), getHostCard())) { - return false; - } + if (!matchesValidParam("ValidPlayer", runParams.get(AbilityKey.Player))) { + return false; } - + if (hasParam("OnlyFirst")) { if ((int) runParams.get(AbilityKey.Num) != 1) { return false; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerLandPlayed.java b/forge-game/src/main/java/forge/game/trigger/TriggerLandPlayed.java index 6ad3e45ac01..d41a1650e49 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerLandPlayed.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerLandPlayed.java @@ -67,14 +67,12 @@ public class TriggerLandPlayed extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - Card land = (Card) runParams.get(AbilityKey.Card); - if (hasParam("ValidCard")) { - if (!matchesValid(land, getParam("ValidCard").split(","), this.getHostCard())) { - return false; - } + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Card))) { + return false; } - + if (hasParam("NotFirstLand")) { + Card land = (Card) runParams.get(AbilityKey.Card); if (land.getController().getLandsPlayedThisTurn() < 1) { return false; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerLifeGained.java b/forge-game/src/main/java/forge/game/trigger/TriggerLifeGained.java index 29096cb897b..829b560ca3b 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerLifeGained.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerLifeGained.java @@ -53,16 +53,13 @@ public class TriggerLifeGained extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - if (hasParam("ValidPlayer")) { - if (!matchesValid(runParams.get(AbilityKey.Player), getParam("ValidPlayer").split(","), getHostCard())) { - return false; - } + if (!matchesValidParam("ValidPlayer", runParams.get(AbilityKey.Player))) { + return false; } - if (hasParam("ValidSource")) { - if (!matchesValid(runParams.get(AbilityKey.Source), getParam("ValidSource").split(","), getHostCard())) { - return false; - } + if (!matchesValidParam("ValidSource", runParams.get(AbilityKey.Source))) { + return false; } + if (hasParam("Spell")) { final SpellAbility spellAbility = (SpellAbility) runParams.get(AbilityKey.SourceSA); if (spellAbility == null || !spellAbility.getRootAbility().isSpell()) { diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerLifeLost.java b/forge-game/src/main/java/forge/game/trigger/TriggerLifeLost.java index 071db7c4df6..e1041725a92 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerLifeLost.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerLifeLost.java @@ -54,11 +54,8 @@ public class TriggerLifeLost extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - if (hasParam("ValidPlayer")) { - if (!matchesValid(runParams.get(AbilityKey.Player), getParam("ValidPlayer").split(","), - this.getHostCard())) { - return false; - } + if (!matchesValidParam("ValidPlayer", runParams.get(AbilityKey.Player))) { + return false; } if (hasParam("FirstTime")) { diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerLosesGame.java b/forge-game/src/main/java/forge/game/trigger/TriggerLosesGame.java index bda69cff8b2..fd142d694bc 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerLosesGame.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerLosesGame.java @@ -32,9 +32,8 @@ public class TriggerLosesGame extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - if (hasParam("ValidPlayer")) { - return matchesValid(runParams.get(AbilityKey.Player), getParam("ValidPlayer").split(","), - this.getHostCard()); + if (!matchesValidParam("ValidPlayer", runParams.get(AbilityKey.Player))) { + return false; } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerMutates.java b/forge-game/src/main/java/forge/game/trigger/TriggerMutates.java index b49b11ef54d..bb4dc29d986 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerMutates.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerMutates.java @@ -12,9 +12,8 @@ public class TriggerMutates extends Trigger { @Override public boolean performTest(Map runParams) { - if (hasParam("ValidCard")) { - return matchesValid(runParams.get(AbilityKey.Card), getParam("ValidCard").split(","), - this.getHostCard()); + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Card))) { + return false; } return true; 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 8a87328118a..c331828ce38 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPayCumulativeUpkeep.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPayCumulativeUpkeep.java @@ -60,13 +60,10 @@ public class TriggerPayCumulativeUpkeep extends Trigger { return false; } } - final Card card = (Card) runParams.get(AbilityKey.Card); - if (hasParam("ValidCard")) { - if (!card.isValid(getParam("ValidCard").split(","), this.getHostCard().getController(), - this.getHostCard(), null)) { - return false; - } + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Card))) { + return false; } + return true; } 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 b1ac0b60c0d..02e528f3966 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPayEcho.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPayEcho.java @@ -59,13 +59,10 @@ public class TriggerPayEcho extends Trigger { return false; } } - final Card card = (Card) runParams.get(AbilityKey.Card); - if (hasParam("ValidCard")) { - if (!card.isValid(getParam("ValidCard").split(","), this.getHostCard().getController(), - this.getHostCard(), null)) { - return false; - } + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Card))) { + return false; } + return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerPayLife.java b/forge-game/src/main/java/forge/game/trigger/TriggerPayLife.java index 8cd5d3aa377..ed3e894e3fb 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPayLife.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPayLife.java @@ -53,8 +53,8 @@ public class TriggerPayLife extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - if (hasParam("ValidPlayer")) { - return matchesValid(runParams.get(AbilityKey.Player), getParam("ValidPlayer").split(","), getHostCard()); + if (!matchesValidParam("ValidPlayer", runParams.get(AbilityKey.Player))) { + return false; } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerPhase.java b/forge-game/src/main/java/forge/game/trigger/TriggerPhase.java index a3572a5feda..cdb40c2e8e4 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPhase.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPhase.java @@ -54,9 +54,8 @@ public class TriggerPhase extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - if (hasParam("ValidPlayer")) { - return matchesValid(runParams.get(AbilityKey.Player), getParam("ValidPlayer").split(","), - this.getHostCard()); + if (!matchesValidParam("ValidPlayer", runParams.get(AbilityKey.Player))) { + return false; } return true; } 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 9b93061a7dc..2f57234e3af 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPhaseIn.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPhaseIn.java @@ -17,11 +17,8 @@ public class TriggerPhaseIn extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - final Card phaser = (Card) runParams.get(AbilityKey.Card); - - if (hasParam("ValidCard")) { - return phaser.isValid(getParam("ValidCard").split(","), this.getHostCard().getController(), - this.getHostCard(), null); + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Card))) { + return false; } return true; 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 6cdf64422fa..36d30e3bbf9 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPhaseOut.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPhaseOut.java @@ -17,19 +17,9 @@ public class TriggerPhaseOut extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - final Card phaser = (Card) runParams.get(AbilityKey.Card); - if (hasParam("ValidCard")) { - if (getParam("ValidCard").equals("Card.Self")) { - // Since Phased out cards aren't visible in .isValid, use a special check here. - // NOTE: All Phase Out Triggers should use ValidCard$ Card.Self - if (phaser != this.getHostCard()) { - return false; - } - } else if (!phaser.isValid(getParam("ValidCard").split(","), this.getHostCard().getController(), - this.getHostCard(), null)) { - return false; - } + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Card))) { + return false; } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerPlanarDice.java b/forge-game/src/main/java/forge/game/trigger/TriggerPlanarDice.java index 1bc6b4277a6..49b20d7bae4 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPlanarDice.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPlanarDice.java @@ -35,11 +35,8 @@ public class TriggerPlanarDice extends Trigger { */ @Override public boolean performTest(Map runParams) { - if (hasParam("ValidPlayer")) { - if (!matchesValid(runParams.get(AbilityKey.Player), getParam("ValidPlayer").split(","), - this.getHostCard())) { - return false; - } + if (!matchesValidParam("ValidPlayer", runParams.get(AbilityKey.Player))) { + return false; } if (hasParam("Result")) { 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 36a97bdd3fa..5a2ba0480bf 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPlaneswalkedFrom.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPlaneswalkedFrom.java @@ -2,7 +2,6 @@ package forge.game.trigger; import forge.game.ability.AbilityKey; import forge.game.card.Card; -import forge.game.card.CardCollection; import forge.game.spellability.SpellAbility; import forge.util.Localizer; @@ -35,14 +34,7 @@ public class TriggerPlaneswalkedFrom extends Trigger { */ @Override public boolean performTest(final Map runParams) { - if (hasParam("ValidCard")) { - final CardCollection moved = (CardCollection) runParams.get(AbilityKey.Cards); - for(Card c : moved) { - if (c.isValid(getParam("ValidCard").split(","), this - .getHostCard().getController(), this.getHostCard(), null)) { - return true; - } - } + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Cards))) { return false; } 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 f3475bd5cac..9c002d723cd 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerPlaneswalkedTo.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerPlaneswalkedTo.java @@ -32,20 +32,12 @@ public class TriggerPlaneswalkedTo extends Trigger { /* (non-Javadoc) * @see forge.card.trigger.Trigger#performTest(java.util.Map) */ - @SuppressWarnings("unchecked") @Override public boolean performTest(Map runParams) { - if (hasParam("ValidCard")) { - for(Card moved : (Iterable) runParams.get(AbilityKey.Cards)) - { - if (moved.isValid(getParam("ValidCard").split(","), this.getHostCard().getController(), - this.getHostCard(), null)) { - return true; - } - } + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Cards))) { return false; } - + return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerRegenerated.java b/forge-game/src/main/java/forge/game/trigger/TriggerRegenerated.java index 07b2b52511a..a5d021b956b 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerRegenerated.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerRegenerated.java @@ -54,15 +54,11 @@ public class TriggerRegenerated extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - if (hasParam("ValidCause")) { - if (!matchesValid(runParams.get(AbilityKey.Cause), getParam("ValidCause").split(","), getHostCard())) { - return false; - } + if (!matchesValidParam("ValidCause", runParams.get(AbilityKey.Cause))) { + return false; } - if (hasParam("ValidCard")) { - if (!matchesValid(runParams.get(AbilityKey.Card), getParam("ValidCard").split(","), getHostCard())) { - return false; - } + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Card))) { + return false; } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerRevealed.java b/forge-game/src/main/java/forge/game/trigger/TriggerRevealed.java index 1c06e5f1a17..055ae2671f9 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerRevealed.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerRevealed.java @@ -15,10 +15,8 @@ public class TriggerRevealed extends Trigger { @Override public boolean performTest(Map runParams) { - if (hasParam("ValidCard")) { - if (!matchesValid(runParams.get(AbilityKey.Card), getParam("ValidCard").split(","), getHostCard())) { - return false; - } + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Card))) { + return false; } 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 f483eb5cb5a..61191e04b1e 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerSacrificed.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerSacrificed.java @@ -20,7 +20,6 @@ package forge.game.trigger; import forge.game.ability.AbilityKey; import forge.game.card.Card; import forge.game.cost.IndividualCostPaymentInstance; -import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.zone.CostPaymentStack; import forge.util.Localizer; @@ -57,24 +56,20 @@ public class TriggerSacrificed extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - final Card sac = (Card) runParams.get(AbilityKey.Card); - final Player player = (Player) runParams.get(AbilityKey.Player); - final SpellAbility sourceSA = (SpellAbility) runParams.get(AbilityKey.Cause); - if (hasParam("ValidPlayer")) { - if (!matchesValid(player, getParam("ValidPlayer").split(","), - this.getHostCard())) { - return false; - } + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Card))) { + return false; } - if (hasParam("ValidCard")) { - if (!sac.isValid(getParam("ValidCard").split(","), this.getHostCard().getController(), - this.getHostCard(), null)) { - return false; - } + if (!matchesValidParam("ValidPlayer", runParams.get(AbilityKey.Player))) { + return false; } + if (!matchesValidParam("ValidCause", runParams.get(AbilityKey.Cause))) { + return false; + } + if (hasParam("ValidSourceController")) { - if (sourceSA == null || !sourceSA.getActivatingPlayer().isValid(getParam("ValidSourceController"), - this.getHostCard().getController(), this.getHostCard(), null)) { + final SpellAbility sourceSA = (SpellAbility) runParams.get(AbilityKey.Cause); + + if (sourceSA == null || !matchesValid(sourceSA.getActivatingPlayer(), getParam("ValidSourceController").split(","))) { return false; } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerScry.java b/forge-game/src/main/java/forge/game/trigger/TriggerScry.java index 3456e012a22..2280dfa788f 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerScry.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerScry.java @@ -54,9 +54,8 @@ public class TriggerScry extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - if (hasParam("ValidPlayer")) { - return matchesValid(runParams.get(AbilityKey.Player), getParam("ValidPlayer").split(","), - this.getHostCard()); + if (!matchesValidParam("ValidPlayer", runParams.get(AbilityKey.Player))) { + return false; } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerSearchedLibrary.java b/forge-game/src/main/java/forge/game/trigger/TriggerSearchedLibrary.java index 9f60c39af72..4c371fe28dd 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerSearchedLibrary.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerSearchedLibrary.java @@ -56,11 +56,8 @@ public class TriggerSearchedLibrary extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - if (hasParam("ValidPlayer")) { - if (!matchesValid(runParams.get(AbilityKey.Player), getParam("ValidPlayer").split(","), - this.getHostCard())) { - return false; - } + if (!matchesValidParam("ValidPlayer", runParams.get(AbilityKey.Player))) { + return false; } if (hasParam("SearchOwnLibrary")) { @SuppressWarnings("unchecked") diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerSetInMotion.java b/forge-game/src/main/java/forge/game/trigger/TriggerSetInMotion.java index f3d32f8c26d..ae7b5f0de79 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerSetInMotion.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerSetInMotion.java @@ -54,11 +54,8 @@ public class TriggerSetInMotion extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - if (hasParam("ValidCard")) { - if (!matchesValid(runParams.get(AbilityKey.Scheme), getParam("ValidCard").split(","), - this.getHostCard())) { - return false; - } + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Scheme))) { + return false; } if (hasParam("SchemeType")) { diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerShuffled.java b/forge-game/src/main/java/forge/game/trigger/TriggerShuffled.java index fb9aa30bf54..6a12e1de096 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerShuffled.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerShuffled.java @@ -54,12 +54,10 @@ public class TriggerShuffled extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - if (hasParam("ValidPlayer")) { - if (!matchesValid(runParams.get(AbilityKey.Player), getParam("ValidPlayer").split(","), - this.getHostCard())) { - return false; - } + if (!matchesValidParam("ValidPlayer", runParams.get(AbilityKey.Player))) { + return false; } + if (hasParam("ShuffleFromEffect")) { if (null == runParams.get(AbilityKey.Source)) { 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 d129121c30d..29609e96d60 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCast.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCast.java @@ -6,12 +6,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ @@ -46,7 +46,7 @@ import forge.util.Localizer; *

* Trigger_SpellAbilityCast class. *

- * + * * @author Forge * @version $Id$ */ @@ -56,7 +56,7 @@ public class TriggerSpellAbilityCast extends Trigger { *

* Constructor for Trigger_SpellAbilityCast. *

- * + * * @param params * a {@link java.util.HashMap} object. * @param host @@ -99,16 +99,19 @@ public class TriggerSpellAbilityCast extends Trigger { } } + + if (!matchesValidParam("ValidControllingPlayer", cast.getController())) { + return false; + } + if (hasParam("ValidControllingPlayer")) { - if (!matchesValid(cast.getController(), getParam("ValidControllingPlayer").split(","), - getHostCard())) { + if (!matchesValid(cast.getController(), getParam("ValidControllingPlayer").split(","))) { return false; } } if (hasParam("ValidActivatingPlayer")) { - if (si == null || !matchesValid(si.getSpellAbility(true).getActivatingPlayer(), getParam("ValidActivatingPlayer") - .split(","), getHostCard())) { + if (si == null || !matchesValid(si.getSpellAbility(true).getActivatingPlayer(), getParam("ValidActivatingPlayer").split(","))) { return false; } if (hasParam("ActivatorThisTurnCast")) { @@ -123,16 +126,11 @@ public class TriggerSpellAbilityCast extends Trigger { } } } - - if (hasParam("ValidCard")) { - if (!matchesValid(cast, getParam("ValidCard").split(","), getHostCard())) { - return false; - } + if (!matchesValidParam("ValidCard", cast)) { + return false; } - if (hasParam("ValidSA")) { - if (!matchesValid(spellAbility, getParam("ValidSA").split(","), getHostCard())) { - return false; - } + if (!matchesValidParam("ValidSA", spellAbility)) { + return false; } if (hasParam("TargetsValid")) { @@ -140,12 +138,12 @@ public class TriggerSpellAbilityCast extends Trigger { if (si != null) { sa = si.getSpellAbility(true); } - + boolean validTgtFound = false; while (sa != null && !validTgtFound) { for (final Card tgt : sa.getTargets().getTargetCards()) { - if (tgt.isValid(getParam("TargetsValid").split(","), getHostCard() - .getController(), getHostCard(), null)) { + + if (matchesValid(tgt, getParam("TargetsValid").split(","))) { validTgtFound = true; if (this.hasParam("RememberValidCards")) { this.getHostCard().addRemembered(tgt); @@ -154,7 +152,7 @@ public class TriggerSpellAbilityCast extends Trigger { } for (final Player p : sa.getTargets().getTargetPlayers()) { - if (matchesValid(p, getParam("TargetsValid").split(","), getHostCard())) { + if (matchesValid(p, getParam("TargetsValid").split(","))) { validTgtFound = true; break; } @@ -186,7 +184,7 @@ public class TriggerSpellAbilityCast extends Trigger { } candidates.removeAll(targetedSA.getTargets().getTargetCards()); String valid = getParam("CanTargetOtherCondition"); - if (CardLists.getValidCards(candidates, valid, spellAbility.getActivatingPlayer(), spellAbility.getHostCard()).isEmpty()) { + if (CardLists.getValidCards(candidates, valid, spellAbility.getActivatingPlayer(), spellAbility.getHostCard(), spellAbility).isEmpty()) { return false; } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCopy.java b/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCopy.java index 8a5cae2c650..4a90d11c2aa 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCopy.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCopy.java @@ -70,19 +70,18 @@ public class TriggerSpellAbilityCopy extends Trigger { } } - if (hasParam("ValidCard")) { - if (!matchesValid(cast, getParam("ValidCard").split(","), getHostCard())) { - return false; - } + if (!matchesValidParam("ValidCard", cast)) { + return false; } - if (hasParam("ValidSA")) { - if (!matchesValid(spellAbility, getParam("ValidSA").split(","), getHostCard())) { - return false; - } + if (!matchesValidParam("ValidSA", spellAbility)) { + return false; } + if (!matchesValidParam("ValidPlayer", runParams.get(AbilityKey.Player))) { + return false; + } + if (hasParam("ValidActivatingPlayer")) { - if (si == null || !matchesValid(si.getSpellAbility(true).getActivatingPlayer(), getParam("ValidActivatingPlayer") - .split(","), getHostCard())) { + if (si == null || !matchesValid(si.getSpellAbility(true).getActivatingPlayer(), getParam("ValidActivatingPlayer").split(","))) { return false; } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerSurveil.java b/forge-game/src/main/java/forge/game/trigger/TriggerSurveil.java index 6c8c20a79da..da58bd0f3d0 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerSurveil.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerSurveil.java @@ -19,7 +19,6 @@ package forge.game.trigger; import forge.game.ability.AbilityKey; import forge.game.card.Card; -import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.util.Localizer; @@ -64,11 +63,8 @@ public class TriggerSurveil extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - Player p = (Player) runParams.get(AbilityKey.Player); - if (hasParam("ValidPlayer")) { - if (!matchesValid(p, getParam("ValidPlayer").split(","), getHostCard())) { - return false; - } + if (!matchesValidParam("ValidPlayer", runParams.get(AbilityKey.Player))) { + return false; } if (hasParam("OnlyFirst")) { 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 d5a4151ca09..1daf89e4264 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerTaps.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerTaps.java @@ -53,14 +53,11 @@ public class TriggerTaps extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - final Card tapper = (Card) runParams.get(AbilityKey.Card); - if (hasParam("ValidCard")) { - if (!tapper.isValid(getParam("ValidCard").split(","), getHostCard().getController(), - getHostCard(), null)) { - return false; - } + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Card))) { + return false; } + if (hasParam("Attacker")) { if ("True".equalsIgnoreCase(getParam("Attacker"))) { if (!(Boolean) runParams.get(AbilityKey.Attacker)) { 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 f7895ba385e..68e9dfb76e7 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerTapsForMana.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerTapsForMana.java @@ -66,22 +66,14 @@ public class TriggerTapsForMana extends Trigger { } } - if (hasParam("ValidCard")) { - if (!matchesValid(runParams.get(AbilityKey.Card), getParam("ValidCard").split(","), getHostCard())) { - return false; - } + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Card))) { + return false; } - - if (hasParam("Player")) { - if (!matchesValid(runParams.get(AbilityKey.Player), getParam("Player").split(","), getHostCard())) { - return false; - } + if (!matchesValidParam("Player", runParams.get(AbilityKey.Player))) { + return false; } - - if (hasParam("Activator")) { - if (!matchesValid(runParams.get(AbilityKey.Activator), getParam("Activator").split(","), getHostCard())) { - return false; - } + if (!matchesValidParam("Activator", runParams.get(AbilityKey.Activator))) { + return false; } if (hasParam("Produced")) { diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerTokenCreated.java b/forge-game/src/main/java/forge/game/trigger/TriggerTokenCreated.java index 49628163635..85c17e9fa19 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerTokenCreated.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerTokenCreated.java @@ -67,10 +67,8 @@ public class TriggerTokenCreated extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - if (hasParam("ValidPlayer")) { - if (!matchesValid(runParams.get(AbilityKey.Player), getParam("ValidPlayer").split(","), getHostCard())) { - return false; - } + if (!matchesValidParam("ValidPlayer", runParams.get(AbilityKey.Player))) { + return false; } if (hasParam("OnlyFirst")) { diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerTransformed.java b/forge-game/src/main/java/forge/game/trigger/TriggerTransformed.java index 22a6e7bf8e3..4fa9ecab4cf 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerTransformed.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerTransformed.java @@ -46,9 +46,8 @@ public class TriggerTransformed extends Trigger { */ @Override public boolean performTest(Map runParams) { - if (hasParam("ValidCard")) { - return matchesValid(runParams.get(AbilityKey.Transformer), getParam("ValidCard").split(","), - this.getHostCard()); + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Transformer))) { + return false; } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerTurnBegin.java b/forge-game/src/main/java/forge/game/trigger/TriggerTurnBegin.java index eeed5ca559e..523995a6d7e 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerTurnBegin.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerTurnBegin.java @@ -15,9 +15,8 @@ public class TriggerTurnBegin extends Trigger { @Override public final boolean performTest(final Map runParams) { - if (hasParam("ValidPlayer")) { - return matchesValid(runParams.get(AbilityKey.Player), getParam("ValidPlayer").split(","), - this.getHostCard()); + if (!matchesValidParam("ValidPlayer", runParams.get(AbilityKey.Player))) { + return false; } return true; } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerTurnFaceUp.java b/forge-game/src/main/java/forge/game/trigger/TriggerTurnFaceUp.java index f79a8ba5a18..82500fe11e3 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerTurnFaceUp.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerTurnFaceUp.java @@ -54,9 +54,8 @@ public class TriggerTurnFaceUp extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - if (hasParam("ValidCard")) { - return matchesValid(runParams.get(AbilityKey.Card), getParam("ValidCard").split(","), - this.getHostCard()); + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Card))) { + return false; } return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerUnattach.java b/forge-game/src/main/java/forge/game/trigger/TriggerUnattach.java index e512e216632..be3ee8ea30e 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerUnattach.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerUnattach.java @@ -17,7 +17,6 @@ */ package forge.game.trigger; -import forge.game.GameEntity; import forge.game.ability.AbilityKey; import forge.game.card.Card; import forge.game.spellability.SpellAbility; @@ -54,21 +53,12 @@ public class TriggerUnattach extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - final GameEntity object = (GameEntity) runParams.get(AbilityKey.Object); - final Card attach = (Card) runParams.get(AbilityKey.Attach); - if (hasParam("ValidObject")) { - if (!object.isValid(getParam("ValidObject").split(","), getHostCard().getController(), - getHostCard(), null)) { - return false; - } + if (!matchesValidParam("ValidObject", runParams.get(AbilityKey.Object))) { + return false; } - - if (hasParam("ValidAttachment")) { - if (!attach.isValid(getParam("ValidAttachment").split(","), getHostCard() - .getController(), getHostCard(), null)) { - return false; - } + if (!matchesValidParam("ValidAttachment", runParams.get(AbilityKey.Attach))) { + return false; } return true; 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 b2eb3661a7a..33b670f97cd 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerUntaps.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerUntaps.java @@ -54,13 +54,8 @@ public class TriggerUntaps extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - final Card untapper = (Card) runParams.get(AbilityKey.Card); - - if (hasParam("ValidCard")) { - if (!untapper.isValid(getParam("ValidCard").split(","), this.getHostCard().getController(), - this.getHostCard(), null)) { - return false; - } + if (!matchesValidParam("ValidCard", runParams.get(AbilityKey.Card))) { + return false; } return true; diff --git a/forge-gui/src/main/java/forge/player/HumanPlay.java b/forge-gui/src/main/java/forge/player/HumanPlay.java index ef27cf3dd2f..21ab3cb1680 100644 --- a/forge-gui/src/main/java/forge/player/HumanPlay.java +++ b/forge-gui/src/main/java/forge/player/HumanPlay.java @@ -484,12 +484,12 @@ public class HumanPlay { } else if (part instanceof CostGainControl) { int amount = Integer.parseInt(part.getAmount()); - CardCollectionView list = CardLists.getValidCards(p.getGame().getCardsIn(ZoneType.Battlefield), part.getType(), p, source); + CardCollectionView list = CardLists.getValidCards(p.getGame().getCardsIn(ZoneType.Battlefield), part.getType(), p, source, sourceAbility); boolean hasPaid = payCostPart(controller, p, sourceAbility, (CostPartWithList)part, amount, list, Localizer.getInstance().getMessage("lblGainControl") + orString); if (!hasPaid) { return false; } } else if (part instanceof CostReturn) { - CardCollectionView list = CardLists.getValidCards(p.getCardsIn(ZoneType.Battlefield), part.getType(), p, source); + CardCollectionView list = CardLists.getValidCards(p.getCardsIn(ZoneType.Battlefield), part.getType(), p, source, sourceAbility); int amount = getAmountFromPartX(part, source, sourceAbility); boolean hasPaid = payCostPart(controller, p, sourceAbility, (CostPartWithList)part, amount, list, Localizer.getInstance().getMessage("lblReturnToHand") + orString); if (!hasPaid) { return false; } @@ -502,7 +502,7 @@ public class HumanPlay { ((CostDiscard)part).payAsDecided(p, PaymentDecision.card(p.getCardsIn(ZoneType.Hand)), sourceAbility); } else { - CardCollectionView list = CardLists.getValidCards(p.getCardsIn(ZoneType.Hand), part.getType(), p, source); + CardCollectionView list = CardLists.getValidCards(p.getCardsIn(ZoneType.Hand), part.getType(), p, source, sourceAbility); int amount = getAmountFromPartX(part, source, sourceAbility); boolean hasPaid = payCostPart(controller, p, sourceAbility, (CostPartWithList)part, amount, list, Localizer.getInstance().getMessage("lbldiscard") + orString); if (!hasPaid) { return false; } @@ -510,13 +510,13 @@ public class HumanPlay { } else if (part instanceof CostReveal) { CostReveal costReveal = (CostReveal) part; - CardCollectionView list = CardLists.getValidCards(p.getCardsIn(costReveal.getRevealFrom()), part.getType(), p, source); + CardCollectionView list = CardLists.getValidCards(p.getCardsIn(costReveal.getRevealFrom()), part.getType(), p, source, sourceAbility); int amount = getAmountFromPartX(part, source, sourceAbility); boolean hasPaid = payCostPart(controller, p, sourceAbility, (CostPartWithList)part, amount, list, Localizer.getInstance().getMessage("lblReveal") + orString); if (!hasPaid) { return false; } } else if (part instanceof CostTapType) { - CardCollectionView list = CardLists.getValidCards(p.getCardsIn(ZoneType.Battlefield), part.getType(), p, source); + CardCollectionView list = CardLists.getValidCards(p.getCardsIn(ZoneType.Battlefield), part.getType(), p, source, sourceAbility); list = CardLists.filter(list, Presets.UNTAPPED); int amount = getAmountFromPartX(part, source, sourceAbility); boolean hasPaid = payCostPart(controller, p, sourceAbility, (CostPartWithList)part, amount, list, Localizer.getInstance().getMessage("lblTap") + orString);