diff --git a/forge-ai/src/main/java/forge/ai/AiAttackController.java b/forge-ai/src/main/java/forge/ai/AiAttackController.java
index 87cd7afcfb3..5f2e126f872 100644
--- a/forge-ai/src/main/java/forge/ai/AiAttackController.java
+++ b/forge-ai/src/main/java/forge/ai/AiAttackController.java
@@ -17,16 +17,26 @@
*/
package forge.ai;
+import java.util.ArrayList;
+import java.util.List;
+
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Lists;
+
import forge.ai.ability.AnimateAi;
import forge.card.CardTypeView;
import forge.game.GameEntity;
import forge.game.ability.AbilityUtils;
import forge.game.ability.ApiType;
import forge.game.ability.effects.ProtectEffect;
-import forge.game.card.*;
+import forge.game.card.Card;
+import forge.game.card.CardCollection;
+import forge.game.card.CardCollectionView;
+import forge.game.card.CardLists;
+import forge.game.card.CardPredicates;
+import forge.game.card.CardUtil;
+import forge.game.card.CounterEnumType;
import forge.game.combat.Combat;
import forge.game.combat.CombatUtil;
import forge.game.combat.GlobalAttackRestrictions;
@@ -43,9 +53,6 @@ import forge.util.MyRandom;
import forge.util.TextUtil;
import forge.util.collect.FCollectionView;
-import java.util.ArrayList;
-import java.util.List;
-
//doesHumanAttackAndWin() uses the global variable AllZone.getComputerPlayer()
/**
diff --git a/forge-ai/src/main/java/forge/ai/AiBlockController.java b/forge-ai/src/main/java/forge/ai/AiBlockController.java
index 6a238e13baf..ca567fdcb4a 100644
--- a/forge-ai/src/main/java/forge/ai/AiBlockController.java
+++ b/forge-ai/src/main/java/forge/ai/AiBlockController.java
@@ -17,12 +17,23 @@
*/
package forge.ai;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+
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.card.Card;
+import forge.game.card.CardCollection;
+import forge.game.card.CardCollectionView;
+import forge.game.card.CardLists;
+import forge.game.card.CardPredicates;
+import forge.game.card.CounterEnumType;
import forge.game.combat.Combat;
import forge.game.combat.CombatUtil;
import forge.game.keyword.Keyword;
@@ -33,8 +44,6 @@ import forge.game.zone.ZoneType;
import forge.util.MyRandom;
import forge.util.collect.FCollectionView;
-import java.util.*;
-
/**
*
@@ -263,14 +272,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/AiCardMemory.java b/forge-ai/src/main/java/forge/ai/AiCardMemory.java
index 9e203710dd9..062489e3db2 100644
--- a/forge-ai/src/main/java/forge/ai/AiCardMemory.java
+++ b/forge-ai/src/main/java/forge/ai/AiCardMemory.java
@@ -18,13 +18,13 @@
package forge.ai;
-import forge.game.card.Card;
-import forge.game.player.Player;
-
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
+import forge.game.card.Card;
+import forge.game.player.Player;
+
/**
*
* AiCardMemory class.
diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java
index eda967e4b29..2958ef944d5 100644
--- a/forge-ai/src/main/java/forge/ai/AiController.java
+++ b/forge-ai/src/main/java/forge/ai/AiController.java
@@ -17,11 +17,19 @@
*/
package forge.ai;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
import com.esotericsoftware.minlog.Log;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
+
import forge.ai.ability.ChangeZoneAi;
import forge.ai.ability.ExploreAi;
import forge.ai.simulation.SpellAbilityPicker;
@@ -30,16 +38,38 @@ import forge.card.mana.ManaCost;
import forge.deck.CardPool;
import forge.deck.Deck;
import forge.deck.DeckSection;
-import forge.game.*;
+import forge.game.CardTraitBase;
+import forge.game.CardTraitPredicates;
+import forge.game.Direction;
+import forge.game.Game;
+import forge.game.GameActionUtil;
+import forge.game.GameEntity;
+import forge.game.GlobalRuleChange;
import forge.game.ability.AbilityUtils;
import forge.game.ability.ApiType;
import forge.game.ability.SpellApiBased;
-import forge.game.card.*;
+import forge.game.card.Card;
+import forge.game.card.CardCollection;
+import forge.game.card.CardCollectionView;
+import forge.game.card.CardFactoryUtil;
+import forge.game.card.CardLists;
+import forge.game.card.CardPlayOption;
+import forge.game.card.CardPredicates;
import forge.game.card.CardPredicates.Accessors;
import forge.game.card.CardPredicates.Presets;
+import forge.game.card.CardUtil;
+import forge.game.card.CounterEnumType;
import forge.game.combat.Combat;
import forge.game.combat.CombatUtil;
-import forge.game.cost.*;
+import forge.game.cost.Cost;
+import forge.game.cost.CostAdjustment;
+import forge.game.cost.CostDiscard;
+import forge.game.cost.CostPart;
+import forge.game.cost.CostPayEnergy;
+import forge.game.cost.CostPayLife;
+import forge.game.cost.CostPutCounter;
+import forge.game.cost.CostRemoveCounter;
+import forge.game.cost.CostSacrifice;
import forge.game.keyword.Keyword;
import forge.game.mana.ManaCostBeingPaid;
import forge.game.phase.PhaseType;
@@ -48,7 +78,15 @@ import forge.game.player.PlayerActionConfirmMode;
import forge.game.replacement.ReplaceMoved;
import forge.game.replacement.ReplacementEffect;
import forge.game.replacement.ReplacementType;
-import forge.game.spellability.*;
+import forge.game.spellability.AbilitySub;
+import forge.game.spellability.LandAbility;
+import forge.game.spellability.OptionalCost;
+import forge.game.spellability.OptionalCostValue;
+import forge.game.spellability.Spell;
+import forge.game.spellability.SpellAbility;
+import forge.game.spellability.SpellAbilityCondition;
+import forge.game.spellability.SpellAbilityPredicates;
+import forge.game.spellability.SpellPermanent;
import forge.game.staticability.StaticAbility;
import forge.game.trigger.Trigger;
import forge.game.trigger.TriggerType;
@@ -56,16 +94,13 @@ import forge.game.trigger.WrappedAbility;
import forge.game.zone.ZoneType;
import forge.item.PaperCard;
import forge.util.Aggregates;
+import forge.util.ComparatorUtil;
import forge.util.Expressions;
import forge.util.MyRandom;
-import forge.util.ComparatorUtil;
import forge.util.collect.FCollectionView;
import io.sentry.Sentry;
import io.sentry.event.BreadcrumbBuilder;
-import java.util.*;
-import java.util.Map.Entry;
-
/**
*
* AiController class.
diff --git a/forge-ai/src/main/java/forge/ai/AiCostDecision.java b/forge-ai/src/main/java/forge/ai/AiCostDecision.java
index 88a3ca7d5fa..138b3864374 100644
--- a/forge-ai/src/main/java/forge/ai/AiCostDecision.java
+++ b/forge-ai/src/main/java/forge/ai/AiCostDecision.java
@@ -1,5 +1,7 @@
package forge.ai;
+import static forge.ai.ComputerUtilCard.getBestCreatureAI;
+
import java.util.Collections;
import java.util.List;
import java.util.Map;
@@ -21,7 +23,36 @@ import forge.game.card.CardLists;
import forge.game.card.CardPredicates;
import forge.game.card.CounterEnumType;
import forge.game.card.CounterType;
-import forge.game.cost.*;
+import forge.game.cost.CostAddMana;
+import forge.game.cost.CostChooseCreatureType;
+import forge.game.cost.CostDamage;
+import forge.game.cost.CostDecisionMakerBase;
+import forge.game.cost.CostDiscard;
+import forge.game.cost.CostDraw;
+import forge.game.cost.CostExert;
+import forge.game.cost.CostExile;
+import forge.game.cost.CostExileFromStack;
+import forge.game.cost.CostExiledMoveToGrave;
+import forge.game.cost.CostFlipCoin;
+import forge.game.cost.CostGainControl;
+import forge.game.cost.CostGainLife;
+import forge.game.cost.CostMill;
+import forge.game.cost.CostPartMana;
+import forge.game.cost.CostPayEnergy;
+import forge.game.cost.CostPayLife;
+import forge.game.cost.CostPutCardToLib;
+import forge.game.cost.CostPutCounter;
+import forge.game.cost.CostRemoveAnyCounter;
+import forge.game.cost.CostRemoveCounter;
+import forge.game.cost.CostReturn;
+import forge.game.cost.CostReveal;
+import forge.game.cost.CostSacrifice;
+import forge.game.cost.CostTap;
+import forge.game.cost.CostTapType;
+import forge.game.cost.CostUnattach;
+import forge.game.cost.CostUntap;
+import forge.game.cost.CostUntapType;
+import forge.game.cost.PaymentDecision;
import forge.game.keyword.Keyword;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
@@ -31,8 +62,6 @@ import forge.util.Aggregates;
import forge.util.TextUtil;
import forge.util.collect.FCollectionView;
-import static forge.ai.ComputerUtilCard.getBestCreatureAI;
-
public class AiCostDecision extends CostDecisionMakerBase {
private final SpellAbility ability;
private final Card source;
diff --git a/forge-ai/src/main/java/forge/ai/AiProfileUtil.java b/forge-ai/src/main/java/forge/ai/AiProfileUtil.java
index 06f60545f52..15f636b4135 100644
--- a/forge-ai/src/main/java/forge/ai/AiProfileUtil.java
+++ b/forge-ai/src/main/java/forge/ai/AiProfileUtil.java
@@ -17,19 +17,19 @@
*/
package forge.ai;
-import forge.LobbyPlayer;
-import forge.util.Aggregates;
-import forge.util.FileUtil;
-
-import forge.util.TextUtil;
-import org.apache.commons.lang3.ArrayUtils;
-
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import org.apache.commons.lang3.ArrayUtils;
+
+import forge.LobbyPlayer;
+import forge.util.Aggregates;
+import forge.util.FileUtil;
+import forge.util.TextUtil;
+
/**
* Holds default AI personality profile values in an enum.
* Loads profile from the given text file when setProfile is called.
diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtil.java b/forge-ai/src/main/java/forge/ai/ComputerUtil.java
index 387734cf125..66855252408 100644
--- a/forge-ai/src/main/java/forge/ai/ComputerUtil.java
+++ b/forge-ai/src/main/java/forge/ai/ComputerUtil.java
@@ -17,12 +17,22 @@
*/
package forge.ai;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang3.StringUtils;
+
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Multimap;
+
import forge.ai.ability.ChooseGenericEffectAi;
import forge.ai.ability.ProtectAi;
import forge.ai.ability.TokenAi;
@@ -30,16 +40,33 @@ import forge.card.CardStateName;
import forge.card.CardType;
import forge.card.ColorSet;
import forge.card.MagicColor;
-import forge.game.*;
+import forge.game.CardTraitPredicates;
+import forge.game.Game;
+import forge.game.GameActionUtil;
+import forge.game.GameObject;
+import forge.game.GameType;
import forge.game.ability.AbilityKey;
import forge.game.ability.AbilityUtils;
import forge.game.ability.ApiType;
import forge.game.ability.effects.CharmEffect;
-import forge.game.card.*;
+import forge.game.card.Card;
+import forge.game.card.CardCollection;
+import forge.game.card.CardCollectionView;
+import forge.game.card.CardLists;
+import forge.game.card.CardPredicates;
import forge.game.card.CardPredicates.Presets;
+import forge.game.card.CardState;
+import forge.game.card.CardUtil;
+import forge.game.card.CounterEnumType;
+import forge.game.card.CounterType;
import forge.game.combat.Combat;
import forge.game.combat.CombatUtil;
-import forge.game.cost.*;
+import forge.game.cost.Cost;
+import forge.game.cost.CostDiscard;
+import forge.game.cost.CostPart;
+import forge.game.cost.CostPayment;
+import forge.game.cost.CostPutCounter;
+import forge.game.cost.CostSacrifice;
import forge.game.keyword.Keyword;
import forge.game.phase.PhaseHandler;
import forge.game.phase.PhaseType;
@@ -61,9 +88,6 @@ import forge.util.Aggregates;
import forge.util.MyRandom;
import forge.util.TextUtil;
import forge.util.collect.FCollection;
-import org.apache.commons.lang3.StringUtils;
-
-import java.util.*;
/**
@@ -2056,8 +2080,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 +3020,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/ComputerUtilAbility.java b/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java
index 8505ff58bed..fa8c7d633d9 100644
--- a/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java
+++ b/forge-ai/src/main/java/forge/ai/ComputerUtilAbility.java
@@ -1,7 +1,11 @@
package forge.ai;
+import java.util.Iterator;
+import java.util.List;
+
import com.google.common.base.Predicate;
import com.google.common.collect.Lists;
+
import forge.card.CardStateName;
import forge.game.Game;
import forge.game.GameActionUtil;
@@ -17,9 +21,6 @@ import forge.game.spellability.SpellAbility;
import forge.game.spellability.SpellAbilityStackInstance;
import forge.game.zone.ZoneType;
-import java.util.Iterator;
-import java.util.List;
-
public class ComputerUtilAbility {
public static CardCollection getAvailableLandsToPlay(final Game game, final Player player) {
if (!game.getStack().isEmpty() || !game.getPhaseHandler().getPhase().isMain()) {
diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java
index 2b97c368c26..4078d93981c 100644
--- a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java
+++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java
@@ -1,5 +1,20 @@
package forge.ai;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.tuple.MutablePair;
+import org.apache.commons.lang3.tuple.Pair;
+
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Iterables;
@@ -18,7 +33,16 @@ import forge.game.Game;
import forge.game.GameObject;
import forge.game.ability.AbilityUtils;
import forge.game.ability.ApiType;
-import forge.game.card.*;
+import forge.game.card.Card;
+import forge.game.card.CardCollection;
+import forge.game.card.CardCollectionView;
+import forge.game.card.CardFactory;
+import forge.game.card.CardFactoryUtil;
+import forge.game.card.CardLists;
+import forge.game.card.CardPredicates;
+import forge.game.card.CardUtil;
+import forge.game.card.CounterEnumType;
+import forge.game.card.CounterType;
import forge.game.combat.Combat;
import forge.game.combat.CombatUtil;
import forge.game.cost.Cost;
@@ -40,12 +64,6 @@ import forge.item.PaperCard;
import forge.util.Aggregates;
import forge.util.Expressions;
import forge.util.MyRandom;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.tuple.MutablePair;
-import org.apache.commons.lang3.tuple.Pair;
-
-import java.util.*;
-import java.util.Map.Entry;
public class ComputerUtilCard {
public static Card getMostExpensivePermanentAI(final CardCollectionView list, final SpellAbility spell, final boolean targeted) {
diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java
index fe240b141db..d4b7d549f74 100644
--- a/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java
+++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java
@@ -25,13 +25,19 @@ 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;
import forge.game.ability.AbilityUtils;
import forge.game.ability.ApiType;
-import forge.game.card.*;
+import forge.game.card.Card;
+import forge.game.card.CardCollection;
+import forge.game.card.CardCollectionView;
+import forge.game.card.CardFactoryUtil;
+import forge.game.card.CardLists;
+import forge.game.card.CardPredicates;
+import forge.game.card.CardUtil;
+import forge.game.card.CounterEnumType;
import forge.game.combat.Combat;
import forge.game.combat.CombatUtil;
import forge.game.cost.CostPayment;
@@ -790,9 +796,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 +806,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 +826,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 +848,7 @@ public class ComputerUtilCombat {
return false;
}
}
- if (!CardTraitBase.matchesValid(attacker, validBlocked.split(","), source)) {
+ if (!trigger.matchesValid(attacker, validBlocked.split(","))) {
return false;
}
}
@@ -856,35 +862,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/ComputerUtilCost.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java
index 84ddd5791c6..cb56ec9fd46 100644
--- a/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java
+++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java
@@ -1,16 +1,41 @@
package forge.ai;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
+
import com.google.common.base.Predicate;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
+
import forge.ai.ability.AnimateAi;
import forge.card.ColorSet;
import forge.game.Game;
import forge.game.ability.AbilityUtils;
-import forge.game.card.*;
+import forge.game.card.Card;
+import forge.game.card.CardCollection;
+import forge.game.card.CardCollectionView;
+import forge.game.card.CardFactoryUtil;
+import forge.game.card.CardLists;
import forge.game.card.CardPredicates.Presets;
+import forge.game.card.CardUtil;
+import forge.game.card.CounterEnumType;
+import forge.game.card.CounterType;
import forge.game.combat.Combat;
-import forge.game.cost.*;
+import forge.game.cost.Cost;
+import forge.game.cost.CostDamage;
+import forge.game.cost.CostDiscard;
+import forge.game.cost.CostPart;
+import forge.game.cost.CostPayLife;
+import forge.game.cost.CostPayment;
+import forge.game.cost.CostPutCounter;
+import forge.game.cost.CostRemoveAnyCounter;
+import forge.game.cost.CostRemoveCounter;
+import forge.game.cost.CostSacrifice;
+import forge.game.cost.CostTapType;
+import forge.game.cost.PaymentDecision;
import forge.game.keyword.Keyword;
import forge.game.player.Player;
import forge.game.spellability.Spell;
@@ -20,12 +45,6 @@ import forge.util.MyRandom;
import forge.util.TextUtil;
import forge.util.collect.FCollectionView;
-import org.apache.commons.lang3.ObjectUtils;
-import org.apache.commons.lang3.StringUtils;
-
-import java.util.List;
-import java.util.Set;
-
public class ComputerUtilCost {
diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java
index 161e84c2dda..2e7127f7aa0 100644
--- a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java
+++ b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java
@@ -1,8 +1,26 @@
package forge.ai;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.tuple.Pair;
+
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
-import com.google.common.collect.*;
+import com.google.common.collect.ArrayListMultimap;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Multimap;
+
import forge.ai.ability.AnimateAi;
import forge.card.ColorSet;
import forge.card.MagicColor;
@@ -13,11 +31,23 @@ import forge.card.mana.ManaCostShard;
import forge.game.CardTraitPredicates;
import forge.game.Game;
import forge.game.GameActionUtil;
-import forge.game.ability.*;
-import forge.game.card.*;
+import forge.game.ability.AbilityKey;
+import forge.game.ability.AbilityUtils;
+import forge.game.ability.ApiType;
+import forge.game.card.Card;
+import forge.game.card.CardCollection;
+import forge.game.card.CardCollectionView;
+import forge.game.card.CardLists;
+import forge.game.card.CardPredicates;
+import forge.game.card.CardUtil;
+import forge.game.card.CounterEnumType;
import forge.game.combat.Combat;
import forge.game.combat.CombatUtil;
-import forge.game.cost.*;
+import forge.game.cost.Cost;
+import forge.game.cost.CostAdjustment;
+import forge.game.cost.CostPartMana;
+import forge.game.cost.CostPayEnergy;
+import forge.game.cost.CostPayment;
import forge.game.keyword.Keyword;
import forge.game.mana.Mana;
import forge.game.mana.ManaCostBeingPaid;
@@ -37,10 +67,6 @@ import forge.game.trigger.TriggerType;
import forge.game.zone.ZoneType;
import forge.util.MyRandom;
import forge.util.TextUtil;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.tuple.Pair;
-
-import java.util.*;
public class ComputerUtilMana {
private final static boolean DEBUG_MANA_PAYMENT = false;
diff --git a/forge-ai/src/main/java/forge/ai/GameState.java b/forge-ai/src/main/java/forge/ai/GameState.java
index 768cb8743a6..1c09d0171ee 100644
--- a/forge-ai/src/main/java/forge/ai/GameState.java
+++ b/forge-ai/src/main/java/forge/ai/GameState.java
@@ -1,9 +1,25 @@
package forge.ai;
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.EnumMap;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import org.apache.commons.lang3.StringUtils;
+
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Multimap;
+
import forge.StaticData;
import forge.card.CardStateName;
import forge.card.MagicColor;
@@ -13,7 +29,12 @@ import forge.game.GameObject;
import forge.game.ability.AbilityFactory;
import forge.game.ability.AbilityKey;
import forge.game.ability.effects.DetachedCardEffect;
-import forge.game.card.*;
+import forge.game.card.Card;
+import forge.game.card.CardCloneStates;
+import forge.game.card.CardCollection;
+import forge.game.card.CardCollectionView;
+import forge.game.card.CardFactory;
+import forge.game.card.CounterType;
import forge.game.card.token.TokenInfo;
import forge.game.combat.Combat;
import forge.game.combat.CombatUtil;
@@ -32,13 +53,6 @@ import forge.item.IPaperCard;
import forge.item.PaperCard;
import forge.util.TextUtil;
import forge.util.collect.FCollectionView;
-import org.apache.commons.lang3.StringUtils;
-
-import java.io.BufferedReader;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.util.*;
-import java.util.Map.Entry;
public abstract class GameState {
private static final Map ZONES = new HashMap<>();
diff --git a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java
index 06192d87258..573d0ce54d9 100644
--- a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java
+++ b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java
@@ -1,11 +1,24 @@
package forge.ai;
+import java.security.InvalidParameterException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.tuple.ImmutablePair;
+import org.apache.commons.lang3.tuple.Pair;
+
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Iterables;
import com.google.common.collect.ListMultimap;
import com.google.common.collect.Lists;
import com.google.common.collect.Multimap;
+
import forge.LobbyPlayer;
import forge.ai.ability.ProtectAi;
import forge.card.CardStateName;
@@ -21,19 +34,43 @@ import forge.game.GameObject;
import forge.game.GameType;
import forge.game.ability.AbilityUtils;
import forge.game.ability.ApiType;
-import forge.game.card.*;
+import forge.game.card.Card;
+import forge.game.card.CardCollection;
+import forge.game.card.CardCollectionView;
+import forge.game.card.CardLists;
+import forge.game.card.CardPredicates;
import forge.game.card.CardPredicates.Presets;
+import forge.game.card.CardUtil;
+import forge.game.card.CardView;
+import forge.game.card.CounterType;
import forge.game.combat.Combat;
-import forge.game.cost.*;
+import forge.game.cost.Cost;
+import forge.game.cost.CostAdjustment;
+import forge.game.cost.CostExile;
+import forge.game.cost.CostPart;
+import forge.game.cost.CostPartMana;
import forge.game.keyword.KeywordInterface;
import forge.game.mana.Mana;
import forge.game.mana.ManaConversionMatrix;
import forge.game.mana.ManaCostBeingPaid;
import forge.game.phase.PhaseHandler;
import forge.game.phase.PhaseType;
-import forge.game.player.*;
+import forge.game.player.DelayedReveal;
+import forge.game.player.Player;
+import forge.game.player.PlayerActionConfirmMode;
+import forge.game.player.PlayerController;
+import forge.game.player.PlayerView;
import forge.game.replacement.ReplacementEffect;
-import forge.game.spellability.*;
+import forge.game.spellability.Ability;
+import forge.game.spellability.AbilityStatic;
+import forge.game.spellability.AbilitySub;
+import forge.game.spellability.LandAbility;
+import forge.game.spellability.OptionalCost;
+import forge.game.spellability.OptionalCostValue;
+import forge.game.spellability.Spell;
+import forge.game.spellability.SpellAbility;
+import forge.game.spellability.SpellAbilityStackInstance;
+import forge.game.spellability.TargetChoices;
import forge.game.trigger.WrappedAbility;
import forge.game.zone.ZoneType;
import forge.item.PaperCard;
@@ -42,12 +79,6 @@ import forge.util.ITriggerEvent;
import forge.util.MyRandom;
import forge.util.collect.FCollection;
import forge.util.collect.FCollectionView;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.tuple.ImmutablePair;
-import org.apache.commons.lang3.tuple.Pair;
-
-import java.security.InvalidParameterException;
-import java.util.*;
/**
@@ -1159,7 +1190,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 +1198,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/SpecialAiLogic.java b/forge-ai/src/main/java/forge/ai/SpecialAiLogic.java
index c757133f256..2bc71048210 100644
--- a/forge-ai/src/main/java/forge/ai/SpecialAiLogic.java
+++ b/forge-ai/src/main/java/forge/ai/SpecialAiLogic.java
@@ -9,7 +9,13 @@ import forge.ai.ability.TokenAi;
import forge.game.Game;
import forge.game.ability.AbilityUtils;
import forge.game.ability.ApiType;
-import forge.game.card.*;
+import forge.game.card.Card;
+import forge.game.card.CardCollection;
+import forge.game.card.CardLists;
+import forge.game.card.CardPredicates;
+import forge.game.card.CardUtil;
+import forge.game.card.CounterEnumType;
+import forge.game.card.CounterType;
import forge.game.combat.Combat;
import forge.game.keyword.Keyword;
import forge.game.phase.PhaseHandler;
diff --git a/forge-ai/src/main/java/forge/ai/SpecialCardAi.java b/forge-ai/src/main/java/forge/ai/SpecialCardAi.java
index 85de244dbfd..f4581c5ccca 100644
--- a/forge-ai/src/main/java/forge/ai/SpecialCardAi.java
+++ b/forge-ai/src/main/java/forge/ai/SpecialCardAi.java
@@ -17,10 +17,17 @@
*/
package forge.ai;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.commons.lang3.tuple.Pair;
+
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
+
import forge.ai.ability.AnimateAi;
import forge.card.ColorSet;
import forge.card.MagicColor;
@@ -29,7 +36,14 @@ import forge.game.Game;
import forge.game.GameType;
import forge.game.ability.AbilityUtils;
import forge.game.ability.ApiType;
-import forge.game.card.*;
+import forge.game.card.Card;
+import forge.game.card.CardCollection;
+import forge.game.card.CardCollectionView;
+import forge.game.card.CardFactoryUtil;
+import forge.game.card.CardLists;
+import forge.game.card.CardPredicates;
+import forge.game.card.CardUtil;
+import forge.game.card.CounterEnumType;
import forge.game.combat.Combat;
import forge.game.combat.CombatUtil;
import forge.game.cost.CostPart;
@@ -50,11 +64,6 @@ import forge.util.MyRandom;
import forge.util.TextUtil;
import forge.util.maps.LinkedHashMapToAmount;
import forge.util.maps.MapToAmount;
-import org.apache.commons.lang3.tuple.Pair;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
/**
* Special logic for individual cards
diff --git a/forge-ai/src/main/java/forge/ai/SpellAbilityAi.java b/forge-ai/src/main/java/forge/ai/SpellAbilityAi.java
index d8c185684fd..841ea538387 100644
--- a/forge-ai/src/main/java/forge/ai/SpellAbilityAi.java
+++ b/forge-ai/src/main/java/forge/ai/SpellAbilityAi.java
@@ -1,7 +1,12 @@
package forge.ai;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
+
import forge.card.CardStateName;
import forge.card.ICardFace;
import forge.card.mana.ManaCost;
@@ -21,10 +26,6 @@ import forge.game.spellability.SpellAbility;
import forge.game.spellability.SpellAbilityCondition;
import forge.util.MyRandom;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-
/**
* Base class for API-specific AI logic
*
diff --git a/forge-ai/src/main/java/forge/ai/SpellApiToAi.java b/forge-ai/src/main/java/forge/ai/SpellApiToAi.java
index 3c2d50f8fde..6aad3f581c1 100644
--- a/forge-ai/src/main/java/forge/ai/SpellApiToAi.java
+++ b/forge-ai/src/main/java/forge/ai/SpellApiToAi.java
@@ -1,13 +1,14 @@
package forge.ai;
+import java.util.Map;
+
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Maps;
+
import forge.ai.ability.*;
import forge.game.ability.ApiType;
import forge.util.ReflectionUtil;
-import java.util.Map;
-
public enum SpellApiToAi {
Converter;
@@ -152,8 +153,8 @@ public enum SpellApiToAi {
.put(ApiType.SetLife, LifeSetAi.class)
.put(ApiType.SetState, SetStateAi.class)
.put(ApiType.Shuffle, ShuffleAi.class)
+ .put(ApiType.SkipPhase, SkipPhaseAi.class)
.put(ApiType.SkipTurn, SkipTurnAi.class)
- .put(ApiType.StoreMap, StoreMapAi.class)
.put(ApiType.StoreSVar, StoreSVarAi.class)
.put(ApiType.Subgame, AlwaysPlayAi.class)
.put(ApiType.Surveil, SurveilAi.class)
diff --git a/forge-ai/src/main/java/forge/ai/ability/ActivateAbilityAi.java b/forge-ai/src/main/java/forge/ai/ability/ActivateAbilityAi.java
index 18029dd4d7f..e261dab37db 100644
--- a/forge-ai/src/main/java/forge/ai/ability/ActivateAbilityAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/ActivateAbilityAi.java
@@ -1,5 +1,8 @@
package forge.ai.ability;
+import java.util.List;
+import java.util.Map;
+
import forge.ai.SpellAbilityAi;
import forge.game.ability.AbilityUtils;
import forge.game.card.Card;
@@ -10,9 +13,6 @@ import forge.game.spellability.TargetRestrictions;
import forge.game.zone.ZoneType;
import forge.util.MyRandom;
-import java.util.List;
-import java.util.Map;
-
public class ActivateAbilityAi extends SpellAbilityAi {
@Override
diff --git a/forge-ai/src/main/java/forge/ai/ability/AddTurnAi.java b/forge-ai/src/main/java/forge/ai/ability/AddTurnAi.java
index f20a3f2f7fd..2f3b28c53c1 100644
--- a/forge-ai/src/main/java/forge/ai/ability/AddTurnAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/AddTurnAi.java
@@ -17,15 +17,15 @@
*/
package forge.ai.ability;
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+
import forge.ai.SpellAbilityAi;
import forge.game.ability.AbilityUtils;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
-import java.util.List;
-
-import org.apache.commons.lang3.StringUtils;
-
/**
*
* AbilityFactory_Turns class.
diff --git a/forge-ai/src/main/java/forge/ai/ability/AmassAi.java b/forge-ai/src/main/java/forge/ai/ability/AmassAi.java
index ab54f83224d..fdd19038669 100644
--- a/forge-ai/src/main/java/forge/ai/ability/AmassAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/AmassAi.java
@@ -9,7 +9,11 @@ import forge.ai.ComputerUtilCard;
import forge.ai.SpellAbilityAi;
import forge.game.Game;
import forge.game.ability.AbilityUtils;
-import forge.game.card.*;
+import forge.game.card.Card;
+import forge.game.card.CardCollection;
+import forge.game.card.CardLists;
+import forge.game.card.CardPredicates;
+import forge.game.card.CounterEnumType;
import forge.game.card.token.TokenInfo;
import forge.game.phase.PhaseHandler;
import forge.game.player.Player;
diff --git a/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java b/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java
index 67f4d6fc376..34d33387a54 100644
--- a/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java
@@ -1,14 +1,31 @@
package forge.ai.ability;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
-import forge.ai.*;
+
+import forge.ai.AiCardMemory;
+import forge.ai.ComputerUtil;
+import forge.ai.ComputerUtilCard;
+import forge.ai.ComputerUtilCost;
+import forge.ai.ComputerUtilMana;
+import forge.ai.SpellAbilityAi;
import forge.card.CardType;
import forge.game.Game;
import forge.game.ability.AbilityUtils;
import forge.game.ability.ApiType;
-import forge.game.card.*;
+import forge.game.ability.effects.AnimateEffectBase;
+import forge.game.card.Card;
+import forge.game.card.CardCollection;
+import forge.game.card.CardCollectionView;
+import forge.game.card.CardLists;
+import forge.game.card.CardPredicates;
+import forge.game.card.CardTraitChanges;
+import forge.game.card.CardUtil;
import forge.game.cost.CostPutCounter;
import forge.game.phase.PhaseHandler;
import forge.game.phase.PhaseType;
@@ -19,12 +36,6 @@ import forge.game.staticability.StaticAbilityContinuous;
import forge.game.staticability.StaticAbilityLayer;
import forge.game.zone.ZoneType;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-
-import forge.game.ability.effects.AnimateEffectBase;
-
/**
*
* AbilityFactoryAnimate class.
diff --git a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java
index c4eb2fd118f..52b88f28a97 100644
--- a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java
@@ -1,17 +1,39 @@
package forge.ai.ability;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
-import forge.ai.*;
+
+import forge.ai.AiCardMemory;
+import forge.ai.AiController;
+import forge.ai.AiProps;
+import forge.ai.ComputerUtil;
+import forge.ai.ComputerUtilAbility;
+import forge.ai.ComputerUtilCard;
+import forge.ai.ComputerUtilCombat;
+import forge.ai.ComputerUtilCost;
+import forge.ai.PlayerControllerAi;
+import forge.ai.SpecialCardAi;
+import forge.ai.SpellAbilityAi;
import forge.game.Game;
import forge.game.GameObject;
import forge.game.GlobalRuleChange;
import forge.game.ability.AbilityFactory;
import forge.game.ability.AbilityUtils;
import forge.game.ability.ApiType;
-import forge.game.card.*;
+import forge.game.card.Card;
+import forge.game.card.CardCollection;
+import forge.game.card.CardCollectionView;
+import forge.game.card.CardLists;
+import forge.game.card.CardPredicates;
+import forge.game.card.CardUtil;
import forge.game.combat.Combat;
import forge.game.combat.CombatUtil;
import forge.game.cost.Cost;
@@ -31,8 +53,6 @@ import forge.game.trigger.TriggerType;
import forge.game.zone.ZoneType;
import forge.util.MyRandom;
-import java.util.*;
-
public class AttachAi extends SpellAbilityAi {
/* (non-Javadoc)
diff --git a/forge-ai/src/main/java/forge/ai/ability/CanPlayAsDrawbackAi.java b/forge-ai/src/main/java/forge/ai/ability/CanPlayAsDrawbackAi.java
index 96876913dd9..a0afe996eac 100644
--- a/forge-ai/src/main/java/forge/ai/ability/CanPlayAsDrawbackAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/CanPlayAsDrawbackAi.java
@@ -1,13 +1,13 @@
package forge.ai.ability;
+import java.util.List;
+import java.util.Map;
+
import forge.ai.SpellAbilityAi;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
-import java.util.List;
-import java.util.Map;
-
public class CanPlayAsDrawbackAi extends SpellAbilityAi {
/* (non-Javadoc)
diff --git a/forge-ai/src/main/java/forge/ai/ability/ChangeCombatantsAi.java b/forge-ai/src/main/java/forge/ai/ability/ChangeCombatantsAi.java
index 1187dc81cdc..f99261af499 100644
--- a/forge-ai/src/main/java/forge/ai/ability/ChangeCombatantsAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/ChangeCombatantsAi.java
@@ -1,5 +1,8 @@
package forge.ai.ability;
+import java.util.Collection;
+import java.util.Map;
+
import forge.ai.SpellAbilityAi;
import forge.game.GameEntity;
import forge.game.player.Player;
@@ -7,9 +10,6 @@ import forge.game.player.PlayerCollection;
import forge.game.player.PlayerPredicates;
import forge.game.spellability.SpellAbility;
-import java.util.Collection;
-import java.util.Map;
-
public class ChangeCombatantsAi extends SpellAbilityAi {
/* (non-Javadoc)
* @see forge.card.abilityfactory.SpellAiLogic#canPlayAI(forge.game.player.Player, java.util.Map, forge.card.spellability.SpellAbility)
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..33508f046d9 100644
--- a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java
@@ -1,11 +1,35 @@
package forge.ai.ability;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang3.StringUtils;
+
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
-import forge.ai.*;
+
+import forge.ai.AiBlockController;
+import forge.ai.AiCardMemory;
+import forge.ai.AiController;
+import forge.ai.AiProps;
+import forge.ai.ComputerUtil;
+import forge.ai.ComputerUtilAbility;
+import forge.ai.ComputerUtilCard;
+import forge.ai.ComputerUtilCombat;
+import forge.ai.ComputerUtilCost;
+import forge.ai.ComputerUtilMana;
+import forge.ai.PlayerControllerAi;
+import forge.ai.SpecialAiLogic;
+import forge.ai.SpecialCardAi;
+import forge.ai.SpellAbilityAi;
+import forge.ai.SpellApiToAi;
import forge.card.MagicColor;
import forge.game.Game;
import forge.game.GameObject;
@@ -13,8 +37,14 @@ import forge.game.GlobalRuleChange;
import forge.game.ability.AbilityKey;
import forge.game.ability.AbilityUtils;
import forge.game.ability.ApiType;
-import forge.game.card.*;
+import forge.game.card.Card;
+import forge.game.card.CardCollection;
+import forge.game.card.CardCollectionView;
+import forge.game.card.CardLists;
+import forge.game.card.CardPredicates;
import forge.game.card.CardPredicates.Presets;
+import forge.game.card.CardUtil;
+import forge.game.card.CounterEnumType;
import forge.game.combat.Combat;
import forge.game.cost.Cost;
import forge.game.cost.CostDiscard;
@@ -29,9 +59,6 @@ import forge.game.spellability.SpellAbility;
import forge.game.spellability.TargetRestrictions;
import forge.game.zone.ZoneType;
import forge.util.MyRandom;
-import org.apache.commons.lang3.StringUtils;
-
-import java.util.*;
public class ChangeZoneAi extends SpellAbilityAi {
/*
@@ -357,7 +384,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 +397,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 +1134,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 +1732,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 +1769,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 +1783,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/ChangeZoneAllAi.java b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAllAi.java
index c2d8939dc8c..2c3ab5706a1 100644
--- a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAllAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAllAi.java
@@ -1,12 +1,29 @@
package forge.ai.ability;
+import java.util.Collections;
+
import com.google.common.base.Predicates;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
-import forge.ai.*;
+
+import forge.ai.AiController;
+import forge.ai.AiPlayerPredicates;
+import forge.ai.AiProps;
+import forge.ai.ComputerUtil;
+import forge.ai.ComputerUtilAbility;
+import forge.ai.ComputerUtilCard;
+import forge.ai.ComputerUtilCombat;
+import forge.ai.ComputerUtilCost;
+import forge.ai.PlayerControllerAi;
+import forge.ai.SpecialCardAi;
+import forge.ai.SpellAbilityAi;
import forge.game.Game;
import forge.game.ability.AbilityUtils;
-import forge.game.card.*;
+import forge.game.card.Card;
+import forge.game.card.CardCollection;
+import forge.game.card.CardCollectionView;
+import forge.game.card.CardLists;
+import forge.game.card.CardPredicates;
import forge.game.cost.Cost;
import forge.game.phase.PhaseType;
import forge.game.player.Player;
@@ -17,8 +34,6 @@ import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
import forge.util.MyRandom;
-import java.util.Collections;
-
public class ChangeZoneAllAi extends SpellAbilityAi {
@Override
protected boolean canPlayAI(Player ai, SpellAbility sa) {
diff --git a/forge-ai/src/main/java/forge/ai/ability/CharmAi.java b/forge-ai/src/main/java/forge/ai/ability/CharmAi.java
index 8835fc47e33..46da4dca610 100644
--- a/forge-ai/src/main/java/forge/ai/ability/CharmAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/CharmAi.java
@@ -1,7 +1,15 @@
package forge.ai.ability;
+import java.util.List;
+import java.util.Map;
+
import com.google.common.collect.Lists;
-import forge.ai.*;
+
+import forge.ai.AiController;
+import forge.ai.AiPlayDecision;
+import forge.ai.ComputerUtilAbility;
+import forge.ai.PlayerControllerAi;
+import forge.ai.SpellAbilityAi;
import forge.game.ability.AbilityUtils;
import forge.game.ability.effects.CharmEffect;
import forge.game.card.Card;
@@ -12,9 +20,6 @@ import forge.util.Aggregates;
import forge.util.MyRandom;
import forge.util.collect.FCollection;
-import java.util.List;
-import java.util.Map;
-
public class CharmAi extends SpellAbilityAi {
@Override
protected boolean checkApiLogic(Player ai, SpellAbility sa) {
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..a50ee8c6def 100644
--- a/forge-ai/src/main/java/forge/ai/ability/ChooseCardAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/ChooseCardAi.java
@@ -10,7 +10,6 @@ import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import forge.ai.ComputerUtilAbility;
-
import forge.ai.ComputerUtilCard;
import forge.ai.ComputerUtilCombat;
import forge.ai.SpellAbilityAi;
@@ -66,7 +65,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 +78,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 +111,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 +185,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/ChooseCardNameAi.java b/forge-ai/src/main/java/forge/ai/ability/ChooseCardNameAi.java
index efd87798478..469a095fa4e 100644
--- a/forge-ai/src/main/java/forge/ai/ability/ChooseCardNameAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/ChooseCardNameAi.java
@@ -7,7 +7,10 @@ import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import forge.StaticData;
-import forge.ai.*;
+import forge.ai.ComputerUtil;
+import forge.ai.ComputerUtilCard;
+import forge.ai.SpecialCardAi;
+import forge.ai.SpellAbilityAi;
import forge.card.CardDb;
import forge.card.CardRules;
import forge.card.CardSplitType;
diff --git a/forge-ai/src/main/java/forge/ai/ability/ChooseColorAi.java b/forge-ai/src/main/java/forge/ai/ability/ChooseColorAi.java
index b8699dab200..b395c6382ad 100644
--- a/forge-ai/src/main/java/forge/ai/ability/ChooseColorAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/ChooseColorAi.java
@@ -8,7 +8,9 @@ import forge.ai.SpecialCardAi;
import forge.ai.SpellAbilityAi;
import forge.card.MagicColor;
import forge.game.Game;
-import forge.game.card.*;
+import forge.game.card.CardCollectionView;
+import forge.game.card.CardLists;
+import forge.game.card.CardPredicates;
import forge.game.phase.PhaseHandler;
import forge.game.phase.PhaseType;
import forge.game.player.Player;
diff --git a/forge-ai/src/main/java/forge/ai/ability/ChooseCompanionAi.java b/forge-ai/src/main/java/forge/ai/ability/ChooseCompanionAi.java
index 1240d9ab54f..e3e50950b18 100644
--- a/forge-ai/src/main/java/forge/ai/ability/ChooseCompanionAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/ChooseCompanionAi.java
@@ -1,15 +1,16 @@
package forge.ai.ability;
-import com.google.common.collect.Lists;
-import forge.ai.SpellAbilityAi;
-import forge.game.card.Card;
-import forge.game.player.Player;
-import forge.game.spellability.SpellAbility;
-
import java.util.Collections;
import java.util.List;
import java.util.Map;
+import com.google.common.collect.Lists;
+
+import forge.ai.SpellAbilityAi;
+import forge.game.card.Card;
+import forge.game.player.Player;
+import forge.game.spellability.SpellAbility;
+
public class ChooseCompanionAi extends SpellAbilityAi {
/* (non-Javadoc)
diff --git a/forge-ai/src/main/java/forge/ai/ability/ChooseGenericEffectAi.java b/forge-ai/src/main/java/forge/ai/ability/ChooseGenericEffectAi.java
index c45a66bc32e..9078eab7c4f 100644
--- a/forge-ai/src/main/java/forge/ai/ability/ChooseGenericEffectAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/ChooseGenericEffectAi.java
@@ -1,14 +1,28 @@
package forge.ai.ability;
+import java.util.List;
+import java.util.Map;
+
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
-import forge.ai.*;
+
+import forge.ai.ComputerUtilAbility;
+import forge.ai.ComputerUtilCard;
+import forge.ai.ComputerUtilCost;
+import forge.ai.SpecialCardAi;
+import forge.ai.SpellAbilityAi;
+import forge.ai.SpellApiToAi;
import forge.card.MagicColor;
import forge.game.Game;
-import forge.game.card.*;
+import forge.game.card.Card;
+import forge.game.card.CardCollection;
+import forge.game.card.CardCollectionView;
+import forge.game.card.CardLists;
import forge.game.card.CardPredicates.Presets;
+import forge.game.card.CardUtil;
+import forge.game.card.CounterEnumType;
import forge.game.combat.Combat;
import forge.game.combat.CombatUtil;
import forge.game.cost.Cost;
@@ -21,9 +35,6 @@ import forge.game.zone.ZoneType;
import forge.util.Aggregates;
import forge.util.collect.FCollection;
-import java.util.List;
-import java.util.Map;
-
public class ChooseGenericEffectAi extends SpellAbilityAi {
@@ -159,10 +170,10 @@ public class ChooseGenericEffectAi extends SpellAbilityAi {
}
}
// FatespinnerSkipDraw,FatespinnerSkipMain,FatespinnerSkipCombat
- if (player.hasKeyword("Skip your draw step.")) {
+ if (game.getReplacementHandler().wouldPhaseBeSkipped(player, "Draw")) {
return skipDraw;
}
- if (player.hasKeyword("Skip your next combat phase.")) {
+ if (game.getReplacementHandler().wouldPhaseBeSkipped(player, "BeginCombat")) {
return skipCombat;
}
diff --git a/forge-ai/src/main/java/forge/ai/ability/ChoosePlayerAi.java b/forge-ai/src/main/java/forge/ai/ability/ChoosePlayerAi.java
index 5b98b108cda..2b5c6af415a 100644
--- a/forge-ai/src/main/java/forge/ai/ability/ChoosePlayerAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/ChoosePlayerAi.java
@@ -1,16 +1,17 @@
package forge.ai.ability;
+import java.util.List;
+import java.util.Map;
+
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
+
import forge.ai.ComputerUtil;
import forge.ai.SpellAbilityAi;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
-import java.util.List;
-import java.util.Map;
-
public class ChoosePlayerAi extends SpellAbilityAi {
@Override
protected boolean canPlayAI(Player ai, SpellAbility sa) {
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/ChooseTypeAi.java b/forge-ai/src/main/java/forge/ai/ability/ChooseTypeAi.java
index 3ca712c2c0b..91690a61212 100644
--- a/forge-ai/src/main/java/forge/ai/ability/ChooseTypeAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/ChooseTypeAi.java
@@ -1,11 +1,23 @@
package forge.ai.ability;
+import java.util.HashSet;
+import java.util.Set;
+
import com.google.common.base.Predicates;
-import forge.ai.*;
+
+import forge.ai.AiCardMemory;
+import forge.ai.ComputerUtilAbility;
+import forge.ai.ComputerUtilCard;
+import forge.ai.ComputerUtilMana;
+import forge.ai.SpellAbilityAi;
import forge.card.CardType;
import forge.game.ability.AbilityUtils;
import forge.game.ability.ApiType;
-import forge.game.card.*;
+import forge.game.card.Card;
+import forge.game.card.CardCollection;
+import forge.game.card.CardCollectionView;
+import forge.game.card.CardLists;
+import forge.game.card.CardPredicates;
import forge.game.keyword.Keyword;
import forge.game.phase.PhaseType;
import forge.game.player.Player;
@@ -13,9 +25,6 @@ import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
import forge.util.Aggregates;
-import java.util.HashSet;
-import java.util.Set;
-
public class ChooseTypeAi extends SpellAbilityAi {
@Override
protected boolean canPlayAI(Player aiPlayer, SpellAbility sa) {
diff --git a/forge-ai/src/main/java/forge/ai/ability/ClashAi.java b/forge-ai/src/main/java/forge/ai/ability/ClashAi.java
index 2d8859d8a4c..0c6c65ff151 100644
--- a/forge-ai/src/main/java/forge/ai/ability/ClashAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/ClashAi.java
@@ -4,8 +4,8 @@ package forge.ai.ability;
import java.util.Map;
import com.google.common.collect.Iterables;
-import forge.ai.ComputerUtilCard;
+import forge.ai.ComputerUtilCard;
import forge.ai.SpellAbilityAi;
import forge.game.card.Card;
import forge.game.card.CardCollectionView;
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..abcc104fed4 100644
--- a/forge-ai/src/main/java/forge/ai/ability/CloneAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/CloneAi.java
@@ -1,5 +1,8 @@
package forge.ai.ability;
+import java.util.List;
+import java.util.Map;
+
import forge.ai.ComputerUtilCard;
import forge.ai.SpellAbilityAi;
import forge.game.Game;
@@ -14,9 +17,6 @@ import forge.game.player.PlayerActionConfirmMode;
import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
-import java.util.List;
-import java.util.Map;
-
public class CloneAi extends SpellAbilityAi {
@Override
@@ -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..d493849c6af 100644
--- a/forge-ai/src/main/java/forge/ai/ability/CopyPermanentAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/CopyPermanentAi.java
@@ -1,14 +1,29 @@
package forge.ai.ability;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Iterables;
-import forge.ai.*;
+
+import forge.ai.AiPlayDecision;
+import forge.ai.ComputerUtil;
+import forge.ai.ComputerUtilAbility;
+import forge.ai.ComputerUtilCard;
+import forge.ai.SpecialCardAi;
+import forge.ai.SpellAbilityAi;
import forge.game.Game;
import forge.game.ability.AbilityKey;
import forge.game.ability.AbilityUtils;
-import forge.game.card.*;
+import forge.game.card.Card;
+import forge.game.card.CardCollection;
+import forge.game.card.CardCollectionView;
+import forge.game.card.CardLists;
+import forge.game.card.CardPredicates;
import forge.game.card.CardPredicates.Presets;
+import forge.game.card.CardUtil;
import forge.game.phase.PhaseHandler;
import forge.game.phase.PhaseType;
import forge.game.player.Player;
@@ -17,10 +32,6 @@ import forge.game.player.PlayerCollection;
import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-
public class CopyPermanentAi extends SpellAbilityAi {
@Override
protected boolean canPlayAI(Player aiPlayer, SpellAbility sa) {
@@ -173,7 +184,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/CopySpellAbilityAi.java b/forge-ai/src/main/java/forge/ai/ability/CopySpellAbilityAi.java
index 2483d259119..3fb611d430f 100644
--- a/forge-ai/src/main/java/forge/ai/ability/CopySpellAbilityAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/CopySpellAbilityAi.java
@@ -1,6 +1,15 @@
package forge.ai.ability;
-import forge.ai.*;
+import java.util.List;
+import java.util.Map;
+
+import forge.ai.AiCardMemory;
+import forge.ai.AiPlayDecision;
+import forge.ai.AiProps;
+import forge.ai.ComputerUtilCard;
+import forge.ai.PlayerControllerAi;
+import forge.ai.SpecialCardAi;
+import forge.ai.SpellAbilityAi;
import forge.game.Game;
import forge.game.ability.ApiType;
import forge.game.player.Player;
@@ -10,9 +19,6 @@ import forge.game.spellability.SpellAbility;
import forge.game.spellability.TargetRestrictions;
import forge.util.MyRandom;
-import java.util.List;
-import java.util.Map;
-
public class CopySpellAbilityAi extends SpellAbilityAi {
@Override
diff --git a/forge-ai/src/main/java/forge/ai/ability/CounterAi.java b/forge-ai/src/main/java/forge/ai/ability/CounterAi.java
index 4f153415e31..764d74822be 100644
--- a/forge-ai/src/main/java/forge/ai/ability/CounterAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/CounterAi.java
@@ -1,6 +1,19 @@
package forge.ai.ability;
-import forge.ai.*;
+import java.util.Iterator;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.tuple.ImmutablePair;
+import org.apache.commons.lang3.tuple.Pair;
+
+import forge.ai.AiController;
+import forge.ai.AiProps;
+import forge.ai.ComputerUtilAbility;
+import forge.ai.ComputerUtilCost;
+import forge.ai.ComputerUtilMana;
+import forge.ai.PlayerControllerAi;
+import forge.ai.SpecialCardAi;
+import forge.ai.SpellAbilityAi;
import forge.game.Game;
import forge.game.ability.AbilityUtils;
import forge.game.ability.ApiType;
@@ -16,11 +29,6 @@ import forge.game.spellability.SpellAbilityStackInstance;
import forge.game.spellability.TargetRestrictions;
import forge.game.zone.ZoneType;
import forge.util.MyRandom;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.tuple.ImmutablePair;
-import org.apache.commons.lang3.tuple.Pair;
-
-import java.util.Iterator;
public class CounterAi extends SpellAbilityAi {
diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersAi.java
index ad8d6335b8a..2b73110bc43 100644
--- a/forge-ai/src/main/java/forge/ai/ability/CountersAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/CountersAi.java
@@ -22,7 +22,12 @@ import java.util.List;
import com.google.common.base.Predicate;
import forge.ai.ComputerUtilCard;
-import forge.game.card.*;
+import forge.game.card.Card;
+import forge.game.card.CardCollection;
+import forge.game.card.CardCollectionView;
+import forge.game.card.CardLists;
+import forge.game.card.CounterEnumType;
+import forge.game.card.CounterType;
import forge.game.keyword.Keyword;
import forge.util.Aggregates;
diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersMoveAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersMoveAi.java
index 14b22f00b1d..105e248f346 100644
--- a/forge-ai/src/main/java/forge/ai/ability/CountersMoveAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/CountersMoveAi.java
@@ -1,13 +1,22 @@
package forge.ai.ability;
+import java.util.List;
+import java.util.Map;
+
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
+
import forge.ai.ComputerUtil;
import forge.ai.ComputerUtilCard;
import forge.ai.SpellAbilityAi;
import forge.game.Game;
import forge.game.ability.AbilityUtils;
-import forge.game.card.*;
+import forge.game.card.Card;
+import forge.game.card.CardLists;
+import forge.game.card.CardPredicates;
+import forge.game.card.CardUtil;
+import forge.game.card.CounterEnumType;
+import forge.game.card.CounterType;
import forge.game.keyword.Keyword;
import forge.game.phase.PhaseHandler;
import forge.game.phase.PhaseType;
@@ -17,9 +26,6 @@ import forge.game.zone.ZoneType;
import forge.util.MyRandom;
import forge.util.collect.FCollection;
-import java.util.List;
-import java.util.Map;
-
public class CountersMoveAi extends SpellAbilityAi {
@Override
protected boolean checkApiLogic(final Player ai, final SpellAbility sa) {
diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java
index 331067a1770..a47b8326bd1 100644
--- a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java
@@ -1,19 +1,43 @@
package forge.ai.ability;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
-import forge.ai.*;
+
+import forge.ai.AiCardMemory;
+import forge.ai.AiProps;
+import forge.ai.ComputerUtil;
+import forge.ai.ComputerUtilAbility;
+import forge.ai.ComputerUtilCard;
+import forge.ai.ComputerUtilCombat;
+import forge.ai.ComputerUtilCost;
+import forge.ai.PlayerControllerAi;
+import forge.ai.SpecialAiLogic;
+import forge.ai.SpecialCardAi;
+import forge.ai.SpellAbilityAi;
import forge.card.CardStateName;
import forge.game.Game;
import forge.game.GameEntity;
import forge.game.ability.AbilityUtils;
import forge.game.ability.ApiType;
-import forge.game.card.*;
+import forge.game.card.Card;
+import forge.game.card.CardCollection;
+import forge.game.card.CardLists;
+import forge.game.card.CardPredicates;
+import forge.game.card.CounterEnumType;
+import forge.game.card.CounterType;
import forge.game.combat.Combat;
import forge.game.combat.CombatUtil;
-import forge.game.cost.*;
+import forge.game.cost.Cost;
+import forge.game.cost.CostPart;
+import forge.game.cost.CostPutCounter;
+import forge.game.cost.CostRemoveCounter;
+import forge.game.cost.CostSacrifice;
import forge.game.keyword.Keyword;
import forge.game.phase.PhaseHandler;
import forge.game.phase.PhaseType;
@@ -27,10 +51,6 @@ import forge.game.zone.ZoneType;
import forge.util.Aggregates;
import forge.util.MyRandom;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
public class CountersPutAi extends SpellAbilityAi {
/*
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..ace8c07c457 100644
--- a/forge-ai/src/main/java/forge/ai/ability/CountersPutAllAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/CountersPutAllAi.java
@@ -1,7 +1,10 @@
package forge.ai.ability;
+import java.util.List;
+
import com.google.common.base.Predicate;
import com.google.common.collect.Lists;
+
import forge.ai.ComputerUtilCost;
import forge.ai.SpellAbilityAi;
import forge.game.ability.AbilityUtils;
@@ -18,8 +21,6 @@ import forge.game.spellability.TargetRestrictions;
import forge.game.zone.ZoneType;
import forge.util.MyRandom;
-import java.util.List;
-
public class CountersPutAllAi extends SpellAbilityAi {
@Override
protected boolean canPlayAI(Player ai, SpellAbility sa) {
@@ -38,11 +39,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/CountersPutOrRemoveAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersPutOrRemoveAi.java
index 70e66e15c59..e0f53792b5a 100644
--- a/forge-ai/src/main/java/forge/ai/ability/CountersPutOrRemoveAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/CountersPutOrRemoveAi.java
@@ -17,21 +17,27 @@
*/
package forge.ai.ability;
+import java.util.List;
+import java.util.Map;
+
import forge.ai.ComputerUtil;
import forge.ai.ComputerUtilCard;
import forge.ai.SpellAbilityAi;
import forge.game.Game;
import forge.game.GlobalRuleChange;
-import forge.game.card.*;
+import forge.game.card.Card;
+import forge.game.card.CardCollection;
+import forge.game.card.CardCollectionView;
+import forge.game.card.CardLists;
+import forge.game.card.CardPredicates;
+import forge.game.card.CounterEnumType;
+import forge.game.card.CounterType;
import forge.game.keyword.Keyword;
import forge.game.player.Player;
import forge.game.player.PlayerController.BinaryChoiceType;
import forge.game.spellability.SpellAbility;
import forge.game.spellability.TargetRestrictions;
-import java.util.List;
-import java.util.Map;
-
/**
*
* AbilityFactory_PutOrRemoveCountersAi class.
diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersRemoveAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersRemoveAi.java
index fe9b81d8104..82527015d51 100644
--- a/forge-ai/src/main/java/forge/ai/ability/CountersRemoveAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/CountersRemoveAi.java
@@ -1,6 +1,10 @@
package forge.ai.ability;
+import java.util.List;
+import java.util.Map;
+
import com.google.common.base.Predicates;
+
import forge.ai.ComputerUtil;
import forge.ai.ComputerUtilCard;
import forge.ai.ComputerUtilCost;
@@ -9,7 +13,13 @@ import forge.game.Game;
import forge.game.GameEntity;
import forge.game.GlobalRuleChange;
import forge.game.ability.AbilityUtils;
-import forge.game.card.*;
+import forge.game.card.Card;
+import forge.game.card.CardCollection;
+import forge.game.card.CardCollectionView;
+import forge.game.card.CardLists;
+import forge.game.card.CardPredicates;
+import forge.game.card.CounterEnumType;
+import forge.game.card.CounterType;
import forge.game.keyword.Keyword;
import forge.game.phase.PhaseHandler;
import forge.game.phase.PhaseType;
@@ -18,9 +28,6 @@ import forge.game.spellability.SpellAbility;
import forge.game.spellability.TargetRestrictions;
import forge.game.zone.ZoneType;
-import java.util.List;
-import java.util.Map;
-
public class CountersRemoveAi extends SpellAbilityAi {
@Override
diff --git a/forge-ai/src/main/java/forge/ai/ability/DamageAiBase.java b/forge-ai/src/main/java/forge/ai/ability/DamageAiBase.java
index 44ebb7170c5..ede5ecf7b2b 100644
--- a/forge-ai/src/main/java/forge/ai/ability/DamageAiBase.java
+++ b/forge-ai/src/main/java/forge/ai/ability/DamageAiBase.java
@@ -1,6 +1,7 @@
package forge.ai.ability;
import com.google.common.collect.Iterables;
+
import forge.ai.ComputerUtilCombat;
import forge.ai.SpellAbilityAi;
import forge.game.Game;
diff --git a/forge-ai/src/main/java/forge/ai/ability/DamageAllAi.java b/forge-ai/src/main/java/forge/ai/ability/DamageAllAi.java
index 70bf867fc18..4d1203b61c1 100644
--- a/forge-ai/src/main/java/forge/ai/ability/DamageAllAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/DamageAllAi.java
@@ -1,7 +1,12 @@
package forge.ai.ability;
import com.google.common.base.Predicate;
-import forge.ai.*;
+
+import forge.ai.ComputerUtilCard;
+import forge.ai.ComputerUtilCombat;
+import forge.ai.ComputerUtilCost;
+import forge.ai.ComputerUtilMana;
+import forge.ai.SpellAbilityAi;
import forge.game.ability.AbilityUtils;
import forge.game.card.Card;
import forge.game.card.CardCollection;
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..220e06c0876 100644
--- a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java
@@ -1,16 +1,39 @@
package forge.ai.ability;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.tuple.Pair;
+
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
-import forge.ai.*;
+
+import forge.ai.AiController;
+import forge.ai.AiProps;
+import forge.ai.ComputerUtil;
+import forge.ai.ComputerUtilAbility;
+import forge.ai.ComputerUtilCard;
+import forge.ai.ComputerUtilCombat;
+import forge.ai.ComputerUtilCost;
+import forge.ai.ComputerUtilMana;
+import forge.ai.PlayerControllerAi;
+import forge.ai.SpecialCardAi;
+import forge.ai.SpellAbilityAi;
import forge.card.mana.ManaCost;
import forge.game.Game;
import forge.game.GameObject;
import forge.game.ability.AbilityUtils;
import forge.game.ability.ApiType;
-import forge.game.card.*;
+import forge.game.card.Card;
+import forge.game.card.CardCollection;
+import forge.game.card.CardFactoryUtil;
+import forge.game.card.CardLists;
+import forge.game.card.CardPredicates;
+import forge.game.card.CounterEnumType;
import forge.game.cost.Cost;
import forge.game.cost.CostPartMana;
import forge.game.cost.CostRemoveCounter;
@@ -26,12 +49,6 @@ import forge.game.spellability.TargetRestrictions;
import forge.game.zone.ZoneType;
import forge.util.Aggregates;
import forge.util.MyRandom;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.tuple.Pair;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
public class DamageDealAi extends DamageAiBase {
@Override
@@ -161,7 +178,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/DamagePreventAi.java b/forge-ai/src/main/java/forge/ai/ability/DamagePreventAi.java
index 964c427c649..447a187df2d 100644
--- a/forge-ai/src/main/java/forge/ai/ability/DamagePreventAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/DamagePreventAi.java
@@ -1,6 +1,13 @@
package forge.ai.ability;
-import forge.ai.*;
+import java.util.ArrayList;
+import java.util.List;
+
+import forge.ai.ComputerUtil;
+import forge.ai.ComputerUtilCard;
+import forge.ai.ComputerUtilCombat;
+import forge.ai.ComputerUtilCost;
+import forge.ai.SpellAbilityAi;
import forge.game.Game;
import forge.game.GameObject;
import forge.game.ability.AbilityUtils;
@@ -19,9 +26,6 @@ import forge.game.spellability.TargetChoices;
import forge.game.spellability.TargetRestrictions;
import forge.game.zone.ZoneType;
-import java.util.ArrayList;
-import java.util.List;
-
public class DamagePreventAi extends SpellAbilityAi {
@Override
diff --git a/forge-ai/src/main/java/forge/ai/ability/DebuffAi.java b/forge-ai/src/main/java/forge/ai/ability/DebuffAi.java
index b41018c9d35..4a28f540a1e 100644
--- a/forge-ai/src/main/java/forge/ai/ability/DebuffAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/DebuffAi.java
@@ -1,5 +1,9 @@
package forge.ai.ability;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
@@ -21,10 +25,6 @@ import forge.game.spellability.SpellAbility;
import forge.game.spellability.TargetRestrictions;
import forge.game.zone.ZoneType;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
public class DebuffAi extends SpellAbilityAi {
// *************************************************************************
// ***************************** Debuff ************************************
diff --git a/forge-ai/src/main/java/forge/ai/ability/DelayedTriggerAi.java b/forge-ai/src/main/java/forge/ai/ability/DelayedTriggerAi.java
index bede875289d..7319d44d128 100644
--- a/forge-ai/src/main/java/forge/ai/ability/DelayedTriggerAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/DelayedTriggerAi.java
@@ -1,7 +1,14 @@
package forge.ai.ability;
import com.google.common.base.Predicate;
-import forge.ai.*;
+
+import forge.ai.AiController;
+import forge.ai.AiPlayDecision;
+import forge.ai.ComputerUtilAbility;
+import forge.ai.ComputerUtilMana;
+import forge.ai.PlayerControllerAi;
+import forge.ai.SpellAbilityAi;
+import forge.ai.SpellApiToAi;
import forge.card.mana.ManaCost;
import forge.game.ability.ApiType;
import forge.game.card.Card;
diff --git a/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java b/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java
index cee64159ff9..0b97955cb30 100644
--- a/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/DestroyAi.java
@@ -1,10 +1,23 @@
package forge.ai.ability;
import com.google.common.base.Predicate;
-import forge.ai.*;
+
+import forge.ai.AiController;
+import forge.ai.AiProps;
+import forge.ai.ComputerUtil;
+import forge.ai.ComputerUtilCard;
+import forge.ai.ComputerUtilCost;
+import forge.ai.PlayerControllerAi;
+import forge.ai.SpecialAiLogic;
+import forge.ai.SpecialCardAi;
+import forge.ai.SpellAbilityAi;
import forge.game.ability.AbilityUtils;
import forge.game.ability.ApiType;
-import forge.game.card.*;
+import forge.game.card.Card;
+import forge.game.card.CardCollection;
+import forge.game.card.CardLists;
+import forge.game.card.CardPredicates;
+import forge.game.card.CounterEnumType;
import forge.game.cost.Cost;
import forge.game.cost.CostPart;
import forge.game.cost.CostSacrifice;
diff --git a/forge-ai/src/main/java/forge/ai/ability/DestroyAllAi.java b/forge-ai/src/main/java/forge/ai/ability/DestroyAllAi.java
index 0748cf03489..13f1a975b53 100644
--- a/forge-ai/src/main/java/forge/ai/ability/DestroyAllAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/DestroyAllAi.java
@@ -2,7 +2,13 @@ package forge.ai.ability;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
-import forge.ai.*;
+
+import forge.ai.AiBlockController;
+import forge.ai.ComputerUtil;
+import forge.ai.ComputerUtilCard;
+import forge.ai.ComputerUtilCombat;
+import forge.ai.ComputerUtilCost;
+import forge.ai.SpellAbilityAi;
import forge.card.MagicColor;
import forge.game.card.Card;
import forge.game.card.CardCollection;
diff --git a/forge-ai/src/main/java/forge/ai/ability/DigAi.java b/forge-ai/src/main/java/forge/ai/ability/DigAi.java
index 43eaf8a28ad..4d7ffc1f458 100644
--- a/forge-ai/src/main/java/forge/ai/ability/DigAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/DigAi.java
@@ -5,7 +5,12 @@ import java.util.Map;
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
-import forge.ai.*;
+import forge.ai.ComputerUtil;
+import forge.ai.ComputerUtilAbility;
+import forge.ai.ComputerUtilCard;
+import forge.ai.ComputerUtilCost;
+import forge.ai.SpecialCardAi;
+import forge.ai.SpellAbilityAi;
import forge.game.Game;
import forge.game.ability.AbilityUtils;
import forge.game.card.Card;
diff --git a/forge-ai/src/main/java/forge/ai/ability/DigUntilAi.java b/forge-ai/src/main/java/forge/ai/ability/DigUntilAi.java
index 9900061c522..449561f46bf 100644
--- a/forge-ai/src/main/java/forge/ai/ability/DigUntilAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/DigUntilAi.java
@@ -1,5 +1,7 @@
package forge.ai.ability;
+import java.util.List;
+
import forge.ai.ComputerUtilCost;
import forge.ai.SpellAbilityAi;
import forge.game.card.Card;
@@ -12,8 +14,6 @@ import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
import forge.util.MyRandom;
-import java.util.List;
-
public class DigUntilAi extends SpellAbilityAi {
@Override
diff --git a/forge-ai/src/main/java/forge/ai/ability/DiscardAi.java b/forge-ai/src/main/java/forge/ai/ability/DiscardAi.java
index 3cf639917e3..102089f06e6 100644
--- a/forge-ai/src/main/java/forge/ai/ability/DiscardAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/DiscardAi.java
@@ -1,6 +1,13 @@
package forge.ai.ability;
-import forge.ai.*;
+import java.util.List;
+
+import forge.ai.ComputerUtil;
+import forge.ai.ComputerUtilAbility;
+import forge.ai.ComputerUtilCost;
+import forge.ai.ComputerUtilMana;
+import forge.ai.SpecialCardAi;
+import forge.ai.SpellAbilityAi;
import forge.game.ability.AbilityUtils;
import forge.game.card.Card;
import forge.game.card.CardCollectionView;
@@ -15,8 +22,6 @@ import forge.game.spellability.TargetRestrictions;
import forge.game.zone.ZoneType;
import forge.util.MyRandom;
-import java.util.List;
-
public class DiscardAi extends SpellAbilityAi {
@Override
diff --git a/forge-ai/src/main/java/forge/ai/ability/DrainManaAi.java b/forge-ai/src/main/java/forge/ai/ability/DrainManaAi.java
index fbb96a1dc91..96310431fc3 100644
--- a/forge-ai/src/main/java/forge/ai/ability/DrainManaAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/DrainManaAi.java
@@ -1,5 +1,7 @@
package forge.ai.ability;
+import java.util.List;
+
import forge.ai.SpellAbilityAi;
import forge.game.ability.AbilityUtils;
import forge.game.card.Card;
@@ -8,8 +10,6 @@ import forge.game.spellability.SpellAbility;
import forge.game.spellability.TargetRestrictions;
import forge.util.MyRandom;
-import java.util.List;
-
public class DrainManaAi extends SpellAbilityAi {
@Override
diff --git a/forge-ai/src/main/java/forge/ai/ability/DrawAi.java b/forge-ai/src/main/java/forge/ai/ability/DrawAi.java
index b48bc62b42e..3f664109774 100644
--- a/forge-ai/src/main/java/forge/ai/ability/DrawAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/DrawAi.java
@@ -18,14 +18,24 @@
*/
package forge.ai.ability;
-import forge.ai.*;
+import forge.ai.AiCostDecision;
+import forge.ai.ComputerUtil;
+import forge.ai.ComputerUtilAbility;
+import forge.ai.ComputerUtilCost;
+import forge.ai.ComputerUtilMana;
+import forge.ai.SpecialCardAi;
+import forge.ai.SpellAbilityAi;
import forge.game.Game;
import forge.game.ability.AbilityUtils;
import forge.game.ability.ApiType;
import forge.game.card.Card;
import forge.game.card.CounterEnumType;
import forge.game.card.CounterType;
-import forge.game.cost.*;
+import forge.game.cost.Cost;
+import forge.game.cost.CostDiscard;
+import forge.game.cost.CostPart;
+import forge.game.cost.CostPayLife;
+import forge.game.cost.PaymentDecision;
import forge.game.phase.PhaseHandler;
import forge.game.phase.PhaseType;
import forge.game.player.Player;
diff --git a/forge-ai/src/main/java/forge/ai/ability/EffectAi.java b/forge-ai/src/main/java/forge/ai/ability/EffectAi.java
index 16999292f12..8614c4eb2d2 100644
--- a/forge-ai/src/main/java/forge/ai/ability/EffectAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/EffectAi.java
@@ -1,12 +1,28 @@
package forge.ai.ability;
+import java.util.List;
+
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Iterables;
-import forge.ai.*;
+
+import forge.ai.AiCardMemory;
+import forge.ai.AiController;
+import forge.ai.ComputerUtil;
+import forge.ai.ComputerUtilCard;
+import forge.ai.ComputerUtilCombat;
+import forge.ai.ComputerUtilMana;
+import forge.ai.PlayerControllerAi;
+import forge.ai.SpecialCardAi;
+import forge.ai.SpellAbilityAi;
+import forge.ai.SpellApiToAi;
import forge.game.Game;
import forge.game.ability.ApiType;
-import forge.game.card.*;
+import forge.game.card.Card;
+import forge.game.card.CardCollection;
+import forge.game.card.CardCollectionView;
+import forge.game.card.CardLists;
+import forge.game.card.CardPredicates;
import forge.game.combat.Combat;
import forge.game.combat.CombatUtil;
import forge.game.phase.PhaseHandler;
@@ -18,8 +34,6 @@ import forge.game.spellability.TargetRestrictions;
import forge.game.zone.ZoneType;
import forge.util.MyRandom;
-import java.util.List;
-
public class EffectAi extends SpellAbilityAi {
@Override
protected boolean canPlayAI(final Player ai,final SpellAbility sa) {
diff --git a/forge-ai/src/main/java/forge/ai/ability/ExploreAi.java b/forge-ai/src/main/java/forge/ai/ability/ExploreAi.java
index ba299f3a0c9..261c4e9d9d6 100644
--- a/forge-ai/src/main/java/forge/ai/ability/ExploreAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/ExploreAi.java
@@ -1,8 +1,17 @@
package forge.ai.ability;
-import forge.ai.*;
-import forge.game.card.*;
+import forge.ai.AiController;
+import forge.ai.AiProps;
+import forge.ai.ComputerUtilCard;
+import forge.ai.ComputerUtilMana;
+import forge.ai.PlayerControllerAi;
+import forge.ai.SpellAbilityAi;
+import forge.game.card.Card;
+import forge.game.card.CardCollection;
+import forge.game.card.CardCollectionView;
+import forge.game.card.CardLists;
+import forge.game.card.CardPredicates;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
diff --git a/forge-ai/src/main/java/forge/ai/ability/FightAi.java b/forge-ai/src/main/java/forge/ai/ability/FightAi.java
index 942579582f1..e40166f2cd5 100644
--- a/forge-ai/src/main/java/forge/ai/ability/FightAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/FightAi.java
@@ -1,6 +1,13 @@
package forge.ai.ability;
-import forge.ai.*;
+import java.util.List;
+import java.util.Map;
+
+import forge.ai.ComputerUtil;
+import forge.ai.ComputerUtilAbility;
+import forge.ai.ComputerUtilCard;
+import forge.ai.ComputerUtilCombat;
+import forge.ai.SpellAbilityAi;
import forge.game.ability.AbilityFactory;
import forge.game.ability.AbilityUtils;
import forge.game.ability.ApiType;
@@ -16,9 +23,6 @@ import forge.game.trigger.Trigger;
import forge.game.trigger.TriggerType;
import forge.util.MyRandom;
-import java.util.List;
-import java.util.Map;
-
public class FightAi extends SpellAbilityAi {
@Override
protected boolean checkAiLogic(final Player ai, final SpellAbility sa, final String aiLogic) {
diff --git a/forge-ai/src/main/java/forge/ai/ability/FogAi.java b/forge-ai/src/main/java/forge/ai/ability/FogAi.java
index 72a4a2eaf91..6dc63330369 100644
--- a/forge-ai/src/main/java/forge/ai/ability/FogAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/FogAi.java
@@ -1,7 +1,13 @@
package forge.ai.ability;
-import forge.ai.*;
+import java.util.List;
+
+import forge.ai.AiCardMemory;
+import forge.ai.ComputerUtil;
+import forge.ai.ComputerUtilCombat;
+import forge.ai.PlayerControllerAi;
+import forge.ai.SpellAbilityAi;
import forge.game.Game;
import forge.game.GameObject;
import forge.game.card.Card;
@@ -12,8 +18,6 @@ import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.util.Aggregates;
-import java.util.List;
-
public class FogAi extends SpellAbilityAi {
/* (non-Javadoc)
diff --git a/forge-ai/src/main/java/forge/ai/ability/ImmediateTriggerAi.java b/forge-ai/src/main/java/forge/ai/ability/ImmediateTriggerAi.java
index fe0830352a6..5b32df43cee 100644
--- a/forge-ai/src/main/java/forge/ai/ability/ImmediateTriggerAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/ImmediateTriggerAi.java
@@ -1,6 +1,11 @@
package forge.ai.ability;
-import forge.ai.*;
+import forge.ai.AiController;
+import forge.ai.AiPlayDecision;
+import forge.ai.ComputerUtilCost;
+import forge.ai.PlayerControllerAi;
+import forge.ai.SpellAbilityAi;
+import forge.ai.SpellApiToAi;
import forge.game.player.Player;
import forge.game.spellability.AbilitySub;
import forge.game.spellability.SpellAbility;
diff --git a/forge-ai/src/main/java/forge/ai/ability/LegendaryRuleAi.java b/forge-ai/src/main/java/forge/ai/ability/LegendaryRuleAi.java
index 4ad913b7a25..f91ef1ba505 100644
--- a/forge-ai/src/main/java/forge/ai/ability/LegendaryRuleAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/LegendaryRuleAi.java
@@ -3,6 +3,7 @@ package forge.ai.ability;
import java.util.Map;
import com.google.common.collect.Iterables;
+
import forge.ai.SpellAbilityAi;
import forge.game.card.Card;
import forge.game.card.CounterEnumType;
diff --git a/forge-ai/src/main/java/forge/ai/ability/LifeExchangeVariantAi.java b/forge-ai/src/main/java/forge/ai/ability/LifeExchangeVariantAi.java
index e1432844d01..0fd3e1e0702 100644
--- a/forge-ai/src/main/java/forge/ai/ability/LifeExchangeVariantAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/LifeExchangeVariantAi.java
@@ -1,6 +1,11 @@
package forge.ai.ability;
-import forge.ai.*;
+import forge.ai.AiProps;
+import forge.ai.ComputerUtil;
+import forge.ai.ComputerUtilAbility;
+import forge.ai.ComputerUtilCombat;
+import forge.ai.PlayerControllerAi;
+import forge.ai.SpellAbilityAi;
import forge.game.Game;
import forge.game.card.Card;
import forge.game.keyword.Keyword;
diff --git a/forge-ai/src/main/java/forge/ai/ability/LifeGainAi.java b/forge-ai/src/main/java/forge/ai/ability/LifeGainAi.java
index 78044dedaec..daf8d04d7bc 100644
--- a/forge-ai/src/main/java/forge/ai/ability/LifeGainAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/LifeGainAi.java
@@ -1,7 +1,12 @@
package forge.ai.ability;
import com.google.common.collect.Iterables;
-import forge.ai.*;
+
+import forge.ai.ComputerUtil;
+import forge.ai.ComputerUtilAbility;
+import forge.ai.ComputerUtilCombat;
+import forge.ai.ComputerUtilCost;
+import forge.ai.SpellAbilityAi;
import forge.game.Game;
import forge.game.ability.AbilityUtils;
import forge.game.card.Card;
diff --git a/forge-ai/src/main/java/forge/ai/ability/ManaEffectAi.java b/forge-ai/src/main/java/forge/ai/ability/ManaEffectAi.java
index 012549c8b85..0d26dcd0667 100644
--- a/forge-ai/src/main/java/forge/ai/ability/ManaEffectAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/ManaEffectAi.java
@@ -1,12 +1,27 @@
package forge.ai.ability;
+import java.util.Arrays;
+import java.util.List;
+
import com.google.common.base.Predicates;
-import forge.ai.*;
+
+import forge.ai.AiPlayDecision;
+import forge.ai.ComputerUtil;
+import forge.ai.ComputerUtilAbility;
+import forge.ai.ComputerUtilCost;
+import forge.ai.ComputerUtilMana;
+import forge.ai.PlayerControllerAi;
+import forge.ai.SpellAbilityAi;
import forge.card.ColorSet;
import forge.card.MagicColor;
import forge.card.mana.ManaCost;
import forge.game.ability.AbilityUtils;
-import forge.game.card.*;
+import forge.game.card.Card;
+import forge.game.card.CardCollection;
+import forge.game.card.CardLists;
+import forge.game.card.CardPredicates;
+import forge.game.card.CounterEnumType;
+import forge.game.card.CounterType;
import forge.game.cost.CostPart;
import forge.game.cost.CostRemoveCounter;
import forge.game.keyword.Keyword;
@@ -17,9 +32,6 @@ import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
import forge.util.Aggregates;
-import java.util.Arrays;
-import java.util.List;
-
public class ManaEffectAi extends SpellAbilityAi {
/*
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..d25fcba5e39 100644
--- a/forge-ai/src/main/java/forge/ai/ability/ManifestAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/ManifestAi.java
@@ -1,7 +1,11 @@
package forge.ai.ability;
+import java.util.List;
+import java.util.Map;
+
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
+
import forge.ai.ComputerUtil;
import forge.ai.ComputerUtilCard;
import forge.ai.ComputerUtilCost;
@@ -24,9 +28,6 @@ import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
import forge.util.MyRandom;
-import java.util.List;
-import java.util.Map;
-
/**
* Created by friarsol on 1/23/15.
*/
@@ -141,7 +142,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/MeldAi.java b/forge-ai/src/main/java/forge/ai/ability/MeldAi.java
index 0bc04e173c2..c0c84ce984f 100644
--- a/forge-ai/src/main/java/forge/ai/ability/MeldAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/MeldAi.java
@@ -1,6 +1,7 @@
package forge.ai.ability;
import com.google.common.base.Predicates;
+
import forge.ai.SpellAbilityAi;
import forge.game.card.CardCollectionView;
import forge.game.card.CardLists;
diff --git a/forge-ai/src/main/java/forge/ai/ability/MillAi.java b/forge-ai/src/main/java/forge/ai/ability/MillAi.java
index 02b94e24d67..f2216b0a5f8 100644
--- a/forge-ai/src/main/java/forge/ai/ability/MillAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/MillAi.java
@@ -1,7 +1,13 @@
package forge.ai.ability;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
+
import forge.ai.ComputerUtil;
import forge.ai.ComputerUtilCost;
import forge.ai.SpecialCardAi;
@@ -19,11 +25,6 @@ import forge.game.spellability.SpellAbility;
import forge.game.spellability.TargetRestrictions;
import forge.game.zone.ZoneType;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Map;
-
public class MillAi extends SpellAbilityAi {
@Override
diff --git a/forge-ai/src/main/java/forge/ai/ability/MustBlockAi.java b/forge-ai/src/main/java/forge/ai/ability/MustBlockAi.java
index fe921f05e72..9e1ecdeb558 100644
--- a/forge-ai/src/main/java/forge/ai/ability/MustBlockAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/MustBlockAi.java
@@ -1,9 +1,16 @@
package forge.ai.ability;
+import java.util.List;
+import java.util.Map;
+
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
-import forge.ai.*;
+
+import forge.ai.AiCardMemory;
+import forge.ai.ComputerUtilCard;
+import forge.ai.ComputerUtilCombat;
+import forge.ai.SpellAbilityAi;
import forge.game.Game;
import forge.game.ability.AbilityUtils;
import forge.game.card.Card;
@@ -17,9 +24,6 @@ import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
-import java.util.List;
-import java.util.Map;
-
public class MustBlockAi extends SpellAbilityAi {
@Override
diff --git a/forge-ai/src/main/java/forge/ai/ability/MutateAi.java b/forge-ai/src/main/java/forge/ai/ability/MutateAi.java
index ca17518e2f2..c6bb4028e00 100644
--- a/forge-ai/src/main/java/forge/ai/ability/MutateAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/MutateAi.java
@@ -1,7 +1,10 @@
package forge.ai.ability;
+import java.util.Map;
+
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
+
import forge.ai.ComputerUtilCard;
import forge.ai.SpellAbilityAi;
import forge.game.card.Card;
@@ -13,8 +16,6 @@ import forge.game.player.Player;
import forge.game.player.PlayerActionConfirmMode;
import forge.game.spellability.SpellAbility;
-import java.util.Map;
-
public class MutateAi extends SpellAbilityAi {
@Override
protected boolean canPlayAI(Player aiPlayer, SpellAbility sa) {
diff --git a/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java b/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java
index fbc05b92472..1775616561a 100644
--- a/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java
@@ -1,6 +1,5 @@
package forge.ai.ability;
-import forge.game.card.*;
import org.apache.commons.lang3.StringUtils;
import com.google.common.base.Predicates;
@@ -13,6 +12,11 @@ import forge.card.CardType.Supertype;
import forge.card.mana.ManaCost;
import forge.game.Game;
import forge.game.GlobalRuleChange;
+import forge.game.card.Card;
+import forge.game.card.CardCollection;
+import forge.game.card.CardCollectionView;
+import forge.game.card.CardLists;
+import forge.game.card.CardPredicates;
import forge.game.cost.Cost;
import forge.game.keyword.KeywordInterface;
import forge.game.mana.ManaCostBeingPaid;
diff --git a/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java b/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java
index 63290093230..2426fb01c01 100644
--- a/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/PermanentCreatureAi.java
@@ -1,7 +1,14 @@
package forge.ai.ability;
import com.google.common.base.Predicate;
-import forge.ai.*;
+
+import forge.ai.AiController;
+import forge.ai.AiProps;
+import forge.ai.ComputerUtil;
+import forge.ai.ComputerUtilCard;
+import forge.ai.ComputerUtilCombat;
+import forge.ai.ComputerUtilCost;
+import forge.ai.PlayerControllerAi;
import forge.card.mana.ManaCost;
import forge.game.Game;
import forge.game.ability.ApiType;
@@ -59,7 +66,7 @@ public class PermanentCreatureAi extends PermanentAi {
if (sa.isDash()) {
//only checks that the dashed creature will attack
if (ph.isPlayerTurn(ai) && ph.getPhase().isBefore(PhaseType.COMBAT_DECLARE_ATTACKERS)) {
- if (ai.hasKeyword("Skip your next combat phase."))
+ if (game.getReplacementHandler().wouldPhaseBeSkipped(ai, "BeginCombat"))
return false;
if (ComputerUtilCost.canPayCost(sa.getHostCard().getSpellPermanent(), ai)) {
//do not dash if creature can be played normally
@@ -77,7 +84,7 @@ public class PermanentCreatureAi extends PermanentAi {
// after attacking
if (card.hasSVar("EndOfTurnLeavePlay")
&& (!ph.isPlayerTurn(ai) || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS)
- || ai.hasKeyword("Skip your next combat phase."))) {
+ || game.getReplacementHandler().wouldPhaseBeSkipped(ai, "BeginCombat"))) {
// AiPlayDecision.AnotherTime
return false;
}
diff --git a/forge-ai/src/main/java/forge/ai/ability/PhasesAi.java b/forge-ai/src/main/java/forge/ai/ability/PhasesAi.java
index ca9dcd4e57c..8973d02888a 100644
--- a/forge-ai/src/main/java/forge/ai/ability/PhasesAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/PhasesAi.java
@@ -1,6 +1,9 @@
package forge.ai.ability;
+import java.util.List;
+
import com.google.common.base.Predicates;
+
import forge.ai.ComputerUtil;
import forge.ai.ComputerUtilCard;
import forge.ai.SpellAbilityAi;
@@ -16,8 +19,6 @@ import forge.game.spellability.TargetRestrictions;
import forge.game.zone.ZoneType;
import forge.util.MyRandom;
-import java.util.List;
-
public class PhasesAi extends SpellAbilityAi {
@Override
protected boolean canPlayAI(Player aiPlayer, SpellAbility sa) {
diff --git a/forge-ai/src/main/java/forge/ai/ability/PlayAi.java b/forge-ai/src/main/java/forge/ai/ability/PlayAi.java
index 443fb1eacfa..324794ea276 100644
--- a/forge-ai/src/main/java/forge/ai/ability/PlayAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/PlayAi.java
@@ -1,16 +1,30 @@
package forge.ai.ability;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
-import forge.ai.*;
+import forge.ai.AiController;
+import forge.ai.AiPlayDecision;
+import forge.ai.AiProps;
+import forge.ai.ComputerUtil;
+import forge.ai.ComputerUtilCard;
+import forge.ai.PlayerControllerAi;
+import forge.ai.SpellAbilityAi;
import forge.card.CardStateName;
import forge.card.CardTypeView;
import forge.game.Game;
import forge.game.GameType;
import forge.game.ability.AbilityUtils;
-import forge.game.card.*;
+import forge.game.card.Card;
+import forge.game.card.CardCollection;
+import forge.game.card.CardCollectionView;
+import forge.game.card.CardLists;
+import forge.game.card.CardPredicates;
import forge.game.cost.Cost;
import forge.game.keyword.Keyword;
import forge.game.player.Player;
@@ -23,10 +37,6 @@ import forge.game.spellability.TargetRestrictions;
import forge.game.zone.ZoneType;
import forge.util.MyRandom;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
public class PlayAi extends SpellAbilityAi {
@Override
diff --git a/forge-ai/src/main/java/forge/ai/ability/PowerExchangeAi.java b/forge-ai/src/main/java/forge/ai/ability/PowerExchangeAi.java
index 1db4d76d321..9626b8f6f43 100644
--- a/forge-ai/src/main/java/forge/ai/ability/PowerExchangeAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/PowerExchangeAi.java
@@ -1,5 +1,8 @@
package forge.ai.ability;
+import java.util.Collections;
+import java.util.List;
+
import com.google.common.base.Predicate;
import forge.ai.ComputerUtilCard;
@@ -14,9 +17,6 @@ import forge.game.spellability.TargetRestrictions;
import forge.game.zone.ZoneType;
import forge.util.MyRandom;
-import java.util.Collections;
-import java.util.List;
-
public class PowerExchangeAi extends SpellAbilityAi {
/* (non-Javadoc)
diff --git a/forge-ai/src/main/java/forge/ai/ability/ProtectAi.java b/forge-ai/src/main/java/forge/ai/ability/ProtectAi.java
index 9557f3204eb..60084d0b8e6 100644
--- a/forge-ai/src/main/java/forge/ai/ability/ProtectAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/ProtectAi.java
@@ -5,7 +5,12 @@ import java.util.List;
import com.google.common.base.Predicate;
-import forge.ai.*;
+import forge.ai.AiAttackController;
+import forge.ai.ComputerUtil;
+import forge.ai.ComputerUtilCard;
+import forge.ai.ComputerUtilCombat;
+import forge.ai.ComputerUtilCost;
+import forge.ai.SpellAbilityAi;
import forge.card.MagicColor;
import forge.game.Game;
import forge.game.GameObject;
diff --git a/forge-ai/src/main/java/forge/ai/ability/PumpAi.java b/forge-ai/src/main/java/forge/ai/ability/PumpAi.java
index 0939a8879ba..b77e246d183 100644
--- a/forge-ai/src/main/java/forge/ai/ability/PumpAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/PumpAi.java
@@ -1,14 +1,32 @@
package forge.ai.ability;
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Lists;
-import forge.ai.*;
+
+import forge.ai.ComputerUtil;
+import forge.ai.ComputerUtilAbility;
+import forge.ai.ComputerUtilCard;
+import forge.ai.ComputerUtilCost;
+import forge.ai.SpecialAiLogic;
+import forge.ai.SpecialCardAi;
+import forge.ai.SpellAbilityAi;
import forge.game.Game;
import forge.game.ability.AbilityUtils;
import forge.game.ability.ApiType;
-import forge.game.card.*;
+import forge.game.card.Card;
+import forge.game.card.CardCollection;
+import forge.game.card.CardLists;
+import forge.game.card.CardPredicates;
import forge.game.card.CardPredicates.Presets;
+import forge.game.card.CardUtil;
+import forge.game.card.CounterEnumType;
+import forge.game.card.CounterType;
import forge.game.cost.Cost;
import forge.game.cost.CostTapType;
import forge.game.keyword.Keyword;
@@ -20,10 +38,6 @@ import forge.game.spellability.SpellAbility;
import forge.game.spellability.TargetRestrictions;
import forge.game.staticability.StaticAbility;
import forge.game.zone.ZoneType;
-import org.apache.commons.lang3.StringUtils;
-
-import java.util.Arrays;
-import java.util.List;
public class PumpAi extends PumpAiBase {
diff --git a/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java b/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java
index 02bce81f94b..aba87269e83 100644
--- a/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java
+++ b/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java
@@ -1,8 +1,11 @@
package forge.ai.ability;
+import java.util.List;
+
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Iterables;
+
import forge.ai.ComputerUtil;
import forge.ai.ComputerUtilCard;
import forge.ai.ComputerUtilCombat;
@@ -10,7 +13,12 @@ import forge.ai.SpellAbilityAi;
import forge.card.MagicColor;
import forge.game.Game;
import forge.game.ability.AbilityUtils;
-import forge.game.card.*;
+import forge.game.card.Card;
+import forge.game.card.CardCollection;
+import forge.game.card.CardCollectionView;
+import forge.game.card.CardLists;
+import forge.game.card.CardPredicates;
+import forge.game.card.CardUtil;
import forge.game.combat.Combat;
import forge.game.combat.CombatUtil;
import forge.game.keyword.Keyword;
@@ -21,8 +29,6 @@ import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
-import java.util.List;
-
public abstract class PumpAiBase extends SpellAbilityAi {
public boolean containsUsefulKeyword(final Player ai, final List keywords, final Card card, final SpellAbility sa, final int attack) {
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..381147880bd 100644
--- a/forge-ai/src/main/java/forge/ai/ability/PumpAllAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/PumpAllAi.java
@@ -1,5 +1,9 @@
package forge.ai.ability;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
import com.google.common.base.Predicate;
import forge.ai.ComputerUtil;
@@ -22,10 +26,6 @@ import forge.game.spellability.SpellAbility;
import forge.game.spellability.TargetRestrictions;
import forge.game.zone.ZoneType;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
public class PumpAllAi extends PumpAiBase {
/* (non-Javadoc)
@@ -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/RearrangeTopOfLibraryAi.java b/forge-ai/src/main/java/forge/ai/ability/RearrangeTopOfLibraryAi.java
index 3e9d91f327d..004591af7a8 100644
--- a/forge-ai/src/main/java/forge/ai/ability/RearrangeTopOfLibraryAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/RearrangeTopOfLibraryAi.java
@@ -1,7 +1,12 @@
package forge.ai.ability;
-import forge.ai.*;
+import forge.ai.AiCardMemory;
+import forge.ai.AiController;
+import forge.ai.AiProps;
+import forge.ai.ComputerUtilMana;
+import forge.ai.PlayerControllerAi;
+import forge.ai.SpellAbilityAi;
import forge.game.ability.AbilityUtils;
import forge.game.card.Card;
import forge.game.card.CardLists;
diff --git a/forge-ai/src/main/java/forge/ai/ability/RegenerateAi.java b/forge-ai/src/main/java/forge/ai/ability/RegenerateAi.java
index 64603e40410..b5b9ece8fc5 100644
--- a/forge-ai/src/main/java/forge/ai/ability/RegenerateAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/RegenerateAi.java
@@ -17,7 +17,13 @@
*/
package forge.ai.ability;
-import forge.ai.*;
+import java.util.ArrayList;
+import java.util.List;
+
+import forge.ai.ComputerUtil;
+import forge.ai.ComputerUtilCard;
+import forge.ai.ComputerUtilCombat;
+import forge.ai.SpellAbilityAi;
import forge.game.Game;
import forge.game.GameObject;
import forge.game.ability.AbilityUtils;
@@ -33,9 +39,6 @@ import forge.game.spellability.SpellAbility;
import forge.game.spellability.TargetRestrictions;
import forge.game.zone.ZoneType;
-import java.util.ArrayList;
-import java.util.List;
-
/**
*
* AbilityFactory_Regenerate class.
diff --git a/forge-ai/src/main/java/forge/ai/ability/RegenerateAllAi.java b/forge-ai/src/main/java/forge/ai/ability/RegenerateAllAi.java
index 5054445fce2..0f8e35a4854 100644
--- a/forge-ai/src/main/java/forge/ai/ability/RegenerateAllAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/RegenerateAllAi.java
@@ -1,5 +1,7 @@
package forge.ai.ability;
+import java.util.List;
+
import forge.ai.ComputerUtil;
import forge.ai.ComputerUtilCombat;
import forge.ai.SpellAbilityAi;
@@ -15,8 +17,6 @@ import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
-import java.util.List;
-
public class RegenerateAllAi extends SpellAbilityAi {
@Override
diff --git a/forge-ai/src/main/java/forge/ai/ability/RepeatAi.java b/forge-ai/src/main/java/forge/ai/ability/RepeatAi.java
index 077177cd0a4..0f9c2a20ffe 100644
--- a/forge-ai/src/main/java/forge/ai/ability/RepeatAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/RepeatAi.java
@@ -1,7 +1,10 @@
package forge.ai.ability;
-import forge.ai.*;
+import forge.ai.AiController;
+import forge.ai.ComputerUtilCost;
+import forge.ai.PlayerControllerAi;
+import forge.ai.SpellAbilityAi;
import forge.game.phase.PhaseType;
import forge.game.player.Player;
import forge.game.player.PlayerActionConfirmMode;
diff --git a/forge-ai/src/main/java/forge/ai/ability/RepeatEachAi.java b/forge-ai/src/main/java/forge/ai/ability/RepeatEachAi.java
index c7a08d63d11..079a0cb8fb7 100644
--- a/forge-ai/src/main/java/forge/ai/ability/RepeatEachAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/RepeatEachAi.java
@@ -1,6 +1,10 @@
package forge.ai.ability;
+import java.util.List;
+import java.util.Map;
+
import com.google.common.base.Predicate;
+
import forge.ai.ComputerUtilCard;
import forge.ai.SpecialCardAi;
import forge.ai.SpellAbilityAi;
@@ -17,9 +21,6 @@ import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
import forge.util.TextUtil;
-import java.util.List;
-import java.util.Map;
-
public class RepeatEachAi extends SpellAbilityAi {
diff --git a/forge-ai/src/main/java/forge/ai/ability/RestartGameAi.java b/forge-ai/src/main/java/forge/ai/ability/RestartGameAi.java
index 9a05607c690..f32afba4a81 100644
--- a/forge-ai/src/main/java/forge/ai/ability/RestartGameAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/RestartGameAi.java
@@ -1,6 +1,14 @@
package forge.ai.ability;
+import com.google.common.collect.Iterables;
+
+import forge.ai.ComputerUtil;
+import forge.ai.ComputerUtilCard;
import forge.ai.SpellAbilityAi;
+import forge.game.card.Card;
+import forge.game.card.CardCollection;
+import forge.game.card.CardLists;
+import forge.game.card.CardPredicates.Presets;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
@@ -16,13 +24,18 @@ public class RestartGameAi extends SpellAbilityAi {
*/
@Override
protected boolean canPlayAI(Player ai, SpellAbility sa) {
- // The only card that uses this is Karn Liberated
+ if (ComputerUtil.aiLifeInDanger(ai, true, 0)) {
+ return true;
+ }
- // TODO Add Logic, check if AI is losing game state, or life
+ // check if enough good permanents will be available to be returned, so AI can "autowin"
+ CardCollection exiled = new CardCollection(Iterables.filter(sa.getHostCard().getRemembered(), Card.class));
+ exiled = CardLists.filter(exiled, Presets.PERMANENTS);
+ if (ComputerUtilCard.evaluatePermanentList(exiled) > 20) {
+ return true;
+ }
- // TODO Add Logic, check if any good cards will be available to be returned
-
- return true;
+ return false;
}
@Override
diff --git a/forge-ai/src/main/java/forge/ai/ability/SacrificeAi.java b/forge-ai/src/main/java/forge/ai/ability/SacrificeAi.java
index 7fb243db7c0..dfd420dab29 100644
--- a/forge-ai/src/main/java/forge/ai/ability/SacrificeAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/SacrificeAi.java
@@ -1,5 +1,7 @@
package forge.ai.ability;
+import java.util.List;
+
import forge.ai.ComputerUtilCard;
import forge.ai.ComputerUtilCost;
import forge.ai.ComputerUtilMana;
@@ -17,8 +19,6 @@ import forge.game.spellability.SpellAbility;
import forge.game.spellability.TargetRestrictions;
import forge.game.zone.ZoneType;
-import java.util.List;
-
public class SacrificeAi extends SpellAbilityAi {
// **************************************************************
// *************************** Sacrifice ***********************
diff --git a/forge-ai/src/main/java/forge/ai/ability/ScryAi.java b/forge-ai/src/main/java/forge/ai/ability/ScryAi.java
index 00b86b44550..276eb4172fc 100644
--- a/forge-ai/src/main/java/forge/ai/ability/ScryAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/ScryAi.java
@@ -1,11 +1,16 @@
package forge.ai.ability;
import com.google.common.base.Predicates;
+
import forge.ai.ComputerUtilMana;
import forge.ai.SpellAbilityAi;
import forge.game.ability.ApiType;
-import forge.game.card.*;
+import forge.game.card.Card;
import forge.game.card.Card.SplitCMCMode;
+import forge.game.card.CardCollection;
+import forge.game.card.CardLists;
+import forge.game.card.CardPredicates;
+import forge.game.card.CounterEnumType;
import forge.game.phase.PhaseHandler;
import forge.game.phase.PhaseType;
import forge.game.player.Player;
diff --git a/forge-ai/src/main/java/forge/ai/ability/SetStateAi.java b/forge-ai/src/main/java/forge/ai/ability/SetStateAi.java
index bc90961a6c5..98b8e1e16c2 100644
--- a/forge-ai/src/main/java/forge/ai/ability/SetStateAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/SetStateAi.java
@@ -1,14 +1,20 @@
package forge.ai.ability;
import com.google.common.base.Predicate;
+
import forge.ai.ComputerUtilCard;
import forge.ai.SpellAbilityAi;
import forge.card.CardStateName;
import forge.game.Game;
import forge.game.GlobalRuleChange;
import forge.game.ability.AbilityUtils;
-import forge.game.card.*;
+import forge.game.card.Card;
+import forge.game.card.CardCollection;
+import forge.game.card.CardLists;
import forge.game.card.CardPredicates.Presets;
+import forge.game.card.CardState;
+import forge.game.card.CardUtil;
+import forge.game.card.CounterEnumType;
import forge.game.phase.PhaseHandler;
import forge.game.phase.PhaseType;
import forge.game.player.Player;
diff --git a/forge-ai/src/main/java/forge/ai/ability/SkipPhaseAi.java b/forge-ai/src/main/java/forge/ai/ability/SkipPhaseAi.java
new file mode 100644
index 00000000000..d72eedd0249
--- /dev/null
+++ b/forge-ai/src/main/java/forge/ai/ability/SkipPhaseAi.java
@@ -0,0 +1,23 @@
+package forge.ai.ability;
+
+import forge.ai.SpellAbilityAi;
+import forge.game.player.Player;
+import forge.game.player.PlayerActionConfirmMode;
+import forge.game.spellability.SpellAbility;
+
+public class SkipPhaseAi extends SpellAbilityAi {
+ @Override
+ protected boolean canPlayAI(Player aiPlayer, SpellAbility sa) {
+ return true;
+ }
+
+ @Override
+ protected boolean doTriggerAINoCost(Player aiPlayer, SpellAbility sa, boolean mandatory) {
+ return mandatory || canPlayAI(aiPlayer, sa);
+ }
+
+ @Override
+ public boolean confirmAction(Player player, SpellAbility sa, PlayerActionConfirmMode mode, String message) {
+ return true;
+ }
+}
diff --git a/forge-ai/src/main/java/forge/ai/ability/StoreMapAi.java b/forge-ai/src/main/java/forge/ai/ability/StoreMapAi.java
deleted file mode 100644
index 341dedd3b0e..00000000000
--- a/forge-ai/src/main/java/forge/ai/ability/StoreMapAi.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package forge.ai.ability;
-
-import forge.ai.SpellAbilityAi;
-import forge.game.player.Player;
-import forge.game.spellability.SpellAbility;
-
-public class StoreMapAi extends SpellAbilityAi {
-
- @Override
- protected boolean canPlayAI(Player ai, SpellAbility sa) {
-
- return true;
- }
-
- @Override
- protected boolean doTriggerAINoCost(Player aiPlayer, SpellAbility sa, boolean mandatory) {
-
- return true;
- }
-
-}
diff --git a/forge-ai/src/main/java/forge/ai/ability/StoreSVarAi.java b/forge-ai/src/main/java/forge/ai/ability/StoreSVarAi.java
index 837123548b3..bec7848d51e 100644
--- a/forge-ai/src/main/java/forge/ai/ability/StoreSVarAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/StoreSVarAi.java
@@ -1,5 +1,8 @@
package forge.ai.ability;
+import java.util.ArrayList;
+import java.util.List;
+
import forge.ai.ComputerUtilMana;
import forge.ai.SpellAbilityAi;
import forge.game.Game;
@@ -14,9 +17,6 @@ import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.trigger.WrappedAbility;
-import java.util.ArrayList;
-import java.util.List;
-
public class StoreSVarAi extends SpellAbilityAi {
@Override
diff --git a/forge-ai/src/main/java/forge/ai/ability/SurveilAi.java b/forge-ai/src/main/java/forge/ai/ability/SurveilAi.java
index fb5e6efa0f7..94c40655dec 100644
--- a/forge-ai/src/main/java/forge/ai/ability/SurveilAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/SurveilAi.java
@@ -1,6 +1,10 @@
package forge.ai.ability;
-import forge.ai.*;
+import forge.ai.AiCardMemory;
+import forge.ai.AiProps;
+import forge.ai.ComputerUtilCost;
+import forge.ai.PlayerControllerAi;
+import forge.ai.SpellAbilityAi;
import forge.game.card.Card;
import forge.game.cost.Cost;
import forge.game.cost.CostPayLife;
diff --git a/forge-ai/src/main/java/forge/ai/ability/TapAi.java b/forge-ai/src/main/java/forge/ai/ability/TapAi.java
index dee2820f9e4..0224fb3d910 100644
--- a/forge-ai/src/main/java/forge/ai/ability/TapAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/TapAi.java
@@ -1,6 +1,11 @@
package forge.ai.ability;
-import forge.ai.*;
+import forge.ai.AiController;
+import forge.ai.AiProps;
+import forge.ai.ComputerUtil;
+import forge.ai.ComputerUtilCost;
+import forge.ai.PlayerControllerAi;
+import forge.ai.SpellAbilityAi;
import forge.game.ability.AbilityUtils;
import forge.game.card.Card;
import forge.game.cost.Cost;
diff --git a/forge-ai/src/main/java/forge/ai/ability/TapAiBase.java b/forge-ai/src/main/java/forge/ai/ability/TapAiBase.java
index e198d6f26ee..fb27b86a4d6 100644
--- a/forge-ai/src/main/java/forge/ai/ability/TapAiBase.java
+++ b/forge-ai/src/main/java/forge/ai/ability/TapAiBase.java
@@ -1,7 +1,10 @@
package forge.ai.ability;
+import java.util.List;
+
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
+
import forge.ai.ComputerUtil;
import forge.ai.ComputerUtilAbility;
import forge.ai.ComputerUtilCard;
@@ -20,8 +23,6 @@ import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
-import java.util.List;
-
public abstract class TapAiBase extends SpellAbilityAi {
/**
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..ff456311037 100644
--- a/forge-ai/src/main/java/forge/ai/ability/TapAllAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/TapAllAi.java
@@ -1,5 +1,7 @@
package forge.ai.ability;
+import java.util.List;
+
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
@@ -19,8 +21,6 @@ import forge.game.spellability.TargetRestrictions;
import forge.game.zone.ZoneType;
import forge.util.MyRandom;
-import java.util.List;
-
public class TapAllAi extends SpellAbilityAi {
@Override
protected boolean canPlayAI(final Player ai, SpellAbility sa) {
@@ -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/TokenAi.java b/forge-ai/src/main/java/forge/ai/ability/TokenAi.java
index bc1d2256025..bd9bffded98 100644
--- a/forge-ai/src/main/java/forge/ai/ability/TokenAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/TokenAi.java
@@ -4,7 +4,16 @@ import java.util.Map;
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
-import forge.ai.*;
+
+import forge.ai.AiController;
+import forge.ai.AiProps;
+import forge.ai.ComputerUtil;
+import forge.ai.ComputerUtilCard;
+import forge.ai.ComputerUtilCost;
+import forge.ai.ComputerUtilMana;
+import forge.ai.PlayerControllerAi;
+import forge.ai.SpellAbilityAi;
+import forge.ai.SpellApiToAi;
import forge.game.Game;
import forge.game.GameEntity;
import forge.game.ability.AbilityUtils;
@@ -27,7 +36,6 @@ import forge.game.spellability.AbilitySub;
import forge.game.spellability.SpellAbility;
import forge.game.spellability.TargetRestrictions;
import forge.game.zone.ZoneType;
-
import forge.util.MyRandom;
/**
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/UnattachAllAi.java b/forge-ai/src/main/java/forge/ai/ability/UnattachAllAi.java
index c40f1833b64..15b2c12a6d0 100644
--- a/forge-ai/src/main/java/forge/ai/ability/UnattachAllAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/UnattachAllAi.java
@@ -1,5 +1,8 @@
package forge.ai.ability;
+import java.util.ArrayList;
+import java.util.List;
+
import forge.ai.ComputerUtilCard;
import forge.ai.ComputerUtilCost;
import forge.ai.SpellAbilityAi;
@@ -12,9 +15,6 @@ import forge.game.spellability.SpellAbility;
import forge.game.spellability.TargetRestrictions;
import forge.util.MyRandom;
-import java.util.ArrayList;
-import java.util.List;
-
public class UnattachAllAi extends SpellAbilityAi {
/* (non-Javadoc)
diff --git a/forge-ai/src/main/java/forge/ai/ability/UntapAi.java b/forge-ai/src/main/java/forge/ai/ability/UntapAi.java
index ecb45dd2ec8..fe3480cec7a 100644
--- a/forge-ai/src/main/java/forge/ai/ability/UntapAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/UntapAi.java
@@ -1,8 +1,17 @@
package forge.ai.ability;
+import java.util.List;
+import java.util.Map;
+
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
-import forge.ai.*;
+
+import forge.ai.ComputerUtil;
+import forge.ai.ComputerUtilAbility;
+import forge.ai.ComputerUtilCard;
+import forge.ai.ComputerUtilCost;
+import forge.ai.ComputerUtilMana;
+import forge.ai.SpellAbilityAi;
import forge.card.mana.ManaCostShard;
import forge.game.Game;
import forge.game.ability.AbilityUtils;
@@ -23,9 +32,6 @@ import forge.game.spellability.SpellAbility;
import forge.game.spellability.TargetRestrictions;
import forge.game.zone.ZoneType;
-import java.util.List;
-import java.util.Map;
-
public class UntapAi extends SpellAbilityAi {
@Override
protected boolean checkAiLogic(final Player ai, final SpellAbility sa, final String aiLogic) {
@@ -71,6 +77,8 @@ public class UntapAi extends SpellAbilityAi {
if (!sa.usesTargeting()) {
if (mandatory) {
return true;
+ } else if ("Never".equals(sa.getParam("AILogic"))) {
+ return false;
}
// TODO: use Defined to determine, if this is an unfavorable result
@@ -314,13 +322,10 @@ public class UntapAi extends SpellAbilityAi {
}
private static Card detectPriorityUntapTargets(final List untapList) {
- // untap Time Vault or another broken card? - Yes please!
- String[] priorityList = {"Time Vault", "Mana Vault", "Icy Manipulator", "Steel Overseer", "Grindclock", "Prototype Portal"};
- for (String name : priorityList) {
- for (Card c : untapList) {
- if (c.getName().equals(name)) {
- return c;
- }
+ // See if there are cards that are *especially* worth untapping, like Time Vault
+ for (Card c : untapList) {
+ if ("True".equals(c.getSVar("UntapMe"))) {
+ return c;
}
}
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..7a1221aff3a 100644
--- a/forge-ai/src/main/java/forge/ai/ability/VoteAi.java
+++ b/forge-ai/src/main/java/forge/ai/ability/VoteAi.java
@@ -1,6 +1,8 @@
package forge.ai.ability;
+import java.util.Map;
+
import forge.ai.SpellAbilityAi;
import forge.game.card.Card;
import forge.game.card.CardLists;
@@ -9,8 +11,6 @@ import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
-import java.util.Map;
-
public class VoteAi extends SpellAbilityAi {
/* (non-Javadoc)
* @see forge.card.abilityfactory.SpellAiLogic#canPlayAI(forge.game.player.Player, java.util.Map, forge.card.spellability.SpellAbility)
@@ -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-ai/src/main/java/forge/ai/simulation/GameCopier.java b/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java
index 8cf8c3d9d0d..eccdeb48f16 100644
--- a/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java
+++ b/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java
@@ -1,13 +1,27 @@
package forge.ai.simulation;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
+
import forge.LobbyPlayer;
import forge.ai.LobbyPlayerAi;
-import forge.game.*;
-import forge.game.card.*;
+import forge.game.Game;
+import forge.game.GameEntity;
+import forge.game.GameObject;
+import forge.game.GameObjectMap;
+import forge.game.GameRules;
+import forge.game.Match;
+import forge.game.StaticEffect;
+import forge.game.card.Card;
+import forge.game.card.CardCloneStates;
+import forge.game.card.CardFactory;
+import forge.game.card.CounterType;
import forge.game.card.token.TokenInfo;
import forge.game.combat.Combat;
import forge.game.keyword.KeywordInterface;
@@ -22,10 +36,6 @@ import forge.game.trigger.TriggerType;
import forge.game.zone.PlayerZoneBattlefield;
import forge.game.zone.ZoneType;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
public class GameCopier {
private static final ZoneType[] ZONES = new ZoneType[] {
ZoneType.Battlefield,
diff --git a/forge-ai/src/main/java/forge/ai/simulation/SpellAbilityPicker.java b/forge-ai/src/main/java/forge/ai/simulation/SpellAbilityPicker.java
index 9d98f72b8d9..913e42a45ce 100644
--- a/forge-ai/src/main/java/forge/ai/simulation/SpellAbilityPicker.java
+++ b/forge-ai/src/main/java/forge/ai/simulation/SpellAbilityPicker.java
@@ -1,5 +1,10 @@
package forge.ai.simulation;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Set;
+
import forge.ai.AiPlayDecision;
import forge.ai.ComputerUtil;
import forge.ai.ComputerUtilAbility;
@@ -9,7 +14,11 @@ import forge.ai.ability.ExploreAi;
import forge.ai.simulation.GameStateEvaluator.Score;
import forge.game.Game;
import forge.game.ability.ApiType;
-import forge.game.card.*;
+import forge.game.card.Card;
+import forge.game.card.CardCollection;
+import forge.game.card.CardCollectionView;
+import forge.game.card.CardLists;
+import forge.game.card.CardPredicates;
import forge.game.phase.PhaseType;
import forge.game.player.Player;
import forge.game.spellability.AbilitySub;
@@ -19,11 +28,6 @@ import forge.game.spellability.SpellAbilityCondition;
import forge.game.zone.ZoneType;
import forge.util.TextUtil;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Set;
-
public class SpellAbilityPicker {
private Game game;
private Player player;
diff --git a/forge-core/src/main/java/forge/CardStorageReader.java b/forge-core/src/main/java/forge/CardStorageReader.java
index 257305926d6..d83f642b715 100644
--- a/forge-core/src/main/java/forge/CardStorageReader.java
+++ b/forge-core/src/main/java/forge/CardStorageReader.java
@@ -41,10 +41,12 @@ import java.util.concurrent.Future;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
-import forge.util.BuildInfo;
import org.apache.commons.lang3.time.StopWatch;
+
import com.google.common.io.Files;
+
import forge.card.CardRules;
+import forge.util.BuildInfo;
import forge.util.FileUtil;
import forge.util.Localizer;
import forge.util.ThreadUtil;
diff --git a/forge-core/src/main/java/forge/ImageKeys.java b/forge-core/src/main/java/forge/ImageKeys.java
index f4f168a5c8c..c1b78502756 100644
--- a/forge-core/src/main/java/forge/ImageKeys.java
+++ b/forge-core/src/main/java/forge/ImageKeys.java
@@ -1,17 +1,16 @@
package forge;
-import forge.item.*;
-import forge.util.FileUtil;
-import forge.util.ImageUtil;
-import forge.util.TextUtil;
-import org.apache.commons.lang3.StringUtils;
-
-
-
import java.io.File;
import java.util.HashMap;
import java.util.Map;
+import org.apache.commons.lang3.StringUtils;
+
+import forge.item.PaperCard;
+import forge.util.FileUtil;
+import forge.util.ImageUtil;
+import forge.util.TextUtil;
+
public final class ImageKeys {
public static final String CARD_PREFIX = "c:";
public static final String TOKEN_PREFIX = "t:";
diff --git a/forge-core/src/main/java/forge/MulliganDefs.java b/forge-core/src/main/java/forge/MulliganDefs.java
index a4a535fde55..f35cb824dbf 100644
--- a/forge-core/src/main/java/forge/MulliganDefs.java
+++ b/forge-core/src/main/java/forge/MulliganDefs.java
@@ -1,9 +1,9 @@
package forge;
-import com.google.common.collect.Lists;
-
import java.util.List;
+import com.google.common.collect.Lists;
+
/*
* A class that contains definitions of available Mulligan rule variants and helper methods to access them
*/
diff --git a/forge-core/src/main/java/forge/StaticData.java b/forge-core/src/main/java/forge/StaticData.java
index 83885198401..ac20072e2a9 100644
--- a/forge-core/src/main/java/forge/StaticData.java
+++ b/forge-core/src/main/java/forge/StaticData.java
@@ -1,11 +1,20 @@
package forge;
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+
import com.google.common.base.Predicate;
+
import forge.card.CardDb;
+import forge.card.CardDb.CardRequest;
import forge.card.CardEdition;
import forge.card.CardRules;
import forge.card.PrintSheet;
-import forge.card.CardDb.CardRequest;
import forge.item.BoosterBox;
import forge.item.FatPack;
import forge.item.PaperCard;
@@ -14,9 +23,6 @@ import forge.token.TokenDb;
import forge.util.storage.IStorage;
import forge.util.storage.StorageBase;
-import java.io.File;
-import java.util.*;
-
/**
* The class holding game invariants, such as cards, editions, game formats. All that data, which is not supposed to be changed by player
@@ -247,6 +253,36 @@ public class StaticData {
return card;
}
+ public PaperCard getCardFromLatestorEarliest(PaperCard card) {
+
+ PaperCard c = this.getCommonCards().getCardFromEdition(card.getName(), null, CardDb.SetPreference.Latest, card.getArtIndex());
+
+ if (null != c && c.hasImage()) {
+ return c;
+ }
+
+ c = this.getCommonCards().getCardFromEdition(card.getName(), null, CardDb.SetPreference.Latest, -1);
+
+ if (null != c && c.hasImage()) {
+ return c;
+ }
+
+ c = this.getCommonCards().getCardFromEdition(card.getName(), null, CardDb.SetPreference.LatestCoreExp, -1);
+
+ if (null != c) {
+ return c;
+ }
+
+ c = this.getCommonCards().getCardFromEdition(card.getName(), null, CardDb.SetPreference.EarliestCoreExp, -1);
+
+ if (null != c) {
+ return c;
+ }
+
+ // I give up!
+ return card;
+ }
+
public boolean getFilteredHandsEnabled(){
return filteredHandsEnabled;
}
diff --git a/forge-core/src/main/java/forge/card/CardDb.java b/forge-core/src/main/java/forge/card/CardDb.java
index cdb48cfa730..f0bead576bd 100644
--- a/forge-core/src/main/java/forge/card/CardDb.java
+++ b/forge-core/src/main/java/forge/card/CardDb.java
@@ -17,6 +17,23 @@
*/
package forge.card;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.TreeMap;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.tuple.Pair;
+
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
import com.google.common.collect.ListMultimap;
@@ -28,13 +45,11 @@ import forge.card.CardEdition.CardInSet;
import forge.card.CardEdition.Type;
import forge.deck.generation.IDeckGenPool;
import forge.item.PaperCard;
-import forge.util.*;
-
-import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.tuple.Pair;
-
-import java.util.*;
-import java.util.Map.Entry;
+import forge.util.Aggregates;
+import forge.util.CollectionSuppliers;
+import forge.util.Lang;
+import forge.util.MyRandom;
+import forge.util.TextUtil;
public final class CardDb implements ICardDatabase, IDeckGenPool {
public final static String foilSuffix = "+";
@@ -402,6 +417,16 @@ public final class CardDb implements ICardDatabase, IDeckGenPool {
public PaperCard getCardFromEdition(final String cardName, final Date printedBefore, final SetPreference fromSet, int artIndex) {
final CardRequest cr = CardRequest.fromString(cardName);
List cards = getAllCards(cr.cardName);
+ if (printedBefore != null){
+ cards = Lists.newArrayList(Iterables.filter(cards, new Predicate() {
+ @Override public boolean apply(PaperCard c) {
+ CardEdition ed = editions.get(c.getEdition());
+ return ed.getDate().before(printedBefore); }
+ }));
+ }
+
+ if (cards.size() == 0) // Don't bother continuing! No cards has been found!
+ return null;
boolean cardsListReadOnly = true;
if (StringUtils.isNotBlank(cr.edition)) {
@@ -547,6 +572,15 @@ public final class CardDb implements ICardDatabase, IDeckGenPool {
return roAllCards;
}
+ public Collection getAllNonPromoCards() {
+ return Lists.newArrayList(Iterables.filter(this.roAllCards, new Predicate() {
+ @Override
+ public boolean apply(final PaperCard paperCard) {
+ return editions.getEditionByCodeOrThrow(paperCard.getEdition()).getType() != Type.PROMOS;
+ }
+ }));
+ }
+
public String getName(final String cardName) {
if (alternateName.containsKey(cardName)) {
return alternateName.get(cardName);
diff --git a/forge-core/src/main/java/forge/card/CardEdition.java b/forge-core/src/main/java/forge/card/CardEdition.java
index ee780da05ab..a306090bff5 100644
--- a/forge-core/src/main/java/forge/card/CardEdition.java
+++ b/forge-core/src/main/java/forge/card/CardEdition.java
@@ -17,28 +17,50 @@
*/
package forge.card;
+import java.io.File;
+import java.io.FilenameFilter;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Calendar;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.commons.lang3.StringUtils;
+
import com.google.common.base.Function;
import com.google.common.base.Predicate;
-import com.google.common.collect.*;
+import com.google.common.collect.ArrayListMultimap;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.ListMultimap;
+import com.google.common.collect.Lists;
+
import forge.StaticData;
import forge.card.CardDb.SetPreference;
import forge.deck.CardPool;
import forge.item.PaperCard;
import forge.item.SealedProduct;
-import forge.util.*;
+import forge.util.Aggregates;
+import forge.util.FileSection;
+import forge.util.FileUtil;
+import forge.util.IItemReader;
+import forge.util.MyRandom;
import forge.util.storage.StorageBase;
import forge.util.storage.StorageReaderBase;
import forge.util.storage.StorageReaderFolder;
-import org.apache.commons.lang3.StringUtils;
-
-import java.io.File;
-import java.io.FilenameFilter;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.*;
-import java.util.Map.Entry;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
/**
diff --git a/forge-core/src/main/java/forge/card/CardFace.java b/forge-core/src/main/java/forge/card/CardFace.java
index 26afc2c06c7..d13bd2ff223 100644
--- a/forge-core/src/main/java/forge/card/CardFace.java
+++ b/forge-core/src/main/java/forge/card/CardFace.java
@@ -1,10 +1,15 @@
package forge.card;
-import forge.card.mana.ManaCost;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.TreeMap;
+
import org.apache.commons.lang3.StringUtils;
-import java.util.*;
-import java.util.Map.Entry;
+import forge.card.mana.ManaCost;
//
// DO NOT AUTOFORMAT / CHECKSTYLE THIS FILE
diff --git a/forge-core/src/main/java/forge/card/CardRules.java b/forge-core/src/main/java/forge/card/CardRules.java
index 130efe627bc..5b5f77c33d6 100644
--- a/forge-core/src/main/java/forge/card/CardRules.java
+++ b/forge-core/src/main/java/forge/card/CardRules.java
@@ -17,14 +17,16 @@
*/
package forge.card;
+import java.util.StringTokenizer;
+
+import org.apache.commons.lang3.StringUtils;
+
import com.google.common.collect.Iterables;
+
import forge.card.mana.IParserManaCost;
import forge.card.mana.ManaCost;
import forge.card.mana.ManaCostShard;
import forge.util.TextUtil;
-import org.apache.commons.lang3.StringUtils;
-
-import java.util.StringTokenizer;
/**
* A collection of methods containing full
diff --git a/forge-core/src/main/java/forge/card/CardType.java b/forge-core/src/main/java/forge/card/CardType.java
index 55b9590ea32..525e929b94e 100644
--- a/forge-core/src/main/java/forge/card/CardType.java
+++ b/forge-core/src/main/java/forge/card/CardType.java
@@ -30,7 +30,6 @@ import org.apache.commons.lang3.NotImplementedException;
import org.apache.commons.lang3.StringUtils;
import com.google.common.base.Predicate;
-
import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;
import com.google.common.collect.ImmutableList;
diff --git a/forge-core/src/main/java/forge/card/ColorSet.java b/forge-core/src/main/java/forge/card/ColorSet.java
index 8065f0a4e48..13833be3e88 100644
--- a/forge-core/src/main/java/forge/card/ColorSet.java
+++ b/forge-core/src/main/java/forge/card/ColorSet.java
@@ -18,7 +18,12 @@
package forge.card;
import java.io.Serializable;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.EnumSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.Set;
import com.google.common.collect.UnmodifiableIterator;
diff --git a/forge-core/src/main/java/forge/card/DeckHints.java b/forge-core/src/main/java/forge/card/DeckHints.java
index fb443fee5a2..b7d7c96d4ac 100644
--- a/forge-core/src/main/java/forge/card/DeckHints.java
+++ b/forge-core/src/main/java/forge/card/DeckHints.java
@@ -1,18 +1,20 @@
package forge.card;
-import com.google.common.base.Function;
-import com.google.common.base.Predicate;
-import com.google.common.base.Predicates;
-import com.google.common.collect.Iterables;
-import forge.item.PaperCard;
-import forge.util.PredicateString.StringOp;
-import org.apache.commons.lang3.tuple.Pair;
-
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import org.apache.commons.lang3.tuple.Pair;
+
+import com.google.common.base.Function;
+import com.google.common.base.Predicate;
+import com.google.common.base.Predicates;
+import com.google.common.collect.Iterables;
+
+import forge.item.PaperCard;
+import forge.util.PredicateString.StringOp;
+
/**
* DeckHints provides the ability for a Card to "want" another Card or type of
* Cards in its random deck.
diff --git a/forge-core/src/main/java/forge/card/ICardDatabase.java b/forge-core/src/main/java/forge/card/ICardDatabase.java
index a83faea5b4d..a847b0149ad 100644
--- a/forge-core/src/main/java/forge/card/ICardDatabase.java
+++ b/forge-core/src/main/java/forge/card/ICardDatabase.java
@@ -1,13 +1,14 @@
package forge.card;
-import com.google.common.base.Predicate;
-import forge.card.CardDb.SetPreference;
-import forge.item.PaperCard;
-
import java.util.Collection;
import java.util.Date;
import java.util.List;
+import com.google.common.base.Predicate;
+
+import forge.card.CardDb.SetPreference;
+import forge.item.PaperCard;
+
public interface ICardDatabase extends Iterable {
PaperCard getCard(String cardName);
PaperCard getCard(String cardName, String edition);
diff --git a/forge-core/src/main/java/forge/card/PrintSheet.java b/forge-core/src/main/java/forge/card/PrintSheet.java
index 969bd8ab7c4..31a6c3795f5 100644
--- a/forge-core/src/main/java/forge/card/PrintSheet.java
+++ b/forge-core/src/main/java/forge/card/PrintSheet.java
@@ -1,6 +1,13 @@
package forge.card;
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map.Entry;
+
import com.google.common.base.Function;
+
import forge.deck.CardPool;
import forge.item.PaperCard;
import forge.util.ItemPool;
@@ -9,12 +16,6 @@ import forge.util.storage.IStorage;
import forge.util.storage.StorageExtendable;
import forge.util.storage.StorageReaderFileSections;
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map.Entry;
-
/**
* TODO: Write javadoc for this type.
diff --git a/forge-core/src/main/java/forge/deck/CardPool.java b/forge-core/src/main/java/forge/deck/CardPool.java
index b484f31ab98..3e27cb17ed7 100644
--- a/forge-core/src/main/java/forge/deck/CardPool.java
+++ b/forge-core/src/main/java/forge/deck/CardPool.java
@@ -17,16 +17,6 @@
*/
package forge.deck;
-import com.google.common.base.Predicate;
-import com.google.common.collect.Lists;
-import forge.StaticData;
-import forge.card.CardDb;
-import forge.item.PaperCard;
-import forge.util.ItemPool;
-import forge.util.ItemPoolSorter;
-import forge.util.MyRandom;
-import org.apache.commons.lang3.StringUtils;
-
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
@@ -34,6 +24,18 @@ import java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+import org.apache.commons.lang3.StringUtils;
+
+import com.google.common.base.Predicate;
+import com.google.common.collect.Lists;
+
+import forge.StaticData;
+import forge.card.CardDb;
+import forge.item.PaperCard;
+import forge.util.ItemPool;
+import forge.util.ItemPoolSorter;
+import forge.util.MyRandom;
+
public class CardPool extends ItemPool {
private static final long serialVersionUID = -5379091255613968393L;
diff --git a/forge-core/src/main/java/forge/deck/Deck.java b/forge-core/src/main/java/forge/deck/Deck.java
index f997a6582a5..eba16e04433 100644
--- a/forge-core/src/main/java/forge/deck/Deck.java
+++ b/forge-core/src/main/java/forge/deck/Deck.java
@@ -17,6 +17,16 @@
*/
package forge.deck;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.EnumMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.TreeSet;
+
import com.google.common.base.Function;
import com.google.common.collect.Lists;
@@ -25,9 +35,6 @@ import forge.card.CardDb;
import forge.item.IPaperCard;
import forge.item.PaperCard;
-import java.util.*;
-import java.util.Map.Entry;
-
/**
*
* Deck class.
@@ -252,7 +259,7 @@ public class Deck extends DeckBase implements Iterable p : parts.entrySet()) {
if( p.getKey() == DeckSection.Planes || p.getKey() == DeckSection.Schemes || p.getKey() == DeckSection.Avatar)
@@ -264,12 +271,18 @@ public class Deck extends DeckBase implements Iterable, InventoryItem {
private static final long serialVersionUID = -7538150536939660052L;
// gameType is from Constant.GameType, like GameType.Regular
diff --git a/forge-core/src/main/java/forge/deck/DeckFormat.java b/forge-core/src/main/java/forge/deck/DeckFormat.java
index 17a622f1d18..4097f15b2cd 100644
--- a/forge-core/src/main/java/forge/deck/DeckFormat.java
+++ b/forge-core/src/main/java/forge/deck/DeckFormat.java
@@ -17,10 +17,20 @@
*/
package forge.deck;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import org.apache.commons.lang3.Range;
+import org.apache.commons.lang3.tuple.ImmutablePair;
+
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
+
import forge.StaticData;
import forge.card.CardRules;
import forge.card.CardRulesPredicates;
@@ -33,14 +43,6 @@ import forge.item.IPaperCard;
import forge.item.PaperCard;
import forge.util.Aggregates;
import forge.util.TextUtil;
-import org.apache.commons.lang3.Range;
-import org.apache.commons.lang3.tuple.ImmutablePair;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map.Entry;
-import java.util.Set;
/**
* GameType is an enum to determine the type of current game. :)
diff --git a/forge-core/src/main/java/forge/deck/DeckGroup.java b/forge-core/src/main/java/forge/deck/DeckGroup.java
index 20ef5adc404..9c436c22fb7 100644
--- a/forge-core/src/main/java/forge/deck/DeckGroup.java
+++ b/forge-core/src/main/java/forge/deck/DeckGroup.java
@@ -17,8 +17,13 @@
*/
package forge.deck;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
import com.google.common.base.Function;
-import java.util.*;
/**
* TODO: Write javadoc for this type.
diff --git a/forge-core/src/main/java/forge/deck/DeckRecognizer.java b/forge-core/src/main/java/forge/deck/DeckRecognizer.java
index 0cae2a03261..1d7aa3b1cd2 100644
--- a/forge-core/src/main/java/forge/deck/DeckRecognizer.java
+++ b/forge-core/src/main/java/forge/deck/DeckRecognizer.java
@@ -17,17 +17,18 @@
*/
package forge.deck;
-import forge.card.CardDb;
-import forge.card.CardDb.SetPreference;
-import forge.card.ICardDatabase;
-import forge.item.PaperCard;
-import org.apache.commons.lang3.StringUtils;
-
import java.util.Calendar;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+import org.apache.commons.lang3.StringUtils;
+
+import forge.card.CardDb;
+import forge.card.CardDb.SetPreference;
+import forge.card.ICardDatabase;
+import forge.item.PaperCard;
+
/**
*
* DeckRecognizer class.
diff --git a/forge-core/src/main/java/forge/deck/generation/DeckGenerator2Color.java b/forge-core/src/main/java/forge/deck/generation/DeckGenerator2Color.java
index 86fade5a990..eb8bc3de2a6 100644
--- a/forge-core/src/main/java/forge/deck/generation/DeckGenerator2Color.java
+++ b/forge-core/src/main/java/forge/deck/generation/DeckGenerator2Color.java
@@ -17,6 +17,11 @@
*/
package forge.deck.generation;
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.commons.lang3.tuple.ImmutablePair;
+
import com.google.common.base.Predicate;
import com.google.common.collect.Lists;
@@ -24,15 +29,9 @@ import forge.card.ColorSet;
import forge.card.MagicColor;
import forge.deck.CardPool;
import forge.deck.DeckFormat;
-
import forge.item.PaperCard;
import forge.util.MyRandom;
-import org.apache.commons.lang3.tuple.ImmutablePair;
-
-import java.util.Arrays;
-import java.util.List;
-
/**
*
* Generate2ColorDeck class.
diff --git a/forge-core/src/main/java/forge/deck/generation/DeckGenerator3Color.java b/forge-core/src/main/java/forge/deck/generation/DeckGenerator3Color.java
index 1dbaf4e3d35..dbe0a78c531 100644
--- a/forge-core/src/main/java/forge/deck/generation/DeckGenerator3Color.java
+++ b/forge-core/src/main/java/forge/deck/generation/DeckGenerator3Color.java
@@ -17,6 +17,10 @@
*/
package forge.deck.generation;
+import java.util.List;
+
+import org.apache.commons.lang3.tuple.ImmutablePair;
+
import com.google.common.base.Predicate;
import com.google.common.collect.Lists;
@@ -27,10 +31,6 @@ import forge.deck.DeckFormat;
import forge.item.PaperCard;
import forge.util.MyRandom;
-import org.apache.commons.lang3.tuple.ImmutablePair;
-
-import java.util.List;
-
/**
*
* Generate3ColorDeck class.
diff --git a/forge-core/src/main/java/forge/deck/generation/DeckGenerator4Color.java b/forge-core/src/main/java/forge/deck/generation/DeckGenerator4Color.java
index b0fb26bb4b4..dd3ea5e4d5b 100644
--- a/forge-core/src/main/java/forge/deck/generation/DeckGenerator4Color.java
+++ b/forge-core/src/main/java/forge/deck/generation/DeckGenerator4Color.java
@@ -17,17 +17,19 @@
*/
package forge.deck.generation;
+import java.util.List;
+
+import org.apache.commons.lang3.tuple.ImmutablePair;
+
import com.google.common.base.Predicate;
import com.google.common.collect.Lists;
+
import forge.card.ColorSet;
import forge.card.MagicColor;
import forge.deck.CardPool;
import forge.deck.DeckFormat;
import forge.item.PaperCard;
import forge.util.MyRandom;
-import org.apache.commons.lang3.tuple.ImmutablePair;
-
-import java.util.List;
/**
*
diff --git a/forge-core/src/main/java/forge/deck/generation/DeckGenerator5Color.java b/forge-core/src/main/java/forge/deck/generation/DeckGenerator5Color.java
index 4341c1d7531..ee6ce87b73b 100644
--- a/forge-core/src/main/java/forge/deck/generation/DeckGenerator5Color.java
+++ b/forge-core/src/main/java/forge/deck/generation/DeckGenerator5Color.java
@@ -17,17 +17,17 @@
*/
package forge.deck.generation;
+import java.util.List;
+
+import org.apache.commons.lang3.tuple.ImmutablePair;
+
import com.google.common.base.Predicate;
import com.google.common.collect.Lists;
import forge.card.ColorSet;
import forge.deck.CardPool;
import forge.deck.DeckFormat;
-
import forge.item.PaperCard;
-import org.apache.commons.lang3.tuple.ImmutablePair;
-
-import java.util.List;
/**
*
diff --git a/forge-core/src/main/java/forge/deck/generation/DeckGeneratorBase.java b/forge-core/src/main/java/forge/deck/generation/DeckGeneratorBase.java
index 4af48f8458b..b5caab29cd6 100644
--- a/forge-core/src/main/java/forge/deck/generation/DeckGeneratorBase.java
+++ b/forge-core/src/main/java/forge/deck/generation/DeckGeneratorBase.java
@@ -17,13 +17,29 @@
*/
package forge.deck.generation;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.TreeMap;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.commons.lang3.tuple.ImmutablePair;
+
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
-import forge.StaticData;
-import forge.card.*;
+import forge.StaticData;
+import forge.card.CardRules;
+import forge.card.CardRulesPredicates;
+import forge.card.CardType;
+import forge.card.ColorSet;
+import forge.card.MagicColor;
import forge.card.mana.ManaCost;
import forge.deck.CardPool;
import forge.deck.DeckFormat;
@@ -34,13 +50,6 @@ import forge.util.DebugTrace;
import forge.util.ItemPool;
import forge.util.MyRandom;
-import org.apache.commons.lang3.tuple.ImmutablePair;
-
-import java.util.*;
-import java.util.Map.Entry;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
/**
*
* Generate2ColorDeck class.
diff --git a/forge-core/src/main/java/forge/deck/generation/DeckGeneratorMonoColor.java b/forge-core/src/main/java/forge/deck/generation/DeckGeneratorMonoColor.java
index b577c0de2ac..551c36b8231 100644
--- a/forge-core/src/main/java/forge/deck/generation/DeckGeneratorMonoColor.java
+++ b/forge-core/src/main/java/forge/deck/generation/DeckGeneratorMonoColor.java
@@ -17,6 +17,10 @@
*/
package forge.deck.generation;
+import java.util.List;
+
+import org.apache.commons.lang3.tuple.ImmutablePair;
+
import com.google.common.base.Predicate;
import com.google.common.collect.Lists;
@@ -24,14 +28,9 @@ import forge.card.ColorSet;
import forge.card.MagicColor;
import forge.deck.CardPool;
import forge.deck.DeckFormat;
-
import forge.item.PaperCard;
import forge.util.MyRandom;
-import org.apache.commons.lang3.tuple.ImmutablePair;
-
-import java.util.List;
-
/**
*
* Generate2ColorDeck class.
diff --git a/forge-core/src/main/java/forge/deck/io/DeckFileHeader.java b/forge-core/src/main/java/forge/deck/io/DeckFileHeader.java
index 43a7ffbd4a6..7c90fe4dfec 100644
--- a/forge-core/src/main/java/forge/deck/io/DeckFileHeader.java
+++ b/forge-core/src/main/java/forge/deck/io/DeckFileHeader.java
@@ -17,13 +17,14 @@
*/
package forge.deck.io;
-import forge.deck.DeckFormat;
-import forge.util.FileSection;
-import org.apache.commons.lang3.StringUtils;
-
import java.util.Set;
import java.util.TreeSet;
+import org.apache.commons.lang3.StringUtils;
+
+import forge.deck.DeckFormat;
+import forge.util.FileSection;
+
/**
* TODO: Write javadoc for this type.
*
diff --git a/forge-core/src/main/java/forge/deck/io/DeckGroupSerializer.java b/forge-core/src/main/java/forge/deck/io/DeckGroupSerializer.java
index 9b0031c0f3e..2ab5b8b1f78 100644
--- a/forge-core/src/main/java/forge/deck/io/DeckGroupSerializer.java
+++ b/forge-core/src/main/java/forge/deck/io/DeckGroupSerializer.java
@@ -17,6 +17,12 @@
*/
package forge.deck.io;
+import java.io.File;
+import java.io.FilenameFilter;
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+
import com.google.common.collect.ImmutableList;
import forge.deck.Deck;
@@ -24,12 +30,6 @@ import forge.deck.DeckGroup;
import forge.util.IItemSerializer;
import forge.util.storage.StorageReaderFolder;
-import org.apache.commons.lang3.StringUtils;
-
-import java.io.File;
-import java.io.FilenameFilter;
-import java.util.List;
-
/**
* TODO: Write javadoc for this type.
*
diff --git a/forge-core/src/main/java/forge/deck/io/DeckSerializer.java b/forge-core/src/main/java/forge/deck/io/DeckSerializer.java
index 4df2b493f1a..95fe2feaca0 100644
--- a/forge-core/src/main/java/forge/deck/io/DeckSerializer.java
+++ b/forge-core/src/main/java/forge/deck/io/DeckSerializer.java
@@ -1,5 +1,13 @@
package forge.deck.io;
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.apache.commons.lang3.StringUtils;
+
import forge.deck.CardPool;
import forge.deck.Deck;
import forge.deck.DeckSection;
@@ -7,13 +15,6 @@ import forge.util.FileSection;
import forge.util.FileSectionManual;
import forge.util.FileUtil;
import forge.util.TextUtil;
-import org.apache.commons.lang3.StringUtils;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
public class DeckSerializer {
diff --git a/forge-core/src/main/java/forge/deck/io/DeckStorage.java b/forge-core/src/main/java/forge/deck/io/DeckStorage.java
index a54ea1679b5..7cc4a229033 100644
--- a/forge-core/src/main/java/forge/deck/io/DeckStorage.java
+++ b/forge-core/src/main/java/forge/deck/io/DeckStorage.java
@@ -17,6 +17,11 @@
*/
package forge.deck.io;
+import java.io.File;
+import java.io.FilenameFilter;
+import java.util.List;
+import java.util.Map;
+
import forge.deck.Deck;
import forge.util.FileSection;
import forge.util.FileUtil;
@@ -24,11 +29,6 @@ import forge.util.IItemReader;
import forge.util.IItemSerializer;
import forge.util.storage.StorageReaderFolder;
-import java.io.File;
-import java.io.FilenameFilter;
-import java.util.List;
-import java.util.Map;
-
/**
* This class knows how to make a file out of a deck object and vice versa.
*/
diff --git a/forge-core/src/main/java/forge/item/BoosterBox.java b/forge-core/src/main/java/forge/item/BoosterBox.java
index a17d1d44bac..e03f58a0656 100644
--- a/forge-core/src/main/java/forge/item/BoosterBox.java
+++ b/forge-core/src/main/java/forge/item/BoosterBox.java
@@ -18,13 +18,15 @@
package forge.item;
+import java.util.ArrayList;
+
+import org.apache.commons.lang3.tuple.Pair;
+
import com.google.common.base.Function;
+
import forge.ImageKeys;
import forge.StaticData;
import forge.card.CardEdition;
-import org.apache.commons.lang3.tuple.Pair;
-
-import java.util.ArrayList;
public class BoosterBox extends BoxedProduct {
public static final Function FN_FROM_SET = new Function() {
diff --git a/forge-core/src/main/java/forge/item/BoosterPack.java b/forge-core/src/main/java/forge/item/BoosterPack.java
index 562745d66ba..0e078a2c137 100644
--- a/forge-core/src/main/java/forge/item/BoosterPack.java
+++ b/forge-core/src/main/java/forge/item/BoosterPack.java
@@ -18,6 +18,8 @@
package forge.item;
+import org.apache.commons.lang3.tuple.Pair;
+
import com.google.common.base.Function;
import com.google.common.collect.ImmutableList;
@@ -27,8 +29,6 @@ import forge.card.CardEdition;
import forge.item.generation.BoosterSlots;
import forge.util.MyRandom;
-import org.apache.commons.lang3.tuple.Pair;
-
public class BoosterPack extends SealedProduct {
private final int artIndex;
private final int hash;
diff --git a/forge-core/src/main/java/forge/item/FatPack.java b/forge-core/src/main/java/forge/item/FatPack.java
index b57870b93a3..2ee80d07309 100644
--- a/forge-core/src/main/java/forge/item/FatPack.java
+++ b/forge-core/src/main/java/forge/item/FatPack.java
@@ -18,18 +18,20 @@
package forge.item;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.lang3.tuple.ImmutablePair;
+import org.apache.commons.lang3.tuple.Pair;
+
import com.google.common.base.Function;
+
import forge.ImageKeys;
import forge.StaticData;
import forge.card.CardEdition;
import forge.item.generation.BoosterGenerator;
import forge.util.TextUtil;
import forge.util.storage.StorageReaderFile;
-import org.apache.commons.lang3.tuple.ImmutablePair;
-import org.apache.commons.lang3.tuple.Pair;
-
-import java.util.ArrayList;
-import java.util.List;
public class FatPack extends BoxedProduct {
public static final Function FN_FROM_SET = new Function() {
diff --git a/forge-core/src/main/java/forge/item/IPaperCard.java b/forge-core/src/main/java/forge/item/IPaperCard.java
index 53ea1d066e4..803c93c9392 100644
--- a/forge-core/src/main/java/forge/item/IPaperCard.java
+++ b/forge-core/src/main/java/forge/item/IPaperCard.java
@@ -1,18 +1,20 @@
package forge.item;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.commons.lang3.StringUtils;
+
import com.google.common.base.Predicate;
import com.google.common.collect.Lists;
+
import forge.card.CardRarity;
import forge.card.CardRules;
import forge.card.CardType.CoreType;
import forge.card.MagicColor;
import forge.util.PredicateCard;
import forge.util.PredicateString;
-import org.apache.commons.lang3.StringUtils;
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
//import forge.Card;
diff --git a/forge-core/src/main/java/forge/item/PaperToken.java b/forge-core/src/main/java/forge/item/PaperToken.java
index c86f6a70b29..74fc8c4d707 100644
--- a/forge-core/src/main/java/forge/item/PaperToken.java
+++ b/forge-core/src/main/java/forge/item/PaperToken.java
@@ -1,15 +1,16 @@
package forge.item;
+import java.util.ArrayList;
+import java.util.Locale;
+
+import org.apache.commons.lang3.StringUtils;
+
import forge.ImageKeys;
import forge.card.CardEdition;
import forge.card.CardRarity;
import forge.card.CardRules;
import forge.card.ColorSet;
import forge.util.MyRandom;
-import org.apache.commons.lang3.StringUtils;
-
-import java.util.ArrayList;
-import java.util.Locale;
public class PaperToken implements InventoryItemFromSet, IPaperCard {
private String name;
diff --git a/forge-core/src/main/java/forge/item/PreconDeck.java b/forge-core/src/main/java/forge/item/PreconDeck.java
index bde7a829c9b..074d7eb3bbd 100644
--- a/forge-core/src/main/java/forge/item/PreconDeck.java
+++ b/forge-core/src/main/java/forge/item/PreconDeck.java
@@ -17,6 +17,11 @@
*/
package forge.item;
+import java.io.File;
+import java.io.FilenameFilter;
+import java.util.List;
+import java.util.Map;
+
import com.google.common.base.Function;
import forge.ImageKeys;
@@ -28,11 +33,6 @@ import forge.util.FileSection;
import forge.util.FileUtil;
import forge.util.storage.StorageReaderFolder;
-import java.io.File;
-import java.io.FilenameFilter;
-import java.util.List;
-import java.util.Map;
-
public class PreconDeck implements InventoryItemFromSet {
private final Deck deck;
diff --git a/forge-core/src/main/java/forge/item/SealedProduct.java b/forge-core/src/main/java/forge/item/SealedProduct.java
index fb9e48c6945..24e70402d0f 100644
--- a/forge-core/src/main/java/forge/item/SealedProduct.java
+++ b/forge-core/src/main/java/forge/item/SealedProduct.java
@@ -18,11 +18,19 @@
package forge.item;
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.lang3.tuple.ImmutablePair;
+import org.apache.commons.lang3.tuple.Pair;
+
import com.google.common.base.Function;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
+
import forge.StaticData;
import forge.card.CardRulesPredicates;
import forge.item.generation.BoosterGenerator;
@@ -30,12 +38,6 @@ import forge.item.generation.BoosterSlots;
import forge.util.Aggregates;
import forge.util.TextUtil;
import forge.util.storage.StorageReaderFile;
-import org.apache.commons.lang3.tuple.ImmutablePair;
-import org.apache.commons.lang3.tuple.Pair;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
public abstract class SealedProduct implements InventoryItemFromSet {
diff --git a/forge-core/src/main/java/forge/item/TournamentPack.java b/forge-core/src/main/java/forge/item/TournamentPack.java
index 94fb0cc8202..b2660505700 100644
--- a/forge-core/src/main/java/forge/item/TournamentPack.java
+++ b/forge-core/src/main/java/forge/item/TournamentPack.java
@@ -17,6 +17,8 @@
*/
package forge.item;
+import java.util.List;
+
import com.google.common.base.Function;
import forge.ImageKeys;
@@ -24,8 +26,6 @@ import forge.StaticData;
import forge.card.CardEdition;
import forge.item.generation.BoosterGenerator;
-import java.util.List;
-
public class TournamentPack extends SealedProduct {
/** The Constant fnFromSet. */
diff --git a/forge-core/src/main/java/forge/item/generation/BoosterGenerator.java b/forge-core/src/main/java/forge/item/generation/BoosterGenerator.java
index 6610e94aee9..6216329a0e3 100644
--- a/forge-core/src/main/java/forge/item/generation/BoosterGenerator.java
+++ b/forge-core/src/main/java/forge/item/generation/BoosterGenerator.java
@@ -17,18 +17,32 @@
*/
package forge.item.generation;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.tuple.Pair;
+
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
+
import forge.StaticData;
import forge.card.CardEdition;
+import forge.card.CardEdition.FoilType;
import forge.card.CardRarity;
import forge.card.CardRulesPredicates;
import forge.card.CardSplitType;
import forge.card.PrintSheet;
-import forge.card.CardEdition.FoilType;
import forge.item.IPaperCard;
import forge.item.IPaperCard.Predicates.Presets;
import forge.item.PaperCard;
@@ -36,10 +50,6 @@ import forge.item.SealedProduct;
import forge.util.Aggregates;
import forge.util.MyRandom;
import forge.util.TextUtil;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.tuple.Pair;
-
-import java.util.*;
/**
*
diff --git a/forge-core/src/main/java/forge/item/generation/ChaosBoosterSupplier.java b/forge-core/src/main/java/forge/item/generation/ChaosBoosterSupplier.java
index c4a38769dc1..55203a7f47c 100644
--- a/forge-core/src/main/java/forge/item/generation/ChaosBoosterSupplier.java
+++ b/forge-core/src/main/java/forge/item/generation/ChaosBoosterSupplier.java
@@ -1,12 +1,12 @@
package forge.item.generation;
+import java.util.List;
+
import forge.card.CardEdition;
import forge.item.BoosterPack;
import forge.item.PaperCard;
import forge.util.BagRandomizer;
-import java.util.List;
-
public class ChaosBoosterSupplier implements IUnOpenedProduct {
private BagRandomizer randomizer;
diff --git a/forge-core/src/main/java/forge/item/generation/IUnOpenedProduct.java b/forge-core/src/main/java/forge/item/generation/IUnOpenedProduct.java
index dfb6cbba402..d2bb054380f 100644
--- a/forge-core/src/main/java/forge/item/generation/IUnOpenedProduct.java
+++ b/forge-core/src/main/java/forge/item/generation/IUnOpenedProduct.java
@@ -1,10 +1,11 @@
package forge.item.generation;
-import com.google.common.base.Supplier;
-import forge.item.PaperCard;
-
import java.util.List;
+import com.google.common.base.Supplier;
+
+import forge.item.PaperCard;
+
/**
* TODO: Write javadoc for this type.
*
diff --git a/forge-core/src/main/java/forge/item/generation/UnOpenedProduct.java b/forge-core/src/main/java/forge/item/generation/UnOpenedProduct.java
index 837c678fbc9..67c07beff5c 100644
--- a/forge-core/src/main/java/forge/item/generation/UnOpenedProduct.java
+++ b/forge-core/src/main/java/forge/item/generation/UnOpenedProduct.java
@@ -1,19 +1,21 @@
package forge.item.generation;
-import com.google.common.base.Predicate;
-import com.google.common.collect.Iterables;
-import forge.StaticData;
-import forge.card.PrintSheet;
-import forge.item.PaperCard;
-import forge.item.SealedProduct;
-import forge.util.ItemPool;
-import org.apache.commons.lang3.tuple.Pair;
-
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
+import org.apache.commons.lang3.tuple.Pair;
+
+import com.google.common.base.Predicate;
+import com.google.common.collect.Iterables;
+
+import forge.StaticData;
+import forge.card.PrintSheet;
+import forge.item.PaperCard;
+import forge.item.SealedProduct;
+import forge.util.ItemPool;
+
public class UnOpenedProduct implements IUnOpenedProduct {
diff --git a/forge-core/src/main/java/forge/token/ITokenDatabase.java b/forge-core/src/main/java/forge/token/ITokenDatabase.java
index f2f54142d02..c9a08eec51f 100644
--- a/forge-core/src/main/java/forge/token/ITokenDatabase.java
+++ b/forge-core/src/main/java/forge/token/ITokenDatabase.java
@@ -1,13 +1,14 @@
package forge.token;
-import com.google.common.base.Predicate;
-import forge.card.CardDb;
-import forge.item.PaperToken;
-
import java.util.Collection;
import java.util.Date;
import java.util.List;
+import com.google.common.base.Predicate;
+
+import forge.card.CardDb;
+import forge.item.PaperToken;
+
public interface ITokenDatabase extends Iterable {
PaperToken getToken(String tokenName);
PaperToken getToken(String tokenName, String edition);
diff --git a/forge-core/src/main/java/forge/token/TokenDb.java b/forge-core/src/main/java/forge/token/TokenDb.java
index 032d3241892..421b12f16d2 100644
--- a/forge-core/src/main/java/forge/token/TokenDb.java
+++ b/forge-core/src/main/java/forge/token/TokenDb.java
@@ -1,14 +1,20 @@
package forge.token;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
import com.google.common.base.Predicate;
import com.google.common.collect.Maps;
+
import forge.card.CardDb;
import forge.card.CardEdition;
import forge.card.CardRules;
import forge.item.PaperToken;
-import java.util.*;
-
public class TokenDb implements ITokenDatabase {
// Expected naming convention of scripts
// token_name
diff --git a/forge-core/src/main/java/forge/util/Aggregates.java b/forge-core/src/main/java/forge/util/Aggregates.java
index 82fa8206d59..7187841a36b 100644
--- a/forge-core/src/main/java/forge/util/Aggregates.java
+++ b/forge-core/src/main/java/forge/util/Aggregates.java
@@ -1,11 +1,15 @@
package forge.util;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
import com.google.common.base.Function;
import com.google.common.collect.Lists;
-import java.util.*;
-import java.util.Map.Entry;
-
/**
* TODO: Write javadoc for this type.
*
diff --git a/forge-core/src/main/java/forge/util/Base64Coder.java b/forge-core/src/main/java/forge/util/Base64Coder.java
index 2a53be0d765..12709a4ded8 100644
--- a/forge-core/src/main/java/forge/util/Base64Coder.java
+++ b/forge-core/src/main/java/forge/util/Base64Coder.java
@@ -31,12 +31,13 @@
package forge.util;
+import java.nio.charset.StandardCharsets;
+
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;
-import java.nio.charset.StandardCharsets;
/**
* A Base64 encoder/decoder.
diff --git a/forge-core/src/main/java/forge/util/CardTranslation.java b/forge-core/src/main/java/forge/util/CardTranslation.java
index c4423cec5fa..db73255a246 100644
--- a/forge-core/src/main/java/forge/util/CardTranslation.java
+++ b/forge-core/src/main/java/forge/util/CardTranslation.java
@@ -1,12 +1,16 @@
package forge.util;
-import com.google.common.base.Charsets;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.tuple.Pair;
-
import java.io.FileInputStream;
import java.io.IOException;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.tuple.Pair;
+
+import com.google.common.base.Charsets;
public class CardTranslation {
diff --git a/forge-core/src/main/java/forge/util/ComparatorUtil.java b/forge-core/src/main/java/forge/util/ComparatorUtil.java
index 7f575825439..ac6f553eaad 100644
--- a/forge-core/src/main/java/forge/util/ComparatorUtil.java
+++ b/forge-core/src/main/java/forge/util/ComparatorUtil.java
@@ -1,6 +1,7 @@
package forge.util;
-import java.util.*;
+import java.util.Collection;
+import java.util.Comparator;
/**
* @author Gili Tzabari
diff --git a/forge-core/src/main/java/forge/util/FileSection.java b/forge-core/src/main/java/forge/util/FileSection.java
index d706be82938..e4db0e9dd5d 100644
--- a/forge-core/src/main/java/forge/util/FileSection.java
+++ b/forge-core/src/main/java/forge/util/FileSection.java
@@ -17,8 +17,6 @@
*/
package forge.util;
-import com.google.common.collect.HashBasedTable;
-import com.google.common.collect.Table;
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.ArrayList;
@@ -31,6 +29,9 @@ import java.util.regex.Pattern;
import org.apache.commons.lang3.StringUtils;
+import com.google.common.collect.HashBasedTable;
+import com.google.common.collect.Table;
+
/**
* TODO: Write javadoc for this type.
*
diff --git a/forge-core/src/main/java/forge/util/FileUtil.java b/forge-core/src/main/java/forge/util/FileUtil.java
index 00af3693cb9..d12ef2741ff 100644
--- a/forge-core/src/main/java/forge/util/FileUtil.java
+++ b/forge-core/src/main/java/forge/util/FileUtil.java
@@ -17,10 +17,17 @@
*/
package forge.util;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.tuple.Pair;
-
-import java.io.*;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.PrintWriter;
+import java.io.Reader;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;
@@ -28,6 +35,9 @@ import java.util.List;
import java.util.concurrent.Callable;
import java.util.regex.Pattern;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.tuple.Pair;
+
/**
*
* FileUtil class.
diff --git a/forge-core/src/main/java/forge/util/ItemPool.java b/forge-core/src/main/java/forge/util/ItemPool.java
index d2fed453094..f8caf2d4061 100644
--- a/forge-core/src/main/java/forge/util/ItemPool.java
+++ b/forge-core/src/main/java/forge/util/ItemPool.java
@@ -17,16 +17,21 @@
*/
package forge.util;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.concurrent.ConcurrentHashMap;
+
import com.google.common.base.Function;
import com.google.common.base.Predicate;
import forge.item.InventoryItem;
-import java.io.Serializable;
-import java.util.*;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.Map.Entry;
-
/**
*
* ItemPool class.
diff --git a/forge-core/src/main/java/forge/util/ItemPoolSorter.java b/forge-core/src/main/java/forge/util/ItemPoolSorter.java
index 0b44e775a38..d2a3923f7ba 100644
--- a/forge-core/src/main/java/forge/util/ItemPoolSorter.java
+++ b/forge-core/src/main/java/forge/util/ItemPoolSorter.java
@@ -17,12 +17,13 @@
*/
package forge.util;
-import com.google.common.base.Function;
-import forge.item.PaperCard;
-
import java.util.Comparator;
import java.util.Map.Entry;
+import com.google.common.base.Function;
+
+import forge.item.PaperCard;
+
/**
*
diff --git a/forge-core/src/main/java/forge/util/Lang.java b/forge-core/src/main/java/forge/util/Lang.java
index 508f3adbac5..c174cdba7b2 100644
--- a/forge-core/src/main/java/forge/util/Lang.java
+++ b/forge-core/src/main/java/forge/util/Lang.java
@@ -6,12 +6,17 @@ import java.util.regex.Pattern;
import org.apache.commons.lang3.StringUtils;
-import forge.util.lang.*;
-
import com.google.common.base.Function;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
+import forge.util.lang.LangChinese;
+import forge.util.lang.LangEnglish;
+import forge.util.lang.LangGerman;
+import forge.util.lang.LangItalian;
+import forge.util.lang.LangJapanese;
+import forge.util.lang.LangSpanish;
+
/**
* Static library containing language-related utility methods.
*/
diff --git a/forge-core/src/main/java/forge/util/LineReader.java b/forge-core/src/main/java/forge/util/LineReader.java
index 7657bd949b3..9da9e51c3c0 100644
--- a/forge-core/src/main/java/forge/util/LineReader.java
+++ b/forge-core/src/main/java/forge/util/LineReader.java
@@ -21,8 +21,11 @@ package forge.util;
* TODO: Write javadoc for this type.
*
*/
-
-import java.io.*;
+import java.io.BufferedReader;
+import java.io.Closeable;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Collection;
diff --git a/forge-core/src/main/java/forge/util/Localizer.java b/forge-core/src/main/java/forge/util/Localizer.java
index c549eb6723a..60acb7e0b59 100644
--- a/forge-core/src/main/java/forge/util/Localizer.java
+++ b/forge-core/src/main/java/forge/util/Localizer.java
@@ -8,7 +8,11 @@ import java.net.URLClassLoader;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.text.MessageFormat;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
public class Localizer {
diff --git a/forge-core/src/main/java/forge/util/NameGenerator.java b/forge-core/src/main/java/forge/util/NameGenerator.java
index 625bbbc669d..29ee7ab8867 100644
--- a/forge-core/src/main/java/forge/util/NameGenerator.java
+++ b/forge-core/src/main/java/forge/util/NameGenerator.java
@@ -1,12 +1,12 @@
/** Random name generator for Forge. */
package forge.util;
-import org.apache.commons.lang3.ArrayUtils;
-
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
+import org.apache.commons.lang3.ArrayUtils;
+
/**
* @author Marc
*
diff --git a/forge-core/src/main/java/forge/util/PredicateCard.java b/forge-core/src/main/java/forge/util/PredicateCard.java
index 308b34f68ca..f7ba508165c 100644
--- a/forge-core/src/main/java/forge/util/PredicateCard.java
+++ b/forge-core/src/main/java/forge/util/PredicateCard.java
@@ -18,6 +18,7 @@
package forge.util;
import com.google.common.base.Predicate;
+
import forge.item.PaperCard;
/**
diff --git a/forge-core/src/main/java/forge/util/PredicateString.java b/forge-core/src/main/java/forge/util/PredicateString.java
index 2355dabd350..bb2dc5d67c6 100644
--- a/forge-core/src/main/java/forge/util/PredicateString.java
+++ b/forge-core/src/main/java/forge/util/PredicateString.java
@@ -17,9 +17,10 @@
*/
package forge.util;
-import com.google.common.base.Predicate;
import org.apache.commons.lang3.StringUtils;
+import com.google.common.base.Predicate;
+
/**
* Special predicate class to perform string operations.
*
diff --git a/forge-core/src/main/java/forge/util/TextUtil.java b/forge-core/src/main/java/forge/util/TextUtil.java
index c1479a43c86..33d4653c013 100644
--- a/forge-core/src/main/java/forge/util/TextUtil.java
+++ b/forge-core/src/main/java/forge/util/TextUtil.java
@@ -1,18 +1,18 @@
package forge.util;
-import forge.item.PaperCard;
-
-import org.apache.commons.lang3.ArrayUtils;
-import org.apache.commons.lang3.StringUtils;
-
-import com.google.common.collect.ImmutableSortedMap;
-
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Map.Entry;
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import com.google.common.collect.ImmutableSortedMap;
+
+import forge.item.PaperCard;
+
/**
* TODO: Write javadoc for this type.
*
diff --git a/forge-core/src/main/java/forge/util/ThreadUtil.java b/forge-core/src/main/java/forge/util/ThreadUtil.java
index 9cecebf401f..87e54edbc4c 100644
--- a/forge-core/src/main/java/forge/util/ThreadUtil.java
+++ b/forge-core/src/main/java/forge/util/ThreadUtil.java
@@ -1,6 +1,13 @@
package forge.util;
-import java.util.concurrent.*;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.TimeUnit;
public class ThreadUtil {
static {
diff --git a/forge-core/src/main/java/forge/util/collect/FCollection.java b/forge-core/src/main/java/forge/util/collect/FCollection.java
index 709c325e16c..1cc57002a02 100644
--- a/forge-core/src/main/java/forge/util/collect/FCollection.java
+++ b/forge-core/src/main/java/forge/util/collect/FCollection.java
@@ -1,16 +1,25 @@
package forge.util.collect;
+import java.io.Serializable;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.NoSuchElementException;
+import java.util.Set;
+
+import org.apache.commons.lang3.ArrayUtils;
+
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Ordering;
import com.google.common.collect.Sets;
-import org.apache.commons.lang3.ArrayUtils;
-
-import java.io.Serializable;
-import java.util.*;
-
/**
* Collection with unique elements ({@link Set}) that maintains the order in
* which the elements are added to it ({@link List}).
diff --git a/forge-core/src/main/java/forge/util/maps/EnumMapOfLists.java b/forge-core/src/main/java/forge/util/maps/EnumMapOfLists.java
index 1e1f6c19617..2d025e331de 100644
--- a/forge-core/src/main/java/forge/util/maps/EnumMapOfLists.java
+++ b/forge-core/src/main/java/forge/util/maps/EnumMapOfLists.java
@@ -1,12 +1,12 @@
package forge.util.maps;
-import com.google.common.base.Supplier;
-
import java.util.Collection;
import java.util.EnumMap;
import java.util.List;
import java.util.Map;
+import com.google.common.base.Supplier;
+
public class EnumMapOfLists, V> extends EnumMap> implements MapOfLists {
private final Supplier extends Collection> factory;
diff --git a/forge-core/src/main/java/forge/util/maps/HashMapOfLists.java b/forge-core/src/main/java/forge/util/maps/HashMapOfLists.java
index f4948ff6b9e..2e4fdf1b10e 100644
--- a/forge-core/src/main/java/forge/util/maps/HashMapOfLists.java
+++ b/forge-core/src/main/java/forge/util/maps/HashMapOfLists.java
@@ -1,12 +1,12 @@
package forge.util.maps;
-import com.google.common.base.Supplier;
-
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import com.google.common.base.Supplier;
+
public class HashMapOfLists extends HashMap> implements MapOfLists {
private final Supplier extends Collection> factory;
diff --git a/forge-core/src/main/java/forge/util/maps/MapToAmountUtil.java b/forge-core/src/main/java/forge/util/maps/MapToAmountUtil.java
index 9a60d5d92d3..172b76f70f0 100644
--- a/forge-core/src/main/java/forge/util/maps/MapToAmountUtil.java
+++ b/forge-core/src/main/java/forge/util/maps/MapToAmountUtil.java
@@ -1,16 +1,18 @@
package forge.util.maps;
-import com.google.common.collect.Lists;
-import forge.util.collect.FCollection;
-import forge.util.collect.FCollectionView;
-import org.apache.commons.lang3.tuple.Pair;
-
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map.Entry;
import java.util.NoSuchElementException;
+import org.apache.commons.lang3.tuple.Pair;
+
+import com.google.common.collect.Lists;
+
+import forge.util.collect.FCollection;
+import forge.util.collect.FCollectionView;
+
public final class MapToAmountUtil {
diff --git a/forge-core/src/main/java/forge/util/storage/StorageBase.java b/forge-core/src/main/java/forge/util/storage/StorageBase.java
index d7f464ddc89..de0dfea3a76 100644
--- a/forge-core/src/main/java/forge/util/storage/StorageBase.java
+++ b/forge-core/src/main/java/forge/util/storage/StorageBase.java
@@ -17,11 +17,16 @@
*/
package forge.util.storage;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
-import forge.util.IItemReader;
-import java.util.*;
+import forge.util.IItemReader;
/**
*
diff --git a/forge-core/src/main/java/forge/util/storage/StorageExtendable.java b/forge-core/src/main/java/forge/util/storage/StorageExtendable.java
index 9b1e187948e..d0eb92dee2b 100644
--- a/forge-core/src/main/java/forge/util/storage/StorageExtendable.java
+++ b/forge-core/src/main/java/forge/util/storage/StorageExtendable.java
@@ -17,9 +17,9 @@
*/
package forge.util.storage;
-import forge.util.IItemReader;
+import java.util.Map;
-import java.util.*;
+import forge.util.IItemReader;
/**
*
diff --git a/forge-core/src/main/java/forge/util/storage/StorageImmediatelySerialized.java b/forge-core/src/main/java/forge/util/storage/StorageImmediatelySerialized.java
index e68658cbece..0956b307b96 100644
--- a/forge-core/src/main/java/forge/util/storage/StorageImmediatelySerialized.java
+++ b/forge-core/src/main/java/forge/util/storage/StorageImmediatelySerialized.java
@@ -17,12 +17,13 @@
*/
package forge.util.storage;
+import java.io.File;
+
import com.google.common.base.Function;
+
import forge.util.IItemSerializer;
import forge.util.TextUtil;
-import java.io.File;
-
/**
*
* StorageImmediatelySerialized class.
diff --git a/forge-core/src/main/java/forge/util/storage/StorageNestedFolders.java b/forge-core/src/main/java/forge/util/storage/StorageNestedFolders.java
index ddd83d49c1d..7746ce16cb6 100644
--- a/forge-core/src/main/java/forge/util/storage/StorageNestedFolders.java
+++ b/forge-core/src/main/java/forge/util/storage/StorageNestedFolders.java
@@ -1,10 +1,10 @@
package forge.util.storage;
-import com.google.common.base.Function;
-
import java.io.File;
import java.util.HashMap;
+import com.google.common.base.Function;
+
public class StorageNestedFolders extends StorageBase> {
private final File thisFolder;
diff --git a/forge-core/src/main/java/forge/util/storage/StorageReaderBase.java b/forge-core/src/main/java/forge/util/storage/StorageReaderBase.java
index 0407a6a5958..06cdf1e35f1 100644
--- a/forge-core/src/main/java/forge/util/storage/StorageReaderBase.java
+++ b/forge-core/src/main/java/forge/util/storage/StorageReaderBase.java
@@ -1,10 +1,11 @@
package forge.util.storage;
+import java.io.File;
+
import com.google.common.base.Function;
import com.google.common.collect.ImmutableList;
-import forge.util.IItemReader;
-import java.io.File;
+import forge.util.IItemReader;
public abstract class StorageReaderBase implements IItemReader {
protected final Function super T, String> keySelector;
diff --git a/forge-core/src/main/java/forge/util/storage/StorageReaderFile.java b/forge-core/src/main/java/forge/util/storage/StorageReaderFile.java
index 61cb21c73a9..f0f369a30b1 100644
--- a/forge-core/src/main/java/forge/util/storage/StorageReaderFile.java
+++ b/forge-core/src/main/java/forge/util/storage/StorageReaderFile.java
@@ -17,16 +17,16 @@
*/
package forge.util.storage;
-import com.google.common.base.Function;
-
-import forge.util.FileUtil;
-
-import org.apache.commons.lang3.StringUtils;
-
import java.io.File;
import java.util.Map;
import java.util.TreeMap;
+import org.apache.commons.lang3.StringUtils;
+
+import com.google.common.base.Function;
+
+import forge.util.FileUtil;
+
/**
* This class treats every line of a given file as a source for a named object.
*
diff --git a/forge-core/src/main/java/forge/util/storage/StorageReaderFileSections.java b/forge-core/src/main/java/forge/util/storage/StorageReaderFileSections.java
index c3c2773ad9f..8dc136b714f 100644
--- a/forge-core/src/main/java/forge/util/storage/StorageReaderFileSections.java
+++ b/forge-core/src/main/java/forge/util/storage/StorageReaderFileSections.java
@@ -17,18 +17,18 @@
*/
package forge.util.storage;
-import com.google.common.base.Function;
-
-import forge.util.FileUtil;
-
-import org.apache.commons.lang3.StringUtils;
-
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
+import org.apache.commons.lang3.StringUtils;
+
+import com.google.common.base.Function;
+
+import forge.util.FileUtil;
+
/**
* This class treats every line of a given file as a source for a named object.
*
diff --git a/forge-core/src/main/java/forge/util/storage/StorageReaderFolder.java b/forge-core/src/main/java/forge/util/storage/StorageReaderFolder.java
index 2fa2ea9fa63..c94ca37d336 100644
--- a/forge-core/src/main/java/forge/util/storage/StorageReaderFolder.java
+++ b/forge-core/src/main/java/forge/util/storage/StorageReaderFolder.java
@@ -17,14 +17,20 @@
*/
package forge.util.storage;
-import com.google.common.base.Function;
-import forge.util.TextUtil;
-
import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
import java.io.IOException;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.NoSuchElementException;
+import java.util.TreeMap;
+
+import com.google.common.base.Function;
+
+import forge.util.TextUtil;
/**
* This class treats every file in the given folder as a source for a named
diff --git a/forge-core/src/main/java/forge/util/storage/StorageReaderRecursiveFolderWithUserFolder.java b/forge-core/src/main/java/forge/util/storage/StorageReaderRecursiveFolderWithUserFolder.java
index 5b81bfa5f2b..cff7b1904a4 100644
--- a/forge-core/src/main/java/forge/util/storage/StorageReaderRecursiveFolderWithUserFolder.java
+++ b/forge-core/src/main/java/forge/util/storage/StorageReaderRecursiveFolderWithUserFolder.java
@@ -17,14 +17,23 @@
*/
package forge.util.storage;
-import com.google.common.base.Function;
-import forge.util.TextUtil;
-
import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
import java.io.IOException;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.NoSuchElementException;
+import java.util.Set;
+import java.util.TreeMap;
+
+import com.google.common.base.Function;
+
+import forge.util.TextUtil;
/**
* This class treats every file in the given folder as a source for a named
diff --git a/forge-game/src/main/java/forge/game/CardTraitBase.java b/forge-game/src/main/java/forge/game/CardTraitBase.java
index b5711814373..f8f9e08a61e 100644
--- a/forge-game/src/main/java/forge/game/CardTraitBase.java
+++ b/forge-game/src/main/java/forge/game/CardTraitBase.java
@@ -1,5 +1,14 @@
package forge.game;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Maps;
+
import forge.card.CardStateName;
import forge.card.MagicColor;
import forge.card.mana.ManaAtom;
@@ -16,13 +25,6 @@ import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
import forge.util.Expressions;
-import java.util.*;
-
-import org.apache.commons.lang3.StringUtils;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Maps;
-
/**
* Base class for Triggers,ReplacementEffects and StaticAbilities.
*
@@ -159,15 +161,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 +331,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 +368,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 +380,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..b1450139a38 100644
--- a/forge-game/src/main/java/forge/game/Game.java
+++ b/forge-game/src/main/java/forge/game/Game.java
@@ -17,6 +17,17 @@
*/
package forge.game;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.commons.lang3.tuple.Pair;
+
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.ArrayListMultimap;
@@ -27,11 +38,19 @@ import com.google.common.collect.Maps;
import com.google.common.collect.Multimap;
import com.google.common.collect.Table;
import com.google.common.eventbus.EventBus;
+
import forge.card.CardRarity;
import forge.card.CardStateName;
import forge.card.CardType.Supertype;
import forge.game.ability.AbilityKey;
-import forge.game.card.*;
+import forge.game.card.Card;
+import forge.game.card.CardCollection;
+import forge.game.card.CardCollectionView;
+import forge.game.card.CardLists;
+import forge.game.card.CardPredicates;
+import forge.game.card.CardUtil;
+import forge.game.card.CardView;
+import forge.game.card.CounterType;
import forge.game.combat.Combat;
import forge.game.event.Event;
import forge.game.event.GameEventGameOutcome;
@@ -39,7 +58,11 @@ import forge.game.phase.Phase;
import forge.game.phase.PhaseHandler;
import forge.game.phase.PhaseType;
import forge.game.phase.Untap;
-import forge.game.player.*;
+import forge.game.player.IGameEntitiesFactory;
+import forge.game.player.Player;
+import forge.game.player.PlayerCollection;
+import forge.game.player.PlayerView;
+import forge.game.player.RegisteredPlayer;
import forge.game.replacement.ReplacementHandler;
import forge.game.spellability.SpellAbility;
import forge.game.spellability.SpellAbilityStackInstance;
@@ -54,10 +77,6 @@ import forge.util.Aggregates;
import forge.util.MyRandom;
import forge.util.Visitor;
-import java.util.*;
-
-import org.apache.commons.lang3.tuple.Pair;
-
/**
* Represents the state of a single game, a new instance is created for each game.
*/
@@ -1042,15 +1061,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 d1d224633c9..4df8d31c025 100644
--- a/forge-game/src/main/java/forge/game/GameAction.java
+++ b/forge-game/src/main/java/forge/game/GameAction.java
@@ -17,8 +17,25 @@
*/
package forge.game;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.commons.lang3.tuple.ImmutablePair;
+
import com.google.common.base.Predicate;
-import com.google.common.collect.*;
+import com.google.common.collect.ArrayListMultimap;
+import com.google.common.collect.ComparisonChain;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Multimap;
+import com.google.common.collect.Sets;
+
import forge.GameCommand;
import forge.StaticData;
import forge.card.CardStateName;
@@ -27,8 +44,23 @@ import forge.game.ability.AbilityKey;
import forge.game.ability.AbilityUtils;
import forge.game.ability.ApiType;
import forge.game.ability.effects.AttachEffect;
-import forge.game.card.*;
-import forge.game.event.*;
+import forge.game.card.Card;
+import forge.game.card.CardCollection;
+import forge.game.card.CardCollectionView;
+import forge.game.card.CardFactory;
+import forge.game.card.CardLists;
+import forge.game.card.CardPredicates;
+import forge.game.card.CardUtil;
+import forge.game.card.CardZoneTable;
+import forge.game.card.CounterEnumType;
+import forge.game.card.CounterType;
+import forge.game.event.GameEventCardChangeZone;
+import forge.game.event.GameEventCardDestroyed;
+import forge.game.event.GameEventCardStatsChanged;
+import forge.game.event.GameEventCardTapped;
+import forge.game.event.GameEventFlipCoin;
+import forge.game.event.GameEventGameStarted;
+import forge.game.event.GameEventScry;
import forge.game.keyword.KeywordInterface;
import forge.game.mulligan.MulliganService;
import forge.game.player.GameLossReason;
@@ -47,12 +79,13 @@ import forge.game.zone.PlayerZoneBattlefield;
import forge.game.zone.Zone;
import forge.game.zone.ZoneType;
import forge.item.PaperCard;
-import forge.util.*;
+import forge.util.Aggregates;
+import forge.util.Expressions;
+import forge.util.MyRandom;
+import forge.util.ThreadUtil;
+import forge.util.Visitor;
import forge.util.collect.FCollection;
import forge.util.collect.FCollectionView;
-import org.apache.commons.lang3.tuple.ImmutablePair;
-
-import java.util.*;
/**
* Methods for common actions performed during a game.
@@ -362,10 +395,6 @@ public class GameAction {
}
}
zoneFrom.remove(c);
- if (!zoneTo.is(ZoneType.Exile) && !zoneTo.is(ZoneType.Stack)) {
- c.setExiledWith(null);
- c.setExiledBy(null);
- }
// cleanup Encoding
if (c.hasEncodedCard()) {
@@ -379,6 +408,16 @@ public class GameAction {
e.removeEncodedCard(c);
}
}
+
+ if (!zoneTo.is(ZoneType.Exile) && !zoneTo.is(ZoneType.Stack)) {
+ Card with = c.getExiledWith();
+ if (with != null) {
+ with.removeUntilLeavesBattlefield(c);
+ }
+
+ c.setExiledWith(null);
+ c.setExiledBy(null);
+ }
}
// if an adventureCard is put from Stack somewhere else, need to reset to Original State
@@ -1143,7 +1182,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/GameActionUtil.java b/forge-game/src/main/java/forge/game/GameActionUtil.java
index c547c496705..fc3be4035e1 100644
--- a/forge-game/src/main/java/forge/game/GameActionUtil.java
+++ b/forge-game/src/main/java/forge/game/GameActionUtil.java
@@ -17,6 +17,10 @@
*/
package forge.game;
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
@@ -27,8 +31,13 @@ import forge.card.mana.ManaCostParser;
import forge.game.ability.AbilityFactory;
import forge.game.ability.AbilityUtils;
import forge.game.ability.ApiType;
-import forge.game.card.*;
+import forge.game.card.Card;
+import forge.game.card.CardCollection;
+import forge.game.card.CardCollectionView;
+import forge.game.card.CardFactoryUtil;
+import forge.game.card.CardPlayOption;
import forge.game.card.CardPlayOption.PayManaCost;
+import forge.game.card.CounterType;
import forge.game.cost.Cost;
import forge.game.keyword.Keyword;
import forge.game.keyword.KeywordInterface;
@@ -37,7 +46,14 @@ import forge.game.player.PlayerController;
import forge.game.replacement.ReplacementEffect;
import forge.game.replacement.ReplacementHandler;
import forge.game.replacement.ReplacementLayer;
-import forge.game.spellability.*;
+import forge.game.spellability.AbilityManaPart;
+import forge.game.spellability.AbilitySub;
+import forge.game.spellability.AlternativeCost;
+import forge.game.spellability.OptionalCost;
+import forge.game.spellability.OptionalCostValue;
+import forge.game.spellability.Spell;
+import forge.game.spellability.SpellAbility;
+import forge.game.spellability.SpellAbilityRestriction;
import forge.game.trigger.Trigger;
import forge.game.trigger.TriggerHandler;
import forge.game.trigger.TriggerType;
@@ -45,10 +61,6 @@ import forge.game.zone.ZoneType;
import forge.util.Lang;
import forge.util.TextUtil;
-import org.apache.commons.lang3.StringUtils;
-
-import java.util.List;
-
/**
*
diff --git a/forge-game/src/main/java/forge/game/GameEntity.java b/forge-game/src/main/java/forge/game/GameEntity.java
index 2a7872ccd5e..93606b758e9 100644
--- a/forge-game/src/main/java/forge/game/GameEntity.java
+++ b/forge-game/src/main/java/forge/game/GameEntity.java
@@ -17,6 +17,12 @@
*/
package forge.game;
+import java.util.Map;
+
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+
import forge.game.ability.AbilityKey;
import forge.game.card.Card;
import forge.game.card.CardCollection;
@@ -37,12 +43,6 @@ import forge.game.trigger.TriggerType;
import forge.game.zone.ZoneType;
import forge.util.collect.FCollection;
-import java.util.Map;
-
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-
public abstract class GameEntity extends GameObject implements IIdentifiable {
protected final int id;
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/GameFormat.java b/forge-game/src/main/java/forge/game/GameFormat.java
index 82f283f759f..5af6fbf2c59 100644
--- a/forge-game/src/main/java/forge/game/GameFormat.java
+++ b/forge-game/src/main/java/forge/game/GameFormat.java
@@ -17,6 +17,24 @@
*/
package forge.game;
+import java.io.File;
+import java.io.FilenameFilter;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
import com.google.common.base.Function;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
@@ -36,13 +54,6 @@ import forge.util.FileUtil;
import forge.util.storage.StorageBase;
import forge.util.storage.StorageReaderRecursiveFolderWithUserFolder;
-import java.io.File;
-import java.io.FilenameFilter;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.*;
-import java.util.Map.Entry;
-
public class GameFormat implements Comparable {
private final String name;
diff --git a/forge-game/src/main/java/forge/game/GameLog.java b/forge-game/src/main/java/forge/game/GameLog.java
index 8fca317132b..6b7f7587ace 100644
--- a/forge-game/src/main/java/forge/game/GameLog.java
+++ b/forge-game/src/main/java/forge/game/GameLog.java
@@ -17,13 +17,13 @@
*/
package forge.game;
-import forge.game.event.IGameEventVisitor;
-
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
+import forge.game.event.IGameEventVisitor;
+
/**
*
* GameLog class.
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/GameOutcome.java b/forge-game/src/main/java/forge/game/GameOutcome.java
index 82fb476d4a8..03ab133b9fd 100644
--- a/forge-game/src/main/java/forge/game/GameOutcome.java
+++ b/forge-game/src/main/java/forge/game/GameOutcome.java
@@ -17,7 +17,15 @@
*/
package forge.game;
+import java.io.Serializable;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
import com.google.common.collect.Lists;
+
import forge.LobbyPlayer;
import forge.game.player.Player;
import forge.game.player.PlayerOutcome;
@@ -26,10 +34,6 @@ import forge.game.player.PlayerView;
import forge.game.player.RegisteredPlayer;
import forge.item.PaperCard;
-import java.io.Serializable;
-import java.util.*;
-import java.util.Map.Entry;
-
/**
*
* GameInfo class.
diff --git a/forge-game/src/main/java/forge/game/GameType.java b/forge-game/src/main/java/forge/game/GameType.java
index 0b1802dfac9..7483b80de99 100644
--- a/forge-game/src/main/java/forge/game/GameType.java
+++ b/forge-game/src/main/java/forge/game/GameType.java
@@ -5,6 +5,7 @@ import java.util.Set;
import com.google.common.base.Enums;
import com.google.common.base.Function;
+
import forge.StaticData;
import forge.deck.CardPool;
import forge.deck.Deck;
diff --git a/forge-game/src/main/java/forge/game/GameView.java b/forge-game/src/main/java/forge/game/GameView.java
index e24e9370034..b845bce1d31 100644
--- a/forge-game/src/main/java/forge/game/GameView.java
+++ b/forge-game/src/main/java/forge/game/GameView.java
@@ -1,6 +1,9 @@
package forge.game;
+import java.util.List;
+
import com.google.common.collect.Iterables;
+
import forge.LobbyPlayer;
import forge.deck.Deck;
import forge.game.GameOutcome.AnteResult;
@@ -19,8 +22,6 @@ import forge.trackable.TrackableObject;
import forge.trackable.TrackableProperty;
import forge.util.collect.FCollectionView;
-import java.util.List;
-
public class GameView extends TrackableObject {
private static final long serialVersionUID = 8522884512960961528L;
diff --git a/forge-game/src/main/java/forge/game/Match.java b/forge-game/src/main/java/forge/game/Match.java
index c34bca44ab0..c8c22588bbc 100644
--- a/forge-game/src/main/java/forge/game/Match.java
+++ b/forge-game/src/main/java/forge/game/Match.java
@@ -1,6 +1,22 @@
package forge.game;
-import com.google.common.collect.*;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import com.google.common.collect.ArrayListMultimap;
+import com.google.common.collect.HashMultimap;
+import com.google.common.collect.HashMultiset;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Multimap;
+import com.google.common.collect.Multiset;
import com.google.common.eventbus.EventBus;
import forge.LobbyPlayer;
@@ -20,12 +36,9 @@ import forge.game.trigger.Trigger;
import forge.game.zone.PlayerZone;
import forge.game.zone.ZoneType;
import forge.item.PaperCard;
+import forge.util.Localizer;
import forge.util.MyRandom;
import forge.util.collect.FCollectionView;
-import forge.util.Localizer;
-
-import java.util.*;
-import java.util.Map.Entry;
public class Match {
private final List players;
diff --git a/forge-game/src/main/java/forge/game/PlanarDice.java b/forge-game/src/main/java/forge/game/PlanarDice.java
index a0aef3692bb..d8705f3e889 100644
--- a/forge-game/src/main/java/forge/game/PlanarDice.java
+++ b/forge-game/src/main/java/forge/game/PlanarDice.java
@@ -1,13 +1,13 @@
package forge.game;
-import forge.game.ability.AbilityKey;
-import forge.game.player.Player;
-import forge.game.trigger.TriggerType;
-
import java.util.Map;
import com.google.common.collect.ImmutableList;
+import forge.game.ability.AbilityKey;
+import forge.game.player.Player;
+import forge.game.trigger.TriggerType;
+
/**
* Represents the planar dice for Planechase games.
*
diff --git a/forge-game/src/main/java/forge/game/StaticEffect.java b/forge-game/src/main/java/forge/game/StaticEffect.java
index 9f1f32cb49e..2e96d44bcf4 100644
--- a/forge-game/src/main/java/forge/game/StaticEffect.java
+++ b/forge-game/src/main/java/forge/game/StaticEffect.java
@@ -17,19 +17,18 @@
*/
package forge.game;
-import forge.game.card.Card;
-import forge.game.card.CardCollection;
-import forge.game.card.CardCollectionView;
-
-import forge.game.player.Player;
-import forge.game.staticability.StaticAbility;
-
import java.util.List;
import java.util.Map;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
+import forge.game.card.Card;
+import forge.game.card.CardCollection;
+import forge.game.card.CardCollectionView;
+import forge.game.player.Player;
+import forge.game.staticability.StaticAbility;
+
/**
*
* StaticEffect class.
diff --git a/forge-game/src/main/java/forge/game/ability/AbilityApiBased.java b/forge-game/src/main/java/forge/game/ability/AbilityApiBased.java
index 4603cee8d98..dba8ae6d801 100644
--- a/forge-game/src/main/java/forge/game/ability/AbilityApiBased.java
+++ b/forge-game/src/main/java/forge/game/ability/AbilityApiBased.java
@@ -1,13 +1,13 @@
package forge.game.ability;
+import java.util.Map;
+
import forge.game.card.Card;
import forge.game.cost.Cost;
import forge.game.spellability.AbilityActivated;
import forge.game.spellability.AbilityManaPart;
import forge.game.spellability.TargetRestrictions;
-import java.util.Map;
-
public class AbilityApiBased extends AbilityActivated {
private final SpellAbilityEffect effect;
diff --git a/forge-game/src/main/java/forge/game/ability/AbilityFactory.java b/forge-game/src/main/java/forge/game/ability/AbilityFactory.java
index 1449ae13096..8fce51f16e1 100644
--- a/forge-game/src/main/java/forge/game/ability/AbilityFactory.java
+++ b/forge-game/src/main/java/forge/game/ability/AbilityFactory.java
@@ -17,9 +17,13 @@
*/
package forge.game.ability;
+import java.util.List;
+import java.util.Map;
+
import com.google.common.base.Function;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
+
import forge.card.CardStateName;
import forge.game.CardTraitBase;
import forge.game.IHasSVars;
@@ -27,15 +31,16 @@ import forge.game.ability.effects.CharmEffect;
import forge.game.card.Card;
import forge.game.card.CardState;
import forge.game.cost.Cost;
-import forge.game.spellability.*;
+import forge.game.spellability.AbilitySub;
+import forge.game.spellability.SpellAbility;
+import forge.game.spellability.SpellAbilityCondition;
+import forge.game.spellability.SpellAbilityRestriction;
+import forge.game.spellability.TargetRestrictions;
import forge.game.zone.ZoneType;
import forge.util.FileSection;
import io.sentry.Sentry;
import io.sentry.event.BreadcrumbBuilder;
-import java.util.List;
-import java.util.Map;
-
/**
*
* AbilityFactory class.
diff --git a/forge-game/src/main/java/forge/game/ability/AbilityKey.java b/forge-game/src/main/java/forge/game/ability/AbilityKey.java
index b0f526793b0..64ebf3d1fb9 100644
--- a/forge-game/src/main/java/forge/game/ability/AbilityKey.java
+++ b/forge-game/src/main/java/forge/game/ability/AbilityKey.java
@@ -61,6 +61,7 @@ public enum AbilityKey {
EffectOnly("EffectOnly"),
Exploited("Exploited"),
Explorer("Explorer"),
+ ExtraTurn("ExtraTurn"),
Event("Event"),
Fighter("Fighter"),
Fighters("Fighters"),
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..31e85809eb7 100644
--- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java
+++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java
@@ -1,5 +1,15 @@
package forge.game.ability;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
+
import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
@@ -18,9 +28,15 @@ 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.card.Card;
+import forge.game.card.CardCollection;
+import forge.game.card.CardCollectionView;
+import forge.game.card.CardFactoryUtil;
+import forge.game.card.CardLists;
+import forge.game.card.CardPredicates;
+import forge.game.card.CardUtil;
+import forge.game.card.CounterType;
import forge.game.cost.Cost;
import forge.game.keyword.Keyword;
import forge.game.keyword.KeywordInterface;
@@ -30,7 +46,13 @@ import forge.game.mana.ManaCostBeingPaid;
import forge.game.player.Player;
import forge.game.player.PlayerCollection;
import forge.game.player.PlayerPredicates;
-import forge.game.spellability.*;
+import forge.game.spellability.AbilitySub;
+import forge.game.spellability.Spell;
+import forge.game.spellability.SpellAbility;
+import forge.game.spellability.SpellAbilityRestriction;
+import forge.game.spellability.SpellAbilityStackInstance;
+import forge.game.spellability.SpellPermanent;
+import forge.game.spellability.TargetChoices;
import forge.game.trigger.Trigger;
import forge.game.trigger.TriggerType;
import forge.game.zone.ZoneType;
@@ -42,15 +64,6 @@ import forge.util.collect.FCollectionView;
import io.sentry.Sentry;
import io.sentry.event.BreadcrumbBuilder;
-import org.apache.commons.lang3.ObjectUtils;
-import org.apache.commons.lang3.StringUtils;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
public class AbilityUtils {
private final static ImmutableList cmpList = ImmutableList.of("LT", "LE", "EQ", "GE", "GT", "NE");
@@ -86,7 +99,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 +114,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 +146,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 +163,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 +211,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 +258,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 +269,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 +332,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 +372,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 +828,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 +838,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 +987,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 +1028,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 +1046,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 +1064,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 +1130,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 +1274,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 +1283,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 +1306,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 +1606,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 +1804,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 +1820,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/ApiType.java b/forge-game/src/main/java/forge/game/ability/ApiType.java
index 7b7924dc819..024a2b35155 100644
--- a/forge-game/src/main/java/forge/game/ability/ApiType.java
+++ b/forge-game/src/main/java/forge/game/ability/ApiType.java
@@ -1,12 +1,12 @@
package forge.game.ability;
-import forge.game.ability.effects.*;
-import forge.util.ReflectionUtil;
-
import java.util.HashMap;
import java.util.Map;
+import forge.game.ability.effects.*;
+import forge.util.ReflectionUtil;
+
/**
* TODO: Write javadoc for this type.
*
@@ -153,9 +153,9 @@ public enum ApiType {
SetLife (LifeSetEffect.class),
SetState (SetStateEffect.class),
Shuffle (ShuffleEffect.class),
+ SkipPhase (SkipPhaseEffect.class),
SkipTurn (SkipTurnEffect.class),
StoreSVar (StoreSVarEffect.class),
- StoreMap (StoreMapEffect.class),
Subgame (SubgameEffect.class),
Surveil (SurveilEffect.class),
SwitchBlock (SwitchBlockEffect.class),
diff --git a/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java b/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java
index c506d8d2162..cbf89d3a2a0 100644
--- a/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java
@@ -4,22 +4,23 @@ import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
-import forge.card.MagicColor;
-import forge.util.TextUtil;
import org.apache.commons.lang3.StringUtils;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
+import com.google.common.collect.Table;
import forge.GameCommand;
import forge.card.CardType;
+import forge.card.MagicColor;
import forge.game.Game;
import forge.game.GameEntity;
import forge.game.GameObject;
import forge.game.card.Card;
import forge.game.card.CardCollection;
import forge.game.card.CardFactoryUtil;
+import forge.game.card.CardZoneTable;
import forge.game.combat.Combat;
import forge.game.player.Player;
import forge.game.player.PlayerCollection;
@@ -35,6 +36,7 @@ import forge.game.zone.ZoneType;
import forge.util.CardTranslation;
import forge.util.Lang;
import forge.util.Localizer;
+import forge.util.TextUtil;
import forge.util.collect.FCollection;
/**
@@ -613,4 +615,32 @@ public abstract class SpellAbilityEffect {
}
return combatChanged;
}
+
+ protected static GameCommand untilHostLeavesPlayCommand(final CardZoneTable triggerList, final Card hostCard) {
+ final Game game = hostCard.getGame();
+ hostCard.addUntilLeavesBattlefield(triggerList.allCards());
+ return new GameCommand() {
+
+ private static final long serialVersionUID = 1L;
+
+ @Override
+ public void run() {
+ CardZoneTable untilTable = new CardZoneTable();
+ for (Table.Cell cell : triggerList.cellSet()) {
+ for (Card c : cell.getValue()) {
+ // better check if card didn't changed zones again?
+ Card newCard = c.getZone().getCards().get(c);
+ if (newCard == null || !newCard.equalsWithTimestamp(c)) {
+ continue;
+ }
+ // no cause there?
+ Card movedCard = game.getAction().moveTo(cell.getRowKey(), newCard, null);
+ untilTable.put(cell.getColumnKey(), cell.getRowKey(), movedCard);
+ }
+ }
+ untilTable.triggerChangesZoneAll(game);
+ }
+
+ };
+ }
}
diff --git a/forge-game/src/main/java/forge/game/ability/StaticAbilityApiBased.java b/forge-game/src/main/java/forge/game/ability/StaticAbilityApiBased.java
index 4942d614490..55d15956b80 100644
--- a/forge-game/src/main/java/forge/game/ability/StaticAbilityApiBased.java
+++ b/forge-game/src/main/java/forge/game/ability/StaticAbilityApiBased.java
@@ -1,5 +1,7 @@
package forge.game.ability;
+import java.util.Map;
+
import forge.game.ability.effects.ChangeZoneAllEffect;
import forge.game.ability.effects.ChangeZoneEffect;
import forge.game.card.Card;
@@ -7,8 +9,6 @@ import forge.game.cost.Cost;
import forge.game.spellability.AbilityStatic;
import forge.game.spellability.TargetRestrictions;
-import java.util.Map;
-
public class StaticAbilityApiBased extends AbilityStatic {
private final SpellAbilityEffect effect;
diff --git a/forge-game/src/main/java/forge/game/ability/effects/AbandonEffect.java b/forge-game/src/main/java/forge/game/ability/effects/AbandonEffect.java
index d646c6daf59..7eeffb6afec 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/AbandonEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/AbandonEffect.java
@@ -1,5 +1,7 @@
package forge.game.ability.effects;
+import java.util.Map;
+
import forge.game.Game;
import forge.game.ability.AbilityKey;
import forge.game.ability.SpellAbilityEffect;
@@ -8,10 +10,8 @@ import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.trigger.TriggerType;
import forge.game.zone.ZoneType;
-import forge.util.Localizer;
import forge.util.CardTranslation;
-
-import java.util.Map;
+import forge.util.Localizer;
public class AbandonEffect extends SpellAbilityEffect {
diff --git a/forge-game/src/main/java/forge/game/ability/effects/ActivateAbilityEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ActivateAbilityEffect.java
index 1ff78b9093a..a292825e681 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/ActivateAbilityEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/ActivateAbilityEffect.java
@@ -1,5 +1,12 @@
package forge.game.ability.effects;
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Lists;
+
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
import forge.game.card.CardLists;
@@ -7,16 +14,9 @@ import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.spellability.TargetRestrictions;
import forge.game.zone.ZoneType;
-import forge.util.collect.FCollection;
import forge.util.Lang;
import forge.util.Localizer;
-
-import org.apache.commons.lang3.StringUtils;
-
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Lists;
-
-import java.util.List;
+import forge.util.collect.FCollection;
public class ActivateAbilityEffect extends SpellAbilityEffect {
@Override
diff --git a/forge-game/src/main/java/forge/game/ability/effects/AddPhaseEffect.java b/forge-game/src/main/java/forge/game/ability/effects/AddPhaseEffect.java
index b10a6919e9f..188a61bca99 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/AddPhaseEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/AddPhaseEffect.java
@@ -1,9 +1,16 @@
package forge.game.ability.effects;
+import java.util.ArrayList;
+import java.util.List;
+
+import forge.game.ability.AbilityFactory;
import forge.game.ability.SpellAbilityEffect;
+import forge.game.phase.ExtraPhase;
import forge.game.phase.PhaseHandler;
import forge.game.phase.PhaseType;
import forge.game.spellability.SpellAbility;
+import forge.game.trigger.Trigger;
+import forge.game.trigger.TriggerHandler;
/**
* TODO: Write javadoc for this type.
@@ -13,32 +20,55 @@ public class AddPhaseEffect extends SpellAbilityEffect {
@Override
public void resolve(SpellAbility sa) {
+ boolean isTopsy = sa.getActivatingPlayer().hasKeyword("The phases of your turn are reversed.");
PhaseHandler phaseHandler = sa.getActivatingPlayer().getGame().getPhaseHandler();
- PhaseType extra = PhaseType.smartValueOf(sa.getParam("ExtraPhase"));
+ PhaseType currentPhase = phaseHandler.getPhase();
- PhaseType after;
+ // Check for World at War - may need to be moved to SpellAbilityCondition later?
+ if (sa.hasParam("BeforeFirstPostCombatMainEnd")) {
+ if (!phaseHandler.beforeFirstPostCombatMainEnd()) {
+ return;
+ }
+ }
+
+ PhaseType afterPhase;
if (sa.hasParam("AfterPhase")) {
- after = PhaseType.smartValueOf(sa.getParam("AfterPhase"));
+ afterPhase = PhaseType.smartValueOf(sa.getParam("AfterPhase"));
}
else {
- // If "AfterPhase" param is missing it means the added Phase comes after this Phase
- after = phaseHandler.getPhase();
+ // If "AfterPhase" param is missing it means the added Phase comes afterPhase this Phase
+ afterPhase = currentPhase;
}
- phaseHandler.addExtraPhase(after, extra);
-
+
+ // The original next phase following afterPhase
+ PhaseType nextPhase = PhaseType.getNext(afterPhase, isTopsy);
+ List extraPhaseList = new ArrayList<>();
+
+ // Insert ExtraPhase
+ String extra = sa.getParam("ExtraPhase");
+ if (extra.equals("Beginning")) {
+ extraPhaseList.addAll(PhaseType.PHASE_GROUPS.get(0));
+ } else if (extra.equals("Combat")) {
+ extraPhaseList.addAll(PhaseType.PHASE_GROUPS.get(2));
+ } else { // Currently no effect will add End Phase
+ extraPhaseList.add(PhaseType.smartValueOf(extra));
+ }
+
+ // Insert FollowedBy
if (sa.hasParam("FollowedBy")) {
- String followedBy = sa.getParam("FollowedBy");
- PhaseType followingExtra;
- if ("ThisPhase".equals(followedBy)) {
- followingExtra = phaseHandler.getPhase();
- } else {
- followingExtra = PhaseType.smartValueOf(followedBy);
- }
- PhaseType followingAfter = extra.equals(PhaseType.COMBAT_BEGIN) ? PhaseType.COMBAT_END : extra;
- if (sa.hasParam("AdditionalBeginningPhase")) {
- followingAfter = extra.equals(PhaseType.UNTAP) ? PhaseType.DRAW : extra;
- }
- phaseHandler.addExtraPhase(followingAfter, followingExtra);
+ // Currently all FollowedBy are Main2 phase, which has no step
+ PhaseType followingExtra = PhaseType.smartValueOf(sa.getParam("FollowedBy"));
+ extraPhaseList.add(followingExtra);
+ }
+
+ ExtraPhase extraPhase = phaseHandler.addExtraPhase(afterPhase, extraPhaseList, nextPhase);
+
+ if (sa.hasParam("ExtraPhaseDelayedTrigger")) {
+ final Trigger delTrig = TriggerHandler.parseTrigger(sa.getSVar(sa.getParam("ExtraPhaseDelayedTrigger")), sa.getHostCard(), true);
+ SpellAbility overridingSA = AbilityFactory.getAbility(sa.getSVar(sa.getParam("ExtraPhaseDelayedTriggerExcute")), sa.getHostCard());
+ overridingSA.setActivatingPlayer(sa.getActivatingPlayer());
+ delTrig.setOverridingAbility(overridingSA);
+ extraPhase.addTrigger(delTrig);
}
}
}
diff --git a/forge-game/src/main/java/forge/game/ability/effects/AddTurnEffect.java b/forge-game/src/main/java/forge/game/ability/effects/AddTurnEffect.java
index 2d31436de09..c18f9aed31a 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/AddTurnEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/AddTurnEffect.java
@@ -1,5 +1,7 @@
package forge.game.ability.effects;
+import java.util.List;
+
import forge.game.ability.AbilityFactory;
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
@@ -10,8 +12,6 @@ import forge.game.trigger.Trigger;
import forge.game.trigger.TriggerHandler;
import forge.util.Localizer;
-import java.util.List;
-
public class AddTurnEffect extends SpellAbilityEffect {
@Override
@@ -57,6 +57,7 @@ public class AddTurnEffect extends SpellAbilityEffect {
}
if (sa.hasParam("SkipUntap")) {
extra.setSkipUntap(true);
+ extra.setSkipUntapSA(sa);
}
if (sa.hasParam("NoSchemes")) {
extra.setCantSetSchemesInMotion(true);
diff --git a/forge-game/src/main/java/forge/game/ability/effects/AnimateAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/AnimateAllEffect.java
index 4740f02d18e..ef111a521c4 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/AnimateAllEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/AnimateAllEffect.java
@@ -1,5 +1,11 @@
package forge.game.ability.effects;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import com.google.common.collect.ImmutableList;
+
import forge.GameCommand;
import forge.card.CardType;
import forge.game.Game;
@@ -12,12 +18,6 @@ import forge.game.event.GameEventCardStatsChanged;
import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import com.google.common.collect.ImmutableList;
-
public class AnimateAllEffect extends AnimateEffectBase {
@Override
diff --git a/forge-game/src/main/java/forge/game/ability/effects/AnimateEffect.java b/forge-game/src/main/java/forge/game/ability/effects/AnimateEffect.java
index 59d730829fe..8672abb81dd 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/AnimateEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/AnimateEffect.java
@@ -1,5 +1,10 @@
package forge.game.ability.effects;
+import java.util.Arrays;
+import java.util.List;
+
+import com.google.common.collect.Lists;
+
import forge.card.CardType;
import forge.game.Game;
import forge.game.ability.AbilityUtils;
@@ -8,11 +13,6 @@ import forge.game.card.CardUtil;
import forge.game.event.GameEventCardStatsChanged;
import forge.game.spellability.SpellAbility;
-import com.google.common.collect.Lists;
-
-import java.util.Arrays;
-import java.util.List;
-
public class AnimateEffect extends AnimateEffectBase {
diff --git a/forge-game/src/main/java/forge/game/ability/effects/AnimateEffectBase.java b/forge-game/src/main/java/forge/game/ability/effects/AnimateEffectBase.java
index 7115bcf00e7..8d05c06e04b 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/AnimateEffectBase.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/AnimateEffectBase.java
@@ -17,6 +17,10 @@
*/
package forge.game.ability.effects;
+import java.util.List;
+
+import com.google.common.collect.Lists;
+
import forge.GameCommand;
import forge.card.CardType;
import forge.card.mana.ManaCost;
@@ -37,10 +41,6 @@ import forge.game.staticability.StaticAbility;
import forge.game.trigger.Trigger;
import forge.game.trigger.TriggerHandler;
-import java.util.List;
-
-import com.google.common.collect.Lists;
-
public abstract class AnimateEffectBase extends SpellAbilityEffect {
public static void doAnimate(final Card c, final SpellAbility sa, final Integer power, final Integer toughness,
final CardType addType, final CardType removeType, final String colors,
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..1b976951a9c 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
@@ -1,5 +1,7 @@
package forge.game.ability.effects;
+import java.util.List;
+
import forge.GameCommand;
import forge.game.Game;
import forge.game.GameEntity;
@@ -15,12 +17,10 @@ import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.spellability.TargetRestrictions;
import forge.game.zone.ZoneType;
-import forge.util.collect.FCollection;
+import forge.util.CardTranslation;
import forge.util.Lang;
import forge.util.Localizer;
-import forge.util.CardTranslation;
-
-import java.util.List;
+import forge.util.collect.FCollection;
public class AttachEffect extends SpellAbilityEffect {
@Override
@@ -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..cd1ba4363d4 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
@@ -1,5 +1,9 @@
package forge.game.ability.effects;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
import forge.game.Game;
import forge.game.ability.AbilityKey;
import forge.game.ability.SpellAbilityEffect;
@@ -13,10 +17,6 @@ import forge.game.trigger.TriggerType;
import forge.game.zone.ZoneType;
import forge.util.collect.FCollectionView;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
/**
* TODO: Write javadoc for this type.
*
@@ -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/BecomesBlockedEffect.java b/forge-game/src/main/java/forge/game/ability/effects/BecomesBlockedEffect.java
index 375e282522f..d227abea28e 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/BecomesBlockedEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/BecomesBlockedEffect.java
@@ -1,5 +1,12 @@
package forge.game.ability.effects;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.google.common.collect.Lists;
+
import forge.game.Game;
import forge.game.ability.AbilityKey;
import forge.game.ability.SpellAbilityEffect;
@@ -8,13 +15,6 @@ import forge.game.event.GameEventCombatChanged;
import forge.game.spellability.SpellAbility;
import forge.game.trigger.TriggerType;
-import org.apache.commons.lang3.StringUtils;
-
-import com.google.common.collect.Lists;
-
-import java.util.List;
-import java.util.Map;
-
public class BecomesBlockedEffect extends SpellAbilityEffect {
@Override
diff --git a/forge-game/src/main/java/forge/game/ability/effects/BidLifeEffect.java b/forge-game/src/main/java/forge/game/ability/effects/BidLifeEffect.java
index 4083e5fe8de..99a80f31f05 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/BidLifeEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/BidLifeEffect.java
@@ -10,8 +10,8 @@ import forge.game.player.Player;
import forge.game.player.PlayerActionConfirmMode;
import forge.game.spellability.AbilitySub;
import forge.game.spellability.SpellAbility;
-import forge.util.collect.FCollection;
import forge.util.Localizer;
+import forge.util.collect.FCollection;
public class BidLifeEffect extends SpellAbilityEffect {
@Override
diff --git a/forge-game/src/main/java/forge/game/ability/effects/BlockEffect.java b/forge-game/src/main/java/forge/game/ability/effects/BlockEffect.java
index 808d45a5e4a..e0e1af7b139 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/BlockEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/BlockEffect.java
@@ -1,5 +1,12 @@
package forge.game.ability.effects;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import com.google.common.collect.Lists;
+
+import forge.game.Game;
import forge.game.ability.AbilityKey;
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
@@ -7,17 +14,11 @@ import forge.game.card.Card;
import forge.game.card.CardCollection;
import forge.game.combat.Combat;
import forge.game.event.GameEventCombatChanged;
-import forge.game.Game;
import forge.game.spellability.SpellAbility;
import forge.game.trigger.TriggerType;
import forge.game.zone.ZoneType;
-
import forge.util.Lang;
-import java.util.*;
-
-import com.google.common.collect.Lists;
-
public class BlockEffect extends SpellAbilityEffect {
@Override
diff --git a/forge-game/src/main/java/forge/game/ability/effects/BondEffect.java b/forge-game/src/main/java/forge/game/ability/effects/BondEffect.java
index 4d9789bac9f..7a05d732a38 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/BondEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/BondEffect.java
@@ -1,5 +1,7 @@
package forge.game.ability.effects;
+import java.util.List;
+
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
@@ -8,8 +10,6 @@ import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
import forge.util.Localizer;
-import java.util.List;
-
public class BondEffect extends SpellAbilityEffect {
@Override
public void resolve(SpellAbility sa) {
diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeCombatantsEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeCombatantsEffect.java
index 0b807bdd2bc..a62b98dc667 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/ChangeCombatantsEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeCombatantsEffect.java
@@ -1,5 +1,12 @@
package forge.game.ability.effects;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.google.common.collect.Maps;
+
import forge.game.Game;
import forge.game.GameEntity;
import forge.game.ability.AbilityKey;
@@ -12,16 +19,9 @@ import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.spellability.SpellAbilityStackInstance;
import forge.game.spellability.TargetRestrictions;
-import forge.util.collect.FCollectionView;
-import forge.util.Localizer;
import forge.util.CardTranslation;
-
-import org.apache.commons.lang3.StringUtils;
-
-import com.google.common.collect.Maps;
-
-import java.util.List;
-import java.util.Map;
+import forge.util.Localizer;
+import forge.util.collect.FCollectionView;
public class ChangeCombatantsEffect extends SpellAbilityEffect {
diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeTargetsEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeTargetsEffect.java
index c52942c35d5..57d4bd08d8a 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/ChangeTargetsEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeTargetsEffect.java
@@ -1,5 +1,11 @@
package forge.game.ability.effects;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.lang3.tuple.ImmutablePair;
+import org.apache.commons.lang3.tuple.Pair;
+
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
@@ -15,12 +21,6 @@ import forge.game.zone.MagicStack;
import forge.util.Aggregates;
import forge.util.Localizer;
-import org.apache.commons.lang3.tuple.ImmutablePair;
-import org.apache.commons.lang3.tuple.Pair;
-
-import java.util.ArrayList;
-import java.util.List;
-
/**
* TODO: Write javadoc for this type.
*
diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeTextEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeTextEffect.java
index 67e6773f08c..9c78a65e2d2 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/ChangeTextEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeTextEffect.java
@@ -13,8 +13,8 @@ import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
import forge.game.event.GameEventCardStatsChanged;
import forge.game.spellability.SpellAbility;
-import forge.util.TextUtil;
import forge.util.Localizer;
+import forge.util.TextUtil;
public class ChangeTextEffect extends SpellAbilityEffect {
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 b33e6c4b51c..b168745ffd0 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
@@ -1,5 +1,8 @@
package forge.game.ability.effects;
+import java.util.List;
+import java.util.Map;
+
import com.google.common.collect.Iterables;
import com.google.common.collect.Maps;
@@ -8,18 +11,20 @@ import forge.game.GameActionUtil;
import forge.game.ability.AbilityKey;
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
-import forge.game.card.*;
+import forge.game.card.Card;
+import forge.game.card.CardCollection;
+import forge.game.card.CardLists;
+import forge.game.card.CardPredicates;
+import forge.game.card.CardUtil;
+import forge.game.card.CardZoneTable;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.trigger.TriggerType;
import forge.game.zone.Zone;
import forge.game.zone.ZoneType;
import forge.util.Lang;
-import forge.util.TextUtil;
import forge.util.Localizer;
-
-import java.util.List;
-import java.util.Map;
+import forge.util.TextUtil;
public class ChangeZoneAllEffect extends SpellAbilityEffect {
@Override
@@ -37,6 +42,11 @@ public class ChangeZoneAllEffect extends SpellAbilityEffect {
@Override
public void resolve(SpellAbility sa) {
+ //if host is not on the battlefield don't apply
+ if (sa.hasParam("UntilHostLeavesPlay") && !sa.getHostCard().isInPlay()) {
+ return;
+ }
+
final ZoneType destination = ZoneType.smartValueOf(sa.getParam("Destination"));
final List origin = ZoneType.listValueOf(sa.getParam("Origin"));
@@ -74,7 +84,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();
@@ -88,7 +98,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());
@@ -260,6 +270,10 @@ public class ChangeZoneAllEffect extends SpellAbilityEffect {
triggerList.triggerChangesZoneAll(game);
+ if (sa.hasParam("UntilHostLeavesPlay")) {
+ source.addLeavesPlayCommand(untilHostLeavesPlayCommand(triggerList, source));
+ }
+
// if Shuffle parameter exists, and any amount of cards were owned by
// that player, then shuffle that library
if (sa.hasParam("Shuffle")) {
@@ -270,5 +284,4 @@ public class ChangeZoneAllEffect extends SpellAbilityEffect {
}
}
}
-
}
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 7e8f35ded82..fba4bc90fb4 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
@@ -1,5 +1,11 @@
package forge.game.ability.effects;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang3.StringUtils;
+
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Iterables;
@@ -15,7 +21,15 @@ import forge.game.GameLogEntryType;
import forge.game.ability.AbilityKey;
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
-import forge.game.card.*;
+import forge.game.card.Card;
+import forge.game.card.CardCollection;
+import forge.game.card.CardCollectionView;
+import forge.game.card.CardLists;
+import forge.game.card.CardPredicates;
+import forge.game.card.CardUtil;
+import forge.game.card.CardView;
+import forge.game.card.CardZoneTable;
+import forge.game.card.CounterType;
import forge.game.event.GameEventCombatChanged;
import forge.game.player.DelayedReveal;
import forge.game.player.Player;
@@ -31,17 +45,12 @@ import forge.game.trigger.TriggerType;
import forge.game.zone.Zone;
import forge.game.zone.ZoneType;
import forge.util.Aggregates;
+import forge.util.CardTranslation;
import forge.util.Lang;
+import forge.util.Localizer;
import forge.util.MessageUtil;
import forge.util.TextUtil;
import forge.util.collect.FCollectionView;
-import forge.util.Localizer;
-import forge.util.CardTranslation;
-import org.apache.commons.lang3.StringUtils;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
public class ChangeZoneEffect extends SpellAbilityEffect {
@@ -409,6 +418,11 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
@Override
public void resolve(SpellAbility sa) {
+ //if host is not on the battlefield don't apply
+ if (sa.hasParam("UntilHostLeavesPlay") && !sa.getHostCard().isInPlay()) {
+ return;
+ }
+
if (isHidden(sa) && !sa.hasParam("Ninjutsu")) {
changeHiddenOriginResolve(sa);
} else {
@@ -578,7 +592,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();
@@ -711,7 +725,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
movedCard.addCounter(cType, cAmount, player, true, counterTable);
}
- if (sa.hasParam("ExileFaceDown")) {
+ if (sa.hasParam("ExileFaceDown") || sa.hasParam("FaceDown")) {
movedCard.turnFaceDown(true);
}
if (sa.hasParam("Foretold")) {
@@ -744,7 +758,6 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
}
}
-
if (remember != null) {
hostCard.addRemembered(movedCard);
// addRememberedFromCardState ?
@@ -797,9 +810,13 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
triggerList.triggerChangesZoneAll(game);
counterTable.triggerCountersPutAll(game);
+
if (sa.hasParam("AtEOT") && !triggerList.isEmpty()) {
registerDelayedTrigger(sa, sa.getParam("AtEOT"), triggerList.allCards());
}
+ if (sa.hasParam("UntilHostLeavesPlay")) {
+ hostCard.addLeavesPlayCommand(untilHostLeavesPlayCommand(triggerList, hostCard));
+ }
// for things like Gaea's Blessing
if (destination.equals(ZoneType.Library) && sa.hasParam("Shuffle") && "True".equals(sa.getParam("Shuffle"))) {
@@ -1096,7 +1113,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);
}
}
@@ -1205,7 +1222,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;
@@ -1388,6 +1405,10 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
}
triggerList.triggerChangesZoneAll(game);
+ if (sa.hasParam("UntilHostLeavesPlay")) {
+ source.addLeavesPlayCommand(untilHostLeavesPlayCommand(triggerList, source));
+ }
+
// remove Controlled While Searching
if (controlTimestamp != null) {
player.removeController(controlTimestamp);
diff --git a/forge-game/src/main/java/forge/game/ability/effects/CharmEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CharmEffect.java
index c01aef67cae..76d5c2020e0 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/CharmEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/CharmEffect.java
@@ -1,5 +1,9 @@
package forge.game.ability.effects;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
import com.google.common.collect.Lists;
import forge.game.ability.AbilityUtils;
@@ -12,10 +16,6 @@ import forge.util.Aggregates;
import forge.util.Lang;
import forge.util.collect.FCollection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-
public class CharmEffect extends SpellAbilityEffect {
public static List makePossibleOptions(final SpellAbility sa) {
diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChooseCardEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChooseCardEffect.java
index f425374b577..ef97d4bf459 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/ChooseCardEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/ChooseCardEffect.java
@@ -1,5 +1,9 @@
package forge.game.ability.effects;
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+
import forge.card.CardType;
import forge.game.Game;
import forge.game.ability.AbilityUtils;
@@ -19,10 +23,6 @@ import forge.util.Aggregates;
import forge.util.Lang;
import forge.util.Localizer;
-import org.apache.commons.lang3.StringUtils;
-
-import java.util.List;
-
public class ChooseCardEffect extends SpellAbilityEffect {
@Override
protected String getStackDescription(SpellAbility sa) {
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..b99b686a4ed 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
@@ -1,5 +1,11 @@
package forge.game.ability.effects;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Iterables;
@@ -24,12 +30,6 @@ import forge.util.Aggregates;
import forge.util.ComparableOp;
import forge.util.Localizer;
-import org.apache.commons.lang3.StringUtils;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
public class ChooseCardNameEffect extends SpellAbilityEffect {
@Override
@@ -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/ChooseColorEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChooseColorEffect.java
index f9b0d07380c..e7ce877a81e 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/ChooseColorEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/ChooseColorEffect.java
@@ -1,5 +1,9 @@
package forge.game.ability.effects;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
import forge.card.MagicColor;
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
@@ -9,10 +13,6 @@ import forge.game.spellability.TargetRestrictions;
import forge.util.Lang;
import forge.util.Localizer;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
public class ChooseColorEffect extends SpellAbilityEffect {
@Override
diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChooseDirectionEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChooseDirectionEffect.java
index a02bf0206e9..f59c19f1160 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/ChooseDirectionEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/ChooseDirectionEffect.java
@@ -9,8 +9,8 @@ import forge.game.card.Card;
import forge.game.player.Player;
import forge.game.player.PlayerController.BinaryChoiceType;
import forge.game.spellability.SpellAbility;
-import forge.util.collect.FCollection;
import forge.util.Localizer;
+import forge.util.collect.FCollection;
public class ChooseDirectionEffect extends SpellAbilityEffect {
@Override
diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChooseGenericEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChooseGenericEffect.java
index f4a6d34daee..8190fa1e40e 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/ChooseGenericEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/ChooseGenericEffect.java
@@ -1,7 +1,10 @@
package forge.game.ability.effects;
+import java.util.List;
+
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
+
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
@@ -10,8 +13,6 @@ import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.util.Aggregates;
-import java.util.List;
-
public class ChooseGenericEffect extends SpellAbilityEffect {
@Override
diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChooseNumberEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChooseNumberEffect.java
index 406a0ca52eb..af26897b838 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/ChooseNumberEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/ChooseNumberEffect.java
@@ -1,7 +1,12 @@
package forge.game.ability.effects;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
+
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
@@ -9,12 +14,8 @@ import forge.game.player.Player;
import forge.game.spellability.AbilitySub;
import forge.game.spellability.SpellAbility;
import forge.game.spellability.TargetRestrictions;
-import forge.util.MyRandom;
import forge.util.Localizer;
-
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
+import forge.util.MyRandom;
public class ChooseNumberEffect extends SpellAbilityEffect {
diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChoosePlayerEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChoosePlayerEffect.java
index 6f25e23d7b4..b576b755b31 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/ChoosePlayerEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/ChoosePlayerEffect.java
@@ -1,5 +1,7 @@
package forge.game.ability.effects;
+import java.util.List;
+
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
@@ -8,10 +10,8 @@ import forge.game.spellability.AbilitySub;
import forge.game.spellability.SpellAbility;
import forge.game.spellability.TargetRestrictions;
import forge.util.Aggregates;
-import forge.util.collect.FCollectionView;
import forge.util.Localizer;
-
-import java.util.List;
+import forge.util.collect.FCollectionView;
public class ChoosePlayerEffect extends SpellAbilityEffect {
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..2f7ceac1850 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
@@ -1,5 +1,9 @@
package forge.game.ability.effects;
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+
import forge.game.Game;
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
@@ -10,14 +14,9 @@ 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;
-import org.apache.commons.lang3.StringUtils;
-
-import java.util.List;
-
public class ChooseSourceEffect extends SpellAbilityEffect {
@Override
protected String getStackDescription(SpellAbility sa) {
@@ -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/ChooseTypeEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChooseTypeEffect.java
index d8c6f7d819c..36b0acf9f67 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/ChooseTypeEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/ChooseTypeEffect.java
@@ -1,15 +1,16 @@
package forge.game.ability.effects;
+import java.security.InvalidParameterException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
import forge.card.CardType;
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.spellability.TargetRestrictions;
-import java.security.InvalidParameterException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
public class ChooseTypeEffect extends SpellAbilityEffect {
diff --git a/forge-game/src/main/java/forge/game/ability/effects/ClashEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ClashEffect.java
index 9234835251f..5afd9ce5626 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/ClashEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/ClashEffect.java
@@ -1,5 +1,7 @@
package forge.game.ability.effects;
+import java.util.Map;
+
import forge.game.GameAction;
import forge.game.GameLogEntryType;
import forge.game.ability.AbilityKey;
@@ -14,8 +16,6 @@ import forge.game.zone.PlayerZone;
import forge.game.zone.ZoneType;
import forge.util.Localizer;
-import java.util.Map;
-
public class ClashEffect extends SpellAbilityEffect {
/* (non-Javadoc)
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..eaae7e1bb70 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
@@ -1,22 +1,25 @@
package forge.game.ability.effects;
-import forge.GameCommand;
-import forge.game.Game;
-import forge.game.ability.AbilityUtils;
-import forge.game.ability.SpellAbilityEffect;
-import forge.game.card.*;
-import forge.game.event.GameEventCardStatsChanged;
-import forge.game.player.Player;
-import forge.game.spellability.SpellAbility;
-import forge.game.zone.ZoneType;
-import forge.util.Localizer;
-import forge.util.CardTranslation;
-
import java.util.Arrays;
import java.util.List;
import com.google.common.collect.Lists;
+import forge.GameCommand;
+import forge.game.Game;
+import forge.game.ability.AbilityUtils;
+import forge.game.ability.SpellAbilityEffect;
+import forge.game.card.Card;
+import forge.game.card.CardCollection;
+import forge.game.card.CardFactory;
+import forge.game.card.CardLists;
+import forge.game.event.GameEventCardStatsChanged;
+import forge.game.player.Player;
+import forge.game.spellability.SpellAbility;
+import forge.game.zone.ZoneType;
+import forge.util.CardTranslation;
+import forge.util.Localizer;
+
public class CloneEffect extends SpellAbilityEffect {
// TODO update this method
@@ -81,7 +84,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/ControlExchangeEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ControlExchangeEffect.java
index 7a2daa09be0..0a155df9bf1 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/ControlExchangeEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/ControlExchangeEffect.java
@@ -1,5 +1,7 @@
package forge.game.ability.effects;
+import java.util.List;
+
import com.google.common.collect.Lists;
import forge.game.Game;
@@ -11,8 +13,6 @@ import forge.game.spellability.SpellAbility;
import forge.util.CardTranslation;
import forge.util.Localizer;
-import java.util.List;
-
public class ControlExchangeEffect extends SpellAbilityEffect {
diff --git a/forge-game/src/main/java/forge/game/ability/effects/ControlExchangeVariantEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ControlExchangeVariantEffect.java
index 92db1453cb4..898354f047b 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/ControlExchangeVariantEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/ControlExchangeVariantEffect.java
@@ -1,5 +1,9 @@
package forge.game.ability.effects;
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
@@ -9,10 +13,6 @@ import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
import forge.util.Localizer;
-import java.util.List;
-
-import org.apache.commons.lang3.StringUtils;
-
public class ControlExchangeVariantEffect extends SpellAbilityEffect {
@Override
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/ControlPlayerEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ControlPlayerEffect.java
index 443d3d8bfa2..4dbc08e0870 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/ControlPlayerEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/ControlPlayerEffect.java
@@ -1,5 +1,7 @@
package forge.game.ability.effects;
+import java.util.List;
+
import forge.GameCommand;
import forge.game.Game;
import forge.game.ability.SpellAbilityEffect;
@@ -8,8 +10,6 @@ import forge.game.spellability.SpellAbility;
import forge.util.Lang;
import forge.util.TextUtil;
-import java.util.List;
-
/**
* TODO: Write javadoc for this type.
*
diff --git a/forge-game/src/main/java/forge/game/ability/effects/ControlSpellEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ControlSpellEffect.java
index 70e723b15d1..e1aba6911bb 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/ControlSpellEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/ControlSpellEffect.java
@@ -1,6 +1,9 @@
package forge.game.ability.effects;
+import java.util.List;
+
import com.google.common.collect.Iterables;
+
import forge.game.Game;
import forge.game.GameObject;
import forge.game.ability.SpellAbilityEffect;
@@ -10,8 +13,6 @@ import forge.game.spellability.SpellAbility;
import forge.game.spellability.SpellAbilityStackInstance;
import forge.game.zone.ZoneType;
-import java.util.List;
-
public class ControlSpellEffect extends SpellAbilityEffect {
/* (non-Javadoc)
* @see forge.card.abilityfactory.SpellEffect#getStackDescription(java.util.Map, forge.card.spellability.SpellAbility)
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..7962c91f45f 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
@@ -1,5 +1,10 @@
package forge.game.ability.effects;
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.mutable.MutableBoolean;
+
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Iterables;
@@ -22,15 +27,10 @@ import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
import forge.item.PaperCard;
import forge.util.Aggregates;
+import forge.util.Localizer;
+import forge.util.PredicateString.StringOp;
import forge.util.TextUtil;
import forge.util.collect.FCollectionView;
-import forge.util.PredicateString.StringOp;
-import forge.util.Localizer;
-
-import org.apache.commons.lang3.StringUtils;
-import org.apache.commons.lang3.mutable.MutableBoolean;
-
-import java.util.List;
public class CopyPermanentEffect extends TokenEffectBase {
@@ -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/CopySpellAbilityEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CopySpellAbilityEffect.java
index 50a18e79e60..a2915a8e839 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/CopySpellAbilityEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/CopySpellAbilityEffect.java
@@ -1,5 +1,9 @@
package forge.game.ability.effects;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
@@ -17,12 +21,8 @@ import forge.game.player.Player;
import forge.game.replacement.ReplacementType;
import forge.game.spellability.AbilitySub;
import forge.game.spellability.SpellAbility;
-import forge.util.Localizer;
import forge.util.CardTranslation;
-
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
+import forge.util.Localizer;
public class CopySpellAbilityEffect extends SpellAbilityEffect {
diff --git a/forge-game/src/main/java/forge/game/ability/effects/CounterEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CounterEffect.java
index d7f06a689a1..3999c0a81be 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/CounterEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/CounterEffect.java
@@ -1,5 +1,11 @@
package forge.game.ability.effects;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+import com.google.common.collect.Lists;
+
import forge.game.Game;
import forge.game.GameLogEntryType;
import forge.game.ability.AbilityKey;
@@ -14,12 +20,6 @@ import forge.game.spellability.SpellPermanent;
import forge.game.trigger.TriggerType;
import forge.util.Localizer;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-
-import com.google.common.collect.Lists;
-
public class CounterEffect extends SpellAbilityEffect {
@Override
protected String getStackDescription(SpellAbility sa) {
diff --git a/forge-game/src/main/java/forge/game/ability/effects/CountersMoveEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CountersMoveEffect.java
index 598fc58446e..b015016a439 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/CountersMoveEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/CountersMoveEffect.java
@@ -1,5 +1,11 @@
package forge.game.ability.effects;
+import java.util.List;
+import java.util.Map;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+
import forge.game.Game;
import forge.game.GameEntityCounterTable;
import forge.game.ability.AbilityUtils;
@@ -13,14 +19,8 @@ import forge.game.player.Player;
import forge.game.player.PlayerController;
import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
-import forge.util.Localizer;
import forge.util.CardTranslation;
-
-import java.util.List;
-import java.util.Map;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
+import forge.util.Localizer;
import forge.util.TextUtil;
public class CountersMoveEffect extends SpellAbilityEffect {
diff --git a/forge-game/src/main/java/forge/game/ability/effects/CountersProliferateEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CountersProliferateEffect.java
index fd81398e5e9..0ae32240416 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/CountersProliferateEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/CountersProliferateEffect.java
@@ -1,5 +1,7 @@
package forge.game.ability.effects;
+import java.util.List;
+
import forge.game.Game;
import forge.game.GameEntity;
import forge.game.GameEntityCounterTable;
@@ -13,10 +15,8 @@ import forge.game.player.PlayerController;
import forge.game.player.PlayerPredicates;
import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
-import forge.util.collect.FCollection;
import forge.util.Localizer;
-
-import java.util.List;
+import forge.util.collect.FCollection;
public class CountersProliferateEffect extends SpellAbilityEffect {
@Override
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/CountersPutEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java
index d050796c13f..dd2374a8976 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java
@@ -1,5 +1,11 @@
package forge.game.ability.effects;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
@@ -18,10 +24,10 @@ import forge.game.card.CardCollection;
import forge.game.card.CardFactoryUtil;
import forge.game.card.CardLists;
import forge.game.card.CardPredicates;
+import forge.game.card.CardPredicates.Presets;
import forge.game.card.CardUtil;
import forge.game.card.CounterEnumType;
import forge.game.card.CounterType;
-import forge.game.card.CardPredicates.Presets;
import forge.game.player.Player;
import forge.game.player.PlayerActionConfirmMode;
import forge.game.player.PlayerController;
@@ -32,14 +38,8 @@ import forge.game.trigger.TriggerType;
import forge.game.zone.Zone;
import forge.game.zone.ZoneType;
import forge.util.Aggregates;
-import forge.util.Localizer;
import forge.util.CardTranslation;
-
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
+import forge.util.Localizer;
public class CountersPutEffect extends SpellAbilityEffect {
@Override
diff --git a/forge-game/src/main/java/forge/game/ability/effects/CountersPutOrRemoveEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CountersPutOrRemoveEffect.java
index 14298c46617..7490946e2c9 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/CountersPutOrRemoveEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/CountersPutOrRemoveEffect.java
@@ -1,5 +1,11 @@
package forge.game.ability.effects;
+import java.util.List;
+import java.util.Map;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+
import forge.game.Game;
import forge.game.GameEntityCounterTable;
import forge.game.ability.AbilityUtils;
@@ -15,12 +21,6 @@ import forge.game.zone.ZoneType;
import forge.util.Lang;
import forge.util.Localizer;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-
-import java.util.List;
-import java.util.Map;
-
/**
* API for adding to or subtracting from existing counters on a target.
*
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..b188effd7d7 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
@@ -1,5 +1,9 @@
package forge.game.ability.effects;
+import java.util.Map;
+
+import com.google.common.collect.Lists;
+
import forge.game.Game;
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
@@ -11,10 +15,6 @@ import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
-import java.util.Map;
-
-import com.google.common.collect.Lists;
-
public class CountersRemoveAllEffect extends SpellAbilityEffect {
@Override
protected String getStackDescription(SpellAbility sa) {
@@ -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/CountersRemoveEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CountersRemoveEffect.java
index 384f4e16376..2557a6ff31b 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/CountersRemoveEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/CountersRemoveEffect.java
@@ -1,5 +1,13 @@
package forge.game.ability.effects;
+import java.util.Map;
+
+import org.apache.commons.lang3.tuple.Pair;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+
import forge.game.Game;
import forge.game.GameEntity;
import forge.game.ability.AbilityUtils;
@@ -15,14 +23,6 @@ import forge.game.zone.Zone;
import forge.game.zone.ZoneType;
import forge.util.Localizer;
-import java.util.Map;
-
-import org.apache.commons.lang3.tuple.Pair;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-
public class CountersRemoveEffect extends SpellAbilityEffect {
@Override
protected String getStackDescription(SpellAbility sa) {
diff --git a/forge-game/src/main/java/forge/game/ability/effects/DamageAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DamageAllEffect.java
index a4e8e6c1217..feab590d460 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/DamageAllEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/DamageAllEffect.java
@@ -1,5 +1,7 @@
package forge.game.ability.effects;
+import java.util.List;
+
import forge.game.Game;
import forge.game.GameEntity;
import forge.game.GameEntityCounterTable;
@@ -13,8 +15,6 @@ import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
-import java.util.List;
-
public class DamageAllEffect extends DamageBaseEffect {
/* (non-Javadoc)
* @see forge.game.ability.SpellAbilityEffect#getStackDescription(forge.game.spellability.SpellAbility)
diff --git a/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java
index 5b9e0542f5e..b8a4a379273 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java
@@ -1,5 +1,9 @@
package forge.game.ability.effects;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
@@ -21,10 +25,6 @@ import forge.game.spellability.SpellAbility;
import forge.util.Lang;
import forge.util.Localizer;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-
public class DamageDealEffect extends DamageBaseEffect {
/* (non-Javadoc)
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..4dd49bb9c1b 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
@@ -1,5 +1,7 @@
package forge.game.ability.effects;
+import java.util.List;
+
import forge.game.Game;
import forge.game.GameEntityCounterTable;
import forge.game.GameObject;
@@ -13,8 +15,6 @@ import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
import forge.util.collect.FCollectionView;
-import java.util.List;
-
public class DamageEachEffect extends DamageBaseEffect {
/* (non-Javadoc)
@@ -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/DebuffEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DebuffEffect.java
index 2595c792dec..1c200511f52 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/DebuffEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/DebuffEffect.java
@@ -1,13 +1,5 @@
package forge.game.ability.effects;
-import forge.GameCommand;
-import forge.card.MagicColor;
-import forge.game.Game;
-import forge.game.ability.SpellAbilityEffect;
-import forge.game.card.Card;
-import forge.game.keyword.KeywordInterface;
-import forge.game.spellability.SpellAbility;
-
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
@@ -16,6 +8,14 @@ import org.apache.commons.lang3.StringUtils;
import com.google.common.collect.Lists;
+import forge.GameCommand;
+import forge.card.MagicColor;
+import forge.game.Game;
+import forge.game.ability.SpellAbilityEffect;
+import forge.game.card.Card;
+import forge.game.keyword.KeywordInterface;
+import forge.game.spellability.SpellAbility;
+
public class DebuffEffect extends SpellAbilityEffect {
@Override
diff --git a/forge-game/src/main/java/forge/game/ability/effects/DeclareCombatantsEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DeclareCombatantsEffect.java
index 36e1f1b0a12..643aa89b5d8 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/DeclareCombatantsEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/DeclareCombatantsEffect.java
@@ -1,5 +1,7 @@
package forge.game.ability.effects;
+import java.util.List;
+
import forge.GameCommand;
import forge.game.ability.SpellAbilityEffect;
import forge.game.phase.PhaseHandler;
@@ -8,8 +10,6 @@ import forge.game.spellability.SpellAbility;
import forge.util.Lang;
import forge.util.TextUtil;
-import java.util.List;
-
public class DeclareCombatantsEffect extends SpellAbilityEffect {
@Override
diff --git a/forge-game/src/main/java/forge/game/ability/effects/DelayedTriggerEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DelayedTriggerEffect.java
index bb2e7afc4d4..f094cb53eb0 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/DelayedTriggerEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/DelayedTriggerEffect.java
@@ -1,5 +1,7 @@
package forge.game.ability.effects;
+import java.util.Map;
+
import com.google.common.collect.Iterables;
import com.google.common.collect.Maps;
@@ -15,8 +17,6 @@ import forge.game.spellability.SpellAbility;
import forge.game.trigger.Trigger;
import forge.game.trigger.TriggerHandler;
-import java.util.Map;
-
public class DelayedTriggerEffect extends SpellAbilityEffect {
/* (non-Javadoc)
diff --git a/forge-game/src/main/java/forge/game/ability/effects/DestroyEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DestroyEffect.java
index dba2774c908..b3a736e563a 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/DestroyEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/DestroyEffect.java
@@ -1,5 +1,11 @@
package forge.game.ability.effects;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import com.google.common.collect.Maps;
+
import forge.game.Game;
import forge.game.GameActionUtil;
import forge.game.ability.SpellAbilityEffect;
@@ -10,12 +16,6 @@ import forge.game.card.CardZoneTable;
import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import com.google.common.collect.Maps;
-
public class DestroyEffect extends SpellAbilityEffect {
@Override
protected String getStackDescription(SpellAbility sa) {
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..aad8132e603 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
@@ -1,5 +1,9 @@
package forge.game.ability.effects;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
import forge.card.MagicColor;
import forge.game.Game;
import forge.game.GameActionUtil;
@@ -21,13 +25,11 @@ import forge.game.spellability.SpellAbility;
import forge.game.spellability.TargetRestrictions;
import forge.game.zone.PlayerZone;
import forge.game.zone.ZoneType;
+import forge.util.CardTranslation;
import forge.util.Lang;
+import forge.util.Localizer;
import forge.util.TextUtil;
import forge.util.collect.FCollectionView;
-import forge.util.Localizer;
-import forge.util.CardTranslation;
-
-import java.util.*;
public class DigEffect extends SpellAbilityEffect {
@@ -135,7 +137,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/DigUntilEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DigUntilEffect.java
index 9f31cf91ffe..cfabeb4834d 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/DigUntilEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/DigUntilEffect.java
@@ -1,5 +1,8 @@
package forge.game.ability.effects;
+import java.util.Collections;
+import java.util.Iterator;
+
import forge.game.Game;
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
@@ -11,10 +14,8 @@ import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.zone.PlayerZone;
import forge.game.zone.ZoneType;
-import forge.util.MyRandom;
import forge.util.Localizer;
-
-import java.util.*;
+import forge.util.MyRandom;
public class DigUntilEffect extends SpellAbilityEffect {
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..77f4696e88a 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
@@ -1,29 +1,32 @@
package forge.game.ability.effects;
+import java.util.List;
+import java.util.Map;
+
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+
import forge.game.Game;
import forge.game.GameActionUtil;
import forge.game.ability.AbilityKey;
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
-import forge.game.card.*;
+import forge.game.card.Card;
+import forge.game.card.CardCollection;
+import forge.game.card.CardCollectionView;
+import forge.game.card.CardLists;
import forge.game.card.CardPredicates.Presets;
+import forge.game.card.CardZoneTable;
import forge.game.player.Player;
import forge.game.player.PlayerActionConfirmMode;
import forge.game.player.PlayerPredicates;
import forge.game.spellability.SpellAbility;
import forge.game.trigger.TriggerType;
import forge.game.zone.ZoneType;
-
-import forge.util.Lang;
import forge.util.Aggregates;
-import forge.util.TextUtil;
+import forge.util.Lang;
import forge.util.Localizer;
-
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-
-import java.util.List;
-import java.util.Map;
+import forge.util.TextUtil;
public class DiscardEffect extends SpellAbilityEffect {
@@ -179,7 +182,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 +210,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/DrainManaEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DrainManaEffect.java
index 873a8fab135..8b22962918e 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/DrainManaEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/DrainManaEffect.java
@@ -1,16 +1,16 @@
package forge.game.ability.effects;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+
import forge.game.ability.SpellAbilityEffect;
import forge.game.mana.Mana;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.spellability.TargetRestrictions;
-import org.apache.commons.lang3.StringUtils;
-
-import java.util.ArrayList;
-import java.util.List;
-
public class DrainManaEffect extends SpellAbilityEffect {
@Override
protected String getStackDescription(SpellAbility sa) {
diff --git a/forge-game/src/main/java/forge/game/ability/effects/DrawEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DrawEffect.java
index f5d918af8c2..9e30ded533f 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/DrawEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/DrawEffect.java
@@ -1,5 +1,7 @@
package forge.game.ability.effects;
+import java.util.List;
+
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
@@ -10,8 +12,6 @@ import forge.game.spellability.TargetRestrictions;
import forge.util.Lang;
import forge.util.Localizer;
-import java.util.List;
-
public class DrawEffect extends SpellAbilityEffect {
@Override
protected String getStackDescription(SpellAbility sa) {
diff --git a/forge-game/src/main/java/forge/game/ability/effects/EffectEffect.java b/forge-game/src/main/java/forge/game/ability/effects/EffectEffect.java
index 0d2e57507f2..308971adf7a 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/EffectEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/EffectEffect.java
@@ -1,5 +1,12 @@
package forge.game.ability.effects;
+import java.util.EnumSet;
+import java.util.List;
+import java.util.Map;
+
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+
import forge.GameCommand;
import forge.ImageKeys;
import forge.game.Game;
@@ -21,13 +28,6 @@ import forge.game.trigger.Trigger;
import forge.game.trigger.TriggerHandler;
import forge.game.trigger.TriggerType;
import forge.game.zone.ZoneType;
-
-import java.util.EnumSet;
-import java.util.List;
-import java.util.Map;
-
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
import forge.util.TextUtil;
import forge.util.collect.FCollection;
diff --git a/forge-game/src/main/java/forge/game/ability/effects/EncodeEffect.java b/forge-game/src/main/java/forge/game/ability/effects/EncodeEffect.java
index fce3d683d35..8d2104b8411 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/EncodeEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/EncodeEffect.java
@@ -8,8 +8,8 @@ import forge.game.card.CardCollectionView;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
-import forge.util.Localizer;
import forge.util.CardTranslation;
+import forge.util.Localizer;
public class EncodeEffect extends SpellAbilityEffect {
@Override
diff --git a/forge-game/src/main/java/forge/game/ability/effects/EndTurnEffect.java b/forge-game/src/main/java/forge/game/ability/effects/EndTurnEffect.java
index 3e0fb1f391f..882270f1f46 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/EndTurnEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/EndTurnEffect.java
@@ -1,6 +1,8 @@
package forge.game.ability.effects;
+import java.util.List;
+
import com.google.common.collect.Lists;
import forge.game.Game;
@@ -10,8 +12,6 @@ import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.util.Localizer;
-import java.util.List;
-
public class EndTurnEffect extends SpellAbilityEffect {
// *************************************************************************
diff --git a/forge-game/src/main/java/forge/game/ability/effects/ExploreEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ExploreEffect.java
index fb46dbbc2b4..353b41d25a3 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/ExploreEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/ExploreEffect.java
@@ -1,6 +1,9 @@
package forge.game.ability.effects;
+import java.util.List;
+
import com.google.common.collect.Lists;
+
import forge.game.Game;
import forge.game.GameEntityCounterTable;
import forge.game.ability.AbilityKey;
@@ -17,8 +20,6 @@ import forge.game.zone.ZoneType;
import forge.util.Lang;
import forge.util.Localizer;
-import java.util.List;
-
public class ExploreEffect extends SpellAbilityEffect {
/* (non-Javadoc)
diff --git a/forge-game/src/main/java/forge/game/ability/effects/FightEffect.java b/forge-game/src/main/java/forge/game/ability/effects/FightEffect.java
index bd3c1e7d3ae..6cda89e1cfb 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/FightEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/FightEffect.java
@@ -1,5 +1,8 @@
package forge.game.ability.effects;
+import java.util.List;
+import java.util.Map;
+
import com.google.common.collect.Lists;
import forge.game.Game;
@@ -12,11 +15,8 @@ import forge.game.player.Player;
import forge.game.replacement.ReplacementType;
import forge.game.spellability.SpellAbility;
import forge.game.trigger.TriggerType;
-import forge.util.Localizer;
import forge.util.CardTranslation;
-
-import java.util.List;
-import java.util.Map;
+import forge.util.Localizer;
public class FightEffect extends DamageBaseEffect {
diff --git a/forge-game/src/main/java/forge/game/ability/effects/FlipCoinEffect.java b/forge-game/src/main/java/forge/game/ability/effects/FlipCoinEffect.java
index 9da08f5d7f5..0dc54e056d0 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/FlipCoinEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/FlipCoinEffect.java
@@ -1,5 +1,10 @@
package forge.game.ability.effects;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
import forge.game.GameObject;
import forge.game.ability.AbilityKey;
import forge.game.ability.AbilityUtils;
@@ -11,13 +16,8 @@ import forge.game.player.PlayerController;
import forge.game.spellability.AbilitySub;
import forge.game.spellability.SpellAbility;
import forge.game.trigger.TriggerType;
-import forge.util.MyRandom;
import forge.util.Localizer;
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import forge.util.MyRandom;
public class FlipCoinEffect extends SpellAbilityEffect {
diff --git a/forge-game/src/main/java/forge/game/ability/effects/GameLossEffect.java b/forge-game/src/main/java/forge/game/ability/effects/GameLossEffect.java
index 587aade5e80..4b6960e6b2c 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/GameLossEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/GameLossEffect.java
@@ -1,13 +1,13 @@
package forge.game.ability.effects;
+import java.util.List;
+
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
import forge.game.player.GameLossReason;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
-import java.util.List;
-
public class GameLossEffect extends SpellAbilityEffect {
/* (non-Javadoc)
diff --git a/forge-game/src/main/java/forge/game/ability/effects/ImmediateTriggerEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ImmediateTriggerEffect.java
index b44158828dd..d2d891385c3 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/ImmediateTriggerEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/ImmediateTriggerEffect.java
@@ -1,5 +1,7 @@
package forge.game.ability.effects;
+import java.util.Map;
+
import com.google.common.collect.Maps;
import forge.game.Game;
@@ -13,8 +15,6 @@ import forge.game.trigger.Trigger;
import forge.game.trigger.TriggerHandler;
import forge.game.trigger.TriggerType;
-import java.util.Map;
-
public class ImmediateTriggerEffect extends SpellAbilityEffect {
/* (non-Javadoc)
diff --git a/forge-game/src/main/java/forge/game/ability/effects/LifeExchangeEffect.java b/forge-game/src/main/java/forge/game/ability/effects/LifeExchangeEffect.java
index f68a400a365..181125d1d1d 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/LifeExchangeEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/LifeExchangeEffect.java
@@ -1,12 +1,12 @@
package forge.game.ability.effects;
+import java.util.List;
+
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
-import java.util.List;
-
public class LifeExchangeEffect extends SpellAbilityEffect {
// *************************************************************************
diff --git a/forge-game/src/main/java/forge/game/ability/effects/LifeExchangeVariantEffect.java b/forge-game/src/main/java/forge/game/ability/effects/LifeExchangeVariantEffect.java
index beeafe366f6..e6180386f37 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/LifeExchangeVariantEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/LifeExchangeVariantEffect.java
@@ -1,5 +1,7 @@
package forge.game.ability.effects;
+import java.util.List;
+
import forge.game.Game;
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
@@ -8,8 +10,6 @@ import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
-import java.util.List;
-
public class LifeExchangeVariantEffect extends SpellAbilityEffect {
// *************************************************************************
diff --git a/forge-game/src/main/java/forge/game/ability/effects/LifeGainEffect.java b/forge-game/src/main/java/forge/game/ability/effects/LifeGainEffect.java
index 780a7f04838..457a92f8b74 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/LifeGainEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/LifeGainEffect.java
@@ -1,14 +1,14 @@
package forge.game.ability.effects;
+import java.util.List;
+
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.util.Lang;
-import java.util.List;
-
public class LifeGainEffect extends SpellAbilityEffect {
/* (non-Javadoc)
diff --git a/forge-game/src/main/java/forge/game/ability/effects/LifeSetEffect.java b/forge-game/src/main/java/forge/game/ability/effects/LifeSetEffect.java
index a58f214fa07..3c44569919e 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/LifeSetEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/LifeSetEffect.java
@@ -1,5 +1,8 @@
package forge.game.ability.effects;
+import java.util.ArrayList;
+import java.util.List;
+
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
import forge.game.player.Player;
@@ -7,9 +10,6 @@ import forge.game.spellability.SpellAbility;
import forge.game.spellability.TargetRestrictions;
import forge.util.Localizer;
-import java.util.ArrayList;
-import java.util.List;
-
public class LifeSetEffect extends SpellAbilityEffect {
/* (non-Javadoc)
diff --git a/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java
index a39274131d2..e63f3f8d6a7 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java
@@ -1,5 +1,11 @@
package forge.game.ability.effects;
+import static forge.util.TextUtil.toManaString;
+
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+
import forge.card.ColorSet;
import forge.card.MagicColor;
import forge.card.mana.ManaAtom;
@@ -18,12 +24,6 @@ import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
import forge.util.Localizer;
-import org.apache.commons.lang3.StringUtils;
-
-import java.util.List;
-
-import static forge.util.TextUtil.toManaString;
-
public class ManaEffect extends SpellAbilityEffect {
@Override
diff --git a/forge-game/src/main/java/forge/game/ability/effects/ManaReflectedEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ManaReflectedEffect.java
index bdf69fbd81f..d211839b692 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/ManaReflectedEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/ManaReflectedEffect.java
@@ -1,5 +1,9 @@
package forge.game.ability.effects;
+import java.util.Collection;
+
+import org.apache.commons.lang3.StringUtils;
+
import forge.card.ColorSet;
import forge.card.MagicColor;
import forge.game.ability.AbilityUtils;
@@ -10,10 +14,6 @@ import forge.game.spellability.AbilityManaPart;
import forge.game.spellability.SpellAbility;
import forge.util.Localizer;
-import java.util.Collection;
-
-import org.apache.commons.lang3.StringUtils;
-
public class ManaReflectedEffect extends SpellAbilityEffect {
/* (non-Javadoc)
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/MillEffect.java b/forge-game/src/main/java/forge/game/ability/effects/MillEffect.java
index 7806099a99c..0ec6e676bba 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/MillEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/MillEffect.java
@@ -10,10 +10,9 @@ import forge.game.card.CardZoneTable;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
-
import forge.util.Lang;
-import forge.util.TextUtil;
import forge.util.Localizer;
+import forge.util.TextUtil;
public class MillEffect extends SpellAbilityEffect {
@Override
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..2c80b33e8a6 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
@@ -1,8 +1,13 @@
package forge.game.ability.effects;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
+
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
@@ -17,10 +22,6 @@ import forge.game.zone.ZoneType;
import forge.util.Aggregates;
import forge.util.Localizer;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-
public class MultiplePilesEffect extends SpellAbilityEffect {
/* (non-Javadoc)
@@ -80,7 +81,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/MustAttackEffect.java b/forge-game/src/main/java/forge/game/ability/effects/MustAttackEffect.java
index cd8b973ba6b..d59c7b4d553 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/MustAttackEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/MustAttackEffect.java
@@ -1,5 +1,7 @@
package forge.game.ability.effects;
+import java.util.List;
+
import forge.game.GameEntity;
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
@@ -10,8 +12,6 @@ import forge.game.player.PlayerCollection;
import forge.game.spellability.SpellAbility;
import forge.game.spellability.TargetRestrictions;
-import java.util.List;
-
public class MustAttackEffect extends SpellAbilityEffect {
/* (non-Javadoc)
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..0b82ce47491 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
@@ -1,5 +1,11 @@
package forge.game.ability.effects;
+import java.util.List;
+import java.util.Map;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+
import forge.game.Game;
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
@@ -11,12 +17,6 @@ import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
import forge.util.Localizer;
-import java.util.List;
-import java.util.Map;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-
public class MustBlockEffect extends SpellAbilityEffect {
@Override
@@ -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/MutateEffect.java b/forge-game/src/main/java/forge/game/ability/effects/MutateEffect.java
index ad8b7b92a6d..f8f7d078f5b 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/MutateEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/MutateEffect.java
@@ -1,6 +1,7 @@
package forge.game.ability.effects;
-import java.util.*;
+import java.util.HashMap;
+import java.util.List;
import com.google.common.collect.Lists;
@@ -9,7 +10,11 @@ import forge.game.Game;
import forge.game.GameObject;
import forge.game.ability.AbilityKey;
import forge.game.ability.SpellAbilityEffect;
-import forge.game.card.*;
+import forge.game.card.Card;
+import forge.game.card.CardCloneStates;
+import forge.game.card.CardCollection;
+import forge.game.card.CardCollectionView;
+import forge.game.card.CardFactory;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.trigger.TriggerType;
diff --git a/forge-game/src/main/java/forge/game/ability/effects/OwnershipGainEffect.java b/forge-game/src/main/java/forge/game/ability/effects/OwnershipGainEffect.java
index dfe384aeee2..2ef16e1a163 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/OwnershipGainEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/OwnershipGainEffect.java
@@ -1,12 +1,12 @@
package forge.game.ability.effects;
+import java.util.List;
+
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
-import java.util.List;
-
public class OwnershipGainEffect extends SpellAbilityEffect {
@Override
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..bcba6217b5a 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
@@ -1,5 +1,10 @@
package forge.game.ability.effects;
+import java.util.List;
+import java.util.Map;
+
+import com.google.common.collect.Maps;
+
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
@@ -11,13 +16,8 @@ import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.zone.PlayerZone;
import forge.game.zone.ZoneType;
-import forge.util.Localizer;
import forge.util.CardTranslation;
-
-import java.util.List;
-import java.util.Map;
-
-import com.google.common.collect.Maps;
+import forge.util.Localizer;
/**
* PeeakAndReveal is a simplified why of handling something that could
@@ -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/PhasesEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PhasesEffect.java
index 0e2ffc2b249..cc4bc385c12 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/PhasesEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/PhasesEffect.java
@@ -1,5 +1,9 @@
package forge.game.ability.effects;
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+
import forge.game.Game;
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
@@ -8,10 +12,6 @@ import forge.game.card.CardCollectionView;
import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
-import org.apache.commons.lang3.StringUtils;
-
-import java.util.List;
-
public class PhasesEffect extends SpellAbilityEffect {
// ******************************************
diff --git a/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java
index 8ffd2c9fd7c..7b2fd9522d7 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java
@@ -34,9 +34,9 @@ import forge.game.zone.Zone;
import forge.game.zone.ZoneType;
import forge.item.PaperCard;
import forge.util.Aggregates;
+import forge.util.CardTranslation;
import forge.util.Lang;
import forge.util.Localizer;
-import forge.util.CardTranslation;
public class PlayEffect extends SpellAbilityEffect {
@Override
diff --git a/forge-game/src/main/java/forge/game/ability/effects/PlayLandVariantEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PlayLandVariantEffect.java
index 89a522c63e5..d777629802e 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/PlayLandVariantEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/PlayLandVariantEffect.java
@@ -1,9 +1,12 @@
package forge.game.ability.effects;
+import java.util.List;
+
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
+
import forge.StaticData;
import forge.card.CardRulesPredicates;
import forge.card.ColorSet;
@@ -22,8 +25,6 @@ import forge.game.zone.ZoneType;
import forge.item.PaperCard;
import forge.util.Aggregates;
-import java.util.List;
-
public class PlayLandVariantEffect extends SpellAbilityEffect {
@Override
diff --git a/forge-game/src/main/java/forge/game/ability/effects/PoisonEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PoisonEffect.java
index a5baf906e78..d8502b8f679 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/PoisonEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/PoisonEffect.java
@@ -1,5 +1,7 @@
package forge.game.ability.effects;
+import java.util.List;
+
import forge.game.Game;
import forge.game.GameEntityCounterTable;
import forge.game.ability.AbilityUtils;
@@ -10,8 +12,6 @@ import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.util.Lang;
-import java.util.List;
-
/**
* TODO: Write javadoc for this type.
*
diff --git a/forge-game/src/main/java/forge/game/ability/effects/PowerExchangeEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PowerExchangeEffect.java
index 5b13d75feae..061c1a55190 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/PowerExchangeEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/PowerExchangeEffect.java
@@ -1,5 +1,7 @@
package forge.game.ability.effects;
+import java.util.List;
+
import forge.GameCommand;
import forge.game.Game;
import forge.game.ability.SpellAbilityEffect;
@@ -7,8 +9,6 @@ import forge.game.card.Card;
import forge.game.event.GameEventCardStatsChanged;
import forge.game.spellability.SpellAbility;
-import java.util.List;
-
public class PowerExchangeEffect extends SpellAbilityEffect {
/* (non-Javadoc)
* @see forge.card.abilityfactory.AbilityFactoryAlterLife.SpellEffect#getStackDescription(java.util.Map, forge.card.spellability.SpellAbility)
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..a92a7bd3dff 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
@@ -1,7 +1,11 @@
package forge.game.ability.effects;
+import java.util.ArrayList;
+import java.util.List;
+
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
+
import forge.GameCommand;
import forge.card.ColorSet;
import forge.card.MagicColor;
@@ -16,11 +20,8 @@ import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
import forge.util.Lang;
-import forge.util.TextUtil;
import forge.util.Localizer;
-
-import java.util.ArrayList;
-import java.util.List;
+import forge.util.TextUtil;
public class ProtectAllEffect extends SpellAbilityEffect {
@@ -87,7 +88,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/ProtectEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ProtectEffect.java
index be1e21a78ca..631ecf9e533 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/ProtectEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/ProtectEffect.java
@@ -1,6 +1,12 @@
package forge.game.ability.effects;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+
import com.google.common.collect.Lists;
+
import forge.GameCommand;
import forge.card.MagicColor;
import forge.game.Game;
@@ -11,13 +17,8 @@ import forge.game.card.CardUtil;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.util.Lang;
-import forge.util.TextUtil;
import forge.util.Localizer;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
+import forge.util.TextUtil;
public class ProtectEffect extends SpellAbilityEffect {
diff --git a/forge-game/src/main/java/forge/game/ability/effects/PumpAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PumpAllEffect.java
index 46cef1e27f7..b612e223132 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/PumpAllEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/PumpAllEffect.java
@@ -1,5 +1,11 @@
package forge.game.ability.effects;
+import java.util.Arrays;
+import java.util.List;
+
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+
import forge.GameCommand;
import forge.game.Game;
import forge.game.ability.AbilityUtils;
@@ -13,12 +19,6 @@ import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
import forge.util.TextUtil;
-import java.util.Arrays;
-import java.util.List;
-
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-
public class PumpAllEffect extends SpellAbilityEffect {
private static void applyPumpAll(final SpellAbility sa,
final Iterable list, final int a, final int d,
diff --git a/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java
index 91de2d26dd1..8865030ae4e 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java
@@ -1,8 +1,14 @@
package forge.game.ability.effects;
+import java.util.Arrays;
+import java.util.List;
+
import com.google.common.base.Function;
import com.google.common.base.Predicate;
+import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+
import forge.GameCommand;
import forge.card.CardType;
import forge.game.Game;
@@ -11,6 +17,7 @@ import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
import forge.game.card.CardCollection;
+import forge.game.card.CardFactoryUtil;
import forge.game.card.CardUtil;
import forge.game.event.GameEventCardStatsChanged;
import forge.game.keyword.KeywordInterface;
@@ -21,13 +28,6 @@ import forge.game.zone.ZoneType;
import forge.util.Aggregates;
import forge.util.Lang;
import forge.util.Localizer;
-
-import java.util.Arrays;
-import java.util.List;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
-import forge.game.card.CardFactoryUtil;
import forge.util.TextUtil;
public class PumpEffect extends SpellAbilityEffect {
diff --git a/forge-game/src/main/java/forge/game/ability/effects/RearrangeTopOfLibraryEffect.java b/forge-game/src/main/java/forge/game/ability/effects/RearrangeTopOfLibraryEffect.java
index d2528511d08..73983e2ac82 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/RearrangeTopOfLibraryEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/RearrangeTopOfLibraryEffect.java
@@ -1,5 +1,9 @@
package forge.game.ability.effects;
+import java.util.List;
+
+import com.google.common.collect.Iterables;
+
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
@@ -12,10 +16,6 @@ import forge.game.zone.ZoneType;
import forge.util.Lang;
import forge.util.Localizer;
-import java.util.List;
-
-import com.google.common.collect.Iterables;
-
public class RearrangeTopOfLibraryEffect extends SpellAbilityEffect {
/* (non-Javadoc)
diff --git a/forge-game/src/main/java/forge/game/ability/effects/RegenerateEffect.java b/forge-game/src/main/java/forge/game/ability/effects/RegenerateEffect.java
index 1957cb4f14b..5eca60660f9 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/RegenerateEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/RegenerateEffect.java
@@ -1,11 +1,11 @@
package forge.game.ability.effects;
-import forge.game.card.Card;
-import forge.game.spellability.SpellAbility;
-
import java.util.Iterator;
import java.util.List;
+import forge.game.card.Card;
+import forge.game.spellability.SpellAbility;
+
public class RegenerateEffect extends RegenerateBaseEffect {
/*
diff --git a/forge-game/src/main/java/forge/game/ability/effects/RegenerationEffect.java b/forge-game/src/main/java/forge/game/ability/effects/RegenerationEffect.java
index bd773d5ccbb..7d42e9c5988 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/RegenerationEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/RegenerationEffect.java
@@ -1,5 +1,7 @@
package forge.game.ability.effects;
+import java.util.Map;
+
import forge.game.Game;
import forge.game.ability.AbilityKey;
import forge.game.ability.SpellAbilityEffect;
@@ -8,8 +10,6 @@ import forge.game.event.GameEventCardRegenerated;
import forge.game.spellability.SpellAbility;
import forge.game.trigger.TriggerType;
-import java.util.Map;
-
public class RegenerationEffect extends SpellAbilityEffect {
/*
diff --git a/forge-game/src/main/java/forge/game/ability/effects/RemoveFromCombatEffect.java b/forge-game/src/main/java/forge/game/ability/effects/RemoveFromCombatEffect.java
index 0f778f4dc01..9778b854703 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/RemoveFromCombatEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/RemoveFromCombatEffect.java
@@ -1,5 +1,9 @@
package forge.game.ability.effects;
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+
import forge.game.Game;
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
@@ -9,9 +13,6 @@ import forge.game.combat.Combat;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.spellability.TargetRestrictions;
-import org.apache.commons.lang3.StringUtils;
-
-import java.util.List;
public class RemoveFromCombatEffect extends SpellAbilityEffect {
diff --git a/forge-game/src/main/java/forge/game/ability/effects/ReorderZoneEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ReorderZoneEffect.java
index e236e8d391a..0aec8a69275 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/ReorderZoneEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/ReorderZoneEffect.java
@@ -1,5 +1,8 @@
package forge.game.ability.effects;
+import java.util.Collections;
+import java.util.List;
+
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.CardCollection;
import forge.game.player.Player;
@@ -9,9 +12,6 @@ import forge.game.zone.ZoneType;
import forge.util.Lang;
import forge.util.MyRandom;
-import java.util.Collections;
-import java.util.List;
-
public class ReorderZoneEffect extends SpellAbilityEffect {
@Override
protected String getStackDescription(SpellAbility sa) {
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..ef28ac2d20a 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
@@ -1,12 +1,20 @@
package forge.game.ability.effects;
+import java.util.Collections;
+import java.util.List;
+
import com.google.common.collect.Lists;
+
import forge.GameCommand;
import forge.game.Game;
import forge.game.GameObject;
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
-import forge.game.card.*;
+import forge.game.card.Card;
+import forge.game.card.CardCollectionView;
+import forge.game.card.CardDamageMap;
+import forge.game.card.CardLists;
+import forge.game.card.CardZoneTable;
import forge.game.player.Player;
import forge.game.spellability.AbilitySub;
import forge.game.spellability.SpellAbility;
@@ -14,9 +22,6 @@ import forge.game.spellability.SpellAbilityStackInstance;
import forge.game.zone.ZoneType;
import forge.util.collect.FCollection;
-import java.util.Collections;
-import java.util.List;
-
public class RepeatEachEffect extends SpellAbilityEffect {
/* (non-Javadoc)
@@ -54,7 +59,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 +75,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/ReplaceDamageEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ReplaceDamageEffect.java
index eee8cdfbd0a..51ba01cbbad 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/ReplaceDamageEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/ReplaceDamageEffect.java
@@ -2,11 +2,11 @@ package forge.game.ability.effects;
import java.util.Map;
-import forge.game.ability.AbilityKey;
import org.apache.commons.lang3.StringUtils;
import forge.game.Game;
import forge.game.GameLogEntryType;
+import forge.game.ability.AbilityKey;
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
diff --git a/forge-game/src/main/java/forge/game/ability/effects/ReplaceSplitDamageEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ReplaceSplitDamageEffect.java
index ccf1fa909e5..802e7076ed8 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/ReplaceSplitDamageEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/ReplaceSplitDamageEffect.java
@@ -3,13 +3,13 @@ package forge.game.ability.effects;
import java.util.List;
import java.util.Map;
-import forge.game.ability.AbilityKey;
import org.apache.commons.lang3.StringUtils;
import forge.game.Game;
import forge.game.GameEntity;
import forge.game.GameEntityCounterTable;
import forge.game.GameObject;
+import forge.game.ability.AbilityKey;
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
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..becdd39955b 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
@@ -1,5 +1,9 @@
package forge.game.ability.effects;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
import forge.game.Game;
import forge.game.GameAction;
import forge.game.GameStage;
@@ -8,7 +12,6 @@ import forge.game.card.Card;
import forge.game.card.CardCollection;
import forge.game.card.CardLists;
import forge.game.player.Player;
-import forge.game.player.RegisteredPlayer;
import forge.game.spellability.SpellAbility;
import forge.game.trigger.TriggerHandler;
import forge.game.trigger.TriggerType;
@@ -16,19 +19,12 @@ import forge.game.zone.ZoneType;
import forge.util.TextUtil;
import forge.util.collect.FCollectionView;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
public class RestartGameEffect extends SpellAbilityEffect {
@Override
public void resolve(SpellAbility sa) {
final Player activator = sa.getActivatingPlayer();
final Game game = activator.getGame();
FCollectionView players = game.getPlayers();
- Map> playerLibraries = new HashMap<>();
// Don't grab Ante Zones
List restartZones = new ArrayList<>(Arrays.asList(ZoneType.Battlefield,
@@ -38,11 +34,33 @@ public class RestartGameEffect extends SpellAbilityEffect {
restartZones.remove(leaveZone);
String leaveRestriction = sa.hasParam("RestrictFromValid") ? sa.getParam("RestrictFromValid") : "Card";
- for (Player p : players) {
+ //Card.resetUniqueNumber();
+ // need this code here, otherwise observables fail
+ forge.game.trigger.Trigger.resetIDs();
+ TriggerHandler trigHandler = game.getTriggerHandler();
+ trigHandler.clearDelayedTrigger();
+ trigHandler.suppressMode(TriggerType.ChangesZone);
+ // Avoid Psychic Surgery trigger in new game
+ trigHandler.suppressMode(TriggerType.Shuffled);
+
+ game.getStack().reset();
+ game.clearCounterAddedThisTurn();
+ game.resetPlayersAttackedOnNextTurn();
+ game.resetPlayersAttackedOnNextTurn();
+ GameAction action = game.getAction();
+
+ for (Player p: players) {
+ p.setStartingLife(p.getStartingLife());
+ p.clearCounters();
+ p.resetSpellCastThisGame();
+ p.onCleanupPhase();
+ p.setLandsPlayedLastTurn(0);
+ p.resetCommanderStats();
+
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);
}
@@ -54,42 +72,13 @@ public class RestartGameEffect extends SpellAbilityEffect {
}
}
p.getZone(ZoneType.Command).removeAllCards(true);
-
- playerLibraries.put(p, newLibrary);
- }
-
- //Card.resetUniqueNumber();
- // need this code here, otherwise observables fail
- forge.game.trigger.Trigger.resetIDs();
- TriggerHandler trigHandler = game.getTriggerHandler();
- trigHandler.clearDelayedTrigger();
- trigHandler.suppressMode(TriggerType.ChangesZone);
- // Avoid Psychic Surgery trigger in new game
- trigHandler.suppressMode(TriggerType.Shuffled);
-
- game.getStack().reset();
- GameAction action = game.getAction();
-
- List gamePlayers = game.getRegisteredPlayers();
- for (int i = 0; i < gamePlayers.size(); i++) {
- final Player player = gamePlayers.get(i);
- if (player.hasLost()) { continue; }
-
- RegisteredPlayer psc = game.getMatch().getPlayers().get(i);
-
- player.setStartingLife(psc.getStartingLife());
- player.setPoisonCounters(0, sa.getHostCard());
- player.resetSpellCastThisGame();
- player.onCleanupPhase();
- player.setLandsPlayedLastTurn(0);
-
- List newLibrary = playerLibraries.get(player);
+
for (Card c : newLibrary) {
action.moveToLibrary(c, 0, sa);
}
- player.initVariantsZones(psc);
+ p.initVariantsZones(p.getRegisteredPlayer());
- player.shuffle(null);
+ p.shuffle(null);
}
trigHandler.clearSuppression(TriggerType.Shuffled);
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..733338ab552 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
@@ -1,5 +1,9 @@
package forge.game.ability.effects;
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+
import forge.game.Game;
import forge.game.ability.AbilityKey;
import forge.game.ability.AbilityUtils;
@@ -14,10 +18,6 @@ import forge.game.trigger.TriggerType;
import forge.game.zone.ZoneType;
import forge.util.Aggregates;
-import java.util.List;
-
-import org.apache.commons.lang3.StringUtils;
-
public class RevealEffect extends SpellAbilityEffect {
@Override
@@ -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/RevealHandEffect.java b/forge-game/src/main/java/forge/game/ability/effects/RevealHandEffect.java
index 7da4350c919..df7e6aad4e3 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/RevealHandEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/RevealHandEffect.java
@@ -1,5 +1,7 @@
package forge.game.ability.effects;
+import java.util.List;
+
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.Card;
import forge.game.card.CardCollectionView;
@@ -9,8 +11,6 @@ import forge.game.spellability.TargetRestrictions;
import forge.game.zone.ZoneType;
import forge.util.Localizer;
-import java.util.List;
-
public class RevealHandEffect extends SpellAbilityEffect {
@Override
diff --git a/forge-game/src/main/java/forge/game/ability/effects/RollDiceEffect.java b/forge-game/src/main/java/forge/game/ability/effects/RollDiceEffect.java
index 0380da94df9..ab26ada5ced 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/RollDiceEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/RollDiceEffect.java
@@ -1,5 +1,11 @@
package forge.game.ability.effects;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang3.StringUtils;
+
import forge.game.ability.AbilityKey;
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
@@ -10,11 +16,6 @@ import forge.game.spellability.SpellAbility;
import forge.game.trigger.TriggerType;
import forge.util.Localizer;
import forge.util.MyRandom;
-import org.apache.commons.lang3.StringUtils;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
public class RollDiceEffect extends SpellAbilityEffect {
diff --git a/forge-game/src/main/java/forge/game/ability/effects/SacrificeAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/SacrificeAllEffect.java
index ad63e69fdf2..5fe245a47b5 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/SacrificeAllEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/SacrificeAllEffect.java
@@ -8,7 +8,12 @@ import forge.game.Game;
import forge.game.GameActionUtil;
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
-import forge.game.card.*;
+import forge.game.card.Card;
+import forge.game.card.CardCollection;
+import forge.game.card.CardCollectionView;
+import forge.game.card.CardLists;
+import forge.game.card.CardUtil;
+import forge.game.card.CardZoneTable;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
diff --git a/forge-game/src/main/java/forge/game/ability/effects/SacrificeEffect.java b/forge-game/src/main/java/forge/game/ability/effects/SacrificeEffect.java
index bef5257778b..2bf1e584204 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/SacrificeEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/SacrificeEffect.java
@@ -1,5 +1,12 @@
package forge.game.ability.effects;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.google.common.collect.Maps;
+
import forge.card.mana.ManaCost;
import forge.game.Game;
import forge.game.GameActionUtil;
@@ -7,7 +14,14 @@ import forge.game.GameEntityCounterTable;
import forge.game.ability.AbilityKey;
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
-import forge.game.card.*;
+import forge.game.card.Card;
+import forge.game.card.CardCollection;
+import forge.game.card.CardCollectionView;
+import forge.game.card.CardLists;
+import forge.game.card.CardPredicates;
+import forge.game.card.CardUtil;
+import forge.game.card.CardZoneTable;
+import forge.game.card.CounterEnumType;
import forge.game.cost.Cost;
import forge.game.player.Player;
import forge.game.player.PlayerController.ManaPaymentPurpose;
@@ -16,12 +30,6 @@ import forge.game.trigger.TriggerType;
import forge.game.zone.ZoneType;
import forge.util.Aggregates;
import forge.util.Localizer;
-import org.apache.commons.lang3.StringUtils;
-
-import com.google.common.collect.Maps;
-
-import java.util.List;
-import java.util.Map;
public class SacrificeEffect extends SpellAbilityEffect {
diff --git a/forge-game/src/main/java/forge/game/ability/effects/ScryEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ScryEffect.java
index 74111b0adf6..e60a8f6f07c 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/ScryEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/ScryEffect.java
@@ -1,14 +1,15 @@
package forge.game.ability.effects;
+import java.util.List;
+
import com.google.common.collect.Lists;
+
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.util.Localizer;
-import java.util.List;
-
public class ScryEffect extends SpellAbilityEffect {
@Override
diff --git a/forge-game/src/main/java/forge/game/ability/effects/SetInMotionEffect.java b/forge-game/src/main/java/forge/game/ability/effects/SetInMotionEffect.java
index 338378c936e..82c37eaf6d9 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/SetInMotionEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/SetInMotionEffect.java
@@ -1,6 +1,8 @@
package forge.game.ability.effects;
+import java.util.Map;
+
import forge.game.Game;
import forge.game.ability.AbilityKey;
import forge.game.ability.AbilityUtils;
@@ -11,8 +13,6 @@ import forge.game.spellability.SpellAbility;
import forge.game.trigger.TriggerType;
import forge.game.zone.ZoneType;
-import java.util.Map;
-
public class SetInMotionEffect extends SpellAbilityEffect {
/* (non-Javadoc)
diff --git a/forge-game/src/main/java/forge/game/ability/effects/SetStateEffect.java b/forge-game/src/main/java/forge/game/ability/effects/SetStateEffect.java
index 0ee16e55f22..1989de4d3df 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/SetStateEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/SetStateEffect.java
@@ -14,9 +14,9 @@ import forge.game.player.Player;
import forge.game.player.PlayerActionConfirmMode;
import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
-import forge.util.TextUtil;
import forge.util.Lang;
import forge.util.Localizer;
+import forge.util.TextUtil;
public class SetStateEffect extends SpellAbilityEffect {
diff --git a/forge-game/src/main/java/forge/game/ability/effects/ShuffleEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ShuffleEffect.java
index b774c93d2d2..0b438fc57c3 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/ShuffleEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/ShuffleEffect.java
@@ -1,14 +1,14 @@
package forge.game.ability.effects;
+import java.util.Iterator;
+import java.util.List;
+
import forge.game.ability.SpellAbilityEffect;
import forge.game.player.Player;
import forge.game.spellability.SpellAbility;
import forge.game.spellability.TargetRestrictions;
import forge.util.Localizer;
-import java.util.Iterator;
-import java.util.List;
-
public class ShuffleEffect extends SpellAbilityEffect {
@Override
diff --git a/forge-game/src/main/java/forge/game/ability/effects/SkipPhaseEffect.java b/forge-game/src/main/java/forge/game/ability/effects/SkipPhaseEffect.java
new file mode 100644
index 00000000000..c6e6839f157
--- /dev/null
+++ b/forge-game/src/main/java/forge/game/ability/effects/SkipPhaseEffect.java
@@ -0,0 +1,126 @@
+package forge.game.ability.effects;
+
+import java.util.List;
+
+import forge.GameCommand;
+import forge.game.Game;
+import forge.game.ability.AbilityFactory;
+import forge.game.ability.SpellAbilityEffect;
+import forge.game.card.Card;
+import forge.game.player.Player;
+import forge.game.replacement.ReplacementEffect;
+import forge.game.replacement.ReplacementHandler;
+import forge.game.replacement.ReplacementLayer;
+import forge.game.spellability.SpellAbility;
+import forge.game.trigger.TriggerType;
+import forge.game.zone.ZoneType;
+
+public class SkipPhaseEffect extends SpellAbilityEffect {
+
+ @Override
+ protected String getStackDescription(SpellAbility sa) {
+ final StringBuilder sb = new StringBuilder();
+ final String duration = sa.getParam("Duration");
+ final String phase = sa.getParam("Phase");
+ final String step = sa.getParam("Step");
+
+ List tgtPlayers = getTargetPlayers(sa);
+ for (final Player player : tgtPlayers) {
+ sb.append(player).append(" ");
+ sb.append("skips their ");
+ if (duration == null) {
+ sb.append("next ");
+ }
+ if (phase != null) {
+ sb.append(phase.toLowerCase()).append(" phase.");
+ } else {
+ sb.append(step.toLowerCase()).append(" step.");
+ }
+ }
+
+ return sb.toString();
+ }
+
+ @Override
+ public void resolve(SpellAbility sa) {
+ final String duration = sa.getParam("Duration");
+ final String phase = sa.getParam("Phase");
+ final String step = sa.getParam("Step");
+
+ List tgtPlayers = getTargetPlayers(sa);
+ for (final Player player : tgtPlayers) {
+ createSkipPhaseEffect(sa, player, duration, phase, step);
+ }
+ }
+
+ public static void createSkipPhaseEffect(SpellAbility sa, final Player player,
+ final String duration, final String phase, final String step) {
+ final Card hostCard = sa.getHostCard();
+ final Game game = hostCard.getGame();
+ final String name = hostCard.getName() + "'s Effect";
+ final String image = hostCard.getImageKey();
+ final boolean isNextThisTurn = duration != null && duration.equals("NextThisTurn");
+
+ final Card eff = createEffect(sa, player, name, image);
+
+ final StringBuilder sb = new StringBuilder();
+ sb.append("Event$ BeginPhase | ActiveZones$ Command | ValidPlayer$ You | Phase$ ");
+ sb.append(phase != null ? phase : step);
+ if (duration != null && !isNextThisTurn) {
+ sb.append(" | Skip$ True");
+ }
+ sb.append("| Description$ Skip ");
+ if (duration == null || isNextThisTurn) {
+ sb.append("your next ");
+ } else {
+ sb.append("each ");
+ }
+ if (phase != null) {
+ sb.append(phase.toLowerCase()).append(" phase");
+ } else {
+ sb.append(step.toLowerCase()).append(" step");
+ }
+ if (duration == null) {
+ sb.append(".");
+ } else {
+ if (game.getPhaseHandler().getPlayerTurn().equals(player)) {
+ sb.append(" of this turn.");
+ } else {
+ sb.append(" of your next turn.");
+ }
+ }
+
+ final String repeffstr = sb.toString();
+ ReplacementEffect re = ReplacementHandler.parseReplacement(repeffstr, eff, true);
+ // Set to layer to Control so it will be applied before "would begin your X phase/step" replacement effects
+ // (Any layer before Other is OK, since default layer is Other.)
+ re.setLayer(ReplacementLayer.Control);
+ if (duration == null || isNextThisTurn) {
+ String exilestr = "DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile";
+ SpellAbility exile = AbilityFactory.getAbility(exilestr, eff);
+ re.setOverridingAbility(exile);
+ }
+ if (duration != null) {
+ final GameCommand endEffect = new GameCommand() {
+ private static final long serialVersionUID = -5861759814760561373L;
+
+ @Override
+ public void run() {
+ game.getAction().exile(eff, null);
+ }
+ };
+
+ if (duration.equals("EndOfTurn") || isNextThisTurn) {
+ game.getEndOfTurn().addUntil(endEffect);
+ } else if (duration.equals("UntilTheEndOfYourNextTurn")) {
+ game.getEndOfTurn().addUntilEnd(player, endEffect);
+ }
+ }
+ eff.addReplacementEffect(re);
+ eff.updateStateForView();
+
+ game.getTriggerHandler().suppressMode(TriggerType.ChangesZone);
+ game.getAction().moveTo(ZoneType.Command, eff, sa);
+ game.getTriggerHandler().clearSuppression(TriggerType.ChangesZone);
+ }
+}
diff --git a/forge-game/src/main/java/forge/game/ability/effects/SkipTurnEffect.java b/forge-game/src/main/java/forge/game/ability/effects/SkipTurnEffect.java
index 9c100db4b34..6de528ed805 100644
--- a/forge-game/src/main/java/forge/game/ability/effects/SkipTurnEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/effects/SkipTurnEffect.java
@@ -1,11 +1,21 @@
package forge.game.ability.effects;
+import java.util.List;
+
+import forge.game.Game;
+import forge.game.ability.AbilityFactory;
import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
+import forge.game.card.Card;
import forge.game.player.Player;
+import forge.game.replacement.ReplacementEffect;
+import forge.game.replacement.ReplacementHandler;
+import forge.game.replacement.ReplacementLayer;
+import forge.game.spellability.AbilitySub;
import forge.game.spellability.SpellAbility;
-
-import java.util.List;
+import forge.game.trigger.TriggerType;
+import forge.game.zone.ZoneType;
+import forge.util.Lang;
public class SkipTurnEffect extends SpellAbilityEffect {
@@ -25,12 +35,35 @@ public class SkipTurnEffect extends SpellAbilityEffect {
@Override
public void resolve(SpellAbility sa) {
+ final Card hostCard = sa.getHostCard();
+ final Game game = hostCard.getGame();
+ final String name = hostCard.getName() + "'s Effect";
+ final String image = hostCard.getImageKey();
final int numTurns = AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("NumTurns"), sa);
+ String repeffstr = "Event$ BeginTurn | ActiveZones$ Command | ValidPlayer$ You " +
+ "| Description$ Skip your next " + (numTurns > 1 ? Lang.getNumeral(numTurns) + " turns." : "turn.");
+ String effect = "DB$ StoreSVar | SVar$ NumTurns | Type$ CountSVar | Expression$ NumTurns/Minus.1";
+ String exile = "DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile " +
+ "| ConditionCheckSVar$ NumTurns | ConditionSVarCompare$ EQ0";
+
List tgtPlayers = getTargetPlayers(sa);
for (final Player player : tgtPlayers) {
- for(int i = 0; i < numTurns; i++) {
- player.addKeyword("Skip your next turn.");
- }
+ final Card eff = createEffect(sa, player, name, image);
+ eff.setSVar("NumTurns", "Number$" + numTurns);
+ SpellAbility calcTurn = AbilityFactory.getAbility(effect, eff);
+ calcTurn.setSubAbility((AbilitySub) AbilityFactory.getAbility(exile, eff));
+
+ ReplacementEffect re = ReplacementHandler.parseReplacement(repeffstr, eff, true);
+ // Set to layer to Control so it will be applied before "would begin your turn" replacement effects
+ // (Any layer before Other is OK, since default layer is Other.)
+ re.setLayer(ReplacementLayer.Control);
+ re.setOverridingAbility(calcTurn);
+ eff.addReplacementEffect(re);
+ eff.updateStateForView();
+
+ game.getTriggerHandler().suppressMode(TriggerType.ChangesZone);
+ game.getAction().moveTo(ZoneType.Command, eff, sa);
+ game.getTriggerHandler().clearSuppression(TriggerType.ChangesZone);
}
}
}
diff --git a/forge-game/src/main/java/forge/game/ability/effects/StoreMapEffect.java b/forge-game/src/main/java/forge/game/ability/effects/StoreMapEffect.java
deleted file mode 100644
index a74bb75cd6f..00000000000
--- a/forge-game/src/main/java/forge/game/ability/effects/StoreMapEffect.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package forge.game.ability.effects;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import forge.game.GameEntity;
-import forge.game.ability.AbilityUtils;
-import forge.game.ability.SpellAbilityEffect;
-import forge.game.card.Card;
-import forge.game.spellability.SpellAbility;
-
-public class StoreMapEffect extends SpellAbilityEffect {
-
- @Override
- public void resolve(SpellAbility sa) {
- final Card source = sa.getHostCard();
- List entity = new ArrayList<>();
- List