@@ -34,7 +33,7 @@ import forge.game.player.Player;
* @author Forge
* @version $Id: Player.java 10091 2011-08-30 16:11:21Z Sloth $
*/
-public abstract class GameEntity implements ITargetable {
+public abstract class GameEntity extends GameObject {
private String name = "";
private int preventNextDamage = 0;
private TreeMap> preventionShieldsWithEffects = new TreeMap>();
@@ -342,58 +341,6 @@ public abstract class GameEntity implements ITargetable {
return false;
}
- /**
- * Checks if is valid.
- *
- * @param restrictions
- * the restrictions
- * @param sourceController
- * the source controller
- * @param source
- * the source
- * @return true, if is valid
- */
- public boolean isValid(final String[] restrictions, final Player sourceController, final Card source) {
-
- for (final String restriction : restrictions) {
- if (this.isValid(restriction, sourceController, source)) {
- return true;
- }
- }
- return false;
-
- } // isValid
-
- /**
- * Checks if is valid.
- *
- * @param restriction
- * the restriction
- * @param sourceController
- * the source controller
- * @param source
- * the source
- * @return true, if is valid
- */
- public boolean isValid(final String restriction, final Player sourceController, final Card source) {
- return false;
- }
-
- /**
- * Checks for property.
- *
- * @param property
- * the property
- * @param sourceController
- * the source controller
- * @param source
- * the source
- * @return true, if successful
- */
- public boolean hasProperty(final String property, final Player sourceController, final Card source) {
- return false;
- }
-
// GameEntities can now be Enchanted
/**
*
diff --git a/src/main/java/forge/GameObject.java b/src/main/java/forge/GameObject.java
new file mode 100644
index 00000000000..aae9887adba
--- /dev/null
+++ b/src/main/java/forge/GameObject.java
@@ -0,0 +1,63 @@
+package forge;
+
+import forge.card.spellability.SpellAbility;
+import forge.game.player.Player;
+
+public abstract class GameObject {
+
+ public boolean canBeTargetedBy(final SpellAbility sa) {
+ return false;
+ }
+
+ /**
+ * Checks if is valid.
+ *
+ * @param restrictions
+ * the restrictions
+ * @param sourceController
+ * the source controller
+ * @param source
+ * the source
+ * @return true, if is valid
+ */
+ public boolean isValid(final String[] restrictions, final Player sourceController, final Card source) {
+
+ for (final String restriction : restrictions) {
+ if (this.isValid(restriction, sourceController, source)) {
+ return true;
+ }
+ }
+ return false;
+
+ } // isValid
+
+ /**
+ * Checks if is valid.
+ *
+ * @param restriction
+ * the restriction
+ * @param sourceController
+ * the source controller
+ * @param source
+ * the source
+ * @return true, if is valid
+ */
+ public boolean isValid(final String restriction, final Player sourceController, final Card source) {
+ return false;
+ }
+
+ /**
+ * Checks for property.
+ *
+ * @param property
+ * the property
+ * @param sourceController
+ * the source controller
+ * @param source
+ * the source
+ * @return true, if successful
+ */
+ public boolean hasProperty(final String property, final Player sourceController, final Card source) {
+ return false;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/forge/ITargetable.java b/src/main/java/forge/ITargetable.java
deleted file mode 100644
index f851cd96825..00000000000
--- a/src/main/java/forge/ITargetable.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package forge;
-
-import forge.card.spellability.SpellAbility;
-
-public interface ITargetable {
- boolean canBeTargetedBy(final SpellAbility sa);
-}
\ No newline at end of file
diff --git a/src/main/java/forge/card/ability/AbilityUtils.java b/src/main/java/forge/card/ability/AbilityUtils.java
index ee0d795d63b..8cd993ee184 100644
--- a/src/main/java/forge/card/ability/AbilityUtils.java
+++ b/src/main/java/forge/card/ability/AbilityUtils.java
@@ -14,7 +14,7 @@ import forge.Card;
import forge.CardLists;
import forge.CardUtil;
import forge.CounterType;
-import forge.ITargetable;
+import forge.GameObject;
import forge.card.cardfactory.CardFactoryUtil;
import forge.card.cost.Cost;
import forge.card.mana.ManaCostBeingPaid;
@@ -469,7 +469,7 @@ public class AbilityUtils {
return CardFactoryUtil.playerXCount(players, calcX[1], card) * multiplier;
}
if (calcX[0].startsWith("TargetedObjects")) {
- final List objects = new ArrayList();
+ final List objects = new ArrayList();
// Make list of all targeted objects starting with the root SpellAbility
SpellAbility loopSA = ability.getRootAbility();
while (loopSA != null) {
@@ -603,8 +603,8 @@ public class AbilityUtils {
* a {@link forge.card.spellability.SpellAbility} object.
* @return a {@link java.util.ArrayList} object.
*/
- public static List getDefinedObjects(final Card card, final String def, final SpellAbility sa) {
- final ArrayList objects = new ArrayList();
+ public static List getDefinedObjects(final Card card, final String def, final SpellAbility sa) {
+ final ArrayList objects = new ArrayList();
final String defined = (def == null) ? "Self" : def;
objects.addAll(AbilityUtils.getDefinedPlayers(card, defined, sa));
@@ -1194,7 +1194,7 @@ public class AbilityUtils {
if (sa.hasParam("ForgetOtherTargets")) {
host.clearRemembered();
}
- for (final ITargetable o : sa.getTargets().getTargets()) {
+ for (final GameObject o : sa.getTargets().getTargets()) {
host.addRemembered(o);
}
}
diff --git a/src/main/java/forge/card/ability/SaTargetRoutines.java b/src/main/java/forge/card/ability/SaTargetRoutines.java
index 442c351d1e3..00e2c80812d 100644
--- a/src/main/java/forge/card/ability/SaTargetRoutines.java
+++ b/src/main/java/forge/card/ability/SaTargetRoutines.java
@@ -5,7 +5,7 @@ import java.util.List;
import com.google.common.collect.Lists;
import forge.Card;
-import forge.ITargetable;
+import forge.GameObject;
import forge.card.spellability.SpellAbility;
import forge.game.player.Player;
@@ -51,11 +51,11 @@ public class SaTargetRoutines {
}
// Targets of unspecified type
- protected List getTargets(SpellAbility sa) { return getTargetables(false, "Defined", sa); }
- protected List getTargets(SpellAbility sa, String definedParam) { return getTargetables(false, definedParam, sa); }
- protected List getDefinedOrTargeteded(SpellAbility sa, String definedParam) { return getTargetables(true, definedParam, sa); }
+ protected List getTargets(SpellAbility sa) { return getTargetables(false, "Defined", sa); }
+ protected List getTargets(SpellAbility sa, String definedParam) { return getTargetables(false, definedParam, sa); }
+ protected List getDefinedOrTargeteded(SpellAbility sa, String definedParam) { return getTargetables(true, definedParam, sa); }
- private List getTargetables(boolean definedFirst, String definedParam, SpellAbility sa) {
+ private List getTargetables(boolean definedFirst, String definedParam, SpellAbility sa) {
boolean useTargets = sa.usesTargeting() && (!definedFirst || !sa.hasParam(definedParam));
return useTargets ? Lists.newArrayList(sa.getTargets().getTargets())
: AbilityUtils.getDefinedObjects(sa.getSourceCard(), sa.getParam(definedParam), sa);
diff --git a/src/main/java/forge/card/ability/ai/AttachAi.java b/src/main/java/forge/card/ability/ai/AttachAi.java
index ac41ab93046..64c41889256 100644
--- a/src/main/java/forge/card/ability/ai/AttachAi.java
+++ b/src/main/java/forge/card/ability/ai/AttachAi.java
@@ -15,7 +15,7 @@ import forge.Card;
import forge.CardLists;
import forge.CardPredicates;
import forge.CardUtil;
-import forge.ITargetable;
+import forge.GameObject;
import forge.card.ability.AbilityUtils;
import forge.card.ability.ApiType;
import forge.card.ability.SpellAbilityAi;
@@ -628,7 +628,7 @@ public class AttachAi extends SpellAbilityAi {
protected boolean doTriggerAINoCost(final Player ai, final SpellAbility sa, final boolean mandatory) {
final Card card = sa.getSourceCard();
// Check if there are any valid targets
- List targets = new ArrayList();
+ List targets = new ArrayList();
final TargetRestrictions tgt = sa.getTargetRestrictions();
if (tgt == null) {
targets = AbilityUtils.getDefinedObjects(sa.getSourceCard(), sa.getParam("Defined"), sa);
@@ -703,7 +703,7 @@ public class AttachAi extends SpellAbilityAi {
* @return true, if successful
*/
private static boolean attachPreference(final SpellAbility sa, final TargetRestrictions tgt, final boolean mandatory) {
- ITargetable o;
+ GameObject o;
if (tgt.canTgtPlayer()) {
o = attachToPlayerAIPreferences(sa.getActivatingPlayer(), sa, mandatory);
} else {
diff --git a/src/main/java/forge/card/ability/ai/ChangeZoneAi.java b/src/main/java/forge/card/ability/ai/ChangeZoneAi.java
index 19611aec2ca..cca32131057 100644
--- a/src/main/java/forge/card/ability/ai/ChangeZoneAi.java
+++ b/src/main/java/forge/card/ability/ai/ChangeZoneAi.java
@@ -18,7 +18,7 @@ import forge.CardPredicates;
import forge.CardPredicates.Presets;
import forge.Constant;
import forge.GameEntity;
-import forge.ITargetable;
+import forge.GameObject;
import forge.card.ability.AbilityUtils;
import forge.card.ability.ApiType;
import forge.card.ability.SpellAbilityAi;
@@ -621,7 +621,7 @@ public class ChangeZoneAi extends SpellAbilityAi {
return false;
}
- final List objects = ComputerUtil.predictThreatenedObjects(ai, sa);
+ final List objects = ComputerUtil.predictThreatenedObjects(ai, sa);
boolean contains = false;
for (final Card c : retrieval) {
if (objects.contains(c)) {
@@ -743,7 +743,7 @@ public class ChangeZoneAi extends SpellAbilityAi {
// check stack for something on the stack that will kill
// anything i control
if (!game.getStack().isEmpty()) {
- final List objects = ComputerUtil.predictThreatenedObjects(ai, sa);
+ final List objects = ComputerUtil.predictThreatenedObjects(ai, sa);
final List threatenedTargets = new ArrayList();
diff --git a/src/main/java/forge/card/ability/ai/ChooseSourceAi.java b/src/main/java/forge/card/ability/ai/ChooseSourceAi.java
index a0f1b7fae34..2f2bceb0fa3 100644
--- a/src/main/java/forge/card/ability/ai/ChooseSourceAi.java
+++ b/src/main/java/forge/card/ability/ai/ChooseSourceAi.java
@@ -6,7 +6,7 @@ import com.google.common.base.Predicate;
import forge.Card;
import forge.CardLists;
-import forge.ITargetable;
+import forge.GameObject;
import forge.card.ability.AbilityUtils;
import forge.card.ability.ApiType;
import forge.card.ability.SpellAbilityAi;
@@ -79,7 +79,7 @@ public class ChooseSourceAi extends SpellAbilityAi {
}
final Card threatSource = topStack.getSourceCard();
- List extends ITargetable> objects = getTargets(sa);
+ List extends GameObject> objects = getTargets(sa);
if (!topStack.usesTargeting() && topStack.hasParam("ValidPlayers") && !topStack.hasParam("Defined")) {
objects = AbilityUtils.getDefinedPlayers(threatSource, topStack.getParam("ValidPlayers"), topStack);
diff --git a/src/main/java/forge/card/ability/ai/DamageDealAi.java b/src/main/java/forge/card/ability/ai/DamageDealAi.java
index 25e8564fbb6..89bc8b981ce 100644
--- a/src/main/java/forge/card/ability/ai/DamageDealAi.java
+++ b/src/main/java/forge/card/ability/ai/DamageDealAi.java
@@ -9,7 +9,7 @@ import com.google.common.collect.Lists;
import forge.Card;
import forge.CardLists;
import forge.CardPredicates;
-import forge.ITargetable;
+import forge.GameObject;
import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityAi;
import forge.card.cost.Cost;
@@ -149,7 +149,7 @@ public class DamageDealAi extends DamageAiBase {
final Card source = sa.getSourceCard();
List hPlay = CardLists.getValidCards(pl.getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), ai, source);
- final List objects = Lists.newArrayList(sa.getTargets().getTargets());
+ final List objects = Lists.newArrayList(sa.getTargets().getTargets());
if (sa.hasParam("TargetUnique")) {
objects.addAll(sa.getUniqueTargets());
}
@@ -374,7 +374,7 @@ public class DamageDealAi extends DamageAiBase {
*/
private boolean damageChooseNontargeted(Player ai, final SpellAbility saMe, final int dmg) {
// TODO: Improve circumstances where the Defined Damage is unwanted
- final List objects = AbilityUtils.getDefinedObjects(saMe.getSourceCard(), saMe.getParam("Defined"), saMe);
+ final List objects = AbilityUtils.getDefinedObjects(saMe.getSourceCard(), saMe.getParam("Defined"), saMe);
boolean urgent = false; // can it wait?
boolean positive = false;
diff --git a/src/main/java/forge/card/ability/ai/DamagePreventAi.java b/src/main/java/forge/card/ability/ai/DamagePreventAi.java
index 6e09468e8d9..e3487bae48c 100644
--- a/src/main/java/forge/card/ability/ai/DamagePreventAi.java
+++ b/src/main/java/forge/card/ability/ai/DamagePreventAi.java
@@ -6,7 +6,7 @@ import java.util.List;
import forge.Card;
import forge.CardLists;
import forge.CardPredicates;
-import forge.ITargetable;
+import forge.GameObject;
import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityAi;
import forge.card.cost.Cost;
@@ -55,11 +55,11 @@ public class DamagePreventAi extends SpellAbilityAi {
if (tgt == null) {
// As far as I can tell these Defined Cards will only have one of
// them
- final List objects = AbilityUtils.getDefinedObjects(sa.getSourceCard(), sa.getParam("Defined"), sa);
+ final List objects = AbilityUtils.getDefinedObjects(sa.getSourceCard(), sa.getParam("Defined"), sa);
// react to threats on the stack
if (!game.getStack().isEmpty()) {
- final List threatenedObjects = ComputerUtil.predictThreatenedObjects(sa.getActivatingPlayer(), sa);
+ final List threatenedObjects = ComputerUtil.predictThreatenedObjects(sa.getActivatingPlayer(), sa);
for (final Object o : objects) {
if (threatenedObjects.contains(o)) {
chance = true;
@@ -94,7 +94,7 @@ public class DamagePreventAi extends SpellAbilityAi {
else if (!game.getStack().isEmpty()) {
sa.resetTargets();
// check stack for something on the stack will kill anything i control
- final List objects = ComputerUtil.predictThreatenedObjects(sa.getActivatingPlayer(), sa);
+ final List objects = ComputerUtil.predictThreatenedObjects(sa.getActivatingPlayer(), sa);
if (objects.contains(ai)) {
sa.getTargets().add(ai);
diff --git a/src/main/java/forge/card/ability/ai/RegenerateAi.java b/src/main/java/forge/card/ability/ai/RegenerateAi.java
index 2374d3617b6..adeff314f68 100644
--- a/src/main/java/forge/card/ability/ai/RegenerateAi.java
+++ b/src/main/java/forge/card/ability/ai/RegenerateAi.java
@@ -23,7 +23,7 @@ import java.util.List;
import forge.Card;
import forge.CardLists;
import forge.CardPredicates;
-import forge.ITargetable;
+import forge.GameObject;
import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityAi;
import forge.card.cost.Cost;
@@ -91,7 +91,7 @@ public class RegenerateAi extends SpellAbilityAi {
final List list = AbilityUtils.getDefinedCards(hostCard, sa.getParam("Defined"), sa);
if (!game.getStack().isEmpty()) {
- final List objects = ComputerUtil.predictThreatenedObjects(sa.getActivatingPlayer(), sa);
+ final List objects = ComputerUtil.predictThreatenedObjects(sa.getActivatingPlayer(), sa);
for (final Card c : list) {
if (objects.contains(c)) {
@@ -127,7 +127,7 @@ public class RegenerateAi extends SpellAbilityAi {
if (!game.getStack().isEmpty()) {
// check stack for something on the stack will kill anything i
// control
- final List objects = ComputerUtil.predictThreatenedObjects(sa.getActivatingPlayer(), sa);
+ final List objects = ComputerUtil.predictThreatenedObjects(sa.getActivatingPlayer(), sa);
final List threatenedTargets = new ArrayList();
diff --git a/src/main/java/forge/card/ability/ai/RegenerateAllAi.java b/src/main/java/forge/card/ability/ai/RegenerateAllAi.java
index ae8fce20bb2..9489bce3241 100644
--- a/src/main/java/forge/card/ability/ai/RegenerateAllAi.java
+++ b/src/main/java/forge/card/ability/ai/RegenerateAllAi.java
@@ -5,7 +5,7 @@ import java.util.List;
import forge.Card;
import forge.CardLists;
import forge.CardPredicates;
-import forge.ITargetable;
+import forge.GameObject;
import forge.card.ability.SpellAbilityAi;
import forge.card.cost.Cost;
import forge.card.spellability.SpellAbility;
@@ -58,7 +58,7 @@ public class RegenerateAllAi extends SpellAbilityAi {
int numSaved = 0;
if (!game.getStack().isEmpty()) {
- final List objects = ComputerUtil.predictThreatenedObjects(sa.getActivatingPlayer(), sa);
+ final List objects = ComputerUtil.predictThreatenedObjects(sa.getActivatingPlayer(), sa);
for (final Card c : list) {
if (objects.contains(c) && c.getShield() == 0) {
diff --git a/src/main/java/forge/card/ability/ai/UnattachAllAi.java b/src/main/java/forge/card/ability/ai/UnattachAllAi.java
index 3250efe1f57..c34f40221cb 100644
--- a/src/main/java/forge/card/ability/ai/UnattachAllAi.java
+++ b/src/main/java/forge/card/ability/ai/UnattachAllAi.java
@@ -5,7 +5,7 @@ import java.util.List;
import java.util.Random;
import forge.Card;
-import forge.ITargetable;
+import forge.GameObject;
import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityAi;
import forge.card.cost.Cost;
@@ -68,7 +68,7 @@ public class UnattachAllAi extends SpellAbilityAi {
final Card card = sa.getSourceCard();
final Player opp = ai.getOpponent();
// Check if there are any valid targets
- List targets = new ArrayList();
+ List targets = new ArrayList();
final TargetRestrictions tgt = sa.getTargetRestrictions();
if (tgt == null) {
targets = AbilityUtils.getDefinedObjects(sa.getSourceCard(), sa.getParam("Defined"), sa);
diff --git a/src/main/java/forge/card/ability/effects/AttachEffect.java b/src/main/java/forge/card/ability/effects/AttachEffect.java
index 794753cb632..77922dba548 100644
--- a/src/main/java/forge/card/ability/effects/AttachEffect.java
+++ b/src/main/java/forge/card/ability/effects/AttachEffect.java
@@ -7,7 +7,7 @@ import forge.Card;
import forge.CardLists;
import forge.Command;
import forge.GameEntity;
-import forge.ITargetable;
+import forge.GameObject;
import forge.card.ability.AbilityUtils;
import forge.card.ability.ApiType;
import forge.card.ability.SpellAbilityEffect;
@@ -39,7 +39,7 @@ public class AttachEffect extends SpellAbilityEffect {
Card source = sa.getSourceCard();
Card card = sa.getSourceCard();
- final List targets = getTargets(sa);
+ final List targets = getTargets(sa);
if (sa.hasParam("Object")) {
card = AbilityUtils.getDefinedCards(source, sa.getParam("Object"), sa).get(0);
@@ -66,7 +66,7 @@ public class AttachEffect extends SpellAbilityEffect {
sb.append(" Attach to ");
- final List targets = getTargets(sa);
+ final List targets = getTargets(sa);
// Should never allow more than one Attachment per card
sb.append(Lang.joinHomogenous(targets));
diff --git a/src/main/java/forge/card/ability/effects/ChangeTargetsEffect.java b/src/main/java/forge/card/ability/effects/ChangeTargetsEffect.java
index 8e404882126..d080d24c007 100644
--- a/src/main/java/forge/card/ability/effects/ChangeTargetsEffect.java
+++ b/src/main/java/forge/card/ability/effects/ChangeTargetsEffect.java
@@ -8,7 +8,7 @@ import org.apache.commons.lang3.tuple.Pair;
import com.google.common.collect.Iterables;
-import forge.ITargetable;
+import forge.GameObject;
import forge.card.ability.SpellAbilityEffect;
import forge.card.spellability.SpellAbility;
import forge.card.spellability.SpellAbilityStackInstance;
@@ -53,11 +53,11 @@ public class ChangeTargetsEffect extends SpellAbilityEffect {
if( changesOneTarget ) {
// 1. choose a target of target spell
- List> allTargets = new ArrayList<>();
+ List> allTargets = new ArrayList<>();
while(changingTgtSI != null) {
SpellAbility changedSa = changingTgtSI.getSpellAbility();
if(changedSa.usesTargeting()) {
- for(ITargetable it : changedSa.getTargets().getTargets())
+ for(GameObject it : changedSa.getTargets().getTargets())
allTargets.add(ImmutablePair.of(changingTgtSI, it));
}
changingTgtSI = changingTgtSI.getSubInstace();
@@ -68,16 +68,16 @@ public class ChangeTargetsEffect extends SpellAbilityEffect {
return;
}
- Pair chosenTarget = chooser.getController().chooseTarget(sa, allTargets);
+ Pair chosenTarget = chooser.getController().chooseTarget(sa, allTargets);
// 2. prepare new target choices
SpellAbilityStackInstance replaceIn = chosenTarget.getKey();
- ITargetable oldTarget = chosenTarget.getValue();
+ GameObject oldTarget = chosenTarget.getValue();
TargetChoices oldTargetBlock = replaceIn.getTargetChoices();
TargetChoices newTargetBlock = oldTargetBlock.clone();
newTargetBlock.remove(oldTarget);
replaceIn.updateTarget(newTargetBlock);
// 3. test if updated choices would be correct.
- ITargetable newTarget = Iterables.getFirst(getDefinedCardsOrTargeted(sa), null);
+ GameObject newTarget = Iterables.getFirst(getDefinedCardsOrTargeted(sa), null);
if(replaceIn.getSpellAbility().canTarget(newTarget)) {
newTargetBlock.add(newTarget);
replaceIn.updateTarget(newTargetBlock);
@@ -94,8 +94,8 @@ public class ChangeTargetsEffect extends SpellAbilityEffect {
}
} else {
changingTgtSA.resetTargets();
- List candidates = changingTgtSA.getTargetRestrictions().getAllCandidates(changingTgtSA, true);
- ITargetable choice = Aggregates.random(candidates);
+ List candidates = changingTgtSA.getTargetRestrictions().getAllCandidates(changingTgtSA, true);
+ GameObject choice = Aggregates.random(candidates);
changingTgtSA.getTargets().add(choice);
changingTgtSI.updateTarget(changingTgtSA.getTargets());
}
diff --git a/src/main/java/forge/card/ability/effects/ChooseSourceEffect.java b/src/main/java/forge/card/ability/effects/ChooseSourceEffect.java
index fa20cd90c46..03ae5738940 100644
--- a/src/main/java/forge/card/ability/effects/ChooseSourceEffect.java
+++ b/src/main/java/forge/card/ability/effects/ChooseSourceEffect.java
@@ -7,7 +7,7 @@ import org.apache.commons.lang3.StringUtils;
import com.google.common.base.Predicate;
import forge.Card;
import forge.CardLists;
-import forge.ITargetable;
+import forge.GameObject;
import forge.card.ability.AbilityUtils;
import forge.card.ability.ApiType;
import forge.card.ability.SpellAbilityEffect;
@@ -206,7 +206,7 @@ public class ChooseSourceEffect extends SpellAbilityEffect {
}
- List extends ITargetable> objects = getTargets(abilityOnStack);
+ List extends GameObject> objects = getTargets(abilityOnStack);
if (!abilityOnStack.usesTargeting() && !abilityOnStack.hasParam("Defined") && abilityOnStack.hasParam("ValidPlayers"))
objects = AbilityUtils.getDefinedPlayers(source, abilityOnStack.getParam("ValidPlayers"), abilityOnStack);
diff --git a/src/main/java/forge/card/ability/effects/CopySpellAbilityEffect.java b/src/main/java/forge/card/ability/effects/CopySpellAbilityEffect.java
index 91b22ee8e7f..01cf743491f 100644
--- a/src/main/java/forge/card/ability/effects/CopySpellAbilityEffect.java
+++ b/src/main/java/forge/card/ability/effects/CopySpellAbilityEffect.java
@@ -8,7 +8,7 @@ import com.google.common.collect.Iterables;
import forge.Card;
import forge.CardLists;
-import forge.ITargetable;
+import forge.GameObject;
import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityEffect;
import forge.card.cardfactory.CardFactory;
@@ -92,7 +92,7 @@ public class CopySpellAbilityEffect extends SpellAbilityEffect {
}
targetedSA = targetedSA.getSubAbility();
}
- List candidates = targetedSA.getTargetRestrictions().getAllCandidates(targetedSA, true);
+ List candidates = targetedSA.getTargetRestrictions().getAllCandidates(targetedSA, true);
if (sa.hasParam("CanTargetPlayer")) {
// Radiate
// Remove targeted players because getAllCandidates include all the valid players
@@ -100,7 +100,7 @@ public class CopySpellAbilityEffect extends SpellAbilityEffect {
candidates.remove(p);
mayChoseNewTargets = false;
- for (ITargetable o : candidates) {
+ for (GameObject o : candidates) {
SpellAbility copy = CardFactory.copySpellAbilityAndSrcCard(card, chosenSA.getSourceCard(), chosenSA, true);
copy.resetFirstTarget(o);
copies.add(copy);
diff --git a/src/main/java/forge/card/ability/effects/CountersPutOrRemoveEffect.java b/src/main/java/forge/card/ability/effects/CountersPutOrRemoveEffect.java
index f28c5780d59..cb7ac5792b1 100644
--- a/src/main/java/forge/card/ability/effects/CountersPutOrRemoveEffect.java
+++ b/src/main/java/forge/card/ability/effects/CountersPutOrRemoveEffect.java
@@ -6,7 +6,7 @@ import org.apache.commons.lang3.tuple.Pair;
import forge.Card;
import forge.CounterType;
-import forge.ITargetable;
+import forge.GameObject;
import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityEffect;
import forge.card.spellability.SpellAbility;
@@ -26,7 +26,7 @@ public class CountersPutOrRemoveEffect extends SpellAbilityEffect {
sb.append(sa.getActivatingPlayer().getName());
sb.append(" removes a counter from or puts another of those counters on ");
- final List targets = getTargets(sa);
+ final List targets = getTargets(sa);
sb.append(Lang.joinHomogenous(targets));
return sb.toString();
diff --git a/src/main/java/forge/card/ability/effects/DamageDealEffect.java b/src/main/java/forge/card/ability/effects/DamageDealEffect.java
index 032c722b0b4..f01199b80ff 100644
--- a/src/main/java/forge/card/ability/effects/DamageDealEffect.java
+++ b/src/main/java/forge/card/ability/effects/DamageDealEffect.java
@@ -8,7 +8,7 @@ import java.util.Map.Entry;
import forge.Card;
import forge.CardUtil;
-import forge.ITargetable;
+import forge.GameObject;
import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityEffect;
import forge.card.spellability.SpellAbility;
@@ -28,7 +28,7 @@ public class DamageDealEffect extends SpellAbilityEffect {
final int dmg = AbilityUtils.calculateAmount(sa.getSourceCard(), damage, sa);
- List tgts = getTargets(sa);
+ List tgts = getTargets(sa);
if (tgts.isEmpty())
return "";
@@ -74,7 +74,7 @@ public class DamageDealEffect extends SpellAbilityEffect {
final boolean removeDamage = sa.hasParam("Remove");
final boolean divideOnResolution = sa.hasParam("DividerOnResolution");
- List tgts = getTargets(sa);
+ List tgts = getTargets(sa);
// Right now for Fireball, maybe later for other stuff
if (sa.hasParam("DivideEvenly")) {
@@ -121,7 +121,7 @@ public class DamageDealEffect extends SpellAbilityEffect {
List assigneeCards = new ArrayList();
// Do we have a way of doing this in a better fashion?
- for(ITargetable obj : tgts) {
+ for(GameObject obj : tgts) {
if (obj instanceof Card) {
assigneeCards.add((Card)obj);
}
diff --git a/src/main/java/forge/card/ability/effects/DamageEachEffect.java b/src/main/java/forge/card/ability/effects/DamageEachEffect.java
index 4ef613a46da..f343ebf5021 100644
--- a/src/main/java/forge/card/ability/effects/DamageEachEffect.java
+++ b/src/main/java/forge/card/ability/effects/DamageEachEffect.java
@@ -4,7 +4,7 @@ import java.util.List;
import forge.Card;
import forge.CardLists;
-import forge.ITargetable;
+import forge.GameObject;
import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityEffect;
import forge.card.cardfactory.CardFactoryUtil;
@@ -65,7 +65,7 @@ public class DamageEachEffect extends SpellAbilityEffect {
sources = CardLists.getValidCards(sources, sa.getParam("ValidCards"), card.getController(), card);
}
- final List tgts = getTargets(sa, "DefinedPlayers");
+ final List tgts = getTargets(sa, "DefinedPlayers");
final boolean targeted = (sa.usesTargeting());
diff --git a/src/main/java/forge/card/ability/effects/DamagePreventEffect.java b/src/main/java/forge/card/ability/effects/DamagePreventEffect.java
index 67e9196b02c..153e9742ee5 100644
--- a/src/main/java/forge/card/ability/effects/DamagePreventEffect.java
+++ b/src/main/java/forge/card/ability/effects/DamagePreventEffect.java
@@ -6,7 +6,7 @@ import java.util.TreeMap;
import forge.Card;
import forge.CardUtil;
-import forge.ITargetable;
+import forge.GameObject;
import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityEffect;
import forge.card.spellability.SpellAbility;
@@ -18,7 +18,7 @@ public class DamagePreventEffect extends SpellAbilityEffect {
protected String getStackDescription(SpellAbility sa) {
final StringBuilder sb = new StringBuilder();
- final List tgts = getTargets(sa);
+ final List tgts = getTargets(sa);
sb.append("Prevent the next ");
sb.append(sa.getParam("Amount"));
@@ -67,7 +67,7 @@ public class DamagePreventEffect extends SpellAbilityEffect {
Card host = sa.getSourceCard();
int numDam = AbilityUtils.calculateAmount(host, sa.getParam("Amount"), sa);
- final List tgts = getTargets(sa);
+ final List tgts = getTargets(sa);
final ArrayList untargetedCards = new ArrayList();
if (sa.hasParam("Radiance") && (sa.usesTargeting())) {
@@ -100,7 +100,7 @@ public class DamagePreventEffect extends SpellAbilityEffect {
effectMap.put("ShieldAmount", String.valueOf(numDam));
if (sa.hasParam("ShieldEffectTarget")) {
String effTgtString = "";
- List effTgts = new ArrayList();
+ List effTgts = new ArrayList();
effTgts = AbilityUtils.getDefinedObjects(host, sa.getParam("ShieldEffectTarget"), sa);
for (final Object effTgt : effTgts) {
if (effTgt instanceof Card) {
@@ -127,7 +127,7 @@ public class DamagePreventEffect extends SpellAbilityEffect {
effectMap.put("ShieldAmount", String.valueOf(numDam));
if (sa.hasParam("ShieldEffectTarget")) {
String effTgtString = "";
- List effTgts = new ArrayList();
+ List effTgts = new ArrayList();
effTgts = AbilityUtils.getDefinedObjects(host, sa.getParam("ShieldEffectTarget"), sa);
for (final Object effTgt : effTgts) {
if (effTgt instanceof Card) {
diff --git a/src/main/java/forge/card/ability/effects/UnattachAllEffect.java b/src/main/java/forge/card/ability/effects/UnattachAllEffect.java
index 61656e04434..486868e6f4a 100644
--- a/src/main/java/forge/card/ability/effects/UnattachAllEffect.java
+++ b/src/main/java/forge/card/ability/effects/UnattachAllEffect.java
@@ -7,7 +7,7 @@ import org.apache.commons.lang3.StringUtils;
import forge.Card;
import forge.CardLists;
import forge.GameEntity;
-import forge.ITargetable;
+import forge.GameObject;
import forge.card.ability.SpellAbilityEffect;
import forge.card.spellability.SpellAbility;
import forge.game.Game;
@@ -143,7 +143,7 @@ public class UnattachAllEffect extends SpellAbilityEffect {
protected String getStackDescription(SpellAbility sa) {
final StringBuilder sb = new StringBuilder();
sb.append("Unattach all valid Equipment and Auras from ");
- final List targets = getTargets(sa);
+ final List targets = getTargets(sa);
sb.append(StringUtils.join(targets, " "));
return sb.toString();
}
@@ -155,7 +155,7 @@ public class UnattachAllEffect extends SpellAbilityEffect {
public void resolve(SpellAbility sa) {
Card source = sa.getSourceCard();
final Game game = sa.getActivatingPlayer().getGame();
- final List targets = getTargets(sa);
+ final List targets = getTargets(sa);
// If Cast Targets will be checked on the Stack
for (final Object o : targets) {
diff --git a/src/main/java/forge/card/spellability/HumanPlaySpellAbility.java b/src/main/java/forge/card/spellability/HumanPlaySpellAbility.java
index dd1ea4bf1f0..0399949d086 100644
--- a/src/main/java/forge/card/spellability/HumanPlaySpellAbility.java
+++ b/src/main/java/forge/card/spellability/HumanPlaySpellAbility.java
@@ -23,7 +23,7 @@ import org.apache.commons.lang3.StringUtils;
import com.google.common.collect.Iterables;
import forge.Card;
-import forge.ITargetable;
+import forge.GameObject;
import forge.card.CardType;
import forge.card.ability.AbilityUtils;
import forge.card.cost.CostPartMana;
@@ -220,10 +220,10 @@ public class HumanPlaySpellAbility {
final StringBuilder sb = new StringBuilder();
sb.append(ability.getSourceCard().getName());
if (ability.getTargetRestrictions() != null) {
- final Iterable targets = ability.getTargets().getTargets();
+ final Iterable targets = ability.getTargets().getTargets();
if (!Iterables.isEmpty(targets)) {
sb.append(" - Targeting ");
- for (final ITargetable o : targets) {
+ for (final GameObject o : targets) {
sb.append(o.toString()).append(" ");
}
}
diff --git a/src/main/java/forge/card/spellability/SpellAbility.java b/src/main/java/forge/card/spellability/SpellAbility.java
index 6d6bd352625..fd26ee16810 100644
--- a/src/main/java/forge/card/spellability/SpellAbility.java
+++ b/src/main/java/forge/card/spellability/SpellAbility.java
@@ -32,7 +32,7 @@ import com.google.common.collect.Lists;
import forge.Card;
import forge.GameEntity;
-import forge.ITargetable;
+import forge.GameObject;
import forge.card.ability.AbilityUtils;
import forge.card.ability.ApiType;
import forge.card.cost.Cost;
@@ -53,7 +53,7 @@ import forge.util.TextUtil;
* @author Forge
* @version $Id$
*/
-public abstract class SpellAbility implements ISpellAbility, ITargetable {
+public abstract class SpellAbility extends GameObject implements ISpellAbility {
// choices for constructor isPermanent argument
private String description = "";
@@ -1027,7 +1027,7 @@ public abstract class SpellAbility implements ISpellAbility, ITargetable {
* a GameEntity
* @return a boolean.
*/
- public final boolean canTarget(final ITargetable entity) {
+ public final boolean canTarget(final GameObject entity) {
final TargetRestrictions tr = this.getTargetRestrictions();
// Restriction related to this ability
@@ -1364,7 +1364,7 @@ public abstract class SpellAbility implements ISpellAbility, ITargetable {
* Reset the first target.
*
*/
- public void resetFirstTarget(ITargetable c) {
+ public void resetFirstTarget(GameObject c) {
SpellAbility sa = this;
while (sa != null) {
if (sa.targetRestricions != null) {
@@ -1528,8 +1528,8 @@ public abstract class SpellAbility implements ISpellAbility, ITargetable {
* the ability
* @return the unique targets
*/
- public final List getUniqueTargets() {
- final List targets = new ArrayList();
+ public final List getUniqueTargets() {
+ final List targets = new ArrayList();
SpellAbility child = this.getParent();
while (child != null) {
if (child.getTargetRestrictions() != null) {
@@ -1574,7 +1574,7 @@ public abstract class SpellAbility implements ISpellAbility, ITargetable {
boolean result = false;
- for (final ITargetable o : matchTgt.getTargets()) {
+ for (final GameObject o : matchTgt.getTargets()) {
if (matchesValid(o, splitTargetRestrictions.split(","))) {
result = true;
break;
@@ -1604,7 +1604,7 @@ public abstract class SpellAbility implements ISpellAbility, ITargetable {
return topSA.getSourceCard().isValid(tgt.getValidTgts(), this.getActivatingPlayer(), this.getSourceCard());
}
- private boolean matchesValid(final ITargetable o, final String[] valids) {
+ private boolean matchesValid(final GameObject o, final String[] valids) {
final Card srcCard = this.getSourceCard();
final Player activatingPlayer = this.getActivatingPlayer();
if (o instanceof Card) {
@@ -1621,6 +1621,61 @@ public abstract class SpellAbility implements ISpellAbility, ITargetable {
return false;
}
+
+ // Takes one argument like Permanent.Blue+withFlying
+ /**
+ *
+ * isValid.
+ *
+ *
+ * @param restriction
+ * a {@link java.lang.String} object.
+ * @param sourceController
+ * a {@link forge.game.player.Player} object.
+ * @param source
+ * a {@link forge.Card} object.
+ * @return a boolean.
+ */
+ @Override
+ public final boolean isValid(final String restriction, final Player sourceController, final Card source) {
+
+ // Inclusive restrictions are Card types
+ final String[] incR = restriction.split("\\.", 2);
+
+ if (incR[0].equals("Spell") && !this.isSpell()) {
+ return false;
+ }
+
+ if (incR.length > 1) {
+ final String excR = incR[1];
+ final String[] exR = excR.split("\\+"); // Exclusive Restrictions are ...
+ for (int j = 0; j < exR.length; j++) {
+ if (!this.hasProperty(exR[j], sourceController, source)) {
+ return false;
+ }
+ }
+ }
+ return true;
+ } // isValid(String Restriction)
+
+ // Takes arguments like Blue or withFlying
+ /**
+ *
+ * hasProperty.
+ *
+ *
+ * @param property
+ * a {@link java.lang.String} object.
+ * @param sourceController
+ * a {@link forge.game.player.Player} object.
+ * @param source
+ * a {@link forge.Card} object.
+ * @return a boolean.
+ */
+ @Override
+ public boolean hasProperty(final String property, final Player sourceController, final Card source) {
+ return true;
+ }
// Methods enabling multiple instances of conspire
public void addConspireInstance() {
diff --git a/src/main/java/forge/card/spellability/TargetChoices.java b/src/main/java/forge/card/spellability/TargetChoices.java
index 7de69ee65ed..dc00cb04b5b 100644
--- a/src/main/java/forge/card/spellability/TargetChoices.java
+++ b/src/main/java/forge/card/spellability/TargetChoices.java
@@ -23,7 +23,7 @@ import java.util.List;
import com.google.common.collect.Iterables;
import forge.Card;
-import forge.ITargetable;
+import forge.GameObject;
import forge.game.player.Player;
/**
@@ -62,7 +62,7 @@ public class TargetChoices implements Cloneable {
* a {@link java.lang.Object} object.
* @return a boolean.
*/
- public final boolean add(final ITargetable o) {
+ public final boolean add(final GameObject o) {
if (o instanceof Player) {
return this.addTarget((Player) o);
} else if (o instanceof Card) {
@@ -137,7 +137,7 @@ public class TargetChoices implements Cloneable {
* a {@link forge.Card} object.
* @return a boolean.
*/
- public final boolean remove(final ITargetable target) {
+ public final boolean remove(final GameObject target) {
// remove returns true if element was found in given list
if (this.targetCards.remove(target) || this.targetPlayers.remove(target) || this.targetSpells.remove(target)) {
this.numTargeted--;
@@ -186,8 +186,8 @@ public class TargetChoices implements Cloneable {
*
* @return a {@link java.util.ArrayList} object.
*/
- public final List getTargets() {
- final ArrayList tgts = new ArrayList();
+ public final List getTargets() {
+ final ArrayList tgts = new ArrayList();
tgts.addAll(this.targetPlayers);
tgts.addAll(this.targetCards);
tgts.addAll(this.targetSpells);
@@ -197,7 +197,7 @@ public class TargetChoices implements Cloneable {
public final String getTargetedString() {
- final List tgts = this.getTargets();
+ final List tgts = this.getTargets();
final StringBuilder sb = new StringBuilder();
for (final Object o : tgts) {
if (o instanceof Player) {
@@ -231,7 +231,7 @@ public class TargetChoices implements Cloneable {
return !targetSpells.isEmpty();
}
- public final boolean isTargeting(ITargetable e) {
+ public final boolean isTargeting(GameObject e) {
return targetCards.contains(e) || targetSpells.contains(e) || targetPlayers.contains(e);
}
diff --git a/src/main/java/forge/card/spellability/TargetRestrictions.java b/src/main/java/forge/card/spellability/TargetRestrictions.java
index 6401908348a..7b8fcab579a 100644
--- a/src/main/java/forge/card/spellability/TargetRestrictions.java
+++ b/src/main/java/forge/card/spellability/TargetRestrictions.java
@@ -25,7 +25,7 @@ import java.util.List;
import org.apache.commons.lang.StringUtils;
import forge.Card;
-import forge.ITargetable;
+import forge.GameObject;
import forge.card.CardType;
import forge.card.ability.AbilityUtils;
import forge.game.Game;
@@ -499,9 +499,9 @@ public class TargetRestrictions {
* Check Valid Candidates and Targeting
* @return a List