diff --git a/.gitattributes b/.gitattributes
index 33cda89881a..d25d74d3c5d 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -14035,6 +14035,7 @@ src/main/java/forge/card/ability/AbilityApiBased.java -text
src/main/java/forge/card/ability/AbilityFactory.java svneol=native#text/plain
src/main/java/forge/card/ability/AbilityUtils.java -text
src/main/java/forge/card/ability/ApiType.java -text
+src/main/java/forge/card/ability/SaTargetRountines.java -text
src/main/java/forge/card/ability/SpellAbilityAi.java -text
src/main/java/forge/card/ability/SpellAbilityEffect.java -text
src/main/java/forge/card/ability/SpellApiBased.java -text
@@ -14324,8 +14325,8 @@ src/main/java/forge/card/spellability/SpellAbilityRestriction.java svneol=native
src/main/java/forge/card/spellability/SpellAbilityStackInstance.java svneol=native#text/plain
src/main/java/forge/card/spellability/SpellAbilityVariables.java svneol=native#text/plain
src/main/java/forge/card/spellability/SpellPermanent.java svneol=native#text/plain
-src/main/java/forge/card/spellability/Target.java svneol=native#text/plain
src/main/java/forge/card/spellability/TargetChoices.java svneol=native#text/plain
+src/main/java/forge/card/spellability/TargetRestrictions.java svneol=native#text/plain
src/main/java/forge/card/spellability/TargetSelection.java svneol=native#text/plain
src/main/java/forge/card/spellability/package-info.java svneol=native#text/plain
src/main/java/forge/card/staticability/StaticAbility.java svneol=native#text/plain
diff --git a/src/main/java/forge/Card.java b/src/main/java/forge/Card.java
index a55185b38e9..cd0e917e9c6 100644
--- a/src/main/java/forge/Card.java
+++ b/src/main/java/forge/Card.java
@@ -58,7 +58,7 @@ import forge.card.spellability.AbilityTriggered;
import forge.card.spellability.OptionalCost;
import forge.card.spellability.SpellAbility;
import forge.card.spellability.SpellPermanent;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.card.staticability.StaticAbility;
import forge.card.trigger.Trigger;
import forge.card.trigger.TriggerType;
@@ -5355,7 +5355,7 @@ public class Card extends GameEntity implements Comparable {
for (final SpellAbility sa : source.getCharacteristics().getSpellAbility()) {
final SpellAbility saTargeting = sa.getSATargetingPlayer();
if (saTargeting != null) {
- for (final Player p : saTargeting.getTarget().getTargetPlayers()) {
+ for (final Player p : saTargeting.getTargets().getTargetPlayers()) {
if (!this.getController().equals(p)) {
return false;
}
@@ -5403,7 +5403,7 @@ public class Card extends GameEntity implements Comparable {
for (final SpellAbility sa : source.getCharacteristics().getSpellAbility()) {
final SpellAbility saTargeting = sa.getSATargetingPlayer();
if (saTargeting != null) {
- for (final Player p : saTargeting.getTarget().getTargetPlayers()) {
+ for (final Player p : saTargeting.getTargets().getTargetPlayers()) {
if (!this.getOwner().equals(p)) {
return false;
}
@@ -5504,7 +5504,7 @@ public class Card extends GameEntity implements Comparable {
for (final SpellAbility sa : source.getCharacteristics().getSpellAbility()) {
final SpellAbility saTargeting = sa.getSATargetingCard();
if (saTargeting != null) {
- for (final Card c : saTargeting.getTarget().getTargetCards()) {
+ for (final Card c : saTargeting.getTargets().getTargetCards()) {
if (!this.getEnchantedBy().contains(c) && !this.equals(c.getEnchanting())) {
return false;
}
@@ -5518,7 +5518,7 @@ public class Card extends GameEntity implements Comparable {
for (final SpellAbility sa : source.getCharacteristics().getSpellAbility()) {
final SpellAbility saTargeting = sa.getSATargetingCard();
if (saTargeting != null) {
- for (final Card c : saTargeting.getTarget().getTargetCards()) {
+ for (final Card c : saTargeting.getTargets().getTargetCards()) {
if (this.getEnchantedBy().contains(c)) {
return false;
}
@@ -5549,7 +5549,7 @@ public class Card extends GameEntity implements Comparable {
for (final SpellAbility sa : source.getCharacteristics().getSpellAbility()) {
final SpellAbility saTargeting = sa.getSATargetingCard();
if (saTargeting != null) {
- for (final Card c : saTargeting.getTarget().getTargetCards()) {
+ for (final Card c : saTargeting.getTargets().getTargetCards()) {
if (!this.canBeEnchantedBy(c)) {
return false;
}
@@ -5575,7 +5575,7 @@ public class Card extends GameEntity implements Comparable {
for (final SpellAbility sa : source.getCharacteristics().getSpellAbility()) {
final SpellAbility saTargeting = sa.getSATargetingCard();
if (saTargeting != null) {
- for (final Card c : saTargeting.getTarget().getTargetCards()) {
+ for (final Card c : saTargeting.getTargets().getTargetCards()) {
if (!this.equippedBy.contains(c)) {
return false;
}
@@ -5686,7 +5686,7 @@ public class Card extends GameEntity implements Comparable {
for (final SpellAbility sa : this.getCharacteristics().getSpellAbility()) {
final SpellAbility saTargeting = sa.getSATargetingCard();
if (saTargeting != null) {
- for (final Card c : saTargeting.getTarget().getTargetCards()) {
+ for (final Card c : saTargeting.getTargets().getTargetCards()) {
if (c.equals(source)) {
return true;
}
@@ -8050,9 +8050,9 @@ public class Card extends GameEntity implements Comparable {
*/
public final boolean canBeEnchantedBy(final Card aura) {
final SpellAbility sa = aura.getFirstSpellAbility();
- Target tgt = null;
+ TargetRestrictions tgt = null;
if (sa != null) {
- tgt = sa.getTarget();
+ tgt = sa.getTargetRestrictions();
}
if (this.hasProtectionFrom(aura)
diff --git a/src/main/java/forge/GameLogFormatter.java b/src/main/java/forge/GameLogFormatter.java
index e5579400c57..2a5da2632c9 100644
--- a/src/main/java/forge/GameLogFormatter.java
+++ b/src/main/java/forge/GameLogFormatter.java
@@ -76,7 +76,7 @@ public class GameLogFormatter extends IGameEventVisitor.Base {
StringBuilder sb = new StringBuilder();
sb.append(who).append(action).append(what);
- if (event.sa.getTarget() != null) {
+ if (event.sa.getTargetRestrictions() != null) {
sb.append(" targeting ");
for (TargetChoices ch : event.sa.getAllTargetChoices()) {
if (null != ch) {
diff --git a/src/main/java/forge/card/ability/AbilityApiBased.java b/src/main/java/forge/card/ability/AbilityApiBased.java
index fa397f0f02a..ca26719f1a4 100644
--- a/src/main/java/forge/card/ability/AbilityApiBased.java
+++ b/src/main/java/forge/card/ability/AbilityApiBased.java
@@ -11,7 +11,7 @@ import forge.card.cardfactory.CardFactory;
import forge.card.cost.Cost;
import forge.card.spellability.AbilityActivated;
import forge.card.spellability.AbilityManaPart;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.player.Player;
public class AbilityApiBased extends AbilityActivated {
@@ -20,7 +20,7 @@ public class AbilityApiBased extends AbilityActivated {
private static final long serialVersionUID = -4183793555528531978L;
- public AbilityApiBased(ApiType api0, Card sourceCard, Cost abCost, Target tgt, Map params0) {
+ public AbilityApiBased(ApiType api0, Card sourceCard, Cost abCost, TargetRestrictions tgt, Map params0) {
super(sourceCard, abCost, tgt);
params = params0;
api = api0;
@@ -48,7 +48,7 @@ public class AbilityApiBased extends AbilityActivated {
*/
@Override
public AbilityActivated getCopy() {
- Target tgt = getTarget() == null ? null : new Target(getTarget());
+ TargetRestrictions tgt = getTargetRestrictions() == null ? null : new TargetRestrictions(getTargetRestrictions());
AbilityActivated res = new AbilityApiBased(api, getSourceCard(), getPayCosts(), tgt, params);
CardFactory.copySpellAbility(this, res);
return res;
diff --git a/src/main/java/forge/card/ability/AbilityFactory.java b/src/main/java/forge/card/ability/AbilityFactory.java
index 83cca998c65..d2d5357a022 100644
--- a/src/main/java/forge/card/ability/AbilityFactory.java
+++ b/src/main/java/forge/card/ability/AbilityFactory.java
@@ -28,7 +28,7 @@ import forge.card.spellability.AbilitySub;
import forge.card.spellability.SpellAbility;
import forge.card.spellability.SpellAbilityCondition;
import forge.card.spellability.SpellAbilityRestriction;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.zone.ZoneType;
import forge.util.FileSection;
@@ -55,7 +55,7 @@ public final class AbilityFactory {
return prefix;
}
- public SpellAbility buildSpellAbility(ApiType api, Card hostCard, Cost abCost, Target abTgt, Map mapParams ) {
+ public SpellAbility buildSpellAbility(ApiType api, Card hostCard, Cost abCost, TargetRestrictions abTgt, Map mapParams ) {
switch(this) {
case Ability: return new AbilityApiBased(api, hostCard, abCost, abTgt, mapParams);
case Spell: return new SpellApiBased(api, hostCard, abCost, abTgt, mapParams);
@@ -124,7 +124,7 @@ public final class AbilityFactory {
public static final SpellAbility getAbility(AbilityRecordType type, ApiType api, Map mapParams, Cost abCost, Card hostCard) {
- Target abTgt = mapParams.containsKey("ValidTgts") ? readTarget(mapParams) : null;
+ TargetRestrictions abTgt = mapParams.containsKey("ValidTgts") ? readTarget(mapParams) : null;
if (api == ApiType.CopySpellAbility || api == ApiType.Counter || api == ApiType.ChangeTargets) {
// Since all "CopySpell" ABs copy things on the Stack no need for it to be everywhere
@@ -204,7 +204,7 @@ public final class AbilityFactory {
return spellAbility;
}
- private static final Target readTarget(Map mapParams) {
+ private static final TargetRestrictions readTarget(Map mapParams) {
final String min = mapParams.containsKey("TargetMin") ? mapParams.get("TargetMin") : "1";
final String max = mapParams.containsKey("TargetMax") ? mapParams.get("TargetMax") : "1";
@@ -214,7 +214,7 @@ public final class AbilityFactory {
final String prompt = mapParams.containsKey("TgtPrompt") ? mapParams.get("TgtPrompt") : "Select target " + mapParams.get("ValidTgts");
sb.append(prompt);
- Target abTgt = new Target(prompt, mapParams.get("ValidTgts").split(","), min, max);
+ TargetRestrictions abTgt = new TargetRestrictions(prompt, mapParams.get("ValidTgts").split(","), min, max);
if (mapParams.containsKey("TgtZone")) { // if Targeting
// something
@@ -338,11 +338,11 @@ public final class AbilityFactory {
origin = ZoneType.listValueOf(params.get("Origin"));
}
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
// Don't set the zone if it targets a player
if ((tgt != null) && !tgt.canTgtPlayer()) {
- sa.getTarget().setZone(origin);
+ sa.getTargetRestrictions().setZone(origin);
}
}
diff --git a/src/main/java/forge/card/ability/AbilityUtils.java b/src/main/java/forge/card/ability/AbilityUtils.java
index 810584984bf..01094aed568 100644
--- a/src/main/java/forge/card/ability/AbilityUtils.java
+++ b/src/main/java/forge/card/ability/AbilityUtils.java
@@ -9,6 +9,8 @@ import forge.card.MagicColor;
import forge.card.mana.ManaCostShard;
import org.apache.commons.lang3.StringUtils;
+import com.google.common.collect.Iterables;
+
import forge.Card;
import forge.CardLists;
import forge.CardUtil;
@@ -124,13 +126,13 @@ public class AbilityUtils {
else if (defined.equals("Targeted")) {
final SpellAbility saTargeting = sa.getSATargetingCard();
if (saTargeting != null) {
- cards.addAll(saTargeting.getTarget().getTargetCards());
+ Iterables.addAll(cards, saTargeting.getTargets().getTargetCards());
}
} else if (defined.equals("ParentTarget")) {
final SpellAbility parent = sa.getParentTargetingCard();
if (parent != null) {
- cards.addAll(parent.getTarget().getTargetCards());
+ Iterables.addAll(cards, parent.getTargets().getTargetCards());
}
} else if (defined.startsWith("Triggered") && (sa != null)) {
@@ -445,17 +447,17 @@ public class AbilityUtils {
final ArrayList players = new ArrayList();
final SpellAbility saTargeting = ability.getSATargetingPlayer();
if (null != saTargeting) {
- players.addAll(saTargeting.getTarget().getTargetPlayers());
+ Iterables.addAll(players, saTargeting.getTargets().getTargetPlayers());
}
return CardFactoryUtil.playerXCount(players, calcX[1], card) * multiplier;
}
if (calcX[0].startsWith("TargetedObjects")) {
- final ArrayList
*
- * @param saMe
+ * @param sa
* a {@link forge.card.spellability.SpellAbility} object.
* @param tgt
- * a {@link forge.card.spellability.Target} object.
+ * a {@link forge.card.spellability.TargetRestrictions} object.
* @param dmg
* a int.
* @param mandatory
* a boolean.
* @return a boolean.
*/
- private boolean damageChooseRequiredTargets(final Player ai, final SpellAbility saMe, final Target tgt, final int dmg,
+ private boolean damageChooseRequiredTargets(final Player ai, final SpellAbility sa, final TargetRestrictions tgt, final int dmg,
final boolean mandatory) {
// this is for Triggered targets that are mandatory
- final boolean noPrevention = saMe.hasParam("NoPrevention");
- final boolean divided = saMe.hasParam("DividedAsYouChoose");
+ final boolean noPrevention = sa.hasParam("NoPrevention");
+ final boolean divided = sa.hasParam("DividedAsYouChoose");
- while (tgt.getNumTargeted() < tgt.getMinTargets(saMe.getSourceCard(), saMe)) {
+ while (sa.getTargets().getNumTargeted() < tgt.getMinTargets(sa.getSourceCard(), sa)) {
// TODO: Consider targeting the planeswalker
if (tgt.canTgtCreature()) {
- final Card c = this.dealDamageChooseTgtC(ai, saMe, dmg, noPrevention, ai, mandatory);
+ final Card c = this.dealDamageChooseTgtC(ai, sa, dmg, noPrevention, ai, mandatory);
if (c != null) {
- tgt.addTarget(c);
+ sa.getTargets().add(c);
if (divided) {
tgt.addDividedAllocation(c, dmg);
break;
@@ -436,8 +436,8 @@ public class DamageDealAi extends DamageAiBase {
}
}
- if (saMe.canTarget(ai)) {
- if (tgt.addTarget(ai)) {
+ if (sa.canTarget(ai)) {
+ if (sa.getTargets().add(ai)) {
if (divided) {
tgt.addDividedAllocation(ai, dmg);
break;
@@ -466,7 +466,7 @@ public class DamageDealAi extends DamageAiBase {
source.setSVar("PayX", Integer.toString(dmg));
}
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
if (tgt == null) {
// If it's not mandatory check a few things
if (!mandatory && !this.damageChooseNontargeted(ai, sa, dmg)) {
@@ -481,12 +481,12 @@ public class DamageDealAi extends DamageAiBase {
// If I can kill my target by paying less mana, do it
int actualPay = 0;
final boolean noPrevention = sa.hasParam("NoPrevention");
- final List cards = tgt.getTargetCards();
+
//target is a player
- if (cards.isEmpty()) {
+ if (!sa.getTargets().isTargetingAnyCard()) {
actualPay = dmg;
}
- for (final Card c : cards) {
+ for (final Card c : sa.getTargets().getTargetCards()) {
final int adjDamage = ComputerUtilCombat.getEnoughDamageToKill(c, dmg, source, false, noPrevention);
if (adjDamage > actualPay) {
actualPay = adjDamage;
diff --git a/src/main/java/forge/card/ability/ai/DamageEachAi.java b/src/main/java/forge/card/ability/ai/DamageEachAi.java
index f2cdd5293e9..d21feb44333 100644
--- a/src/main/java/forge/card/ability/ai/DamageEachAi.java
+++ b/src/main/java/forge/card/ability/ai/DamageEachAi.java
@@ -3,7 +3,7 @@ package forge.card.ability.ai;
import forge.card.ability.AbilityUtils;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.player.Player;
public class DamageEachAi extends DamageAiBase {
@@ -13,11 +13,11 @@ public class DamageEachAi extends DamageAiBase {
*/
@Override
protected boolean canPlayAI(Player ai, SpellAbility sa) {
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
if (tgt != null && sa.canTarget(ai.getOpponent())) {
- tgt.resetTargets();
- sa.getTarget().addTarget(ai.getOpponent());
+ sa.resetTargets();
+ sa.getTargets().add(ai.getOpponent());
}
final String damage = sa.getParam("NumDmg");
diff --git a/src/main/java/forge/card/ability/ai/DamagePreventAi.java b/src/main/java/forge/card/ability/ai/DamagePreventAi.java
index 7df9f7ad0d3..2f01f74a1fb 100644
--- a/src/main/java/forge/card/ability/ai/DamagePreventAi.java
+++ b/src/main/java/forge/card/ability/ai/DamagePreventAi.java
@@ -11,7 +11,7 @@ import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityAi;
import forge.card.cost.Cost;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.Game;
import forge.game.ai.ComputerUtil;
import forge.game.ai.ComputerUtilCard;
@@ -49,7 +49,7 @@ public class DamagePreventAi extends SpellAbilityAi {
return false;
}
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
if (tgt == null) {
// As far as I can tell these Defined Cards will only have one of
// them
@@ -57,7 +57,7 @@ public class DamagePreventAi extends SpellAbilityAi {
// react to threats on the stack
if (!game.getStack().isEmpty()) {
- final ArrayList 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;
@@ -91,14 +91,14 @@ public class DamagePreventAi extends SpellAbilityAi {
// react to threats on the stack
else if (!game.getStack().isEmpty()) {
- tgt.resetTargets();
+ sa.resetTargets();
// check stack for something on the stack will kill anything i
// control
final ArrayList objects = new ArrayList();
// AbilityFactory.predictThreatenedObjects(af);
if (objects.contains(ai)) {
- tgt.addTarget(ai);
+ sa.getTargets().add(ai);
}
final List threatenedTargets = new ArrayList();
@@ -114,7 +114,7 @@ public class DamagePreventAi extends SpellAbilityAi {
if (!threatenedTargets.isEmpty()) {
// Choose "best" of the remaining to save
- tgt.addTarget(ComputerUtilCard.getBestCreatureAI(threatenedTargets));
+ sa.getTargets().add(ComputerUtilCard.getBestCreatureAI(threatenedTargets));
chance = true;
}
@@ -123,7 +123,7 @@ public class DamagePreventAi extends SpellAbilityAi {
if (sa.canTarget(ai) && ComputerUtilCombat.wouldLoseLife(ai, game.getCombat())
&& (ComputerUtilCombat.lifeInDanger(ai, game.getCombat()) || sa.isAbility())
&& game.getPhaseHandler().isPlayerTurn(ai.getOpponent())) {
- tgt.addTarget(ai);
+ sa.getTargets().add(ai);
chance = true;
} else {
// filter AIs battlefield by what I can target
@@ -139,7 +139,7 @@ public class DamagePreventAi extends SpellAbilityAi {
for (final Card c : combatants) {
if (ComputerUtilCombat.combatantWouldBeDestroyed(ai, c)) {
- tgt.addTarget(c);
+ sa.getTargets().add(c);
chance = true;
break;
}
@@ -153,7 +153,7 @@ public class DamagePreventAi extends SpellAbilityAi {
@Override
protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) {
boolean chance = false;
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
if (tgt == null) {
// If there's no target on the trigger, just say yes.
chance = true;
@@ -179,8 +179,8 @@ public class DamagePreventAi extends SpellAbilityAi {
*/
private boolean preventDamageMandatoryTarget(final Player ai, final SpellAbility sa,
final boolean mandatory) {
- final Target tgt = sa.getTarget();
- tgt.resetTargets();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
+ sa.resetTargets();
// filter AIs battlefield by what I can target
final Game game = ai.getGame();
List targetables = game.getCardsIn(ZoneType.Battlefield);
@@ -201,7 +201,7 @@ public class DamagePreventAi extends SpellAbilityAi {
if (game.getPhaseHandler().is(PhaseType.COMBAT_DECLARE_BLOCKERS)) {
for (final Card c : combatants) {
if (ComputerUtilCombat.combatantWouldBeDestroyed(ai, c)) {
- tgt.addTarget(c);
+ sa.getTargets().add(c);
return true;
}
}
@@ -210,11 +210,11 @@ public class DamagePreventAi extends SpellAbilityAi {
// TODO see if something on the stack is about to kill something I
// can target
- tgt.addTarget(combatants.get(0));
+ sa.getTargets().add(combatants.get(0));
return true;
}
- tgt.addTarget(ComputerUtilCard.getCheapestPermanentAI(targetables, sa, true));
+ sa.getTargets().add(ComputerUtilCard.getCheapestPermanentAI(targetables, sa, true));
return true;
}
diff --git a/src/main/java/forge/card/ability/ai/DebuffAi.java b/src/main/java/forge/card/ability/ai/DebuffAi.java
index 7f9c45f1c79..20ca1d693dc 100644
--- a/src/main/java/forge/card/ability/ai/DebuffAi.java
+++ b/src/main/java/forge/card/ability/ai/DebuffAi.java
@@ -13,7 +13,7 @@ import forge.card.ability.SpellAbilityAi;
import forge.card.cost.Cost;
import forge.card.spellability.SpellAbility;
import forge.card.spellability.SpellAbilityRestriction;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.ai.ComputerUtilCard;
import forge.game.ai.ComputerUtilCost;
import forge.game.phase.PhaseHandler;
@@ -30,7 +30,7 @@ public class DebuffAi extends SpellAbilityAi {
protected boolean canPlayAI(final Player ai, final SpellAbility sa) {
// if there is no target and host card isn't in play, don't activate
final Card source = sa.getSourceCard();
- if ((sa.getTarget() == null) && !source.isInPlay()) {
+ if ((sa.getTargetRestrictions() == null) && !source.isInPlay()) {
return false;
}
@@ -70,7 +70,7 @@ public class DebuffAi extends SpellAbilityAi {
return false;
}
- if ((sa.getTarget() == null) || !sa.getTarget().doesTarget()) {
+ if ((sa.getTargetRestrictions() == null) || !sa.getTargetRestrictions().doesTarget()) {
List cards = AbilityUtils.getDefinedCards(sa.getSourceCard(), sa.getParam("Defined"), sa);
if (!cards.isEmpty()) {
@@ -97,7 +97,7 @@ public class DebuffAi extends SpellAbilityAi {
@Override
public boolean chkAIDrawback(SpellAbility sa, Player ai) {
- if ((sa.getTarget() == null) || !sa.getTarget().doesTarget()) {
+ if ((sa.getTargetRestrictions() == null) || !sa.getTargetRestrictions().doesTarget()) {
// TODO - copied from AF_Pump.pumpDrawbackAI() - what should be
// here?
} else {
@@ -128,8 +128,8 @@ public class DebuffAi extends SpellAbilityAi {
return false;
}
- final Target tgt = sa.getTarget();
- tgt.resetTargets();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
+ sa.resetTargets();
List list = getCurseCreatures(ai, sa, kws);
list = CardLists.getValidCards(list, tgt.getValidTgts(), sa.getActivatingPlayer(), sa.getSourceCard());
@@ -144,17 +144,17 @@ public class DebuffAi extends SpellAbilityAi {
return mandatory && debuffMandatoryTarget(ai, sa, mandatory);
}
- while (tgt.getNumTargeted() < tgt.getMaxTargets(sa.getSourceCard(), sa)) {
+ while (sa.getTargets().getNumTargeted() < tgt.getMaxTargets(sa.getSourceCard(), sa)) {
Card t = null;
// boolean goodt = false;
if (list.isEmpty()) {
- if ((tgt.getNumTargeted() < tgt.getMinTargets(sa.getSourceCard(), sa)) || (tgt.getNumTargeted() == 0)) {
+ if ((sa.getTargets().getNumTargeted() < tgt.getMinTargets(sa.getSourceCard(), sa)) || (sa.getTargets().getNumTargeted() == 0)) {
if (mandatory) {
return debuffMandatoryTarget(ai, sa, mandatory);
}
- tgt.resetTargets();
+ sa.resetTargets();
return false;
} else {
// TODO is this good enough? for up to amounts?
@@ -163,7 +163,7 @@ public class DebuffAi extends SpellAbilityAi {
}
t = ComputerUtilCard.getBestCreatureAI(list);
- tgt.addTarget(t);
+ sa.getTargets().add(t);
list.remove(t);
}
@@ -216,16 +216,16 @@ public class DebuffAi extends SpellAbilityAi {
*/
private boolean debuffMandatoryTarget(final Player ai, final SpellAbility sa, final boolean mandatory) {
List list = ai.getGame().getCardsIn(ZoneType.Battlefield);
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
list = CardLists.getValidCards(list, tgt.getValidTgts(), sa.getActivatingPlayer(), sa.getSourceCard());
if (list.size() < tgt.getMinTargets(sa.getSourceCard(), sa)) {
- tgt.resetTargets();
+ sa.resetTargets();
return false;
}
// Remove anything that's already been targeted
- for (final Card c : tgt.getTargetCards()) {
+ for (final Card c : sa.getTargets().getTargetCards()) {
list.remove(c);
}
@@ -233,7 +233,7 @@ public class DebuffAi extends SpellAbilityAi {
final List forced = CardLists.filterControlledBy(list, ai);
final Card source = sa.getSourceCard();
- while (tgt.getNumTargeted() < tgt.getMaxTargets(source, sa)) {
+ while (sa.getTargets().getNumTargeted() < tgt.getMaxTargets(source, sa)) {
if (pref.isEmpty()) {
break;
}
@@ -247,10 +247,10 @@ public class DebuffAi extends SpellAbilityAi {
pref.remove(c);
- tgt.addTarget(c);
+ sa.getTargets().add(c);
}
- while (tgt.getNumTargeted() < tgt.getMinTargets(sa.getSourceCard(), sa)) {
+ while (sa.getTargets().getNumTargeted() < tgt.getMinTargets(sa.getSourceCard(), sa)) {
if (forced.isEmpty()) {
break;
}
@@ -266,11 +266,11 @@ public class DebuffAi extends SpellAbilityAi {
forced.remove(c);
- tgt.addTarget(c);
+ sa.getTargets().add(c);
}
- if (tgt.getNumTargeted() < tgt.getMinTargets(sa.getSourceCard(), sa)) {
- tgt.resetTargets();
+ if (sa.getTargets().getNumTargeted() < tgt.getMinTargets(sa.getSourceCard(), sa)) {
+ sa.resetTargets();
return false;
}
@@ -281,7 +281,7 @@ public class DebuffAi extends SpellAbilityAi {
protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) {
final List kws = sa.hasParam("Keywords") ? Arrays.asList(sa.getParam("Keywords").split(" & ")) : new ArrayList();
- if (sa.getTarget() == null) {
+ if (sa.getTargetRestrictions() == null) {
if (mandatory) {
return true;
}
diff --git a/src/main/java/forge/card/ability/ai/DestroyAi.java b/src/main/java/forge/card/ability/ai/DestroyAi.java
index 0ef05b45e15..d52757477c7 100644
--- a/src/main/java/forge/card/ability/ai/DestroyAi.java
+++ b/src/main/java/forge/card/ability/ai/DestroyAi.java
@@ -15,7 +15,7 @@ import forge.card.cost.Cost;
import forge.card.cost.CostPart;
import forge.card.cost.CostSacrifice;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.ai.ComputerUtil;
import forge.game.ai.ComputerUtilCard;
import forge.game.ai.ComputerUtilCost;
@@ -41,7 +41,7 @@ public class DestroyAi extends SpellAbilityAi {
// based on what the expected targets could be
final Random r = MyRandom.getRandom();
final Cost abCost = sa.getPayCosts();
- final Target abTgt = sa.getTarget();
+ final TargetRestrictions abTgt = sa.getTargetRestrictions();
final Card source = sa.getSourceCard();
final boolean noRegen = sa.hasParam("NoRegen");
List list;
@@ -65,7 +65,7 @@ public class DestroyAi extends SpellAbilityAi {
// Targeting
if (abTgt != null) {
- abTgt.resetTargets();
+ sa.resetTargets();
list = CardLists.getTargetableCards(ai.getOpponent().getCardsIn(ZoneType.Battlefield), sa);
list = CardLists.getValidCards(list, abTgt.getValidTgts(), source.getController(), source);
if (sa.hasParam("AITgts")) {
@@ -113,11 +113,11 @@ public class DestroyAi extends SpellAbilityAi {
return false;
}
// target loop
- while (abTgt.getNumTargeted() < abTgt.getMaxTargets(sa.getSourceCard(), sa)) {
+ while (sa.getTargets().getNumTargeted() < abTgt.getMaxTargets(sa.getSourceCard(), sa)) {
if (list.size() == 0) {
- if ((abTgt.getNumTargeted() < abTgt.getMinTargets(sa.getSourceCard(), sa))
- || (abTgt.getNumTargeted() == 0)) {
- abTgt.resetTargets();
+ if ((sa.getTargets().getNumTargeted() < abTgt.getMinTargets(sa.getSourceCard(), sa))
+ || (sa.getTargets().getNumTargeted() == 0)) {
+ sa.resetTargets();
return false;
} else {
// TODO is this good enough? for up to amounts?
@@ -136,9 +136,9 @@ public class DestroyAi extends SpellAbilityAi {
}
if (choice == null) { // can't find anything left
- if ((abTgt.getNumTargeted() < abTgt.getMinTargets(sa.getSourceCard(), sa))
- || (abTgt.getNumTargeted() == 0)) {
- abTgt.resetTargets();
+ if ((sa.getTargets().getNumTargeted() < abTgt.getMinTargets(sa.getSourceCard(), sa))
+ || (sa.getTargets().getNumTargeted() == 0)) {
+ sa.resetTargets();
return false;
} else {
// TODO is this good enough? for up to amounts?
@@ -146,7 +146,7 @@ public class DestroyAi extends SpellAbilityAi {
}
}
list.remove(choice);
- abTgt.addTarget(choice);
+ sa.getTargets().add(choice);
}
} else {
if (sa.hasParam("Defined")) {
@@ -164,7 +164,7 @@ public class DestroyAi extends SpellAbilityAi {
@Override
protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) {
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
final Card source = sa.getSourceCard();
final boolean noRegen = sa.hasParam("NoRegen");
final Player opp = ai.getOpponent();
@@ -178,7 +178,7 @@ public class DestroyAi extends SpellAbilityAi {
return false;
}
- tgt.resetTargets();
+ sa.resetTargets();
List preferred = CardLists.getNotKeyword(list, "Indestructible");
preferred = CardLists.filterControlledBy(preferred, opp);
@@ -200,12 +200,12 @@ public class DestroyAi extends SpellAbilityAi {
list.remove(c);
}
- while (tgt.getNumTargeted() < tgt.getMaxTargets(sa.getSourceCard(), sa)) {
+ while (sa.getTargets().getNumTargeted() < tgt.getMaxTargets(sa.getSourceCard(), sa)) {
if (preferred.size() == 0) {
- if ((tgt.getNumTargeted() == 0)
- || (tgt.getNumTargeted() < tgt.getMinTargets(sa.getSourceCard(), sa))) {
+ if ((sa.getTargets().getNumTargeted() == 0)
+ || (sa.getTargets().getNumTargeted() < tgt.getMinTargets(sa.getSourceCard(), sa))) {
if (!mandatory) {
- tgt.resetTargets();
+ sa.resetTargets();
return false;
} else {
break;
@@ -222,12 +222,12 @@ public class DestroyAi extends SpellAbilityAi {
} else {
c = ComputerUtilCard.getMostExpensivePermanentAI(preferred, sa, false);
}
- tgt.addTarget(c);
+ sa.getTargets().add(c);
preferred.remove(c);
}
}
- while (tgt.getNumTargeted() < tgt.getMinTargets(sa.getSourceCard(), sa)) {
+ while (sa.getTargets().getNumTargeted() < tgt.getMinTargets(sa.getSourceCard(), sa)) {
if (list.size() == 0) {
break;
} else {
@@ -237,12 +237,12 @@ public class DestroyAi extends SpellAbilityAi {
} else {
c = ComputerUtilCard.getCheapestPermanentAI(list, sa, false);
}
- tgt.addTarget(c);
+ sa.getTargets().add(c);
list.remove(c);
}
}
- if (tgt.getNumTargeted() < tgt.getMinTargets(sa.getSourceCard(), sa)) {
+ if (sa.getTargets().getNumTargeted() < tgt.getMinTargets(sa.getSourceCard(), sa)) {
return false;
}
} else {
diff --git a/src/main/java/forge/card/ability/ai/DestroyAllAi.java b/src/main/java/forge/card/ability/ai/DestroyAllAi.java
index cf61e8a5b57..f403f25b5cc 100644
--- a/src/main/java/forge/card/ability/ai/DestroyAllAi.java
+++ b/src/main/java/forge/card/ability/ai/DestroyAllAi.java
@@ -10,7 +10,6 @@ import forge.CardLists;
import forge.card.ability.SpellAbilityAi;
import forge.card.cost.Cost;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
import forge.game.ai.ComputerUtilCard;
import forge.game.ai.ComputerUtilCost;
import forge.game.ai.ComputerUtilMana;
@@ -33,7 +32,6 @@ public class DestroyAllAi extends SpellAbilityAi {
@Override
protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) {
final Card source = sa.getSourceCard();
- final Target tgt = sa.getTarget();
String valid = "";
if (mandatory) {
return true;
@@ -41,13 +39,12 @@ public class DestroyAllAi extends SpellAbilityAi {
if (sa.hasParam("ValidCards")) {
valid = sa.getParam("ValidCards");
}
- List humanlist =
- CardLists.getValidCards(ai.getOpponent().getCardsIn(ZoneType.Battlefield), valid.split(","), source.getController(), source);
- List computerlist =
- CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), valid.split(","), source.getController(), source);
- if (sa.getTarget() != null) {
- tgt.resetTargets();
- sa.getTarget().addTarget(ai.getOpponent());
+ List humanlist = CardLists.getValidCards(ai.getOpponent().getCardsIn(ZoneType.Battlefield), valid.split(","), source.getController(), source);
+ List computerlist = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), valid.split(","), source.getController(), source);
+
+ if (sa.usesTargeting()) {
+ sa.resetTargets();
+ sa.getTargets().add(ai.getOpponent());
computerlist.clear();
}
@@ -98,15 +95,11 @@ public class DestroyAllAi extends SpellAbilityAi {
valid = valid.replace("X", Integer.toString(xPay));
}
- final Target tgt = sa.getTarget();
-
- List humanlist =
- CardLists.getValidCards(ai.getOpponent().getCardsIn(ZoneType.Battlefield), valid.split(","), source.getController(), source);
- List computerlist =
- CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), valid.split(","), source.getController(), source);
- if (sa.getTarget() != null) {
- tgt.resetTargets();
- sa.getTarget().addTarget(ai.getOpponent());
+ List humanlist = CardLists.getValidCards(ai.getOpponent().getCardsIn(ZoneType.Battlefield), valid.split(","), source.getController(), source);
+ List computerlist = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), valid.split(","), source.getController(), source);
+ if (sa.usesTargeting()) {
+ sa.resetTargets();
+ sa.getTargets().add(ai.getOpponent());
computerlist.clear();
}
diff --git a/src/main/java/forge/card/ability/ai/DigAi.java b/src/main/java/forge/card/ability/ai/DigAi.java
index e0402343f11..4cd8429e955 100644
--- a/src/main/java/forge/card/ability/ai/DigAi.java
+++ b/src/main/java/forge/card/ability/ai/DigAi.java
@@ -6,7 +6,6 @@ import forge.Card;
import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityAi;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
import forge.game.ai.ComputerUtil;
import forge.game.phase.PhaseType;
import forge.game.player.Player;
@@ -24,15 +23,14 @@ public class DigAi extends SpellAbilityAi {
Player opp = ai.getOpponent();
final Card host = sa.getSourceCard();
- final Target tgt = sa.getTarget();
Player libraryOwner = ai;
- if (sa.getTarget() != null) {
- tgt.resetTargets();
+ if (sa.usesTargeting()) {
+ sa.resetTargets();
if (!opp.canBeTargetedBy(sa)) {
return false;
} else {
- sa.getTarget().addTarget(opp);
+ sa.getTargets().add(opp);
}
libraryOwner = opp;
}
@@ -68,11 +66,9 @@ public class DigAi extends SpellAbilityAi {
@Override
protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) {
- final Target tgt = sa.getTarget();
-
- if (sa.getTarget() != null) {
- tgt.resetTargets();
- sa.getTarget().addTarget(ai);
+ if (sa.usesTargeting()) {
+ sa.resetTargets();
+ sa.getTargets().add(ai);
}
return true;
diff --git a/src/main/java/forge/card/ability/ai/DigUntilAi.java b/src/main/java/forge/card/ability/ai/DigUntilAi.java
index 0baee0c1a58..abed6fd5f16 100644
--- a/src/main/java/forge/card/ability/ai/DigUntilAi.java
+++ b/src/main/java/forge/card/ability/ai/DigUntilAi.java
@@ -7,7 +7,6 @@ import forge.CardLists;
import forge.card.ability.SpellAbilityAi;
import forge.card.spellability.AbilitySub;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
import forge.game.ai.ComputerUtilMana;
import forge.game.player.Player;
import forge.game.zone.ZoneType;
@@ -26,16 +25,15 @@ public class DigUntilAi extends SpellAbilityAi {
final Random r = MyRandom.getRandom();
final boolean randomReturn = r.nextFloat() <= Math.pow(chance, sa.getActivationsThisTurn() + 1);
- final Target tgt = sa.getTarget();
Player libraryOwner = ai;
Player opp = ai.getOpponent();
- if (sa.getTarget() != null) {
- tgt.resetTargets();
+ if (sa.usesTargeting()) {
+ sa.resetTargets();
if (!opp.canBeTargetedBy(sa)) {
return false;
} else {
- sa.getTarget().addTarget(opp);
+ sa.getTargets().add(opp);
}
libraryOwner = opp;
} else {
@@ -70,14 +68,12 @@ public class DigUntilAi extends SpellAbilityAi {
@Override
protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) {
- final Target tgt = sa.getTarget();
-
- if (sa.getTarget() != null) {
- tgt.resetTargets();
+ if (sa.usesTargeting()) {
+ sa.resetTargets();
if (sa.isCurse()) {
- sa.getTarget().addTarget(ai.getOpponent());
+ sa.getTargets().add(ai.getOpponent());
} else {
- sa.getTarget().addTarget(ai);
+ sa.getTargets().add(ai);
}
}
diff --git a/src/main/java/forge/card/ability/ai/DiscardAi.java b/src/main/java/forge/card/ability/ai/DiscardAi.java
index 2c5c794ce9c..ad4b4ce9888 100644
--- a/src/main/java/forge/card/ability/ai/DiscardAi.java
+++ b/src/main/java/forge/card/ability/ai/DiscardAi.java
@@ -8,7 +8,7 @@ import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityAi;
import forge.card.cost.Cost;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.ai.ComputerUtil;
import forge.game.ai.ComputerUtilCost;
import forge.game.ai.ComputerUtilMana;
@@ -22,7 +22,7 @@ public class DiscardAi extends SpellAbilityAi {
@Override
protected boolean canPlayAI(Player ai, SpellAbility sa) {
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
final Card source = sa.getSourceCard();
final Cost abCost = sa.getPayCosts();
@@ -113,14 +113,14 @@ public class DiscardAi extends SpellAbilityAi {
} // discardCanPlayAI()
private boolean discardTargetAI(final Player ai, final SpellAbility sa) {
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
Player opp = ai.getOpponent();
if (opp.getCardsIn(ZoneType.Hand).isEmpty()) {
return false;
}
if (tgt != null) {
if (sa.canTarget(opp)) {
- tgt.addTarget(opp);
+ sa.getTargets().add(opp);
return true;
}
}
@@ -131,14 +131,14 @@ public class DiscardAi extends SpellAbilityAi {
@Override
protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) {
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
if (tgt != null) {
Player opp = ai.getOpponent();
if (!discardTargetAI(ai, sa)) {
if (mandatory && sa.canTarget(opp)) {
- tgt.addTarget(opp);
+ sa.getTargets().add(opp);
} else if (mandatory && sa.canTarget(ai)) {
- tgt.addTarget(ai);
+ sa.getTargets().add(ai);
} else {
return false;
}
@@ -159,7 +159,7 @@ public class DiscardAi extends SpellAbilityAi {
public boolean chkAIDrawback(SpellAbility sa, Player ai) {
// Drawback AI improvements
// if parent draws cards, make sure cards in hand + cards drawn > 0
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
if (tgt != null) {
return discardTargetAI(ai, sa);
}
diff --git a/src/main/java/forge/card/ability/ai/DrainManaAi.java b/src/main/java/forge/card/ability/ai/DrainManaAi.java
index bd9c620aed3..0f45772bdf4 100644
--- a/src/main/java/forge/card/ability/ai/DrainManaAi.java
+++ b/src/main/java/forge/card/ability/ai/DrainManaAi.java
@@ -7,7 +7,7 @@ import forge.Card;
import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityAi;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.player.Player;
import forge.util.MyRandom;
@@ -17,7 +17,7 @@ public class DrainManaAi extends SpellAbilityAi {
protected boolean canPlayAI(Player ai, SpellAbility sa) {
// AI cannot use this properly until he can use SAs during Humans turn
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
final Card source = sa.getSourceCard();
final Player opp = ai.getOpponent();
final Random r = MyRandom.getRandom();
@@ -33,8 +33,8 @@ public class DrainManaAi extends SpellAbilityAi {
return false;
}
} else {
- tgt.resetTargets();
- tgt.addTarget(opp);
+ sa.resetTargets();
+ sa.getTargets().add(opp);
}
return randomReturn;
@@ -44,7 +44,7 @@ public class DrainManaAi extends SpellAbilityAi {
protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) {
final Player opp = ai.getOpponent();
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
final Card source = sa.getSourceCard();
if (null == tgt) {
@@ -60,8 +60,8 @@ public class DrainManaAi extends SpellAbilityAi {
return true;
} else {
- tgt.resetTargets();
- tgt.addTarget(opp);
+ sa.resetTargets();
+ sa.getTargets().add(opp);
}
return true;
@@ -70,7 +70,7 @@ public class DrainManaAi extends SpellAbilityAi {
@Override
public boolean chkAIDrawback(SpellAbility sa, Player ai) {
// AI cannot use this properly until he can use SAs during Humans turn
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
final Card source = sa.getSourceCard();
boolean randomReturn = true;
@@ -82,8 +82,8 @@ public class DrainManaAi extends SpellAbilityAi {
return false;
}
} else {
- tgt.resetTargets();
- tgt.addTarget(ai.getOpponent());
+ sa.resetTargets();
+ sa.getTargets().add(ai.getOpponent());
}
return randomReturn;
diff --git a/src/main/java/forge/card/ability/ai/DrawAi.java b/src/main/java/forge/card/ability/ai/DrawAi.java
index 5cb90206545..2d48b6a05c8 100644
--- a/src/main/java/forge/card/ability/ai/DrawAi.java
+++ b/src/main/java/forge/card/ability/ai/DrawAi.java
@@ -18,7 +18,6 @@
*/
package forge.card.ability.ai;
-import java.util.List;
import java.util.Random;
import forge.Card;
@@ -30,7 +29,7 @@ import forge.card.cost.CostPart;
import forge.card.cost.PaymentDecision;
import forge.card.spellability.AbilitySub;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.Game;
import forge.game.ai.ComputerUtil;
import forge.game.ai.ComputerUtilCost;
@@ -53,7 +52,7 @@ public class DrawAi extends SpellAbilityAi {
*/
@Override
protected boolean canPlayAI(Player ai, SpellAbility sa) {
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
final Card source = sa.getSourceCard();
final Cost abCost = sa.getPayCosts();
final Game game = ai.getGame();
@@ -95,8 +94,8 @@ public class DrawAi extends SpellAbilityAi {
}
if (tgt != null) {
- final List players = tgt.getTargetPlayers();
- if ((players.size() > 0) && players.get(0).isOpponentOf(ai)) {
+ final Player player = sa.getTargets().getFirstTargetedPlayer();
+ if (player != null && player.isOpponentOf(ai)) {
return true;
}
}
@@ -139,7 +138,7 @@ public class DrawAi extends SpellAbilityAi {
}
private boolean targetAI(final Player ai, final SpellAbility sa, final boolean mandatory) {
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
final Card source = sa.getSourceCard();
final boolean drawback = (sa instanceof AbilitySub);
final Game game = ai.getGame();
@@ -180,7 +179,7 @@ public class DrawAi extends SpellAbilityAi {
if (tgt != null) {
// ability is targeted
- tgt.resetTargets();
+ sa.resetTargets();
final boolean canTgtHuman = sa.canTarget(opp);
final boolean canTgtComp = sa.canTarget(ai);
@@ -192,7 +191,7 @@ public class DrawAi extends SpellAbilityAi {
if (canTgtHuman && !opp.cantLose() && numCards >= humanLibrarySize) {
// Deck the Human? DO IT!
- tgt.addTarget(opp);
+ sa.getTargets().add(opp);
return true;
}
@@ -228,9 +227,9 @@ public class DrawAi extends SpellAbilityAi {
}
if ((!tgtHuman || !canTgtHuman) && canTgtComp) {
- tgt.addTarget(ai);
+ sa.getTargets().add(ai);
} else if (mandatory && canTgtHuman) {
- tgt.addTarget(opp);
+ sa.getTargets().add(opp);
} else {
return false;
}
diff --git a/src/main/java/forge/card/ability/ai/EffectAi.java b/src/main/java/forge/card/ability/ai/EffectAi.java
index 90e9383056f..c7687f2a7c7 100644
--- a/src/main/java/forge/card/ability/ai/EffectAi.java
+++ b/src/main/java/forge/card/ability/ai/EffectAi.java
@@ -9,7 +9,7 @@ import forge.Card;
import forge.CardLists;
import forge.card.ability.SpellAbilityAi;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.Game;
import forge.game.ai.ComputerUtilCard;
import forge.game.ai.ComputerUtilCombat;
@@ -58,9 +58,9 @@ public class EffectAi extends SpellAbilityAi {
if (!ComputerUtilCombat.lifeInDanger(ai, game.getCombat())) {
return false;
}
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
if (tgt != null) {
- tgt.resetTargets();
+ sa.resetTargets();
List list = game.getCombat().getAttackers();
list = CardLists.getValidCards(list, tgt.getValidTgts(), sa.getActivatingPlayer(), sa.getSourceCard());
list = CardLists.getTargetableCards(list, sa);
@@ -68,7 +68,7 @@ public class EffectAi extends SpellAbilityAi {
if (target == null) {
return false;
}
- tgt.addTarget(target);
+ sa.getTargets().add(target);
}
randomReturn = true;
} else if (logic.equals("Always")) {
@@ -109,13 +109,13 @@ public class EffectAi extends SpellAbilityAi {
}
}
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
if (tgt != null && tgt.canTgtPlayer()) {
- tgt.resetTargets();
+ sa.resetTargets();
if (tgt.canOnlyTgtOpponent() || logic.equals("BeginningOfOppTurn")) {
- tgt.addTarget(ai.getOpponent());
+ sa.getTargets().add(ai.getOpponent());
} else {
- tgt.addTarget(ai);
+ sa.getTargets().add(ai);
}
}
@@ -125,15 +125,14 @@ public class EffectAi extends SpellAbilityAi {
@Override
protected boolean doTriggerAINoCost(Player aiPlayer, SpellAbility sa, boolean mandatory) {
- final Target tgt = sa.getTarget();
final Player opp = aiPlayer.getOpponent();
- if (sa.getTarget() != null) {
- tgt.resetTargets();
+ if (sa.usesTargeting()) {
+ sa.resetTargets();
if (mandatory && sa.canTarget(opp)) {
- sa.getTarget().addTarget(opp);
+ sa.getTargets().add(opp);
} else if (mandatory && sa.canTarget(aiPlayer)) {
- sa.getTarget().addTarget(aiPlayer);
+ sa.getTargets().add(aiPlayer);
}
}
diff --git a/src/main/java/forge/card/ability/ai/FightAi.java b/src/main/java/forge/card/ability/ai/FightAi.java
index acaeb2f1181..e1b9f06b9e8 100644
--- a/src/main/java/forge/card/ability/ai/FightAi.java
+++ b/src/main/java/forge/card/ability/ai/FightAi.java
@@ -7,7 +7,6 @@ import forge.Card;
import forge.CardLists;
import forge.card.ability.SpellAbilityAi;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
import forge.game.ai.ComputerUtil;
import forge.game.ai.ComputerUtilCombat;
import forge.game.player.Player;
@@ -20,8 +19,7 @@ public class FightAi extends SpellAbilityAi {
*/
@Override
protected boolean canPlayAI(Player ai, SpellAbility sa) {
- Target tgt = sa.getTarget();
- tgt.resetTargets();
+ sa.resetTargets();
List aiCreatures = ai.getCreaturesInPlay();
aiCreatures = CardLists.getTargetableCards(aiCreatures, sa);
@@ -42,12 +40,12 @@ public class FightAi extends SpellAbilityAi {
if (ComputerUtilCombat.getDamageToKill(humanCreature) <= aiCreature.getNetAttack()
&& humanCreature.getNetAttack() < ComputerUtilCombat.getDamageToKill(aiCreature)) {
// todo: check min/max targets; see if we picked the best matchup
- tgt.addTarget(humanCreature);
- tgt.addTarget(aiCreature);
+ sa.getTargets().add(humanCreature);
+ sa.getTargets().add(aiCreature);
return true;
} else if (humanCreature.getSVar("Targeting").equals("Dies")) {
- tgt.addTarget(humanCreature);
- tgt.addTarget(aiCreature);
+ sa.getTargets().add(humanCreature);
+ sa.getTargets().add(aiCreature);
return true;
}
}
@@ -67,8 +65,8 @@ public class FightAi extends SpellAbilityAi {
if (ComputerUtilCombat.getDamageToKill(creature1) <= creature2.getNetAttack()
&& creature1.getNetAttack() >= ComputerUtilCombat.getDamageToKill(creature2)) {
// todo: check min/max targets; see if we picked the best matchup
- tgt.addTarget(creature1);
- tgt.addTarget(creature2);
+ sa.getTargets().add(creature1);
+ sa.getTargets().add(creature2);
return true;
}
}
diff --git a/src/main/java/forge/card/ability/ai/GameLossAi.java b/src/main/java/forge/card/ability/ai/GameLossAi.java
index 8c5876051ec..133b5f4898a 100644
--- a/src/main/java/forge/card/ability/ai/GameLossAi.java
+++ b/src/main/java/forge/card/ability/ai/GameLossAi.java
@@ -2,7 +2,7 @@ package forge.card.ability.ai;
import forge.card.ability.SpellAbilityAi;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.player.Player;
public class GameLossAi extends SpellAbilityAi {
@@ -16,10 +16,10 @@ public class GameLossAi extends SpellAbilityAi {
// Only one SA Lose the Game card right now, which is Door to
// Nothingness
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
if (tgt != null) {
- tgt.resetTargets();
- tgt.addTarget(opp);
+ sa.resetTargets();
+ sa.getTargets().add(opp);
}
// In general, don't return true.
@@ -38,10 +38,10 @@ public class GameLossAi extends SpellAbilityAi {
return false;
}
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
if (tgt != null) {
- tgt.resetTargets();
- tgt.addTarget(ai.getOpponent());
+ sa.resetTargets();
+ sa.getTargets().add(ai.getOpponent());
}
return true;
diff --git a/src/main/java/forge/card/ability/ai/LifeExchangeAi.java b/src/main/java/forge/card/ability/ai/LifeExchangeAi.java
index 362dc3199f6..4c6f2acd2e2 100644
--- a/src/main/java/forge/card/ability/ai/LifeExchangeAi.java
+++ b/src/main/java/forge/card/ability/ai/LifeExchangeAi.java
@@ -4,7 +4,7 @@ import java.util.Random;
import forge.card.ability.SpellAbilityAi;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.player.Player;
import forge.util.MyRandom;
@@ -37,12 +37,12 @@ public class LifeExchangeAi extends SpellAbilityAi {
* and one card that has a conditional (Psychic Transfer) that are
* not currently handled
*/
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
if (tgt != null) {
- tgt.resetTargets();
+ sa.resetTargets();
if (opponent.canBeTargetedBy(sa)) {
// never target self, that would be silly for exchange
- tgt.addTarget(opponent);
+ sa.getTargets().add(opponent);
if (!opponent.canLoseLife()) {
return false;
}
diff --git a/src/main/java/forge/card/ability/ai/LifeGainAi.java b/src/main/java/forge/card/ability/ai/LifeGainAi.java
index 49f1ae6a9de..4f0c2f7e606 100644
--- a/src/main/java/forge/card/ability/ai/LifeGainAi.java
+++ b/src/main/java/forge/card/ability/ai/LifeGainAi.java
@@ -6,7 +6,7 @@ import forge.card.ability.SpellAbilityAi;
import forge.card.cost.Cost;
import forge.card.spellability.AbilitySub;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.Game;
import forge.game.ai.ComputerUtil;
import forge.game.ai.ComputerUtilCombat;
@@ -112,11 +112,11 @@ public class LifeGainAi extends SpellAbilityAi {
return false;
}
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
if (tgt != null) {
- tgt.resetTargets();
+ sa.resetTargets();
if (sa.canTarget(ai)) {
- tgt.addTarget(ai);
+ sa.getTargets().add(ai);
} else {
return false;
}
@@ -146,13 +146,13 @@ public class LifeGainAi extends SpellAbilityAi {
// If the Target is gaining life, target self.
// if the Target is modifying how much life is gained, this needs to be
// handled better
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
if (tgt != null) {
- tgt.resetTargets();
+ sa.resetTargets();
if (sa.canTarget(ai)) {
- tgt.addTarget(ai);
+ sa.getTargets().add(ai);
} else if (mandatory && sa.canTarget(ai.getOpponent())) {
- tgt.addTarget(ai.getOpponent());
+ sa.getTargets().add(ai.getOpponent());
} else {
return false;
}
diff --git a/src/main/java/forge/card/ability/ai/LifeLoseAi.java b/src/main/java/forge/card/ability/ai/LifeLoseAi.java
index c875b3a78be..e56846b5b63 100644
--- a/src/main/java/forge/card/ability/ai/LifeLoseAi.java
+++ b/src/main/java/forge/card/ability/ai/LifeLoseAi.java
@@ -6,7 +6,7 @@ import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityAi;
import forge.card.cost.Cost;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.ai.ComputerUtil;
import forge.game.ai.ComputerUtilCost;
import forge.game.ai.ComputerUtilMana;
@@ -18,13 +18,7 @@ public class LifeLoseAi extends SpellAbilityAi {
@Override
public boolean chkAIDrawback(SpellAbility sa, Player ai) {
- final Target tgt = sa.getTarget();
- List tgtPlayers;
- if (tgt != null) {
- tgtPlayers = tgt.getTargetPlayers();
- } else {
- tgtPlayers = AbilityUtils.getDefinedPlayers(sa.getSourceCard(), sa.getParam("Defined"), sa);
- }
+ List tgtPlayers = getTargetPlayers(sa);
final Card source = sa.getSourceCard();
final String amountStr = sa.getParam("LifeAmount");
@@ -98,12 +92,10 @@ public class LifeLoseAi extends SpellAbilityAi {
return false;
}
- final Target tgt = sa.getTarget();
-
- if (sa.getTarget() != null) {
- tgt.resetTargets();
+ if (sa.usesTargeting()) {
+ sa.resetTargets();
if (sa.canTarget(opp)) {
- sa.getTarget().addTarget(opp);
+ sa.getTargets().add(opp);
} else {
return false;
}
@@ -138,12 +130,12 @@ public class LifeLoseAi extends SpellAbilityAi {
@Override
protected boolean doTriggerAINoCost(final Player ai, final SpellAbility sa,
final boolean mandatory) {
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
if (tgt != null) {
if (sa.canTarget(ai.getOpponent())) {
- tgt.addTarget(ai.getOpponent());
+ sa.getTargets().add(ai.getOpponent());
} else if (mandatory && sa.canTarget(ai)) {
- tgt.addTarget(ai);
+ sa.getTargets().add(ai);
} else {
return false;
}
@@ -161,12 +153,7 @@ public class LifeLoseAi extends SpellAbilityAi {
amount = AbilityUtils.calculateAmount(source, amountStr, sa);
}
- List tgtPlayers;
- if (tgt != null) {
- tgtPlayers = tgt.getTargetPlayers();
- } else {
- tgtPlayers = AbilityUtils.getDefinedPlayers(sa.getSourceCard(), sa.getParam("Defined"), sa);
- }
+ List tgtPlayers = getTargetPlayers(sa);
if (!mandatory && tgtPlayers.contains(ai) && amount > 0 && amount + 3 > ai.getLife()) {
// For cards like Foul Imp, ETB you lose life
diff --git a/src/main/java/forge/card/ability/ai/LifeSetAi.java b/src/main/java/forge/card/ability/ai/LifeSetAi.java
index 5d751041cb4..f133c0b37a2 100644
--- a/src/main/java/forge/card/ability/ai/LifeSetAi.java
+++ b/src/main/java/forge/card/ability/ai/LifeSetAi.java
@@ -7,7 +7,7 @@ import forge.CounterType;
import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityAi;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.ai.ComputerUtilMana;
import forge.game.phase.PhaseType;
import forge.game.player.Player;
@@ -51,11 +51,11 @@ public class LifeSetAi extends SpellAbilityAi {
// prevent run-away activations - first time will always return true
final boolean chance = r.nextFloat() <= Math.pow(.6667, sa.getActivationsThisTurn());
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
if (tgt != null) {
- tgt.resetTargets();
+ sa.resetTargets();
if (tgt.canOnlyTgtOpponent()) {
- tgt.addTarget(opponent);
+ sa.getTargets().add(opponent);
// if we can only target the human, and the Human's life
// would
// go up, don't play it.
@@ -67,11 +67,11 @@ public class LifeSetAi extends SpellAbilityAi {
}
} else {
if ((amount > myLife) && (myLife <= 10)) {
- tgt.addTarget(ai);
+ sa.getTargets().add(ai);
} else if (hlife > amount) {
- tgt.addTarget(opponent);
+ sa.getTargets().add(opponent);
} else if (amount > myLife) {
- tgt.addTarget(ai);
+ sa.getTargets().add(ai);
} else {
return false;
}
@@ -128,18 +128,18 @@ public class LifeSetAi extends SpellAbilityAi {
// if the Target is modifying how much life is gained, this needs to
// be
// handled better
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
if (tgt != null) {
- tgt.resetTargets();
+ sa.resetTargets();
if (tgt.canOnlyTgtOpponent()) {
- tgt.addTarget(opponent);
+ sa.getTargets().add(opponent);
} else {
if ((amount > myLife) && (myLife <= 10)) {
- tgt.addTarget(ai);
+ sa.getTargets().add(ai);
} else if (hlife > amount) {
- tgt.addTarget(opponent);
+ sa.getTargets().add(opponent);
} else if (amount > myLife) {
- tgt.addTarget(ai);
+ sa.getTargets().add(ai);
} else {
return false;
}
diff --git a/src/main/java/forge/card/ability/ai/MillAi.java b/src/main/java/forge/card/ability/ai/MillAi.java
index 04f63f7162b..12c6a2512e7 100644
--- a/src/main/java/forge/card/ability/ai/MillAi.java
+++ b/src/main/java/forge/card/ability/ai/MillAi.java
@@ -8,7 +8,7 @@ import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityAi;
import forge.card.cost.Cost;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.ai.ComputerUtil;
import forge.game.ai.ComputerUtilCost;
import forge.game.ai.ComputerUtilMana;
@@ -92,14 +92,14 @@ public class MillAi extends SpellAbilityAi {
}
private boolean targetAI(final Player ai, final SpellAbility sa, final boolean mandatory) {
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
Player opp = ai.getOpponent();
if (tgt != null) {
- tgt.resetTargets();
+ sa.resetTargets();
if (!sa.canTarget(opp)) {
if (mandatory && sa.canTarget(ai)) {
- tgt.addTarget(ai);
+ sa.getTargets().add(ai);
return true;
}
return false;
@@ -114,22 +114,22 @@ public class MillAi extends SpellAbilityAi {
return false;
}
- tgt.addTarget(opp);
+ sa.getTargets().add(opp);
return true;
}
if (numCards >= pLibrary.size()) {
// Can Mill out Human's deck? Do it!
- tgt.addTarget(opp);
+ sa.getTargets().add(opp);
return true;
}
// Obscure case when you know what your top card is so you might?
// want to mill yourself here
// if (AI wants to mill self)
- // tgt.addTarget(AllZone.getComputerPlayer());
+ // sa.getTargets().add(AllZone.getComputerPlayer());
// else
- tgt.addTarget(opp);
+ sa.getTargets().add(opp);
}
return true;
}
diff --git a/src/main/java/forge/card/ability/ai/MustBlockAi.java b/src/main/java/forge/card/ability/ai/MustBlockAi.java
index 1c3483dc821..d1934898a15 100644
--- a/src/main/java/forge/card/ability/ai/MustBlockAi.java
+++ b/src/main/java/forge/card/ability/ai/MustBlockAi.java
@@ -10,7 +10,7 @@ import forge.CardPredicates;
import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityAi;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.ai.ComputerUtilCard;
import forge.game.ai.ComputerUtilCombat;
import forge.game.phase.CombatUtil;
@@ -35,7 +35,7 @@ public class MustBlockAi extends SpellAbilityAi {
@Override
protected boolean doTriggerAINoCost(final Player ai, SpellAbility sa, boolean mandatory) {
final Card source = sa.getSourceCard();
- final Target abTgt = sa.getTarget();
+ final TargetRestrictions abTgt = sa.getTargetRestrictions();
// only use on creatures that can attack
if (!ai.getGame().getPhaseHandler().getPhase().isBefore(PhaseType.MAIN2)) {
@@ -89,7 +89,7 @@ public class MustBlockAi extends SpellAbilityAi {
if (blocker == null) {
return false;
}
- abTgt.addTarget(blocker);
+ sa.getTargets().add(blocker);
chance = true;
} else {
return false;
diff --git a/src/main/java/forge/card/ability/ai/PhasesAi.java b/src/main/java/forge/card/ability/ai/PhasesAi.java
index 409eb3a431f..6172f1fd5e3 100644
--- a/src/main/java/forge/card/ability/ai/PhasesAi.java
+++ b/src/main/java/forge/card/ability/ai/PhasesAi.java
@@ -8,7 +8,7 @@ import forge.CardLists;
import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityAi;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.Game;
import forge.game.player.Player;
import forge.game.zone.ZoneType;
@@ -22,7 +22,7 @@ public class PhasesAi extends SpellAbilityAi {
@Override
protected boolean canPlayAI(Player aiPlayer, SpellAbility sa) {
// This still needs to be fleshed out
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
final Card source = sa.getSourceCard();
final Random r = MyRandom.getRandom();
@@ -51,7 +51,7 @@ public class PhasesAi extends SpellAbilityAi {
@Override
protected boolean doTriggerAINoCost(Player aiPlayer, SpellAbility sa, boolean mandatory) {
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
if (tgt == null) {
return mandatory;
@@ -69,7 +69,7 @@ public class PhasesAi extends SpellAbilityAi {
@Override
public boolean chkAIDrawback(SpellAbility sa, Player aiPlayer) {
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
boolean randomReturn = true;
@@ -89,7 +89,7 @@ public class PhasesAi extends SpellAbilityAi {
*
*
* @param tgt
- * a {@link forge.card.spellability.Target} object.
+ * a {@link forge.card.spellability.TargetRestrictions} object.
* @param af
* a {@link forge.card.ability.AbilityFactory} object.
* @param sa
@@ -98,7 +98,7 @@ public class PhasesAi extends SpellAbilityAi {
* a boolean.
* @return a boolean.
*/
- private boolean phasesPrefTargeting(final Target tgt, final SpellAbility sa,
+ private boolean phasesPrefTargeting(final TargetRestrictions tgt, final SpellAbility sa,
final boolean mandatory) {
// Card source = sa.getSourceCard();
@@ -135,7 +135,7 @@ public class PhasesAi extends SpellAbilityAi {
*/
private boolean phasesUnpreferredTargeting(final Game game, final SpellAbility sa, final boolean mandatory) {
final Card source = sa.getSourceCard();
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
List list = game.getCardsIn(ZoneType.Battlefield);
list = CardLists.getTargetableCards(CardLists.getValidCards(list, tgt.getValidTgts(), source.getController(), source), sa);
diff --git a/src/main/java/forge/card/ability/ai/PlayAi.java b/src/main/java/forge/card/ability/ai/PlayAi.java
index be299264012..5210f8eda90 100644
--- a/src/main/java/forge/card/ability/ai/PlayAi.java
+++ b/src/main/java/forge/card/ability/ai/PlayAi.java
@@ -10,7 +10,7 @@ import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityAi;
import forge.card.cost.Cost;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.ai.ComputerUtilCard;
import forge.game.ai.ComputerUtilCost;
import forge.game.player.Player;
@@ -54,14 +54,14 @@ public class PlayAi extends SpellAbilityAi {
boolean chance = r.nextFloat() <= Math.pow(.6667, sa.getRestrictions().getNumberTurnActivations());
List cards;
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
if (tgt != null) {
ZoneType zone = tgt.getZone().get(0);
cards = CardLists.getValidCards(ai.getGame().getCardsIn(zone), tgt.getValidTgts(), ai, source);
if (cards.isEmpty()) {
return false;
}
- tgt.addTarget(ComputerUtilCard.getBestAI(cards));
+ sa.getTargets().add(ComputerUtilCard.getBestAI(cards));
} else if (!sa.hasParam("Valid")) {
cards = new ArrayList(AbilityUtils.getDefinedCards(sa.getSourceCard(), sa.getParam("Defined"), sa));
if (cards.isEmpty()) {
@@ -87,7 +87,7 @@ public class PlayAi extends SpellAbilityAi {
@Override
protected boolean doTriggerAINoCost(final Player ai, final SpellAbility sa, final boolean mandatory) {
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
if (tgt != null) {
return false;
}
diff --git a/src/main/java/forge/card/ability/ai/PoisonAi.java b/src/main/java/forge/card/ability/ai/PoisonAi.java
index b6b0653a78d..a3c3070d460 100644
--- a/src/main/java/forge/card/ability/ai/PoisonAi.java
+++ b/src/main/java/forge/card/ability/ai/PoisonAi.java
@@ -7,7 +7,7 @@ import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityAi;
import forge.card.cost.Cost;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.ai.ComputerUtil;
import forge.game.ai.ComputerUtilCost;
import forge.game.phase.PhaseType;
@@ -59,11 +59,10 @@ public class PoisonAi extends SpellAbilityAi {
return false;
}
- final Target tgt = sa.getTarget();
- if (sa.getTarget() != null) {
- tgt.resetTargets();
- sa.getTarget().addTarget(ai.getOpponent());
+ if (sa.usesTargeting()) {
+ sa.resetTargets();
+ sa.getTargets().add(ai.getOpponent());
}
return true;
@@ -72,9 +71,9 @@ public class PoisonAi extends SpellAbilityAi {
@Override
protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) {
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
if (tgt != null) {
- tgt.addTarget(ai.getOpponent());
+ sa.getTargets().add(ai.getOpponent());
} else {
final List players = AbilityUtils.getDefinedPlayers(sa.getSourceCard(), sa.getParam("Defined"), sa);
for (final Player p : players) {
diff --git a/src/main/java/forge/card/ability/ai/ProtectAi.java b/src/main/java/forge/card/ability/ai/ProtectAi.java
index 34b0b7c59bf..2433e00ecdb 100644
--- a/src/main/java/forge/card/ability/ai/ProtectAi.java
+++ b/src/main/java/forge/card/ability/ai/ProtectAi.java
@@ -12,7 +12,7 @@ import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityAi;
import forge.card.cost.Cost;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.Game;
import forge.game.ai.ComputerUtil;
import forge.game.ai.ComputerUtilCard;
@@ -117,7 +117,7 @@ public class ProtectAi extends SpellAbilityAi {
final Card hostCard = sa.getSourceCard();
final Game game = ai.getGame();
// if there is no target and host card isn't in play, don't activate
- if ((sa.getTarget() == null) && !hostCard.isInPlay()) {
+ if ((sa.getTargetRestrictions() == null) && !hostCard.isInPlay()) {
return false;
}
@@ -153,7 +153,7 @@ public class ProtectAi extends SpellAbilityAi {
return false;
}
- if ((sa.getTarget() == null) || !sa.getTarget().doesTarget()) {
+ if ((sa.getTargetRestrictions() == null) || !sa.getTargetRestrictions().doesTarget()) {
final List cards = AbilityUtils.getDefinedCards(sa.getSourceCard(), sa.getParam("Defined"), sa);
if (cards.size() == 0) {
@@ -182,8 +182,8 @@ public class ProtectAi extends SpellAbilityAi {
final Card source = sa.getSourceCard();
- final Target tgt = sa.getTarget();
- tgt.resetTargets();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
+ sa.resetTargets();
List list = getProtectCreatures(ai, sa);
list = CardLists.getValidCards(list, tgt.getValidTgts(), sa.getActivatingPlayer(), sa.getSourceCard());
@@ -221,17 +221,17 @@ public class ProtectAi extends SpellAbilityAi {
// Don't target cards that will die.
list = ComputerUtil.getSafeTargets(ai, sa, list);
- while (tgt.getNumTargeted() < tgt.getMaxTargets(source, sa)) {
+ while (sa.getTargets().getNumTargeted() < tgt.getMaxTargets(source, sa)) {
Card t = null;
// boolean goodt = false;
if (list.isEmpty()) {
- if ((tgt.getNumTargeted() < tgt.getMinTargets(source, sa)) || (tgt.getNumTargeted() == 0)) {
+ if ((sa.getTargets().getNumTargeted() < tgt.getMinTargets(source, sa)) || (sa.getTargets().getNumTargeted() == 0)) {
if (mandatory) {
return protectMandatoryTarget(ai, sa, mandatory);
}
- tgt.resetTargets();
+ sa.resetTargets();
return false;
} else {
// TODO is this good enough? for up to amounts?
@@ -240,7 +240,7 @@ public class ProtectAi extends SpellAbilityAi {
}
t = ComputerUtilCard.getBestCreatureAI(list);
- tgt.addTarget(t);
+ sa.getTargets().add(t);
list.remove(t);
}
@@ -251,16 +251,16 @@ public class ProtectAi extends SpellAbilityAi {
final Game game = ai.getGame();
List list = game.getCardsIn(ZoneType.Battlefield);
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
list = CardLists.getValidCards(list, tgt.getValidTgts(), sa.getActivatingPlayer(), sa.getSourceCard());
if (list.size() < tgt.getMinTargets(sa.getSourceCard(), sa)) {
- tgt.resetTargets();
+ sa.resetTargets();
return false;
}
// Remove anything that's already been targeted
- for (final Card c : tgt.getTargetCards()) {
+ for (final Card c : sa.getTargets().getTargetCards()) {
list.remove(c);
}
@@ -281,7 +281,7 @@ public class ProtectAi extends SpellAbilityAi {
final List forced = CardLists.filterControlledBy(list, ai);
final Card source = sa.getSourceCard();
- while (tgt.getNumTargeted() < tgt.getMaxTargets(source, sa)) {
+ while (sa.getTargets().getNumTargeted() < tgt.getMaxTargets(source, sa)) {
if (pref.isEmpty()) {
break;
}
@@ -295,10 +295,10 @@ public class ProtectAi extends SpellAbilityAi {
pref.remove(c);
- tgt.addTarget(c);
+ sa.getTargets().add(c);
}
- while (tgt.getNumTargeted() < tgt.getMaxTargets(source, sa)) {
+ while (sa.getTargets().getNumTargeted() < tgt.getMaxTargets(source, sa)) {
if (pref2.isEmpty()) {
break;
}
@@ -312,10 +312,10 @@ public class ProtectAi extends SpellAbilityAi {
pref2.remove(c);
- tgt.addTarget(c);
+ sa.getTargets().add(c);
}
- while (tgt.getNumTargeted() < tgt.getMinTargets(source, sa)) {
+ while (sa.getTargets().getNumTargeted() < tgt.getMinTargets(source, sa)) {
if (forced.isEmpty()) {
break;
}
@@ -329,11 +329,11 @@ public class ProtectAi extends SpellAbilityAi {
forced.remove(c);
- tgt.addTarget(c);
+ sa.getTargets().add(c);
}
- if (tgt.getNumTargeted() < tgt.getMinTargets(sa.getSourceCard(), sa)) {
- tgt.resetTargets();
+ if (sa.getTargets().getNumTargeted() < tgt.getMinTargets(sa.getSourceCard(), sa)) {
+ sa.resetTargets();
return false;
}
@@ -342,7 +342,7 @@ public class ProtectAi extends SpellAbilityAi {
@Override
protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) {
- if (sa.getTarget() == null) {
+ if (sa.getTargetRestrictions() == null) {
if (mandatory) {
return true;
}
@@ -356,7 +356,7 @@ public class ProtectAi extends SpellAbilityAi {
@Override
public boolean chkAIDrawback(SpellAbility sa, Player ai) {
final Card host = sa.getSourceCard();
- if ((sa.getTarget() == null) || !sa.getTarget().doesTarget()) {
+ if ((sa.getTargetRestrictions() == null) || !sa.getTargetRestrictions().doesTarget()) {
if (host.isCreature()) {
// TODO
}
diff --git a/src/main/java/forge/card/ability/ai/ProtectAllAi.java b/src/main/java/forge/card/ability/ai/ProtectAllAi.java
index 7126abe1a27..3fd32133065 100644
--- a/src/main/java/forge/card/ability/ai/ProtectAllAi.java
+++ b/src/main/java/forge/card/ability/ai/ProtectAllAi.java
@@ -14,7 +14,7 @@ public class ProtectAllAi extends SpellAbilityAi {
protected boolean canPlayAI(Player ai, SpellAbility sa) {
final Card hostCard = sa.getSourceCard();
// if there is no target and host card isn't in play, don't activate
- if ((sa.getTarget() == null) && !hostCard.isInPlay()) {
+ if ((sa.getTargetRestrictions() == null) && !hostCard.isInPlay()) {
return false;
}
diff --git a/src/main/java/forge/card/ability/ai/PumpAi.java b/src/main/java/forge/card/ability/ai/PumpAi.java
index 37861c2825c..4a28c724f87 100644
--- a/src/main/java/forge/card/ability/ai/PumpAi.java
+++ b/src/main/java/forge/card/ability/ai/PumpAi.java
@@ -14,7 +14,7 @@ import forge.card.cost.CostPart;
import forge.card.cost.CostTapType;
import forge.card.spellability.SpellAbility;
import forge.card.spellability.SpellAbilityRestriction;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.Game;
import forge.game.ai.ComputerUtil;
import forge.game.ai.ComputerUtilCard;
@@ -142,7 +142,7 @@ public class PumpAi extends PumpAiBase {
}
//Untargeted
- if ((sa.getTarget() == null) || !sa.getTarget().doesTarget()) {
+ if ((sa.getTargetRestrictions() == null) || !sa.getTargetRestrictions().doesTarget()) {
final List cards = AbilityUtils.getDefinedCards(sa.getSourceCard(),
sa.getParam("Defined"), sa);
@@ -192,8 +192,8 @@ public class PumpAi extends PumpAiBase {
}
final Player opp = ai.getOpponent();
- final Target tgt = sa.getTarget();
- tgt.resetTargets();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
+ sa.resetTargets();
List list = new ArrayList();
if (sa.hasParam("AILogic")) {
if (sa.getParam("AILogic").equals("HighestPower")) {
@@ -201,7 +201,7 @@ public class PumpAi extends PumpAiBase {
list = CardLists.getTargetableCards(list, sa);
CardLists.sortByPowerDesc(list);
if (!list.isEmpty()) {
- tgt.addTarget(list.get(0));
+ sa.getTargets().add(list.get(0));
return true;
} else {
return false;
@@ -209,7 +209,7 @@ public class PumpAi extends PumpAiBase {
}
} else if (sa.isCurse()) {
if (sa.canTarget(opp)) {
- tgt.addTarget(opp);
+ sa.getTargets().add(opp);
return true;
}
list = this.getCurseCreatures(ai, sa, defense, attack, keywords);
@@ -221,7 +221,7 @@ public class PumpAi extends PumpAiBase {
list = this.getPumpCreatures(ai, sa, defense, attack, keywords);
}
if (sa.canTarget(ai)) {
- tgt.addTarget(ai);
+ sa.getTargets().add(ai);
return true;
}
}
@@ -251,17 +251,17 @@ public class PumpAi extends PumpAiBase {
list = ComputerUtil.getSafeTargets(ai, sa, list);
}
- while (tgt.getNumTargeted() < tgt.getMaxTargets(sa.getSourceCard(), sa)) {
+ while (sa.getTargets().getNumTargeted() < tgt.getMaxTargets(sa.getSourceCard(), sa)) {
Card t = null;
// boolean goodt = false;
if (list.isEmpty()) {
- if ((tgt.getNumTargeted() < tgt.getMinTargets(sa.getSourceCard(), sa)) || (tgt.getNumTargeted() == 0)) {
+ if ((sa.getTargets().getNumTargeted() < tgt.getMinTargets(sa.getSourceCard(), sa)) || (sa.getTargets().getNumTargeted() == 0)) {
if (mandatory) {
return this.pumpMandatoryTarget(ai, sa, mandatory);
}
- tgt.resetTargets();
+ sa.resetTargets();
return false;
} else {
// TODO is this good enough? for up to amounts?
@@ -270,7 +270,7 @@ public class PumpAi extends PumpAiBase {
}
t = ComputerUtilCard.getBestAI(list);
- tgt.addTarget(t);
+ sa.getTargets().add(t);
list.remove(t);
}
@@ -280,18 +280,18 @@ public class PumpAi extends PumpAiBase {
private boolean pumpMandatoryTarget(final Player ai, final SpellAbility sa, final boolean mandatory) {
final Game game = ai.getGame();
List list = game.getCardsIn(ZoneType.Battlefield);
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
final Player opp = ai.getOpponent();
list = CardLists.getValidCards(list, tgt.getValidTgts(), sa.getActivatingPlayer(), sa.getSourceCard());
list = CardLists.getTargetableCards(list, sa);
if (list.size() < tgt.getMinTargets(sa.getSourceCard(), sa)) {
- tgt.resetTargets();
+ sa.resetTargets();
return false;
}
// Remove anything that's already been targeted
- for (final Card c : tgt.getTargetCards()) {
+ for (final Card c : sa.getTargets().getTargetCards()) {
list.remove(c);
}
@@ -307,7 +307,7 @@ public class PumpAi extends PumpAiBase {
forced = CardLists.filterControlledBy(list, opp);
}
- while (tgt.getNumTargeted() < tgt.getMaxTargets(source, sa)) {
+ while (sa.getTargets().getNumTargeted() < tgt.getMaxTargets(source, sa)) {
if (pref.isEmpty()) {
break;
}
@@ -321,10 +321,10 @@ public class PumpAi extends PumpAiBase {
pref.remove(c);
- tgt.addTarget(c);
+ sa.getTargets().add(c);
}
- while (tgt.getNumTargeted() < tgt.getMinTargets(sa.getSourceCard(), sa)) {
+ while (sa.getTargets().getNumTargeted() < tgt.getMinTargets(sa.getSourceCard(), sa)) {
if (forced.isEmpty()) {
break;
}
@@ -338,11 +338,11 @@ public class PumpAi extends PumpAiBase {
forced.remove(c);
- tgt.addTarget(c);
+ sa.getTargets().add(c);
}
- if (tgt.getNumTargeted() < tgt.getMinTargets(sa.getSourceCard(), sa)) {
- tgt.resetTargets();
+ if (sa.getTargets().getNumTargeted() < tgt.getMinTargets(sa.getSourceCard(), sa)) {
+ sa.resetTargets();
return false;
}
@@ -381,7 +381,7 @@ public class PumpAi extends PumpAiBase {
attack = AbilityUtils.calculateAmount(sa.getSourceCard(), numAttack, sa);
}
- if (sa.getTarget() == null) {
+ if (sa.getTargetRestrictions() == null) {
if (mandatory) {
return true;
}
@@ -421,7 +421,7 @@ public class PumpAi extends PumpAiBase {
attack = AbilityUtils.calculateAmount(sa.getSourceCard(), numAttack, sa);
}
- if ((sa.getTarget() == null) || !sa.getTarget().doesTarget()) {
+ if ((sa.getTargetRestrictions() == null) || !sa.getTargetRestrictions().doesTarget()) {
if (source.isCreature()) {
if (!source.hasKeyword("Indestructible")
&& ((source.getNetDefense() + defense) <= source.getDamage())) {
diff --git a/src/main/java/forge/card/ability/ai/PumpAllAi.java b/src/main/java/forge/card/ability/ai/PumpAllAi.java
index 4e7762f0a93..a2c27ed26e2 100644
--- a/src/main/java/forge/card/ability/ai/PumpAllAi.java
+++ b/src/main/java/forge/card/ability/ai/PumpAllAi.java
@@ -10,7 +10,7 @@ import forge.Card;
import forge.CardLists;
import forge.card.ability.AbilityUtils;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.Game;
import forge.game.ai.ComputerUtil;
import forge.game.ai.ComputerUtilCard;
@@ -49,10 +49,10 @@ public class PumpAllAi extends PumpAiBase {
List comp = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), valid, source.getController(), source);
List human = CardLists.getValidCards(opp.getCardsIn(ZoneType.Battlefield), valid, source.getController(), source);
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
if (tgt != null && sa.canTarget(opp) && sa.hasParam("IsCurse")) {
- tgt.resetTargets();
- sa.getTarget().addTarget(opp);
+ sa.resetTargets();
+ sa.getTargets().add(opp);
comp = new ArrayList();
}
diff --git a/src/main/java/forge/card/ability/ai/RearrangeTopOfLibraryAi.java b/src/main/java/forge/card/ability/ai/RearrangeTopOfLibraryAi.java
index 3e6b2978538..d0728092079 100644
--- a/src/main/java/forge/card/ability/ai/RearrangeTopOfLibraryAi.java
+++ b/src/main/java/forge/card/ability/ai/RearrangeTopOfLibraryAi.java
@@ -3,7 +3,7 @@ package forge.card.ability.ai;
import forge.card.ability.SpellAbilityAi;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.player.Player;
public class RearrangeTopOfLibraryAi extends SpellAbilityAi {
@@ -21,11 +21,11 @@ public class RearrangeTopOfLibraryAi extends SpellAbilityAi {
@Override
protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) {
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
if (tgt != null) {
// ability is targeted
- tgt.resetTargets();
+ sa.resetTargets();
Player opp = ai.getOpponent();
final boolean canTgtHuman = opp.canBeTargetedBy(sa);
@@ -33,7 +33,7 @@ public class RearrangeTopOfLibraryAi extends SpellAbilityAi {
if (!canTgtHuman) {
return false;
} else {
- tgt.addTarget(opp);
+ sa.getTargets().add(opp);
}
} else {
// if it's just defined, no big deal
diff --git a/src/main/java/forge/card/ability/ai/RegenerateAi.java b/src/main/java/forge/card/ability/ai/RegenerateAi.java
index 410b414ed0b..088a88c9d8c 100644
--- a/src/main/java/forge/card/ability/ai/RegenerateAi.java
+++ b/src/main/java/forge/card/ability/ai/RegenerateAi.java
@@ -23,11 +23,12 @@ import java.util.List;
import forge.Card;
import forge.CardLists;
import forge.CardPredicates;
+import forge.ITargetable;
import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityAi;
import forge.card.cost.Cost;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.Game;
import forge.game.ai.ComputerUtil;
import forge.game.ai.ComputerUtilCard;
@@ -77,14 +78,14 @@ public class RegenerateAi extends SpellAbilityAi {
}
}
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
if (tgt == null) {
// As far as I can tell these Defined Cards will only have one of
// them
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)) {
@@ -108,7 +109,7 @@ public class RegenerateAi extends SpellAbilityAi {
}
}
} else {
- tgt.resetTargets();
+ sa.resetTargets();
// filter AIs battlefield by what I can target
List targetables = CardLists.getValidCards(ai.getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), ai, hostCard);
targetables = CardLists.getTargetableCards(targetables, sa);
@@ -120,7 +121,7 @@ public class RegenerateAi extends SpellAbilityAi {
if (!game.getStack().isEmpty()) {
// check stack for something on the stack will kill anything i
// control
- final ArrayList objects = ComputerUtil.predictThreatenedObjects(sa.getActivatingPlayer(), sa);
+ final List objects = ComputerUtil.predictThreatenedObjects(sa.getActivatingPlayer(), sa);
final List threatenedTargets = new ArrayList();
@@ -132,7 +133,7 @@ public class RegenerateAi extends SpellAbilityAi {
if (!threatenedTargets.isEmpty()) {
// Choose "best" of the remaining to regenerate
- tgt.addTarget(ComputerUtilCard.getBestCreatureAI(threatenedTargets));
+ sa.getTargets().add(ComputerUtilCard.getBestCreatureAI(threatenedTargets));
chance = true;
}
} else {
@@ -142,14 +143,14 @@ public class RegenerateAi extends SpellAbilityAi {
for (final Card c : combatants) {
if ((c.getShield() == 0) && ComputerUtilCombat.combatantWouldBeDestroyed(ai, c)) {
- tgt.addTarget(c);
+ sa.getTargets().add(c);
chance = true;
break;
}
}
}
}
- if (tgt.getTargets().isEmpty()) {
+ if (sa.getTargets().isEmpty()) {
return false;
}
}
@@ -161,7 +162,7 @@ public class RegenerateAi extends SpellAbilityAi {
protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) {
boolean chance = false;
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
if (tgt == null) {
// If there's no target on the trigger, just say yes.
chance = true;
@@ -175,8 +176,8 @@ public class RegenerateAi extends SpellAbilityAi {
private static boolean regenMandatoryTarget(final Player ai, final SpellAbility sa, final boolean mandatory) {
final Card hostCard = sa.getSourceCard();
final Game game = ai.getGame();
- final Target tgt = sa.getTarget();
- tgt.resetTargets();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
+ sa.resetTargets();
// filter AIs battlefield by what I can target
List targetables = game.getCardsIn(ZoneType.Battlefield);
targetables = CardLists.getValidCards(targetables, tgt.getValidTgts(), ai, hostCard);
@@ -197,7 +198,7 @@ public class RegenerateAi extends SpellAbilityAi {
if (game.getPhaseHandler().is(PhaseType.COMBAT_DECLARE_BLOCKERS)) {
for (final Card c : combatants) {
if ((c.getShield() == 0) && ComputerUtilCombat.combatantWouldBeDestroyed(ai, c)) {
- tgt.addTarget(c);
+ sa.getTargets().add(c);
return true;
}
}
@@ -210,26 +211,26 @@ public class RegenerateAi extends SpellAbilityAi {
if (CardLists.getNotType(compTargetables, "Creature").isEmpty()) {
for (final Card c : combatants) {
if (c.getShield() == 0) {
- tgt.addTarget(c);
+ sa.getTargets().add(c);
return true;
}
}
- tgt.addTarget(combatants.get(0));
+ sa.getTargets().add(combatants.get(0));
return true;
} else {
CardLists.sortByCmcDesc(compTargetables);
for (final Card c : compTargetables) {
if (c.getShield() == 0) {
- tgt.addTarget(c);
+ sa.getTargets().add(c);
return true;
}
}
- tgt.addTarget(compTargetables.get(0));
+ sa.getTargets().add(compTargetables.get(0));
return true;
}
}
- tgt.addTarget(ComputerUtilCard.getCheapestPermanentAI(targetables, sa, true));
+ sa.getTargets().add(ComputerUtilCard.getCheapestPermanentAI(targetables, sa, true));
return true;
}
diff --git a/src/main/java/forge/card/ability/ai/RegenerateAllAi.java b/src/main/java/forge/card/ability/ai/RegenerateAllAi.java
index db5a0e329ec..ba884ba4c71 100644
--- a/src/main/java/forge/card/ability/ai/RegenerateAllAi.java
+++ b/src/main/java/forge/card/ability/ai/RegenerateAllAi.java
@@ -1,11 +1,11 @@
package forge.card.ability.ai;
-import java.util.ArrayList;
import java.util.List;
import forge.Card;
import forge.CardLists;
import forge.CardPredicates;
+import forge.ITargetable;
import forge.card.ability.SpellAbilityAi;
import forge.card.cost.Cost;
import forge.card.spellability.SpellAbility;
@@ -57,7 +57,7 @@ public class RegenerateAllAi extends SpellAbilityAi {
int numSaved = 0;
if (!game.getStack().isEmpty()) {
- final ArrayList 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/RepeatAi.java b/src/main/java/forge/card/ability/ai/RepeatAi.java
index 0af52f14586..18409ece607 100644
--- a/src/main/java/forge/card/ability/ai/RepeatAi.java
+++ b/src/main/java/forge/card/ability/ai/RepeatAi.java
@@ -3,7 +3,7 @@ package forge.card.ability.ai;
import forge.card.ability.SpellAbilityAi;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.player.Player;
import forge.game.player.PlayerActionConfirmMode;
@@ -11,14 +11,14 @@ public class RepeatAi extends SpellAbilityAi {
@Override
protected boolean canPlayAI(Player ai, SpellAbility sa) {
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
final Player opp = ai.getOpponent();
if (tgt != null) {
if (!opp.canBeTargetedBy(sa)) {
return false;
}
- tgt.resetTargets();
- tgt.addTarget(opp);
+ sa.resetTargets();
+ sa.getTargets().add(opp);
}
return true;
}
diff --git a/src/main/java/forge/card/ability/ai/RepeatEachAi.java b/src/main/java/forge/card/ability/ai/RepeatEachAi.java
index fac0e1bc6ba..9a2919fae25 100644
--- a/src/main/java/forge/card/ability/ai/RepeatEachAi.java
+++ b/src/main/java/forge/card/ability/ai/RepeatEachAi.java
@@ -11,7 +11,6 @@ import forge.CardPredicates.Presets;
import forge.CounterType;
import forge.card.ability.SpellAbilityAi;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
import forge.game.player.Player;
import forge.game.zone.ZoneType;
@@ -57,7 +56,6 @@ public class RepeatEachAi extends SpellAbilityAi {
sa.setTargetCard(perms.get(0));
} else if ("RemoveAllCounters".equals(logic)) {
// Break Dark Depths
- Target tgt = sa.getTarget();
List depthsList = aiPlayer.getCardsIn(ZoneType.Battlefield, "Dark Depths");
depthsList = CardLists.filter(depthsList, new Predicate() {
@Override
@@ -67,7 +65,7 @@ public class RepeatEachAi extends SpellAbilityAi {
});
if (depthsList.size() > 0) {
- tgt.addTarget(depthsList.get(0));
+ sa.getTargets().add(depthsList.get(0));
return true;
}
@@ -84,7 +82,7 @@ public class RepeatEachAi extends SpellAbilityAi {
return false;
}
- tgt.addTarget(list.get(0));
+ sa.getTargets().add(list.get(0));
} else if ("BalanceLands".equals(logic)) {
if (CardLists.filter(aiPlayer.getCardsIn(ZoneType.Battlefield), Presets.LANDS).size() >= 5) {
return false;
diff --git a/src/main/java/forge/card/ability/ai/RevealAiBase.java b/src/main/java/forge/card/ability/ai/RevealAiBase.java
index 4d1a9599b2a..2305c6191ea 100644
--- a/src/main/java/forge/card/ability/ai/RevealAiBase.java
+++ b/src/main/java/forge/card/ability/ai/RevealAiBase.java
@@ -3,28 +3,28 @@ package forge.card.ability.ai;
import forge.card.ability.SpellAbilityAi;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.player.Player;
import forge.game.zone.ZoneType;
public abstract class RevealAiBase extends SpellAbilityAi {
protected boolean revealHandTargetAI(final Player ai, final SpellAbility sa) {
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
Player opp = ai.getOpponent();
final int humanHandSize = opp.getCardsIn(ZoneType.Hand).size();
if (tgt != null) {
// ability is targeted
- tgt.resetTargets();
+ sa.resetTargets();
final boolean canTgtHuman = opp.canBeTargetedBy(sa);
if (!canTgtHuman || (humanHandSize == 0)) {
return false;
} else {
- tgt.addTarget(opp);
+ sa.getTargets().add(opp);
}
} else {
// if it's just defined, no big deal
diff --git a/src/main/java/forge/card/ability/ai/SacrificeAi.java b/src/main/java/forge/card/ability/ai/SacrificeAi.java
index c5106a419aa..7fb2ac360a1 100644
--- a/src/main/java/forge/card/ability/ai/SacrificeAi.java
+++ b/src/main/java/forge/card/ability/ai/SacrificeAi.java
@@ -8,7 +8,7 @@ import forge.CardPredicates;
import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityAi;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.ai.ComputerUtilCard;
import forge.game.ai.ComputerUtilMana;
import forge.game.player.Player;
@@ -50,16 +50,16 @@ public class SacrificeAi extends SpellAbilityAi {
private boolean sacrificeTgtAI(final Player ai, final SpellAbility sa) {
final Card source = sa.getSourceCard();
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
final boolean destroy = sa.hasParam("Destroy");
Player opp = ai.getOpponent();
if (tgt != null) {
- tgt.resetTargets();
+ sa.resetTargets();
if (!opp.canBeTargetedBy(sa)) {
return false;
}
- tgt.addTarget(opp);
+ sa.getTargets().add(opp);
final String valid = sa.getParam("SacValid");
String num = sa.getParam("Amount");
num = (num == null) ? "1" : num;
diff --git a/src/main/java/forge/card/ability/ai/ScryAi.java b/src/main/java/forge/card/ability/ai/ScryAi.java
index 47ac3ed1e51..9e1da576fbe 100644
--- a/src/main/java/forge/card/ability/ai/ScryAi.java
+++ b/src/main/java/forge/card/ability/ai/ScryAi.java
@@ -4,7 +4,7 @@ import java.util.Random;
import forge.card.ability.SpellAbilityAi;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.player.Player;
import forge.util.MyRandom;
@@ -15,13 +15,13 @@ public class ScryAi extends SpellAbilityAi {
*/
@Override
protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) {
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
if (tgt != null) { // It doesn't appear that Scry ever targets
// ability is targeted
- tgt.resetTargets();
+ sa.resetTargets();
- tgt.addTarget(ai);
+ sa.getTargets().add(ai);
}
return true;
diff --git a/src/main/java/forge/card/ability/ai/SetStateAi.java b/src/main/java/forge/card/ability/ai/SetStateAi.java
index f0c03e61eac..890f92c5d88 100644
--- a/src/main/java/forge/card/ability/ai/SetStateAi.java
+++ b/src/main/java/forge/card/ability/ai/SetStateAi.java
@@ -8,7 +8,7 @@ import forge.game.player.Player;
public class SetStateAi extends SpellAbilityAi {
@Override
protected boolean canPlayAI(Player aiPlayer, SpellAbility sa) {
- if (sa.getTarget() == null && "Transform".equals(sa.getParam("Mode"))) {
+ if (sa.getTargetRestrictions() == null && "Transform".equals(sa.getParam("Mode"))) {
return true;
}
return false;
diff --git a/src/main/java/forge/card/ability/ai/TapAi.java b/src/main/java/forge/card/ability/ai/TapAi.java
index 5a5d827a82c..21a7a61ef28 100644
--- a/src/main/java/forge/card/ability/ai/TapAi.java
+++ b/src/main/java/forge/card/ability/ai/TapAi.java
@@ -7,7 +7,7 @@ import forge.Card;
import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityAi;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.phase.PhaseHandler;
import forge.game.phase.PhaseType;
import forge.game.player.Player;
@@ -31,7 +31,7 @@ public class TapAi extends TapAiBase {
return false;
}
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
final Card source = sa.getSourceCard();
final Random r = MyRandom.getRandom();
@@ -49,7 +49,7 @@ public class TapAi extends TapAiBase {
return false;
}
} else {
- tgt.resetTargets();
+ sa.resetTargets();
if (!tapPrefTargeting(ai, source, tgt, sa, false)) {
return false;
}
diff --git a/src/main/java/forge/card/ability/ai/TapAiBase.java b/src/main/java/forge/card/ability/ai/TapAiBase.java
index 2b32ce616f1..89b9e754329 100644
--- a/src/main/java/forge/card/ability/ai/TapAiBase.java
+++ b/src/main/java/forge/card/ability/ai/TapAiBase.java
@@ -11,7 +11,7 @@ import forge.CardPredicates;
import forge.CardPredicates.Presets;
import forge.card.ability.SpellAbilityAi;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.Game;
import forge.game.ai.ComputerUtil;
import forge.game.ai.ComputerUtilCard;
@@ -40,9 +40,9 @@ public abstract class TapAiBase extends SpellAbilityAi {
*/
private boolean tapTargetList(final Player ai, final SpellAbility sa, final List tapList, final boolean mandatory) {
final Card source = sa.getSourceCard();
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
- for (final Card c : tgt.getTargetCards()) {
+ for (final Card c : sa.getTargets().getTargetCards()) {
tapList.remove(c);
}
@@ -50,13 +50,13 @@ public abstract class TapAiBase extends SpellAbilityAi {
return false;
}
- while (tgt.getNumTargeted() < tgt.getMaxTargets(source, sa)) {
+ while (sa.getTargets().getNumTargeted() < tgt.getMaxTargets(source, sa)) {
Card choice = null;
if (tapList.size() == 0) {
- if ((tgt.getNumTargeted() < tgt.getMinTargets(source, sa)) || (tgt.getNumTargeted() == 0)) {
+ if ((sa.getTargets().getNumTargeted() < tgt.getMinTargets(source, sa)) || (sa.getTargets().getNumTargeted() == 0)) {
if (!mandatory) {
- tgt.resetTargets();
+ sa.resetTargets();
}
return false;
} else {
@@ -75,9 +75,9 @@ public abstract class TapAiBase extends SpellAbilityAi {
}
if (choice == null) { // can't find anything left
- if ((tgt.getNumTargeted() < tgt.getMinTargets(sa.getSourceCard(), sa)) || (tgt.getNumTargeted() == 0)) {
+ if ((sa.getTargets().getNumTargeted() < tgt.getMinTargets(sa.getSourceCard(), sa)) || (sa.getTargets().getNumTargeted() == 0)) {
if (!mandatory) {
- tgt.resetTargets();
+ sa.resetTargets();
}
return false;
} else {
@@ -89,7 +89,7 @@ public abstract class TapAiBase extends SpellAbilityAi {
}
tapList.remove(choice);
- tgt.addTarget(choice);
+ sa.getTargets().add(choice);
}
return true;
@@ -103,7 +103,7 @@ public abstract class TapAiBase extends SpellAbilityAi {
* @param source
* a {@link forge.Card} object.
* @param tgt
- * a {@link forge.card.spellability.Target} object.
+ * a {@link forge.card.spellability.TargetRestrictions} object.
* @param af
* a {@link forge.card.ability.AbilityFactory} object.
* @param sa
@@ -112,7 +112,7 @@ public abstract class TapAiBase extends SpellAbilityAi {
* a boolean.
* @return a boolean.
*/
- protected boolean tapPrefTargeting(final Player ai, final Card source, final Target tgt, final SpellAbility sa, final boolean mandatory) {
+ protected boolean tapPrefTargeting(final Player ai, final Card source, final TargetRestrictions tgt, final SpellAbility sa, final boolean mandatory) {
final Player opp = ai.getOpponent();
final Game game = ai.getGame();
List tapList = opp.getCardsIn(ZoneType.Battlefield);
@@ -142,13 +142,13 @@ public abstract class TapAiBase extends SpellAbilityAi {
return false;
}
- while (tgt.getNumTargeted() < tgt.getMaxTargets(source, sa)) {
+ while (sa.getTargets().getNumTargeted() < tgt.getMaxTargets(source, sa)) {
Card choice = null;
if (tapList.size() == 0) {
- if ((tgt.getNumTargeted() < tgt.getMinTargets(source, sa)) || (tgt.getNumTargeted() == 0)) {
+ if ((sa.getTargets().getNumTargeted() < tgt.getMinTargets(source, sa)) || (sa.getTargets().getNumTargeted() == 0)) {
if (!mandatory) {
- tgt.resetTargets();
+ sa.resetTargets();
}
return false;
} else {
@@ -204,9 +204,9 @@ public abstract class TapAiBase extends SpellAbilityAi {
}
if (choice == null) { // can't find anything left
- if ((tgt.getNumTargeted() < tgt.getMinTargets(sa.getSourceCard(), sa)) || (tgt.getNumTargeted() == 0)) {
+ if ((sa.getTargets().getNumTargeted() < tgt.getMinTargets(sa.getSourceCard(), sa)) || (sa.getTargets().getNumTargeted() == 0)) {
if (!mandatory) {
- tgt.resetTargets();
+ sa.resetTargets();
}
return false;
} else {
@@ -218,7 +218,7 @@ public abstract class TapAiBase extends SpellAbilityAi {
}
tapList.remove(choice);
- tgt.addTarget(choice);
+ sa.getTargets().add(choice);
}
return true;
@@ -239,7 +239,7 @@ public abstract class TapAiBase extends SpellAbilityAi {
*/
protected boolean tapUnpreferredTargeting(final Player ai, final SpellAbility sa, final boolean mandatory) {
final Card source = sa.getSourceCard();
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
final Game game = ai.getGame();
List list = game.getCardsIn(ZoneType.Battlefield);
@@ -280,7 +280,7 @@ public abstract class TapAiBase extends SpellAbilityAi {
@Override
protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) {
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
final Card source = sa.getSourceCard();
if (tgt == null) {
@@ -292,7 +292,7 @@ public abstract class TapAiBase extends SpellAbilityAi {
return true;
} else {
- tgt.resetTargets();
+ sa.resetTargets();
if (tapPrefTargeting(ai, source, tgt, sa, mandatory)) {
return true;
} else if (mandatory) {
@@ -306,7 +306,7 @@ public abstract class TapAiBase extends SpellAbilityAi {
@Override
public boolean chkAIDrawback(SpellAbility sa, Player ai) {
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
final Card source = sa.getSourceCard();
boolean randomReturn = true;
@@ -315,7 +315,7 @@ public abstract class TapAiBase extends SpellAbilityAi {
// either self or defined, either way should be fine
} else {
// target section, maybe pull this out?
- tgt.resetTargets();
+ sa.resetTargets();
if (!tapPrefTargeting(ai, source, tgt, sa, false)) {
return false;
}
diff --git a/src/main/java/forge/card/ability/ai/TapAllAi.java b/src/main/java/forge/card/ability/ai/TapAllAi.java
index 2ded0dbc056..8af60b465e2 100644
--- a/src/main/java/forge/card/ability/ai/TapAllAi.java
+++ b/src/main/java/forge/card/ability/ai/TapAllAi.java
@@ -11,7 +11,7 @@ import forge.CardLists;
import forge.CardPredicates.Presets;
import forge.card.ability.SpellAbilityAi;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.Game;
import forge.game.phase.CombatUtil;
import forge.game.phase.PhaseType;
@@ -45,11 +45,9 @@ public class TapAllAi extends SpellAbilityAi {
List validTappables = game.getCardsIn(ZoneType.Battlefield);
- final Target tgt = sa.getTarget();
-
- if (sa.getTarget() != null) {
- tgt.resetTargets();
- tgt.addTarget(opp);
+ if (sa.usesTargeting()) {
+ sa.resetTargets();
+ sa.getTargets().add(opp);
validTappables = opp.getCardsIn(ZoneType.Battlefield);
}
@@ -126,11 +124,11 @@ public class TapAllAi extends SpellAbilityAi {
List validTappables = getTapAllTargets(valid, source);
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
if (tgt != null) {
- tgt.resetTargets();
- tgt.addTarget(ai.getOpponent());
+ sa.resetTargets();
+ sa.getTargets().add(ai.getOpponent());
validTappables = ai.getOpponent().getCardsIn(ZoneType.Battlefield);
}
diff --git a/src/main/java/forge/card/ability/ai/TapOrUntapAi.java b/src/main/java/forge/card/ability/ai/TapOrUntapAi.java
index 1d67a7bc6b0..5cdf75e407d 100644
--- a/src/main/java/forge/card/ability/ai/TapOrUntapAi.java
+++ b/src/main/java/forge/card/ability/ai/TapOrUntapAi.java
@@ -6,7 +6,7 @@ import java.util.Random;
import forge.Card;
import forge.card.ability.AbilityUtils;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.player.Player;
import forge.util.MyRandom;
@@ -17,7 +17,7 @@ public class TapOrUntapAi extends TapAiBase {
*/
@Override
protected boolean canPlayAI(Player ai, SpellAbility sa) {
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
final Card source = sa.getSourceCard();
final Random r = MyRandom.getRandom();
@@ -38,7 +38,7 @@ public class TapOrUntapAi extends TapAiBase {
return false;
}
} else {
- tgt.resetTargets();
+ sa.resetTargets();
if (!tapPrefTargeting(ai, source, tgt, sa, false)) {
return false;
}
diff --git a/src/main/java/forge/card/ability/ai/TokenAi.java b/src/main/java/forge/card/ability/ai/TokenAi.java
index e7c5deb9c1e..80b42cccf5a 100644
--- a/src/main/java/forge/card/ability/ai/TokenAi.java
+++ b/src/main/java/forge/card/ability/ai/TokenAi.java
@@ -7,7 +7,7 @@ import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityAi;
import forge.card.cost.Cost;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.Game;
import forge.game.ai.ComputerUtil;
import forge.game.ai.ComputerUtilCost;
@@ -126,13 +126,13 @@ public class TokenAi extends SpellAbilityAi {
final Random r = MyRandom.getRandom();
final Card source = sa.getSourceCard();
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
if (tgt != null) {
- tgt.resetTargets();
+ sa.resetTargets();
if (tgt.canOnlyTgtOpponent() || "Opponent".equals(sa.getParam("AITgts"))) {
- tgt.addTarget(opp);
+ sa.getTargets().add(opp);
} else {
- tgt.addTarget(ai);
+ sa.getTargets().add(ai);
}
}
@@ -184,13 +184,13 @@ public class TokenAi extends SpellAbilityAi {
protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) {
readParameters(sa);
final Card source = sa.getSourceCard();
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
if (tgt != null) {
- tgt.resetTargets();
+ sa.resetTargets();
if (tgt.canOnlyTgtOpponent()) {
- tgt.addTarget(ai.getOpponent());
+ sa.getTargets().add(ai.getOpponent());
} else {
- tgt.addTarget(ai);
+ sa.getTargets().add(ai);
}
}
if ("X".equals(this.tokenAmount) || "X".equals(this.tokenPower) || "X".equals(this.tokenToughness)) {
diff --git a/src/main/java/forge/card/ability/ai/TwoPilesAi.java b/src/main/java/forge/card/ability/ai/TwoPilesAi.java
index 7e91e6c2459..9bf065732a9 100644
--- a/src/main/java/forge/card/ability/ai/TwoPilesAi.java
+++ b/src/main/java/forge/card/ability/ai/TwoPilesAi.java
@@ -8,7 +8,7 @@ import forge.CardLists;
import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityAi;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.player.Player;
import forge.game.zone.ZoneType;
@@ -31,20 +31,19 @@ public class TwoPilesAi extends SpellAbilityAi {
valid = sa.getParam("ValidCards");
}
- List tgtPlayers;
+
final Player opp = ai.getOpponent();
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
if (tgt != null) {
- tgt.resetTargets();
+ sa.resetTargets();
if (tgt.canTgtPlayer()) {
- tgt.addTarget(opp);
+ sa.getTargets().add(opp);
}
- tgtPlayers = tgt.getTargetPlayers();
- } else {
- tgtPlayers = AbilityUtils.getDefinedPlayers(sa.getSourceCard(), sa.getParam("Defined"), sa);
}
-
+
+ List tgtPlayers = getTargetPlayers(sa);
+
final Player p = tgtPlayers.get(0);
List pool = new ArrayList();
if (sa.hasParam("DefinedCards")) {
diff --git a/src/main/java/forge/card/ability/ai/UnattachAllAi.java b/src/main/java/forge/card/ability/ai/UnattachAllAi.java
index b398379152d..3250efe1f57 100644
--- a/src/main/java/forge/card/ability/ai/UnattachAllAi.java
+++ b/src/main/java/forge/card/ability/ai/UnattachAllAi.java
@@ -10,7 +10,7 @@ import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityAi;
import forge.card.cost.Cost;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.ai.ComputerUtilCard;
import forge.game.ai.ComputerUtilMana;
import forge.game.phase.PhaseType;
@@ -36,9 +36,9 @@ public class UnattachAllAi extends SpellAbilityAi {
boolean chance = r.nextFloat() <= .9;
// Attach spells always have a target
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
if (tgt != null) {
- tgt.resetTargets();
+ sa.resetTargets();
}
if (abCost != null && abCost.getTotalMana().countX() > 0 && source.getSVar("X").equals("Count$xPaid")) {
@@ -69,7 +69,7 @@ public class UnattachAllAi extends SpellAbilityAi {
final Player opp = ai.getOpponent();
// Check if there are any valid targets
List targets = new ArrayList();
- final Target tgt = sa.getTarget();
+ 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/ai/UntapAi.java b/src/main/java/forge/card/ability/ai/UntapAi.java
index f83c1f583ee..a3d14dd6538 100644
--- a/src/main/java/forge/card/ability/ai/UntapAi.java
+++ b/src/main/java/forge/card/ability/ai/UntapAi.java
@@ -10,7 +10,7 @@ import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityAi;
import forge.card.cost.Cost;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.ai.ComputerUtilCard;
import forge.game.ai.ComputerUtilCost;
import forge.game.player.Player;
@@ -24,7 +24,7 @@ public class UntapAi extends SpellAbilityAi {
*/
@Override
protected boolean canPlayAI(Player ai, SpellAbility sa) {
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
final Card source = sa.getSourceCard();
final Cost cost = sa.getPayCosts();
@@ -51,7 +51,7 @@ public class UntapAi extends SpellAbilityAi {
@Override
protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) {
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
if (tgt == null) {
if (mandatory) {
@@ -79,7 +79,7 @@ public class UntapAi extends SpellAbilityAi {
@Override
public boolean chkAIDrawback(SpellAbility sa, Player ai) {
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
boolean randomReturn = true;
@@ -100,7 +100,7 @@ public class UntapAi extends SpellAbilityAi {
*
*
* @param tgt
- * a {@link forge.card.spellability.Target} object.
+ * a {@link forge.card.spellability.TargetRestrictions} object.
* @param af
* a {@link forge.card.ability.AbilityFactory} object.
* @param sa
@@ -109,7 +109,7 @@ public class UntapAi extends SpellAbilityAi {
* a boolean.
* @return a boolean.
*/
- private static boolean untapPrefTargeting(final Player ai, final Target tgt, final SpellAbility sa, final boolean mandatory) {
+ private static boolean untapPrefTargeting(final Player ai, final TargetRestrictions tgt, final SpellAbility sa, final boolean mandatory) {
final Card source = sa.getSourceCard();
Player targetController = ai;
@@ -132,12 +132,12 @@ public class UntapAi extends SpellAbilityAi {
return false;
}
- while (tgt.getNumTargeted() < tgt.getMaxTargets(sa.getSourceCard(), sa)) {
+ while (sa.getTargets().getNumTargeted() < tgt.getMaxTargets(sa.getSourceCard(), sa)) {
Card choice = null;
if (untapList.size() == 0) {
- if ((tgt.getNumTargeted() < tgt.getMinTargets(sa.getSourceCard(), sa)) || (tgt.getNumTargeted() == 0)) {
- tgt.resetTargets();
+ if ((sa.getTargets().getNumTargeted() < tgt.getMinTargets(sa.getSourceCard(), sa)) || (sa.getTargets().getNumTargeted() == 0)) {
+ sa.resetTargets();
return false;
} else {
// TODO is this good enough? for up to amounts?
@@ -157,8 +157,8 @@ public class UntapAi extends SpellAbilityAi {
}
if (choice == null) { // can't find anything left
- if ((tgt.getNumTargeted() < tgt.getMinTargets(sa.getSourceCard(), sa)) || (tgt.getNumTargeted() == 0)) {
- tgt.resetTargets();
+ if ((sa.getTargets().getNumTargeted() < tgt.getMinTargets(sa.getSourceCard(), sa)) || (sa.getTargets().getNumTargeted() == 0)) {
+ sa.resetTargets();
return false;
} else {
// TODO is this good enough? for up to amounts?
@@ -167,7 +167,7 @@ public class UntapAi extends SpellAbilityAi {
}
untapList.remove(choice);
- tgt.addTarget(choice);
+ sa.getTargets().add(choice);
}
return true;
}
@@ -187,7 +187,7 @@ public class UntapAi extends SpellAbilityAi {
*/
private boolean untapUnpreferredTargeting(final SpellAbility sa, final boolean mandatory) {
final Card source = sa.getSourceCard();
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
List list = sa.getActivatingPlayer().getGame().getCardsIn(ZoneType.Battlefield);
@@ -228,7 +228,7 @@ public class UntapAi extends SpellAbilityAi {
* @param source
* a {@link forge.Card} object.
* @param tgt
- * a {@link forge.card.spellability.Target} object.
+ * a {@link forge.card.spellability.TargetRestrictions} object.
* @param af
* a {@link forge.card.ability.AbilityFactory} object.
* @param sa
@@ -239,8 +239,9 @@ public class UntapAi extends SpellAbilityAi {
* a {@link forge.CardList} object.
* @return a boolean.
*/
- private boolean untapTargetList(final Card source, final Target tgt, final SpellAbility sa, final boolean mandatory, final List tapList) {
- for (final Card c : tgt.getTargetCards()) {
+ private boolean untapTargetList(final Card source, final TargetRestrictions tgt, final SpellAbility sa, final boolean mandatory, final List tapList) {
+
+ for (final Card c : sa.getTargets().getTargetCards()) {
tapList.remove(c);
}
@@ -248,13 +249,13 @@ public class UntapAi extends SpellAbilityAi {
return false;
}
- while (tgt.getNumTargeted() < tgt.getMaxTargets(source, sa)) {
+ while (sa.getTargets().getNumTargeted() < tgt.getMaxTargets(source, sa)) {
Card choice = null;
if (tapList.size() == 0) {
- if ((tgt.getNumTargeted() < tgt.getMinTargets(source, sa)) || (tgt.getNumTargeted() == 0)) {
+ if ((sa.getTargets().getNumTargeted() < tgt.getMinTargets(source, sa)) || (sa.getTargets().getNumTargeted() == 0)) {
if (!mandatory) {
- tgt.resetTargets();
+ sa.resetTargets();
}
return false;
} else {
@@ -274,9 +275,9 @@ public class UntapAi extends SpellAbilityAi {
}
if (choice == null) { // can't find anything left
- if ((tgt.getNumTargeted() < tgt.getMinTargets(sa.getSourceCard(), sa)) || (tgt.getNumTargeted() == 0)) {
+ if ((sa.getTargets().getNumTargeted() < tgt.getMinTargets(sa.getSourceCard(), sa)) || (sa.getTargets().getNumTargeted() == 0)) {
if (!mandatory) {
- tgt.resetTargets();
+ sa.resetTargets();
}
return false;
} else {
@@ -286,7 +287,7 @@ public class UntapAi extends SpellAbilityAi {
}
tapList.remove(choice);
- tgt.addTarget(choice);
+ sa.getTargets().add(choice);
}
return true;
diff --git a/src/main/java/forge/card/ability/effects/AddTurnEffect.java b/src/main/java/forge/card/ability/effects/AddTurnEffect.java
index e3792d20283..47ca309296c 100644
--- a/src/main/java/forge/card/ability/effects/AddTurnEffect.java
+++ b/src/main/java/forge/card/ability/effects/AddTurnEffect.java
@@ -5,7 +5,6 @@ import java.util.List;
import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityEffect;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
import forge.game.phase.ExtraTurn;
import forge.game.player.Player;
@@ -39,17 +38,10 @@ public class AddTurnEffect extends SpellAbilityEffect {
public void resolve(SpellAbility sa) {
final int numTurns = AbilityUtils.calculateAmount(sa.getSourceCard(), sa.getParam("NumTurns"), sa);
- List tgtPlayers;
-
- final Target tgt = sa.getTarget();
- if (tgt != null) {
- tgtPlayers = tgt.getTargetPlayers();
- } else {
- tgtPlayers = AbilityUtils.getDefinedPlayers(sa.getSourceCard(), sa.getParam("Defined"), sa);
- }
+ List tgtPlayers = getTargetPlayers(sa);
for (final Player p : tgtPlayers) {
- if ((tgt == null) || p.canBeTargetedBy(sa)) {
+ if ((sa.getTargetRestrictions() == null) || p.canBeTargetedBy(sa)) {
for (int i = 0; i < numTurns; i++) {
ExtraTurn extra = p.getGame().getPhaseHandler().addExtraTurn(p);
if (sa.hasParam("LoseAtEndStep")) {
diff --git a/src/main/java/forge/card/ability/effects/AnimateAllEffect.java b/src/main/java/forge/card/ability/effects/AnimateAllEffect.java
index 14f41a6cdae..582a25054d7 100644
--- a/src/main/java/forge/card/ability/effects/AnimateAllEffect.java
+++ b/src/main/java/forge/card/ability/effects/AnimateAllEffect.java
@@ -14,7 +14,6 @@ import forge.card.ability.AbilityFactory;
import forge.card.ability.AbilityUtils;
import forge.card.replacement.ReplacementEffect;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
import forge.card.staticability.StaticAbility;
import forge.card.trigger.Trigger;
import forge.card.trigger.TriggerHandler;
@@ -121,16 +120,8 @@ public class AnimateAllEffect extends AnimateEffectBase {
}
List list;
- List tgtPlayers = null;
-
- final Target tgt = sa.getTarget();
- if (tgt != null) {
- tgtPlayers = tgt.getTargetPlayers();
- } else if (sa.hasParam("Defined")) {
- // use it
- tgtPlayers = AbilityUtils.getDefinedPlayers(sa.getSourceCard(), sa.getParam("Defined"), sa);
- }
-
+ List tgtPlayers = getTargetPlayers(sa);
+
if ((tgtPlayers == null) || tgtPlayers.isEmpty()) {
list = game.getCardsIn(ZoneType.Battlefield);
} else {
diff --git a/src/main/java/forge/card/ability/effects/AnimateEffect.java b/src/main/java/forge/card/ability/effects/AnimateEffect.java
index 6cb24d40ad6..60539cac9a7 100644
--- a/src/main/java/forge/card/ability/effects/AnimateEffect.java
+++ b/src/main/java/forge/card/ability/effects/AnimateEffect.java
@@ -13,7 +13,6 @@ import forge.card.ability.AbilityFactory;
import forge.card.ability.AbilityUtils;
import forge.card.replacement.ReplacementEffect;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
import forge.card.staticability.StaticAbility;
import forge.card.trigger.Trigger;
import forge.card.trigger.TriggerHandler;
@@ -27,8 +26,7 @@ public class AnimateEffect extends AnimateEffectBase {
@Override
public void resolve(final SpellAbility sa) {
final Card source = sa.getSourceCard();
- final Card host = sa.getSourceCard();
- final Map svars = host.getSVars();
+ final Map svars = source.getSVars();
String animateRemembered = null;
@@ -46,11 +44,11 @@ public class AnimateEffect extends AnimateEffectBase {
// AF specific sa
int power = -1;
if (sa.hasParam("Power")) {
- power = AbilityUtils.calculateAmount(host, sa.getParam("Power"), sa);
+ power = AbilityUtils.calculateAmount(source, sa.getParam("Power"), sa);
}
int toughness = -1;
if (sa.hasParam("Toughness")) {
- toughness = AbilityUtils.calculateAmount(host, sa.getParam("Toughness"), sa);
+ toughness = AbilityUtils.calculateAmount(source, sa.getParam("Toughness"), sa);
}
final Game game = sa.getActivatingPlayer().getGame();
@@ -74,7 +72,7 @@ public class AnimateEffect extends AnimateEffectBase {
// allow ChosenType - overrides anything else specified
if (types.contains("ChosenType")) {
types.clear();
- types.add(host.getChosenType());
+ types.add(source.getChosenType());
}
final ArrayList keywords = new ArrayList();
@@ -106,7 +104,7 @@ public class AnimateEffect extends AnimateEffectBase {
final String colors = sa.getParam("Colors");
if (colors.equals("ChosenColor")) {
- tmpDesc = CardUtil.getShortColorsString(host.getChosenColor());
+ tmpDesc = CardUtil.getShortColorsString(source.getChosenColor());
} else {
tmpDesc = CardUtil.getShortColorsString(new ArrayList(Arrays.asList(colors.split(","))));
}
@@ -137,8 +135,7 @@ public class AnimateEffect extends AnimateEffectBase {
sVars.addAll(Arrays.asList(sa.getParam("sVars").split(",")));
}
- final Target tgt = sa.getTarget();
- List tgts = tgt != null ? tgts = tgt.getTargetCards() : AbilityUtils.getDefinedCards(source, sa.getParam("Defined"), sa);
+ List tgts = getTargetCards(sa);
for (final Card c : tgts) {
@@ -165,7 +162,7 @@ public class AnimateEffect extends AnimateEffectBase {
final ArrayList addedAbilities = new ArrayList();
if (abilities.size() > 0) {
for (final String s : abilities) {
- final String actualAbility = host.getSVar(s);
+ final String actualAbility = source.getSVar(s);
final SpellAbility grantedAbility = AbilityFactory.getAbility(actualAbility, c);
addedAbilities.add(grantedAbility);
c.addSpellAbility(grantedAbility);
@@ -176,7 +173,7 @@ public class AnimateEffect extends AnimateEffectBase {
final ArrayList addedTriggers = new ArrayList();
if (triggers.size() > 0) {
for (final String s : triggers) {
- final String actualTrigger = host.getSVar(s);
+ final String actualTrigger = source.getSVar(s);
final Trigger parsedTrigger = TriggerHandler.parseTrigger(actualTrigger, c, false);
addedTriggers.add(c.addTrigger(parsedTrigger));
}
@@ -196,7 +193,7 @@ public class AnimateEffect extends AnimateEffectBase {
// itself a static ability)
if (stAbs.size() > 0) {
for (final String s : stAbs) {
- final String actualAbility = host.getSVar(s);
+ final String actualAbility = source.getSVar(s);
c.addStaticAbility(actualAbility);
}
}
@@ -204,7 +201,7 @@ public class AnimateEffect extends AnimateEffectBase {
// give sVars
if (sVars.size() > 0) {
for (final String s : sVars) {
- final String actualsVar = host.getSVar(s);
+ final String actualsVar = source.getSVar(s);
c.setSVar(s, actualsVar);
}
}
@@ -230,7 +227,7 @@ public class AnimateEffect extends AnimateEffectBase {
// give Remembered
if (animateRemembered != null) {
- for (final Object o : AbilityUtils.getDefinedObjects(host, animateRemembered, sa)) {
+ for (final Object o : AbilityUtils.getDefinedObjects(source, animateRemembered, sa)) {
c.addRemembered(o);
}
}
@@ -266,13 +263,13 @@ public class AnimateEffect extends AnimateEffectBase {
if (sa.hasParam("UntilEndOfCombat")) {
game.getEndOfCombat().addUntil(unanimate);
} else if (sa.hasParam("UntilHostLeavesPlay")) {
- host.addLeavesPlayCommand(unanimate);
+ source.addLeavesPlayCommand(unanimate);
} else if (sa.hasParam("UntilYourNextUpkeep")) {
- game.getUpkeep().addUntil(host.getController(), unanimate);
+ game.getUpkeep().addUntil(source.getController(), unanimate);
} else if (sa.hasParam("UntilControllerNextUntap")) {
game.getUntap().addUntil(c.getController(), unanimate);
} else if (sa.hasParam("UntilYourNextTurn")) {
- game.getCleanup().addUntil(host.getController(), unanimate);
+ game.getCleanup().addUntil(source.getController(), unanimate);
} else {
game.getEndOfTurn().addUntil(unanimate);
}
@@ -321,8 +318,7 @@ public class AnimateEffect extends AnimateEffectBase {
final StringBuilder sb = new StringBuilder();
- final Target tgt = sa.getTarget();
- final List tgts = tgt != null ? tgt.getTargetCards() : AbilityUtils.getDefinedCards(sa.getSourceCard(), sa.getParam("Defined"), sa);
+ final List tgts = getTargetCards(sa);
for (final Card c : tgts) {
sb.append(c).append(" ");
diff --git a/src/main/java/forge/card/ability/effects/AttachEffect.java b/src/main/java/forge/card/ability/effects/AttachEffect.java
index 19bbb708e5a..b2bc8fbc5b3 100644
--- a/src/main/java/forge/card/ability/effects/AttachEffect.java
+++ b/src/main/java/forge/card/ability/effects/AttachEffect.java
@@ -12,10 +12,11 @@ import forge.card.ability.AbilityUtils;
import forge.card.ability.ApiType;
import forge.card.ability.SpellAbilityEffect;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.Game;
import forge.game.player.Player;
import forge.game.zone.ZoneType;
+import forge.util.Lang;
public class AttachEffect extends SpellAbilityEffect {
@@ -38,7 +39,7 @@ public class AttachEffect extends SpellAbilityEffect {
Card source = sa.getSourceCard();
Card card = sa.getSourceCard();
- final List targets = getTargetObjects(sa);
+ final List targets = getTargets(sa);
if (sa.hasParam("Object")) {
card = AbilityUtils.getDefinedCards(source, sa.getParam("Object"), sa).get(0);
@@ -61,13 +62,10 @@ public class AttachEffect extends SpellAbilityEffect {
sb.append(" Attach to ");
- final List targets = getTargetObjects(sa);
+ final List targets = getTargets(sa);
// Should never allow more than one Attachment per card
- for (final Object o : targets) {
- sb.append(o).append(" ");
- }
-
+ sb.append(Lang.joinHomogenous(targets));
return sb.toString();
}
@@ -179,7 +177,7 @@ public class AttachEffect extends SpellAbilityEffect {
}
aura.setActivatingPlayer(source.getController());
final Game game = source.getGame();
- final Target tgt = aura.getTarget();
+ final TargetRestrictions tgt = aura.getTargetRestrictions();
Player p = source.getController();
if (tgt.canTgtPlayer()) {
diff --git a/src/main/java/forge/card/ability/effects/BecomesBlockedEffect.java b/src/main/java/forge/card/ability/effects/BecomesBlockedEffect.java
index 6f23e47fe1f..a8fedbd21ef 100644
--- a/src/main/java/forge/card/ability/effects/BecomesBlockedEffect.java
+++ b/src/main/java/forge/card/ability/effects/BecomesBlockedEffect.java
@@ -11,7 +11,7 @@ import forge.card.ability.SpellAbilityEffect;
import forge.card.cardfactory.CardFactoryUtil;
import forge.card.spellability.Ability;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.card.trigger.TriggerType;
import forge.game.Game;
@@ -33,7 +33,7 @@ public class BecomesBlockedEffect extends SpellAbilityEffect {
public void resolve(SpellAbility sa) {
final Game game = sa.getActivatingPlayer().getGame();
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
for (final Card c : getTargetCards(sa)) {
if ((tgt == null) || c.canBeTargetedBy(sa)) {
game.getCombat().setBlocked(c);
diff --git a/src/main/java/forge/card/ability/effects/ChangeTargetsEffect.java b/src/main/java/forge/card/ability/effects/ChangeTargetsEffect.java
index 424e2fb1bf3..588c2751a5c 100644
--- a/src/main/java/forge/card/ability/effects/ChangeTargetsEffect.java
+++ b/src/main/java/forge/card/ability/effects/ChangeTargetsEffect.java
@@ -5,6 +5,7 @@ import java.util.List;
import forge.card.ability.SpellAbilityEffect;
import forge.card.spellability.SpellAbility;
import forge.card.spellability.SpellAbilityStackInstance;
+import forge.card.spellability.TargetChoices;
import forge.game.zone.MagicStack;
/**
@@ -18,7 +19,7 @@ public class ChangeTargetsEffect extends SpellAbilityEffect {
*/
@Override
public void resolve(SpellAbility sa) {
- final List sas = getTargetSpellAbilities(sa);
+ final List sas = getTargetSpells(sa);
final boolean remember = sa.hasParam("RememberTargetedCard");
final MagicStack stack = sa.getActivatingPlayer().getGame().getStack();
@@ -33,7 +34,8 @@ public class ChangeTargetsEffect extends SpellAbilityEffect {
while(changingTgtSI != null) {
// Update targets, with a potential new target
SpellAbility changingTgtSA = changingTgtSI.getSpellAbility();
- changingTgtSI.updateTarget(sa.getActivatingPlayer().getController().chooseTargets(changingTgtSA));
+ TargetChoices newTarget = sa.getActivatingPlayer().getController().chooseTargets(changingTgtSA);
+ changingTgtSI.updateTarget(newTarget);
changingTgtSI = changingTgtSI.getSubInstace();
}
diff --git a/src/main/java/forge/card/ability/effects/ChangeZoneAllEffect.java b/src/main/java/forge/card/ability/effects/ChangeZoneAllEffect.java
index 19e7a7a7cfe..46617b333ac 100644
--- a/src/main/java/forge/card/ability/effects/ChangeZoneAllEffect.java
+++ b/src/main/java/forge/card/ability/effects/ChangeZoneAllEffect.java
@@ -46,7 +46,7 @@ public class ChangeZoneAllEffect extends SpellAbilityEffect {
List cards = new ArrayList();
- List tgtPlayers = getTargetPlayersEmptyAsDefault(sa);
+ List tgtPlayers = getTargetPlayers(sa);
final Game game = sa.getActivatingPlayer().getGame();
if ((tgtPlayers == null) || tgtPlayers.isEmpty() || sa.hasParam("UseAllOriginZones")) {
@@ -106,7 +106,7 @@ public class ChangeZoneAllEffect extends SpellAbilityEffect {
// Auras without Candidates stay in their current location
if (c.isAura()) {
final SpellAbility saAura = AttachEffect.getAttachSpellAbility(c);
- if (!saAura.getTarget().hasCandidates(saAura, false)) {
+ if (!saAura.getTargetRestrictions().hasCandidates(saAura, false)) {
continue;
}
}
diff --git a/src/main/java/forge/card/ability/effects/ChangeZoneEffect.java b/src/main/java/forge/card/ability/effects/ChangeZoneEffect.java
index 6f66d772bd6..aaa22295c56 100644
--- a/src/main/java/forge/card/ability/effects/ChangeZoneEffect.java
+++ b/src/main/java/forge/card/ability/effects/ChangeZoneEffect.java
@@ -5,6 +5,8 @@ import java.util.HashMap;
import java.util.List;
import com.google.common.base.Predicates;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
import forge.Card;
import forge.CardCharacteristicName;
@@ -18,7 +20,7 @@ import forge.card.ability.ai.ChangeZoneAi;
import forge.card.spellability.AbilitySub;
import forge.card.spellability.SpellAbility;
import forge.card.spellability.SpellAbilityStackInstance;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.card.trigger.TriggerType;
import forge.game.Game;
import forge.game.player.Player;
@@ -70,15 +72,15 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
sb.append(" ");
// Player whose cards will change zones
- List fetchers = new ArrayList();
+ List fetchers = null;
if (sa.hasParam("DefinedPlayer")) {
fetchers = AbilityUtils.getDefinedPlayers(sa.getSourceCard(), sa.getParam("DefinedPlayer"), sa);
}
- if (fetchers.isEmpty() && sa.hasParam("ValidTgts") && sa.getTarget() != null) {
- fetchers = sa.getTarget().getTargetPlayers();
+ if (fetchers == null && sa.hasParam("ValidTgts") && sa.usesTargeting()) {
+ fetchers = Lists.newArrayList(sa.getTargets().getTargetPlayers());
}
- if (fetchers.isEmpty()) {
- fetchers.add(sa.getSourceCard().getController());
+ if (fetchers == null) {
+ fetchers = Lists.newArrayList(sa.getSourceCard().getController());
}
final String fetcherNames = Lang.joinHomogenous(fetchers, Player.Accessors.FN_GET_NAME);
@@ -238,15 +240,12 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
final StringBuilder sbTargets = new StringBuilder();
- List tgts;
- if (sa.getTarget() != null) {
- tgts = sa.getTarget().getTargetCards();
+ Iterable tgts;
+ if (sa.usesTargeting()) {
+ tgts = sa.getTargets().getTargetCards();
} else {
// otherwise add self to list and go from there
- tgts = new ArrayList();
- for (final Card c : sa.knownDetermineDefined(sa.getParam("Defined"))) {
- tgts.add(c);
- }
+ tgts = sa.knownDetermineDefined(sa.getParam("Defined"));
}
for (final Card c : tgts) {
@@ -255,7 +254,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
final String targetname = sbTargets.toString();
- final String pronoun = tgts.size() > 1 ? " their " : " its ";
+ final String pronoun = Iterables.size(tgts) > 1 ? " their " : " its ";
final String fromGraveyard = " from the graveyard";
@@ -367,11 +366,9 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
* @param sa
* a {@link forge.card.spellability.SpellAbility} object.
*/
- private static void changeKnownOriginResolve(final SpellAbility sa) {
- List tgtCards;
- List sas;
-
- final Target tgt = sa.getTarget();
+ private void changeKnownOriginResolve(final SpellAbility sa) {
+ Iterable tgtCards = getTargetCards(sa);
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
final Player player = sa.getActivatingPlayer();
final Card hostCard = sa.getSourceCard();
final Game game = player.getGame();
@@ -379,23 +376,8 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
final ZoneType destination = ZoneType.smartValueOf(sa.getParam("Destination"));
final List origin = ZoneType.listValueOf(sa.getParam("Origin"));
- if (tgt != null) {
- tgtCards = tgt.getTargetCards();
- } else {
- tgtCards = new ArrayList();
- for (final Card c : AbilityUtils.getDefinedCards(hostCard, sa.getParam("Defined"), sa)) {
- tgtCards.add(c);
- }
- }
-
// changing zones for spells on the stack
- if (tgt != null) {
- sas = tgt.getTargetSAs();
- } else {
- sas = AbilityUtils.getDefinedSpellAbilities(hostCard, sa.getParam("Defined"), sa);
- }
-
- for (final SpellAbility tgtSA : sas) {
+ for (final SpellAbility tgtSA : getTargetSpells(sa)) {
if (!tgtSA.isSpell()) { // Catch any abilities or triggers that slip through somehow
continue;
}
@@ -422,135 +404,134 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
boolean optional = sa.hasParam("Optional");
- if (tgtCards.size() != 0) {
- for (final Card tgtC : tgtCards) {
- if (tgt != null && tgtC.isInPlay() && !tgtC.canBeTargetedBy(sa)) {
- continue;
+
+ for (final Card tgtC : tgtCards) {
+ if (tgt != null && tgtC.isInPlay() && !tgtC.canBeTargetedBy(sa)) {
+ continue;
+ }
+
+ final String prompt = String.format("Do you want to move %s from %s to %s?", tgtC, origin, destination);
+ if (optional && false == player.getController().confirmAction(sa, null, prompt) )
+ continue;
+
+ final Zone originZone = game.getZoneOf(tgtC);
+
+ // if Target isn't in the expected Zone, continue
+
+ if (originZone == null || !origin.contains(originZone.getZoneType())) {
+ continue;
+ }
+
+ Card movedCard = null;
+
+ if (destination.equals(ZoneType.Library)) {
+ // library position is zero indexed
+ final int libraryPosition = sa.hasParam("LibraryPosition") ? Integer.parseInt(sa.getParam("LibraryPosition")) : 0;
+
+ movedCard = game.getAction().moveToLibrary(tgtC, libraryPosition);
+
+ // for things like Gaea's Blessing
+ if (sa.hasParam("Shuffle")) {
+ tgtC.getOwner().shuffle();
}
+ } else {
+ if (destination.equals(ZoneType.Battlefield)) {
+ if (sa.hasParam("Tapped") || sa.hasParam("Ninjutsu")) {
+ tgtC.setTapped(true);
+ }
+ if (sa.hasParam("GainControl")) {
+ if (sa.hasParam("NewController")) {
+ final Player p = AbilityUtils.getDefinedPlayers(hostCard, sa.getParam("NewController"), sa).get(0);
+ tgtC.setController(p, game.getNextTimestamp());
+ } else {
+ tgtC.setController(player, game.getNextTimestamp());
+ }
+ }
+ if (sa.hasParam("AttachedTo")) {
+ List list = AbilityUtils.getDefinedCards(hostCard, sa.getParam("AttachedTo"), sa);
+ if (list.isEmpty()) {
+ list = game.getCardsIn(ZoneType.Battlefield);
+ list = CardLists.getValidCards(list, sa.getParam("AttachedTo"), tgtC.getController(), tgtC);
+ }
+ if (!list.isEmpty()) {
+ Card attachedTo = player.getController().chooseSingleCardForEffect(list, sa, tgtC + " - Select a card to attach to.");
+ if (tgtC.isAura()) {
+ if (tgtC.isEnchanting()) {
+ // If this Card is already Enchanting something, need
+ // to unenchant it, then clear out the commands
+ final GameEntity oldEnchanted = tgtC.getEnchanting();
+ tgtC.removeEnchanting(oldEnchanted);
+ }
+ tgtC.enchantEntity(attachedTo);
+ } else if (tgtC.isEquipment()) { //Equipment
+ if (tgtC.isEquipping()) {
+ final Card oldEquiped = tgtC.getEquippingCard();
+ tgtC.removeEquipping(oldEquiped);
+ }
+ tgtC.equipCard(attachedTo);
+ } else { // fortification
+ if (tgtC.isFortifying()) {
+ final Card oldFortified = tgtC.getFortifyingCard();
+ tgtC.removeFortifying(oldFortified);
+ }
+ tgtC.fortifyCard(attachedTo);
+ }
+ } else { // When it should enter the battlefield attached to an illegal permanent it fails
+ continue;
+ }
+ }
- final String prompt = String.format("Do you want to move %s from %s to %s?", tgtC, origin, destination);
- if (optional && false == player.getController().confirmAction(sa, null, prompt) )
- continue;
+ // Auras without Candidates stay in their current
+ // location
+ if (tgtC.isAura()) {
+ final SpellAbility saAura = AttachEffect.getAttachSpellAbility(tgtC);
+ saAura.setActivatingPlayer(sa.getActivatingPlayer());
+ if (!saAura.getTargetRestrictions().hasCandidates(saAura, false)) {
+ continue;
+ }
+ }
- final Zone originZone = game.getZoneOf(tgtC);
+ movedCard = game.getAction().moveTo(tgtC.getController().getZone(destination), tgtC);
- // if Target isn't in the expected Zone, continue
-
- if (originZone == null || !origin.contains(originZone.getZoneType())) {
- continue;
- }
-
- Card movedCard = null;
-
- if (destination.equals(ZoneType.Library)) {
- // library position is zero indexed
- final int libraryPosition = sa.hasParam("LibraryPosition") ? Integer.parseInt(sa.getParam("LibraryPosition")) : 0;
-
- movedCard = game.getAction().moveToLibrary(tgtC, libraryPosition);
-
- // for things like Gaea's Blessing
- if (sa.hasParam("Shuffle")) {
- tgtC.getOwner().shuffle();
+ if (sa.hasParam("Ninjutsu") || sa.hasParam("Attacking")) {
+ // What should they attack?
+ // TODO Ninjutsu needs to actually select the Defender, instead of auto selecting player
+ List defenders = game.getCombat().getDefenders();
+ if (!defenders.isEmpty()) {
+ // Blockeres are already declared, set this to unblocked
+ game.getCombat().addAttacker(tgtC, defenders.get(0), false);
+ }
+ }
+ if (sa.hasParam("Tapped") || sa.hasParam("Ninjutsu")) {
+ tgtC.setTapped(true);
}
} else {
- if (destination.equals(ZoneType.Battlefield)) {
- if (sa.hasParam("Tapped") || sa.hasParam("Ninjutsu")) {
- tgtC.setTapped(true);
- }
- if (sa.hasParam("GainControl")) {
- if (sa.hasParam("NewController")) {
- final Player p = AbilityUtils.getDefinedPlayers(hostCard, sa.getParam("NewController"), sa).get(0);
- tgtC.setController(p, game.getNextTimestamp());
- } else {
- tgtC.setController(player, game.getNextTimestamp());
- }
- }
- if (sa.hasParam("AttachedTo")) {
- List list = AbilityUtils.getDefinedCards(hostCard, sa.getParam("AttachedTo"), sa);
- if (list.isEmpty()) {
- list = game.getCardsIn(ZoneType.Battlefield);
- list = CardLists.getValidCards(list, sa.getParam("AttachedTo"), tgtC.getController(), tgtC);
- }
- if (!list.isEmpty()) {
- Card attachedTo = player.getController().chooseSingleCardForEffect(list, sa, tgtC + " - Select a card to attach to.");
- if (tgtC.isAura()) {
- if (tgtC.isEnchanting()) {
- // If this Card is already Enchanting something, need
- // to unenchant it, then clear out the commands
- final GameEntity oldEnchanted = tgtC.getEnchanting();
- tgtC.removeEnchanting(oldEnchanted);
- }
- tgtC.enchantEntity(attachedTo);
- } else if (tgtC.isEquipment()) { //Equipment
- if (tgtC.isEquipping()) {
- final Card oldEquiped = tgtC.getEquippingCard();
- tgtC.removeEquipping(oldEquiped);
- }
- tgtC.equipCard(attachedTo);
- } else { // fortification
- if (tgtC.isFortifying()) {
- final Card oldFortified = tgtC.getFortifyingCard();
- tgtC.removeFortifying(oldFortified);
- }
- tgtC.fortifyCard(attachedTo);
- }
- } else { // When it should enter the battlefield attached to an illegal permanent it fails
- continue;
- }
- }
-
- // Auras without Candidates stay in their current
- // location
- if (tgtC.isAura()) {
- final SpellAbility saAura = AttachEffect.getAttachSpellAbility(tgtC);
- saAura.setActivatingPlayer(sa.getActivatingPlayer());
- if (!saAura.getTarget().hasCandidates(saAura, false)) {
- continue;
- }
- }
-
- movedCard = game.getAction().moveTo(tgtC.getController().getZone(destination), tgtC);
-
- if (sa.hasParam("Ninjutsu") || sa.hasParam("Attacking")) {
- // What should they attack?
- // TODO Ninjutsu needs to actually select the Defender, instead of auto selecting player
- List defenders = game.getCombat().getDefenders();
- if (!defenders.isEmpty()) {
- // Blockeres are already declared, set this to unblocked
- game.getCombat().addAttacker(tgtC, defenders.get(0), false);
- }
- }
- if (sa.hasParam("Tapped") || sa.hasParam("Ninjutsu")) {
- tgtC.setTapped(true);
- }
- } else {
- movedCard = game.getAction().moveTo(destination, tgtC);
- // If a card is Exiled from the stack, remove its spells from the stack
- if (sa.hasParam("Fizzle")) {
- ArrayList spells = tgtC.getSpellAbilities();
- for (SpellAbility spell : spells) {
- if (tgtC.isInZone(ZoneType.Exile)) {
- final SpellAbilityStackInstance si = game.getStack().getInstanceFromSpellAbility(spell);
- if (si != null) {
- game.getStack().remove(si);
- }
+ movedCard = game.getAction().moveTo(destination, tgtC);
+ // If a card is Exiled from the stack, remove its spells from the stack
+ if (sa.hasParam("Fizzle")) {
+ ArrayList spells = tgtC.getSpellAbilities();
+ for (SpellAbility spell : spells) {
+ if (tgtC.isInZone(ZoneType.Exile)) {
+ final SpellAbilityStackInstance si = game.getStack().getInstanceFromSpellAbility(spell);
+ if (si != null) {
+ game.getStack().remove(si);
}
}
}
- if (sa.hasParam("ExileFaceDown")) {
- movedCard.setState(CardCharacteristicName.FaceDown);
- }
+ }
+ if (sa.hasParam("ExileFaceDown")) {
+ movedCard.setState(CardCharacteristicName.FaceDown);
}
}
- if (remember != null) {
- hostCard.addRemembered(movedCard);
- }
- if (forget != null) {
- hostCard.getRemembered().remove(movedCard);
- }
- if (imprint != null) {
- hostCard.addImprinted(movedCard);
- }
+ }
+ if (remember != null) {
+ hostCard.addRemembered(movedCard);
+ }
+ if (forget != null) {
+ hostCard.getRemembered().remove(movedCard);
+ }
+ if (imprint != null) {
+ hostCard.addImprinted(movedCard);
}
}
}
@@ -582,8 +563,8 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
Player chooser = null;
if (sa.hasParam("Chooser")) {
final String choose = sa.getParam("Chooser");
- if (choose.equals("Targeted") && (sa.getTarget().getTargetPlayers() != null)) {
- chooser = sa.getTarget().getTargetPlayers().get(0);
+ if (choose.equals("Targeted") && sa.getTargets().isTargetingAnyPlayer()) {
+ chooser = sa.getTargets().getFirstTargetedPlayer();
} else {
chooser = AbilityUtils.getDefinedPlayers(sa.getSourceCard(), choose, sa).get(0);
}
@@ -621,9 +602,9 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
final boolean optional = sa.hasParam("Optional");
final Game game = player.getGame();
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
if (tgt != null) {
- final List players = tgt.getTargetPlayers();
+ final List players = Lists.newArrayList(sa.getTargets().getTargetPlayers());
player = sa.hasParam("DefinedPlayer") ? player : players.get(0);
if (players.contains(player) && !player.canBeTargetedBy(sa)) {
return;
diff --git a/src/main/java/forge/card/ability/effects/ChooseCardEffect.java b/src/main/java/forge/card/ability/effects/ChooseCardEffect.java
index 909a7f05ba3..f308c7e90a9 100644
--- a/src/main/java/forge/card/ability/effects/ChooseCardEffect.java
+++ b/src/main/java/forge/card/ability/effects/ChooseCardEffect.java
@@ -12,7 +12,7 @@ import forge.card.CardType;
import forge.card.ability.SpellAbilityEffect;
import forge.card.cardfactory.CardFactoryUtil;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.Game;
import forge.game.player.Player;
import forge.game.zone.ZoneType;
@@ -37,7 +37,7 @@ public class ChooseCardEffect extends SpellAbilityEffect {
final Game game = sa.getActivatingPlayer().getGame();
final ArrayList chosen = new ArrayList();
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
final List tgtPlayers = getTargetPlayers(sa);
ZoneType choiceZone = ZoneType.Battlefield;
diff --git a/src/main/java/forge/card/ability/effects/ChooseCardNameEffect.java b/src/main/java/forge/card/ability/effects/ChooseCardNameEffect.java
index 95ad9b9cc1f..db7355976f5 100644
--- a/src/main/java/forge/card/ability/effects/ChooseCardNameEffect.java
+++ b/src/main/java/forge/card/ability/effects/ChooseCardNameEffect.java
@@ -19,7 +19,7 @@ import forge.card.CardRulesPredicates;
import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityEffect;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.ai.ComputerUtilCard;
import forge.game.player.Player;
import forge.game.zone.ZoneType;
@@ -46,7 +46,7 @@ public class ChooseCardNameEffect extends SpellAbilityEffect {
public void resolve(SpellAbility sa) {
final Card host = sa.getSourceCard();
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
final List tgtPlayers = getTargetPlayers(sa);
String valid = "Card";
diff --git a/src/main/java/forge/card/ability/effects/ChooseColorEffect.java b/src/main/java/forge/card/ability/effects/ChooseColorEffect.java
index d42c35fefa0..b0ee32eacfe 100644
--- a/src/main/java/forge/card/ability/effects/ChooseColorEffect.java
+++ b/src/main/java/forge/card/ability/effects/ChooseColorEffect.java
@@ -11,7 +11,7 @@ import forge.CardPredicates;
import forge.Constant;
import forge.card.ability.SpellAbilityEffect;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.Game;
import forge.game.ai.ComputerUtilCard;
import forge.game.player.Player;
@@ -42,7 +42,7 @@ public class ChooseColorEffect extends SpellAbilityEffect {
final List tgtPlayers = getTargetPlayers(sa);
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
for (final Player p : tgtPlayers) {
if ((tgt == null) || p.canBeTargetedBy(sa)) {
diff --git a/src/main/java/forge/card/ability/effects/ChooseGenericEffect.java b/src/main/java/forge/card/ability/effects/ChooseGenericEffect.java
index c0dedc6f317..c2a27f9ff9a 100644
--- a/src/main/java/forge/card/ability/effects/ChooseGenericEffect.java
+++ b/src/main/java/forge/card/ability/effects/ChooseGenericEffect.java
@@ -13,7 +13,7 @@ import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityEffect;
import forge.card.spellability.AbilitySub;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.player.Player;
import forge.gui.GuiChoose;
import forge.util.Aggregates;
@@ -41,9 +41,9 @@ public class ChooseGenericEffect extends SpellAbilityEffect {
choices.put(s, theseParams.get("ChoiceDescription"));
}
- final List tgtPlayers = getDefinedPlayersBeforeTargetOnes(sa);
+ final List tgtPlayers = getDefinedPlayersOrTargeted(sa);
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
for (final Player p : tgtPlayers) {
if (tgt != null && !p.canBeTargetedBy(sa)) {
diff --git a/src/main/java/forge/card/ability/effects/ChooseNumberEffect.java b/src/main/java/forge/card/ability/effects/ChooseNumberEffect.java
index a34f74e2452..19a866feb35 100644
--- a/src/main/java/forge/card/ability/effects/ChooseNumberEffect.java
+++ b/src/main/java/forge/card/ability/effects/ChooseNumberEffect.java
@@ -9,7 +9,7 @@ import forge.Card;
import forge.card.ability.SpellAbilityEffect;
import forge.card.cardfactory.CardFactoryUtil;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.player.Player;
import forge.gui.GuiDialog;
@@ -43,7 +43,7 @@ public class ChooseNumberEffect extends SpellAbilityEffect {
final int max = StringUtils.isNumeric(sMax) ? Integer.parseInt(sMax) : CardFactoryUtil.xCount(card, card.getSVar(sMax));
final List tgtPlayers = getTargetPlayers(sa);
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
for (final Player p : tgtPlayers) {
if ((tgt == null) || p.canBeTargetedBy(sa)) {
diff --git a/src/main/java/forge/card/ability/effects/ChoosePlayerEffect.java b/src/main/java/forge/card/ability/effects/ChoosePlayerEffect.java
index eefd4603e9c..f9570efe5f4 100644
--- a/src/main/java/forge/card/ability/effects/ChoosePlayerEffect.java
+++ b/src/main/java/forge/card/ability/effects/ChoosePlayerEffect.java
@@ -6,7 +6,7 @@ import forge.Card;
import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityEffect;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.player.Player;
public class ChoosePlayerEffect extends SpellAbilityEffect {
@@ -29,7 +29,7 @@ public class ChoosePlayerEffect extends SpellAbilityEffect {
final List tgtPlayers = getTargetPlayers(sa);
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
final List choices = sa.hasParam("Choices") ? AbilityUtils.getDefinedPlayers(
sa.getSourceCard(), sa.getParam("Choices"), sa) : sa.getActivatingPlayer().getGame().getPlayers();
diff --git a/src/main/java/forge/card/ability/effects/ChooseSourceEffect.java b/src/main/java/forge/card/ability/effects/ChooseSourceEffect.java
index 3e3cdf8152c..6edfe7d024a 100644
--- a/src/main/java/forge/card/ability/effects/ChooseSourceEffect.java
+++ b/src/main/java/forge/card/ability/effects/ChooseSourceEffect.java
@@ -5,8 +5,6 @@ import java.util.List;
import org.apache.commons.lang3.StringUtils;
import com.google.common.base.Predicate;
-import com.google.common.collect.Lists;
-
import forge.Card;
import forge.CardLists;
import forge.ITargetable;
@@ -16,7 +14,7 @@ import forge.card.ability.SpellAbilityEffect;
import forge.card.cardfactory.CardFactoryUtil;
import forge.card.spellability.SpellAbility;
import forge.card.spellability.SpellAbilityStackInstance;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.Game;
import forge.game.ai.ComputerUtilCard;
import forge.game.ai.ComputerUtilCombat;
@@ -42,7 +40,7 @@ public class ChooseSourceEffect extends SpellAbilityEffect {
final Card host = sa.getSourceCard();
final Game game = sa.getActivatingPlayer().getGame();
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
final List tgtPlayers = getTargetPlayers(sa);
@@ -190,19 +188,10 @@ public class ChooseSourceEffect extends SpellAbilityEffect {
}
- final List extends ITargetable> objects;
- final Target threatTgt = abilityOnStack.getTarget();
+ List extends ITargetable> objects = getTargets(abilityOnStack);
- if (threatTgt == null) {
- if (abilityOnStack.hasParam("Defined")) {
- objects = AbilityUtils.getDefinedObjects(source, abilityOnStack.getParam("Defined"), abilityOnStack);
- } else if (abilityOnStack.hasParam("ValidPlayers")) {
- objects = AbilityUtils.getDefinedPlayers(source, abilityOnStack.getParam("ValidPlayers"), abilityOnStack);
- } else
- objects = Lists.newArrayList();
- } else {
- objects = threatTgt.getTargetPlayers();
- }
+ if (!abilityOnStack.usesTargeting() && !abilityOnStack.hasParam("Defined") && abilityOnStack.hasParam("ValidPlayers"))
+ objects = AbilityUtils.getDefinedPlayers(source, abilityOnStack.getParam("ValidPlayers"), abilityOnStack);
if (!objects.contains(ai) || abilityOnStack.hasParam("NoPrevention")) {
continue;
diff --git a/src/main/java/forge/card/ability/effects/ChooseTypeEffect.java b/src/main/java/forge/card/ability/effects/ChooseTypeEffect.java
index 03ce88fdcf4..cfec03eb3b5 100644
--- a/src/main/java/forge/card/ability/effects/ChooseTypeEffect.java
+++ b/src/main/java/forge/card/ability/effects/ChooseTypeEffect.java
@@ -10,7 +10,7 @@ import forge.Constant;
import forge.card.CardType;
import forge.card.ability.SpellAbilityEffect;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.player.Player;
public class ChooseTypeEffect extends SpellAbilityEffect {
@@ -53,7 +53,7 @@ public class ChooseTypeEffect extends SpellAbilityEffect {
}
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
final List tgtPlayers = getTargetPlayers(sa);
if( !validTypes.isEmpty()) {
diff --git a/src/main/java/forge/card/ability/effects/CloneEffect.java b/src/main/java/forge/card/ability/effects/CloneEffect.java
index a78079f396d..0051e23706c 100644
--- a/src/main/java/forge/card/ability/effects/CloneEffect.java
+++ b/src/main/java/forge/card/ability/effects/CloneEffect.java
@@ -15,7 +15,7 @@ import forge.card.ability.SpellAbilityEffect;
import forge.card.cardfactory.CardFactory;
import forge.card.cardfactory.CardFactoryUtil;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.card.trigger.Trigger;
import forge.card.trigger.TriggerHandler;
import forge.game.Game;
@@ -32,14 +32,14 @@ public class CloneEffect extends SpellAbilityEffect {
Card tgtCard = host;
Card cardToCopy = host;
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
if (sa.hasParam("Defined")) {
List cloneSources = AbilityUtils.getDefinedCards(host, sa.getParam("Defined"), sa);
if (!cloneSources.isEmpty()) {
cardToCopy = cloneSources.get(0);
}
} else if (tgt != null) {
- cardToCopy = tgt.getTargetCards().get(0);
+ cardToCopy = sa.getTargets().getFirstTargetedCard();
}
List cloneTargets = AbilityUtils.getDefinedCards(host, sa.getParam("CloneTarget"), sa);
@@ -61,14 +61,14 @@ public class CloneEffect extends SpellAbilityEffect {
// find cloning source i.e. thing to be copied
Card cardToCopy = null;
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
if (sa.hasParam("Defined")) {
List cloneSources = AbilityUtils.getDefinedCards(host, sa.getParam("Defined"), sa);
if (!cloneSources.isEmpty()) {
cardToCopy = cloneSources.get(0);
}
} else if (tgt != null) {
- cardToCopy = tgt.getTargetCards().get(0);
+ cardToCopy = sa.getTargets().getFirstTargetedCard();
}
if (cardToCopy == null) {
return;
diff --git a/src/main/java/forge/card/ability/effects/ControlExchangeEffect.java b/src/main/java/forge/card/ability/effects/ControlExchangeEffect.java
index 6beff52e453..f03bf8abefa 100644
--- a/src/main/java/forge/card/ability/effects/ControlExchangeEffect.java
+++ b/src/main/java/forge/card/ability/effects/ControlExchangeEffect.java
@@ -3,11 +3,13 @@ package forge.card.ability.effects;
import java.util.ArrayList;
import java.util.List;
+import com.google.common.collect.Lists;
+
import forge.Card;
import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityEffect;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.player.Player;
@@ -20,8 +22,8 @@ public class ControlExchangeEffect extends SpellAbilityEffect {
protected String getStackDescription(SpellAbility sa) {
Card object1 = null;
Card object2 = null;
- final Target tgt = sa.getTarget();
- List tgts = tgt == null ? new ArrayList() : tgt.getTargetCards();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
+ List tgts = tgt == null ? new ArrayList() : Lists.newArrayList(sa.getTargets().getTargetCards());
if (tgts.size() > 0) {
object1 = tgts.get(0);
}
@@ -45,8 +47,8 @@ public class ControlExchangeEffect extends SpellAbilityEffect {
public void resolve(SpellAbility sa) {
Card object1 = null;
Card object2 = null;
- final Target tgt = sa.getTarget();
- List tgts = tgt == null ? new ArrayList() : tgt.getTargetCards();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
+ List tgts = tgt == null ? new ArrayList() : Lists.newArrayList(sa.getTargets().getTargetCards());
if (tgts.size() > 0) {
object1 = tgts.get(0);
}
diff --git a/src/main/java/forge/card/ability/effects/ControlGainEffect.java b/src/main/java/forge/card/ability/effects/ControlGainEffect.java
index 81582e4a498..5ccb5681ee3 100644
--- a/src/main/java/forge/card/ability/effects/ControlGainEffect.java
+++ b/src/main/java/forge/card/ability/effects/ControlGainEffect.java
@@ -1,6 +1,5 @@
package forge.card.ability.effects;
-import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -11,7 +10,6 @@ import forge.card.ability.SpellAbilityEffect;
import forge.card.mana.ManaCost;
import forge.card.spellability.Ability;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
import forge.game.Game;
import forge.game.player.Player;
import forge.game.zone.ZoneType;
@@ -24,13 +22,7 @@ public class ControlGainEffect extends SpellAbilityEffect {
protected String getStackDescription(SpellAbility sa) {
final StringBuilder sb = new StringBuilder();
-
- final Target tgt = sa.getTarget();
-
- List newController = AbilityUtils.getDefinedPlayers(sa.getSourceCard(), sa.getParam("NewController"), sa);
- if ((tgt != null) && tgt.getTargetPlayers() != null && !tgt.getTargetPlayers().isEmpty()) {
- newController = tgt.getTargetPlayers();
- }
+ List newController = getTargetPlayers(sa, "NewController");
if (newController.size() == 0) {
newController.add(sa.getActivatingPlayer());
}
@@ -74,7 +66,6 @@ public class ControlGainEffect extends SpellAbilityEffect {
@Override
public void resolve(SpellAbility sa) {
- List tgtCards = new ArrayList();
Card source = sa.getSourceCard();
final boolean bUntap = sa.hasParam("Untap");
@@ -86,28 +77,16 @@ public class ControlGainEffect extends SpellAbilityEffect {
final List kws = sa.hasParam("AddKWs") ? Arrays.asList(sa.getParam("AddKWs").split(" & ")) : null;
final List lose = sa.hasParam("LoseControl") ? Arrays.asList(sa.getParam("LoseControl").split(",")) : null;
- final Target tgt = sa.getTarget();
- final List controllers;
-
- if (sa.hasParam("NewController")) {
- controllers = AbilityUtils.getDefinedPlayers(sa.getSourceCard(), sa.getParam("NewController"), sa);
- } else if (tgt != null && tgt.getTargetPlayers() != null && tgt.canTgtPlayer()) {
- controllers = tgt.getTargetPlayers();
- } else
- controllers = new ArrayList();
+ final List controllers = getDefinedPlayersOrTargeted(sa, "NewController");
final Player newController = controllers.isEmpty() ? sa.getActivatingPlayer() : controllers.get(0);
final Game game = newController.getGame();
+ final List tgtCards;
if (sa.hasParam("AllValid")) {
- tgtCards = game.getCardsIn(ZoneType.Battlefield);
- tgtCards = AbilityUtils.filterListByType(tgtCards, sa.getParam("AllValid"), sa);
- } else if (sa.hasParam("Defined")) {
- tgtCards = AbilityUtils.getDefinedCards(source, sa.getParam("Defined"), sa);
- } else {
+ tgtCards = AbilityUtils.filterListByType(game.getCardsIn(ZoneType.Battlefield), sa.getParam("AllValid"), sa);
+ } else
tgtCards = getTargetCards(sa);
- }
-
// check for lose control criteria right away
if (lose != null && lose.contains("LeavesPlay") && !source.isInZone(ZoneType.Battlefield)) {
diff --git a/src/main/java/forge/card/ability/effects/CopyPermanentEffect.java b/src/main/java/forge/card/ability/effects/CopyPermanentEffect.java
index 84b76fbb47d..d520dae68f1 100644
--- a/src/main/java/forge/card/ability/effects/CopyPermanentEffect.java
+++ b/src/main/java/forge/card/ability/effects/CopyPermanentEffect.java
@@ -25,7 +25,7 @@ import forge.card.cardfactory.CardFactoryUtil;
import forge.card.mana.ManaCost;
import forge.card.spellability.Ability;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.Game;
import forge.game.ai.ComputerUtilCard;
import forge.game.player.Player;
@@ -70,7 +70,7 @@ public class CopyPermanentEffect extends SpellAbilityEffect {
sa.getParam("NumCopies"), sa) : 1;
List tgtCards = getTargetCards(sa);
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
if (sa.hasParam("ValidSupportedCopy")) {
List cards = Lists.newArrayList(CardDb.instance().getUniqueCards());
diff --git a/src/main/java/forge/card/ability/effects/CopySpellAbilityEffect.java b/src/main/java/forge/card/ability/effects/CopySpellAbilityEffect.java
index c1e7038b242..48d3277f213 100644
--- a/src/main/java/forge/card/ability/effects/CopySpellAbilityEffect.java
+++ b/src/main/java/forge/card/ability/effects/CopySpellAbilityEffect.java
@@ -6,6 +6,7 @@ import java.util.List;
import forge.Card;
import forge.CardLists;
+import forge.ITargetable;
import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityEffect;
import forge.card.cardfactory.CardFactory;
@@ -15,14 +16,10 @@ import forge.gui.GuiChoose;
public class CopySpellAbilityEffect extends SpellAbilityEffect {
- // *************************************************************************
- // ************************* CopySpell *************************************
- // *************************************************************************
-
@Override
protected String getStackDescription(SpellAbility sa) {
final StringBuilder sb = new StringBuilder();
- final List tgtSpells = getTargetSpellAbilities(sa);
+ final List tgtSpells = getTargetSpells(sa);
sb.append("Copy ");
// TODO Someone fix this Description when Copying Charms
@@ -62,7 +59,7 @@ public class CopySpellAbilityEffect extends SpellAbilityEffect {
controller = AbilityUtils.getDefinedPlayers(card, sa.getParam("Controller"), sa).get(0);
}
- final List tgtSpells = getTargetSpellAbilities(sa);
+ final List tgtSpells = getTargetSpells(sa);
if (tgtSpells.size() == 0) {
@@ -112,12 +109,13 @@ public class CopySpellAbilityEffect extends SpellAbilityEffect {
chosenSA = GuiChoose.one("Select a spell to copy", tgtSpells);
}
chosenSA.setActivatingPlayer(controller);
- List candidates = chosenSA.getTarget().getAllCandidates(chosenSA, true);
+ List candidates = chosenSA.getTargetRestrictions().getAllCandidates(chosenSA, true);
if (sa.hasParam("CanTargetPlayer")) {
// Radiate
// Remove targeted players because getAllCandidates include all the valid players
- candidates.removeAll(chosenSA.getTarget().getTargetPlayers());
- for (Object o : candidates) {
+ for(Player p : chosenSA.getTargets().getTargetPlayers())
+ candidates.remove(p);
+ for (ITargetable o : candidates) {
CardFactory.copySpellontoStack(card, chosenSA.getSourceCard(), chosenSA, true, o);
}
} else {// Precursor Golem, Ink-Treader Nephilim
diff --git a/src/main/java/forge/card/ability/effects/CounterEffect.java b/src/main/java/forge/card/ability/effects/CounterEffect.java
index 251f3212fd3..7bb41e3a411 100644
--- a/src/main/java/forge/card/ability/effects/CounterEffect.java
+++ b/src/main/java/forge/card/ability/effects/CounterEffect.java
@@ -37,7 +37,7 @@ public class CounterEffect extends SpellAbilityEffect {
sas.add(spell);
}
} else {
- sas = getTargetSpellAbilities(sa);
+ sas = getTargetSpells(sa);
}
sb.append("countering");
@@ -82,7 +82,7 @@ public class CounterEffect extends SpellAbilityEffect {
sas.add(spell);
}
} else {
- sas = getTargetSpellAbilities(sa);
+ sas = getTargetSpells(sa);
}
if (sa.hasParam("ForgetOtherTargets")) {
diff --git a/src/main/java/forge/card/ability/effects/CountersMoveEffect.java b/src/main/java/forge/card/ability/effects/CountersMoveEffect.java
index 4d4878f4bbe..611f5b47898 100644
--- a/src/main/java/forge/card/ability/effects/CountersMoveEffect.java
+++ b/src/main/java/forge/card/ability/effects/CountersMoveEffect.java
@@ -9,7 +9,6 @@ import forge.CounterType;
import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityEffect;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
import forge.gui.GuiChoose;
public class CountersMoveEffect extends SpellAbilityEffect {
@@ -17,16 +16,10 @@ public class CountersMoveEffect extends SpellAbilityEffect {
@Override
protected String getStackDescription(SpellAbility sa) {
final StringBuilder sb = new StringBuilder();
- final Card host = sa.getSourceCard();
Card source = null;
- List srcCards;
- final Target tgt = sa.getTarget();
- if (!sa.hasParam("Source") && tgt != null) {
- srcCards = tgt.getTargetCards();
- } else {
- srcCards = AbilityUtils.getDefinedCards(host, sa.getParam("Source"), sa);
- }
+ List srcCards = getDefinedCardsOrTargeted(sa, "Source");
+
if (srcCards.size() > 0) {
source = srcCards.get(0);
}
@@ -74,25 +67,14 @@ public class CountersMoveEffect extends SpellAbilityEffect {
}
Card source = null;
- List srcCards;
- final Target tgt = sa.getTarget();
- if (!sa.hasParam("Source") && tgt != null) {
- srcCards = tgt.getTargetCards();
- } else {
- srcCards = AbilityUtils.getDefinedCards(host, sa.getParam("Source"), sa);
- }
+ List srcCards = getDefinedCardsOrTargeted(sa, "Source");
if (srcCards.size() > 0) {
source = srcCards.get(0);
}
if (sa.getParam("CounterNum").equals("All")) {
amount = source.getCounters(cType);
}
- List tgtCards;
- if (!sa.hasParam("Defined") && tgt != null) {
- tgtCards = tgt.getTargetCards();
- } else {
- tgtCards = AbilityUtils.getDefinedCards(host, sa.getParam("Defined"), sa);
- }
+ List tgtCards = getTargetCards(sa);
for (final Card dest : tgtCards) {
if ((null != source) && (null != dest)) {
diff --git a/src/main/java/forge/card/ability/effects/CountersPutAllEffect.java b/src/main/java/forge/card/ability/effects/CountersPutAllEffect.java
index 5c0fe2fe562..3e5feb63ffa 100644
--- a/src/main/java/forge/card/ability/effects/CountersPutAllEffect.java
+++ b/src/main/java/forge/card/ability/effects/CountersPutAllEffect.java
@@ -8,7 +8,7 @@ import forge.CounterType;
import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityEffect;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.Game;
import forge.game.player.Player;
import forge.game.zone.ZoneType;
@@ -48,9 +48,9 @@ public class CountersPutAllEffect extends SpellAbilityEffect {
List cards = game.getCardsIn(zone);
cards = CardLists.getValidCards(cards, valid, sa.getSourceCard().getController(), sa.getSourceCard());
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
if (tgt != null) {
- final Player pl = sa.getTargetPlayer();
+ final Player pl = sa.getTargets().getFirstTargetedPlayer();
cards = CardLists.filterControlledBy(cards, pl);
}
diff --git a/src/main/java/forge/card/ability/effects/CountersPutEffect.java b/src/main/java/forge/card/ability/effects/CountersPutEffect.java
index 2b9b98fc88e..dc91ff11254 100644
--- a/src/main/java/forge/card/ability/effects/CountersPutEffect.java
+++ b/src/main/java/forge/card/ability/effects/CountersPutEffect.java
@@ -9,7 +9,6 @@ import forge.CounterType;
import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityEffect;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
import forge.card.trigger.TriggerType;
import forge.game.zone.Zone;
import forge.game.zone.ZoneType;
@@ -41,8 +40,7 @@ public class CountersPutEffect extends SpellAbilityEffect {
} else {
sb.append(" on ");
}
- final Target tgt = sa.getTarget();
- final List tgtCards = tgt != null ? tgt.getTargetCards() : AbilityUtils.getDefinedCards(sa.getSourceCard(), sa.getParam("Defined"), sa);
+ final List tgtCards = getTargetCards(sa);
final Iterator it = tgtCards.iterator();
while (it.hasNext()) {
@@ -92,18 +90,11 @@ public class CountersPutEffect extends SpellAbilityEffect {
}
}
- List tgtCards;
-
- final Target tgt = sa.getTarget();
- if (tgt != null && (tgt.getTargetPlayers().size() == 0)) {
- tgtCards = tgt.getTargetCards();
- } else {
- tgtCards = AbilityUtils.getDefinedCards(card, sa.getParam("Defined"), sa);
- }
+ List tgtCards = getTargetCards(sa);
for (final Card tgtCard : tgtCards) {
- counterAmount = (sa.getTarget() != null && sa.hasParam("DividedAsYouChoose")) ? sa.getTarget().getDividedValue(tgtCard) : counterAmount;
- if ((tgt == null) || tgtCard.canBeTargetedBy(sa)) {
+ counterAmount = (sa.usesTargeting() && sa.hasParam("DividedAsYouChoose")) ? sa.getTargetRestrictions().getDividedValue(tgtCard) : counterAmount;
+ if (!sa.usesTargeting() || tgtCard.canBeTargetedBy(sa)) {
if (max != -1) {
counterAmount = max - tgtCard.getCounters(counterType);
}
diff --git a/src/main/java/forge/card/ability/effects/CountersRemoveAllEffect.java b/src/main/java/forge/card/ability/effects/CountersRemoveAllEffect.java
index 2b823122cd9..8552efbb3bf 100644
--- a/src/main/java/forge/card/ability/effects/CountersRemoveAllEffect.java
+++ b/src/main/java/forge/card/ability/effects/CountersRemoveAllEffect.java
@@ -8,7 +8,6 @@ import forge.CounterType;
import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityEffect;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
import forge.game.Game;
import forge.game.player.Player;
import forge.game.zone.ZoneType;
@@ -52,9 +51,8 @@ public class CountersRemoveAllEffect extends SpellAbilityEffect {
List cards = game.getCardsIn(zone);
cards = CardLists.getValidCards(cards, valid, sa.getSourceCard().getController(), sa.getSourceCard());
- final Target tgt = sa.getTarget();
- if (tgt != null) {
- final Player pl = sa.getTargetPlayer();
+ if (sa.usesTargeting()) {
+ final Player pl = sa.getTargets().getFirstTargetedPlayer();
cards = CardLists.filterControlledBy(cards, pl);
}
diff --git a/src/main/java/forge/card/ability/effects/CountersRemoveEffect.java b/src/main/java/forge/card/ability/effects/CountersRemoveEffect.java
index a20ed4d0f74..5902917eb08 100644
--- a/src/main/java/forge/card/ability/effects/CountersRemoveEffect.java
+++ b/src/main/java/forge/card/ability/effects/CountersRemoveEffect.java
@@ -9,7 +9,7 @@ import forge.CounterType;
import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityEffect;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.Game;
import forge.game.zone.Zone;
import forge.game.zone.ZoneType;
@@ -73,7 +73,7 @@ public class CountersRemoveEffect extends SpellAbilityEffect {
}
}
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
boolean rememberRemoved = false;
if (sa.hasParam("RememberRemoved")) {
diff --git a/src/main/java/forge/card/ability/effects/DamageAllEffect.java b/src/main/java/forge/card/ability/effects/DamageAllEffect.java
index a694de55df2..96f47aaac25 100644
--- a/src/main/java/forge/card/ability/effects/DamageAllEffect.java
+++ b/src/main/java/forge/card/ability/effects/DamageAllEffect.java
@@ -8,7 +8,6 @@ import forge.CardLists;
import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityEffect;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
import forge.game.Game;
import forge.game.player.Player;
import forge.game.zone.ZoneType;
@@ -51,11 +50,7 @@ public class DamageAllEffect extends SpellAbilityEffect {
final String damage = sa.getParam("NumDmg");
final int dmg = AbilityUtils.calculateAmount(sa.getSourceCard(), damage, sa);
- final Target tgt = sa.getTarget();
- Player targetPlayer = null;
- if (tgt != null) {
- targetPlayer = tgt.getTargetPlayers().get(0);
- }
+ Player targetPlayer = sa.getTargets().getFirstTargetedPlayer();
String players = "";
List list = new ArrayList();
diff --git a/src/main/java/forge/card/ability/effects/DamageDealEffect.java b/src/main/java/forge/card/ability/effects/DamageDealEffect.java
index 5a4efbb7d46..f337ff187dc 100644
--- a/src/main/java/forge/card/ability/effects/DamageDealEffect.java
+++ b/src/main/java/forge/card/ability/effects/DamageDealEffect.java
@@ -25,7 +25,7 @@ public class DamageDealEffect extends SpellAbilityEffect {
final int dmg = AbilityUtils.calculateAmount(sa.getSourceCard(), damage, sa);
- List tgts = getTargetObjects(sa);
+ List tgts = getTargets(sa);
if (tgts.isEmpty())
return "";
@@ -73,12 +73,7 @@ public class DamageDealEffect extends SpellAbilityEffect {
final boolean combatDmg = sa.hasParam("CombatDamage");
final boolean removeDamage = sa.hasParam("Remove");
- List tgts;
- if (sa.getTarget() == null) {
- tgts = AbilityUtils.getDefinedObjects(sa.getSourceCard(), sa.getParam("Defined"), sa) ;
- } else {
- tgts = sa.getTarget().getTargets();
- }
+ List tgts = getTargets(sa);
// Right now for Fireball, maybe later for other stuff
if (sa.hasParam("DivideEvenly")) {
@@ -88,7 +83,7 @@ public class DamageDealEffect extends SpellAbilityEffect {
}
}
- final boolean targeted = (sa.getTarget() != null);
+ final boolean targeted = (sa.usesTargeting());
if (sa.hasParam("Radiance") && targeted) {
Card origin = null;
@@ -116,7 +111,7 @@ public class DamageDealEffect extends SpellAbilityEffect {
final Card source = definedSources.get(0);
for (final Object o : tgts) {
- dmg = (sa.getTarget() != null && sa.hasParam("DividedAsYouChoose")) ? sa.getTarget().getDividedValue(o) : dmg;
+ dmg = (sa.usesTargeting() && sa.hasParam("DividedAsYouChoose")) ? sa.getTargetRestrictions().getDividedValue(o) : dmg;
if (o instanceof Card) {
final Card c = (Card) o;
if (c.isInPlay() && (!targeted || c.canBeTargetedBy(sa))) {
diff --git a/src/main/java/forge/card/ability/effects/DamageEachEffect.java b/src/main/java/forge/card/ability/effects/DamageEachEffect.java
index bc4f6208dd8..4ef613a46da 100644
--- a/src/main/java/forge/card/ability/effects/DamageEachEffect.java
+++ b/src/main/java/forge/card/ability/effects/DamageEachEffect.java
@@ -65,14 +65,9 @@ public class DamageEachEffect extends SpellAbilityEffect {
sources = CardLists.getValidCards(sources, sa.getParam("ValidCards"), card.getController(), card);
}
- final List tgts;
- if (sa.getTarget() == null) {
- tgts = AbilityUtils.getDefinedObjects(sa.getSourceCard(), sa.getParam("DefinedPlayers"), sa);
- } else {
- tgts = sa.getTarget().getTargets();
- }
+ final List tgts = getTargets(sa, "DefinedPlayers");
- final boolean targeted = (sa.getTarget() != null);
+ final boolean targeted = (sa.usesTargeting());
for (final Object o : tgts) {
for (final Card source : sources) {
diff --git a/src/main/java/forge/card/ability/effects/DamagePreventEffect.java b/src/main/java/forge/card/ability/effects/DamagePreventEffect.java
index 78f9f7f8869..4cc66d78dc3 100644
--- a/src/main/java/forge/card/ability/effects/DamagePreventEffect.java
+++ b/src/main/java/forge/card/ability/effects/DamagePreventEffect.java
@@ -17,7 +17,7 @@ public class DamagePreventEffect extends SpellAbilityEffect {
protected String getStackDescription(SpellAbility sa) {
final StringBuilder sb = new StringBuilder();
- final List tgts = getTargetObjects(sa);
+ final List tgts = getTargets(sa);
sb.append("Prevent the next ");
sb.append(sa.getParam("Amount"));
@@ -45,7 +45,7 @@ public class DamagePreventEffect extends SpellAbilityEffect {
}
}
- if (sa.hasParam("Radiance") && (sa.getTarget() != null)) {
+ if (sa.hasParam("Radiance") && (sa.usesTargeting())) {
sb.append(" and each other ").append(sa.getParam("ValidTgts"))
.append(" that shares a color with ");
if (tgts.size() > 1) {
@@ -66,15 +66,10 @@ public class DamagePreventEffect extends SpellAbilityEffect {
Card host = sa.getSourceCard();
int numDam = AbilityUtils.calculateAmount(host, sa.getParam("Amount"), sa);
- final List tgts;
+ final List tgts = getTargets(sa);
final ArrayList untargetedCards = new ArrayList();
- if (sa.getTarget() == null) {
- tgts = AbilityUtils.getDefinedObjects(sa.getSourceCard(), sa.getParam("Defined"), sa);
- } else {
- tgts = sa.getTarget().getTargets();
- }
-
- if (sa.hasParam("Radiance") && (sa.getTarget() != null)) {
+
+ if (sa.hasParam("Radiance") && (sa.usesTargeting())) {
Card origin = null;
for (int i = 0; i < tgts.size(); i++) {
if (tgts.get(i) instanceof Card) {
@@ -90,10 +85,10 @@ public class DamagePreventEffect extends SpellAbilityEffect {
}
}
- final boolean targeted = (sa.getTarget() != null);
+ final boolean targeted = (sa.usesTargeting());
for (final Object o : tgts) {
- numDam = (sa.getTarget() != null && sa.hasParam("DividedAsYouChoose")) ? sa.getTarget().getDividedValue(o) : numDam;
+ numDam = (sa.usesTargeting() && sa.hasParam("DividedAsYouChoose")) ? sa.getTargetRestrictions().getDividedValue(o) : numDam;
if (o instanceof Card) {
final Card c = (Card) o;
if (c.isInPlay() && (!targeted || c.canBeTargetedBy(sa))) {
diff --git a/src/main/java/forge/card/ability/effects/DeclareCombatantsEffect.java b/src/main/java/forge/card/ability/effects/DeclareCombatantsEffect.java
index 06f25473f6d..aed24f2539c 100644
--- a/src/main/java/forge/card/ability/effects/DeclareCombatantsEffect.java
+++ b/src/main/java/forge/card/ability/effects/DeclareCombatantsEffect.java
@@ -13,7 +13,7 @@ public class DeclareCombatantsEffect extends SpellAbilityEffect {
@Override
protected String getStackDescription(SpellAbility sa) {
- List tgtPlayers = getDefinedPlayersBeforeTargetOnes(sa);
+ List tgtPlayers = getDefinedPlayersOrTargeted(sa);
boolean attackers = sa.hasParam("DeclareAttackers");
final String attDesc = "which creatures attack";
@@ -31,7 +31,7 @@ public class DeclareCombatantsEffect extends SpellAbilityEffect {
@Override
public void resolve(SpellAbility sa) {
- List tgtPlayers = getDefinedPlayersBeforeTargetOnes(sa);
+ List tgtPlayers = getDefinedPlayersOrTargeted(sa);
final boolean attackers = sa.hasParam("DeclareAttackers");
final boolean blockers = sa.hasParam("DeclareBlockers");
diff --git a/src/main/java/forge/card/ability/effects/DestroyAllEffect.java b/src/main/java/forge/card/ability/effects/DestroyAllEffect.java
index f30a7674619..191c89cb1e4 100644
--- a/src/main/java/forge/card/ability/effects/DestroyAllEffect.java
+++ b/src/main/java/forge/card/ability/effects/DestroyAllEffect.java
@@ -7,7 +7,6 @@ import forge.CardLists;
import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityEffect;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
import forge.game.Game;
import forge.game.player.Player;
import forge.game.zone.ZoneType;
@@ -42,15 +41,7 @@ public class DestroyAllEffect extends SpellAbilityEffect {
final Card card = sa.getSourceCard();
final Game game = sa.getActivatingPlayer().getGame();
- final Target tgt = sa.getTarget();
- Player targetPlayer = null;
- if (tgt != null) {
- for (final Object o : tgt.getTargets()) {
- if (o instanceof Player) {
- targetPlayer = (Player) o;
- }
- }
- }
+ Player targetPlayer = sa.getTargets().getFirstTargetedPlayer();
String valid = "";
diff --git a/src/main/java/forge/card/ability/effects/DestroyEffect.java b/src/main/java/forge/card/ability/effects/DestroyEffect.java
index f9028296365..d271f85bd04 100644
--- a/src/main/java/forge/card/ability/effects/DestroyEffect.java
+++ b/src/main/java/forge/card/ability/effects/DestroyEffect.java
@@ -8,7 +8,7 @@ import forge.Card;
import forge.CardUtil;
import forge.card.ability.SpellAbilityEffect;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.Game;
public class DestroyEffect extends SpellAbilityEffect {
@@ -82,7 +82,7 @@ public class DestroyEffect extends SpellAbilityEffect {
final List tgtCards = getTargetCards(sa);
final ArrayList untargetedCards = new ArrayList();
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
if (sa.hasParam("Radiance")) {
for (final Card c : CardUtil.getRadiance(card, tgtCards.get(0),
diff --git a/src/main/java/forge/card/ability/effects/DigEffect.java b/src/main/java/forge/card/ability/effects/DigEffect.java
index 7ad34ece831..ca026f098bf 100644
--- a/src/main/java/forge/card/ability/effects/DigEffect.java
+++ b/src/main/java/forge/card/ability/effects/DigEffect.java
@@ -12,7 +12,7 @@ import forge.CardLists;
import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityEffect;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.Game;
import forge.game.ai.ComputerUtilCard;
import forge.game.player.Player;
@@ -85,7 +85,7 @@ public class DigEffect extends SpellAbilityEffect {
}
}
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
final List tgtPlayers = getTargetPlayers(sa);
if (sa.hasParam("Choser")) {
diff --git a/src/main/java/forge/card/ability/effects/DigUntilEffect.java b/src/main/java/forge/card/ability/effects/DigUntilEffect.java
index 8027b8cd0e0..6c1fe98121a 100644
--- a/src/main/java/forge/card/ability/effects/DigUntilEffect.java
+++ b/src/main/java/forge/card/ability/effects/DigUntilEffect.java
@@ -10,7 +10,7 @@ import forge.Card;
import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityEffect;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.Game;
import forge.game.player.Player;
import forge.game.zone.PlayerZone;
@@ -94,7 +94,7 @@ public class DigUntilEffect extends SpellAbilityEffect {
final boolean remember = sa.hasParam("RememberFound");
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
final ZoneType foundDest = ZoneType.smartValueOf(sa.getParam("FoundDestination"));
final int foundLibPos = AbilityUtils.calculateAmount(host, sa.getParam("FoundLibraryPosition"), sa);
diff --git a/src/main/java/forge/card/ability/effects/DiscardEffect.java b/src/main/java/forge/card/ability/effects/DiscardEffect.java
index aa4ab76b91c..d5d745c5d72 100644
--- a/src/main/java/forge/card/ability/effects/DiscardEffect.java
+++ b/src/main/java/forge/card/ability/effects/DiscardEffect.java
@@ -13,7 +13,7 @@ import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityEffect;
import forge.card.cardfactory.CardFactoryUtil;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.player.Player;
import forge.game.player.PlayerActionConfirmMode;
import forge.game.zone.ZoneType;
@@ -90,7 +90,7 @@ public class DiscardEffect extends SpellAbilityEffect {
final String mode = sa.getParam("Mode");
//final boolean anyNumber = sa.hasParam("AnyNumber");
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
final List discarded = new ArrayList();
diff --git a/src/main/java/forge/card/ability/effects/DrainManaEffect.java b/src/main/java/forge/card/ability/effects/DrainManaEffect.java
index 27da97bae80..9ac6f94b6cc 100644
--- a/src/main/java/forge/card/ability/effects/DrainManaEffect.java
+++ b/src/main/java/forge/card/ability/effects/DrainManaEffect.java
@@ -6,7 +6,7 @@ import org.apache.commons.lang3.StringUtils;
import forge.card.ability.SpellAbilityEffect;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.player.Player;
public class DrainManaEffect extends SpellAbilityEffect {
@@ -24,7 +24,7 @@ public class DrainManaEffect extends SpellAbilityEffect {
@Override
public void resolve(SpellAbility sa) {
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
for (final Player p : getTargetPlayers(sa)) {
if ((tgt == null) || p.canBeTargetedBy(sa)) {
diff --git a/src/main/java/forge/card/ability/effects/DrawEffect.java b/src/main/java/forge/card/ability/effects/DrawEffect.java
index fbdd6f4a180..de97548c27d 100644
--- a/src/main/java/forge/card/ability/effects/DrawEffect.java
+++ b/src/main/java/forge/card/ability/effects/DrawEffect.java
@@ -6,7 +6,7 @@ import forge.Card;
import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityEffect;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.player.Player;
import forge.util.Lang;
@@ -15,7 +15,7 @@ public class DrawEffect extends SpellAbilityEffect {
protected String getStackDescription(SpellAbility sa) {
final StringBuilder sb = new StringBuilder();
- final List tgtPlayers = getDefinedPlayersBeforeTargetOnes(sa);
+ final List tgtPlayers = getDefinedPlayersOrTargeted(sa);
if (!tgtPlayers.isEmpty()) {
@@ -40,13 +40,13 @@ public class DrawEffect extends SpellAbilityEffect {
final int numCards = sa.hasParam("NumCards") ? AbilityUtils.calculateAmount(sa.getSourceCard(), sa.getParam("NumCards"), sa) : 1;
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
final boolean optional = sa.hasParam("OptionalDecider");
final boolean upto = sa.hasParam("Upto");
- for (final Player p : getDefinedPlayersBeforeTargetOnes(sa)) {
+ for (final Player p : getDefinedPlayersOrTargeted(sa)) {
if ((tgt == null) || p.canBeTargetedBy(sa))
if (optional && !p.getController().confirmAction(sa, null, "Do you want to draw " + Lang.nounWithAmount(numCards, " card") + "?"))
continue;
diff --git a/src/main/java/forge/card/ability/effects/FightEffect.java b/src/main/java/forge/card/ability/effects/FightEffect.java
index 3e70a4278ef..28a77babffd 100644
--- a/src/main/java/forge/card/ability/effects/FightEffect.java
+++ b/src/main/java/forge/card/ability/effects/FightEffect.java
@@ -3,11 +3,13 @@ package forge.card.ability.effects;
import java.util.ArrayList;
import java.util.List;
+import com.google.common.collect.Lists;
+
import forge.Card;
import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityEffect;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
public class FightEffect extends SpellAbilityEffect {
@@ -48,10 +50,10 @@ public class FightEffect extends SpellAbilityEffect {
Card fighter1 = null;
Card fighter2 = null;
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
List tgts = null;
if (tgt != null) {
- tgts = tgt.getTargetCards();
+ tgts = Lists.newArrayList(sa.getTargets().getTargetCards());
if (tgts.size() > 0) {
fighter1 = tgts.get(0);
}
diff --git a/src/main/java/forge/card/ability/effects/LifeGainEffect.java b/src/main/java/forge/card/ability/effects/LifeGainEffect.java
index 79a830f2a8c..9650d817493 100644
--- a/src/main/java/forge/card/ability/effects/LifeGainEffect.java
+++ b/src/main/java/forge/card/ability/effects/LifeGainEffect.java
@@ -1,13 +1,12 @@
package forge.card.ability.effects;
-import java.util.ArrayList;
import java.util.List;
import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityEffect;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.player.Player;
public class LifeGainEffect extends SpellAbilityEffect {
@@ -36,14 +35,9 @@ public class LifeGainEffect extends SpellAbilityEffect {
public void resolve(SpellAbility sa) {
final int lifeAmount = AbilityUtils.calculateAmount(sa.getSourceCard(), sa.getParam("LifeAmount"), sa);
- final Target tgt = sa.getTarget();
- List tgtPlayers = new ArrayList();
-
- if (sa.hasParam("Defined")) {
- tgtPlayers = AbilityUtils.getDefinedPlayers(sa.getSourceCard(), sa.getParam("Defined"), sa);
- } else if (tgt != null) {
- tgtPlayers = tgt.getTargetPlayers();
- } else {
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
+ List tgtPlayers = getTargetPlayers(sa);
+ if( tgtPlayers.isEmpty() ) {
tgtPlayers.add(sa.getActivatingPlayer());
}
diff --git a/src/main/java/forge/card/ability/effects/LifeLoseEffect.java b/src/main/java/forge/card/ability/effects/LifeLoseEffect.java
index c7072230e7b..64f6efa62bf 100644
--- a/src/main/java/forge/card/ability/effects/LifeLoseEffect.java
+++ b/src/main/java/forge/card/ability/effects/LifeLoseEffect.java
@@ -4,7 +4,7 @@ package forge.card.ability.effects;
import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityEffect;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.player.Player;
public class LifeLoseEffect extends SpellAbilityEffect {
@@ -41,7 +41,7 @@ public class LifeLoseEffect extends SpellAbilityEffect {
final int lifeAmount = AbilityUtils.calculateAmount(sa.getSourceCard(), sa.getParam("LifeAmount"), sa);
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
for (final Player p : getTargetPlayers(sa)) {
if ((tgt == null) || p.canBeTargetedBy(sa)) {
lifeLost += p.loseLife(lifeAmount);
diff --git a/src/main/java/forge/card/ability/effects/LifeSetEffect.java b/src/main/java/forge/card/ability/effects/LifeSetEffect.java
index 7405eca6bbb..a00fd8d1261 100644
--- a/src/main/java/forge/card/ability/effects/LifeSetEffect.java
+++ b/src/main/java/forge/card/ability/effects/LifeSetEffect.java
@@ -7,7 +7,7 @@ import java.util.List;
import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityEffect;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.player.Player;
import forge.gui.GuiChoose;
@@ -20,7 +20,7 @@ public class LifeSetEffect extends SpellAbilityEffect {
public void resolve(SpellAbility sa) {
final boolean redistribute = sa.hasParam("Redistribute");
final int lifeAmount = redistribute ? 20 : AbilityUtils.calculateAmount(sa.getSourceCard(), sa.getParam("LifeAmount"), sa);
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
final List lifetotals = new ArrayList();
if (redistribute) {
diff --git a/src/main/java/forge/card/ability/effects/ManaEffect.java b/src/main/java/forge/card/ability/effects/ManaEffect.java
index 35a58ba918f..e8dcc8c7e0b 100644
--- a/src/main/java/forge/card/ability/effects/ManaEffect.java
+++ b/src/main/java/forge/card/ability/effects/ManaEffect.java
@@ -11,7 +11,7 @@ import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityEffect;
import forge.card.spellability.AbilityManaPart;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.GameActionUtil;
import forge.game.Game;
import forge.game.ai.ComputerUtilCard;
@@ -33,7 +33,7 @@ public class ManaEffect extends SpellAbilityEffect {
sa.setUndoable(sa.isAbility() && sa.isUndoable());
final List tgtPlayers = getTargetPlayers(sa);
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
final boolean optional = sa.hasParam("Optional");
final Game game = sa.getActivatingPlayer().getGame();
diff --git a/src/main/java/forge/card/ability/effects/MillEffect.java b/src/main/java/forge/card/ability/effects/MillEffect.java
index 9381a458d0c..2713cb8631d 100644
--- a/src/main/java/forge/card/ability/effects/MillEffect.java
+++ b/src/main/java/forge/card/ability/effects/MillEffect.java
@@ -7,7 +7,7 @@ import forge.CardCharacteristicName;
import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityEffect;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.player.Player;
import forge.game.zone.ZoneType;
@@ -23,7 +23,7 @@ public class MillEffect extends SpellAbilityEffect {
source.clearRemembered();
}
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
ZoneType destination = ZoneType.smartValueOf(sa.getParam("Destination"));
if (destination == null) {
diff --git a/src/main/java/forge/card/ability/effects/MustAttackEffect.java b/src/main/java/forge/card/ability/effects/MustAttackEffect.java
index 9a82e8e4755..5688be81a39 100644
--- a/src/main/java/forge/card/ability/effects/MustAttackEffect.java
+++ b/src/main/java/forge/card/ability/effects/MustAttackEffect.java
@@ -6,7 +6,7 @@ import forge.Card;
import forge.GameEntity;
import forge.card.ability.SpellAbilityEffect;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.player.Player;
public class MustAttackEffect extends SpellAbilityEffect {
@@ -42,7 +42,7 @@ public class MustAttackEffect extends SpellAbilityEffect {
@Override
public void resolve(SpellAbility sa) {
final List tgtPlayers = getTargetPlayers(sa);
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
for (final Player p : tgtPlayers) {
if ((tgt == null) || p.canBeTargetedBy(sa)) {
diff --git a/src/main/java/forge/card/ability/effects/MustBlockEffect.java b/src/main/java/forge/card/ability/effects/MustBlockEffect.java
index cd528ff5bd9..500eb9d2db3 100644
--- a/src/main/java/forge/card/ability/effects/MustBlockEffect.java
+++ b/src/main/java/forge/card/ability/effects/MustBlockEffect.java
@@ -7,7 +7,7 @@ import forge.Card;
import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityEffect;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
public class MustBlockEffect extends SpellAbilityEffect {
@@ -15,14 +15,8 @@ public class MustBlockEffect extends SpellAbilityEffect {
public void resolve(SpellAbility sa) {
final Card host = sa.getSourceCard();
- List tgtCards;
-
- final Target tgt = sa.getTarget();
- if (tgt != null) {
- tgtCards = tgt.getTargetCards();
- } else {
- tgtCards = AbilityUtils.getDefinedCards(sa.getSourceCard(), sa.getParam("Defined"), sa);
- }
+ List tgtCards = getTargetCards(sa);
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
List cards;
if (sa.hasParam("DefinedAttacker")) {
diff --git a/src/main/java/forge/card/ability/effects/PlayEffect.java b/src/main/java/forge/card/ability/effects/PlayEffect.java
index cef26c29558..5e21266e2ee 100644
--- a/src/main/java/forge/card/ability/effects/PlayEffect.java
+++ b/src/main/java/forge/card/ability/effects/PlayEffect.java
@@ -230,8 +230,8 @@ public class PlayEffect extends SpellAbilityEffect {
boolean noManaCost = sa.hasParam("WithoutManaCost");
tgtSA = noManaCost ? tgtSA.copyWithNoManaCost() : tgtSA;
- if (tgtSA.getTarget() != null && !optional) {
- tgtSA.getTarget().setMandatory(true);
+ if (tgtSA.usesTargeting() && !optional) {
+ tgtSA.getTargetRestrictions().setMandatory(true);
}
if (controller.isHuman()) {
diff --git a/src/main/java/forge/card/ability/effects/PoisonEffect.java b/src/main/java/forge/card/ability/effects/PoisonEffect.java
index e308d15cb17..e5a0e60556d 100644
--- a/src/main/java/forge/card/ability/effects/PoisonEffect.java
+++ b/src/main/java/forge/card/ability/effects/PoisonEffect.java
@@ -7,7 +7,7 @@ import org.apache.commons.lang3.StringUtils;
import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityEffect;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.player.Player;
/**
@@ -24,7 +24,7 @@ import forge.game.player.Player;
public void resolve(SpellAbility sa) {
final int amount = AbilityUtils.calculateAmount(sa.getSourceCard(), sa.getParam("Num"), sa);
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
for (final Player p : getTargetPlayers(sa)) {
if ((tgt == null) || p.canBeTargetedBy(sa)) {
p.addPoisonCounters(amount, sa.getSourceCard());
diff --git a/src/main/java/forge/card/ability/effects/ProtectAllEffect.java b/src/main/java/forge/card/ability/effects/ProtectAllEffect.java
index 6bf3c817aa6..9462e363f41 100644
--- a/src/main/java/forge/card/ability/effects/ProtectAllEffect.java
+++ b/src/main/java/forge/card/ability/effects/ProtectAllEffect.java
@@ -64,7 +64,7 @@ public class ProtectAllEffect extends SpellAbilityEffect {
gains.add(color.toLowerCase());
}
} else if (sa.getParam("Gains").equals("TargetedCardColor")) {
- for (final Card c : sa.getSATargetingCard().getTarget().getTargetCards()) {
+ for (final Card c : sa.getSATargetingCard().getTargets().getTargetCards()) {
ColorSet cs = CardUtil.getColors(c);
for(byte col : MagicColor.WUBRG) {
if (cs.hasAnyColor(col))
diff --git a/src/main/java/forge/card/ability/effects/ProtectEffect.java b/src/main/java/forge/card/ability/effects/ProtectEffect.java
index 7ca54a65a3b..f1415d00cb8 100644
--- a/src/main/java/forge/card/ability/effects/ProtectEffect.java
+++ b/src/main/java/forge/card/ability/effects/ProtectEffect.java
@@ -11,7 +11,7 @@ import forge.Command;
import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityEffect;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.Game;
import forge.game.ai.ComputerUtilCard;
import forge.game.player.Player;
@@ -52,7 +52,7 @@ public class ProtectEffect extends SpellAbilityEffect {
}
}
- if (sa.hasParam("Radiance") && (sa.getTarget() != null)) {
+ if (sa.hasParam("Radiance") && (sa.usesTargeting())) {
sb.append(" and each other ").append(sa.getParam("ValidTgts"))
.append(" that shares a color with ");
if (tgtCards.size() > 1) {
@@ -141,7 +141,7 @@ public class ProtectEffect extends SpellAbilityEffect {
final List tgtCards = getTargetCards(sa);
final ArrayList untargetedCards = new ArrayList();
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
if (sa.hasParam("Radiance") && (tgt != null)) {
for (final Card c : CardUtil.getRadiance(host, tgtCards.get(0),
diff --git a/src/main/java/forge/card/ability/effects/PumpAllEffect.java b/src/main/java/forge/card/ability/effects/PumpAllEffect.java
index b9c0c8dbed8..752c94e69c2 100644
--- a/src/main/java/forge/card/ability/effects/PumpAllEffect.java
+++ b/src/main/java/forge/card/ability/effects/PumpAllEffect.java
@@ -113,7 +113,7 @@ public class PumpAllEffect extends SpellAbilityEffect {
@Override
public void resolve(SpellAbility sa) {
List list;
- final List tgtPlayers = getTargetPlayersEmptyAsDefault(sa);
+ final List tgtPlayers = getTargetPlayers(sa);
final ArrayList affectedZones = new ArrayList();
final Game game = sa.getActivatingPlayer().getGame();
diff --git a/src/main/java/forge/card/ability/effects/PumpEffect.java b/src/main/java/forge/card/ability/effects/PumpEffect.java
index c1bd3552103..c7db6a63a82 100644
--- a/src/main/java/forge/card/ability/effects/PumpEffect.java
+++ b/src/main/java/forge/card/ability/effects/PumpEffect.java
@@ -12,7 +12,7 @@ import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityEffect;
import forge.card.cardfactory.CardFactoryUtil;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.Game;
import forge.game.player.Player;
import forge.game.zone.ZoneType;
@@ -122,20 +122,9 @@ public class PumpEffect extends SpellAbilityEffect {
protected String getStackDescription(SpellAbility sa) {
final StringBuilder sb = new StringBuilder();
- ArrayList tgts = new ArrayList();
-
- final Target tgt = sa.getTarget();
- if (tgt != null) {
- tgts.addAll(tgt.getTargetCards());
- tgts.addAll(tgt.getTargetPlayers());
- } else {
- if (sa.hasParam("Defined")) {
- tgts.addAll(AbilityUtils.getDefinedPlayers(sa.getSourceCard(), sa.getParam("Defined"), sa));
- }
- if (tgts.isEmpty()) {
- tgts.addAll(AbilityUtils.getDefinedCards(sa.getSourceCard(), sa.getParam("Defined"), sa));
- }
- }
+ List tgts = new ArrayList();
+ tgts.addAll(getTargetCards(sa));
+ tgts.addAll(getTargetPlayers(sa));
if (tgts.size() > 0) {
@@ -188,7 +177,7 @@ public class PumpEffect extends SpellAbilityEffect {
public void resolve(SpellAbility sa) {
List tgtCards = new ArrayList();
final ArrayList untargetedCards = new ArrayList();
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
final Game game = sa.getActivatingPlayer().getGame();
List tgtPlayers = new ArrayList();
String pumpRemembered = null;
@@ -199,17 +188,10 @@ public class PumpEffect extends SpellAbilityEffect {
final int a = AbilityUtils.calculateAmount(sa.getSourceCard(), sa.getParam("NumAtt"), sa);
final int d = AbilityUtils.calculateAmount(sa.getSourceCard(), sa.getParam("NumDef"), sa);
- if (tgt != null) {
- tgtCards = tgt.getTargetCards();
- tgtPlayers = tgt.getTargetPlayers();
- } else {
- if (sa.hasParam("Defined")) {
- tgtPlayers = AbilityUtils.getDefinedPlayers(sa.getSourceCard(), sa.getParam("Defined"), sa);
- }
- if (tgtPlayers.isEmpty()) {
- tgtCards = AbilityUtils.getDefinedCards(sa.getSourceCard(), sa.getParam("Defined"), sa);
- }
- }
+ List tgts = new ArrayList();
+ tgts.addAll(getTargetCards(sa));
+ tgts.addAll(getTargetPlayers(sa));
+
if (sa.hasParam("DefinedChosenKW")) {
if (sa.getParam("DefinedChosenKW").equals("Type")) {
final String t = sa.getSourceCard().getChosenType();
diff --git a/src/main/java/forge/card/ability/effects/RearrangeTopOfLibraryEffect.java b/src/main/java/forge/card/ability/effects/RearrangeTopOfLibraryEffect.java
index 0897064959f..33d6f13d58f 100644
--- a/src/main/java/forge/card/ability/effects/RearrangeTopOfLibraryEffect.java
+++ b/src/main/java/forge/card/ability/effects/RearrangeTopOfLibraryEffect.java
@@ -7,7 +7,7 @@ import forge.Card;
import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityEffect;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.player.Player;
import forge.game.zone.PlayerZone;
import forge.game.zone.ZoneType;
@@ -74,7 +74,7 @@ public class RearrangeTopOfLibraryEffect extends SpellAbilityEffect {
boolean shuffle = false;
if (sa.getActivatingPlayer().isHuman()) {
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
numCards = AbilityUtils.calculateAmount(host, sa.getParam("NumCards"), sa);
diff --git a/src/main/java/forge/card/ability/effects/RegenerateEffect.java b/src/main/java/forge/card/ability/effects/RegenerateEffect.java
index b071bb7cb45..b3c9154bfb9 100644
--- a/src/main/java/forge/card/ability/effects/RegenerateEffect.java
+++ b/src/main/java/forge/card/ability/effects/RegenerateEffect.java
@@ -7,7 +7,7 @@ import forge.Card;
import forge.Command;
import forge.card.ability.SpellAbilityEffect;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.Game;
public class RegenerateEffect extends SpellAbilityEffect {
@@ -44,7 +44,7 @@ public class RegenerateEffect extends SpellAbilityEffect {
@Override
public void resolve(SpellAbility sa) {
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
final Game game = sa.getActivatingPlayer().getGame();
for (final Card tgtC : getTargetCards(sa)) {
diff --git a/src/main/java/forge/card/ability/effects/RemoveFromCombatEffect.java b/src/main/java/forge/card/ability/effects/RemoveFromCombatEffect.java
index 982c7e25309..4e7220024e3 100644
--- a/src/main/java/forge/card/ability/effects/RemoveFromCombatEffect.java
+++ b/src/main/java/forge/card/ability/effects/RemoveFromCombatEffect.java
@@ -7,7 +7,7 @@ import org.apache.commons.lang3.StringUtils;
import forge.Card;
import forge.card.ability.SpellAbilityEffect;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.Game;
import forge.game.player.Player;
@@ -32,7 +32,7 @@ public class RemoveFromCombatEffect extends SpellAbilityEffect {
final Game game = activator.getGame();
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
for (final Card c : getTargetCards(sa)) {
if ((tgt == null) || c.canBeTargetedBy(sa)) {
game.getCombat().removeFromCombat(c);
diff --git a/src/main/java/forge/card/ability/effects/ReorderZoneEffect.java b/src/main/java/forge/card/ability/effects/ReorderZoneEffect.java
index 86c500d3be5..ad5f771defb 100644
--- a/src/main/java/forge/card/ability/effects/ReorderZoneEffect.java
+++ b/src/main/java/forge/card/ability/effects/ReorderZoneEffect.java
@@ -9,7 +9,7 @@ import com.google.common.collect.Lists;
import forge.Card;
import forge.card.ability.SpellAbilityEffect;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.player.Player;
import forge.game.zone.ZoneType;
import forge.util.Lang;
@@ -42,7 +42,7 @@ public class ReorderZoneEffect extends SpellAbilityEffect {
public void resolve(SpellAbility sa) {
final ZoneType zone = ZoneType.smartValueOf(sa.getParam("Zone"));
boolean shuffle = sa.hasParam("Random");
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
for (final Player p : getTargetPlayers(sa)) {
diff --git a/src/main/java/forge/card/ability/effects/RevealEffect.java b/src/main/java/forge/card/ability/effects/RevealEffect.java
index 2f0fbc0fde0..f2ce0b5e700 100644
--- a/src/main/java/forge/card/ability/effects/RevealEffect.java
+++ b/src/main/java/forge/card/ability/effects/RevealEffect.java
@@ -8,7 +8,7 @@ import forge.CardLists;
import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityEffect;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.Game;
import forge.game.player.Player;
import forge.game.zone.ZoneType;
@@ -23,7 +23,7 @@ public class RevealEffect extends SpellAbilityEffect {
int cnt = sa.hasParam("NumCards") ? AbilityUtils.calculateAmount(host, sa.getParam("NumCards"), sa) : 1;
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
for (final Player p : getTargetPlayers(sa)) {
final Game game = p.getGame();
diff --git a/src/main/java/forge/card/ability/effects/RevealHandEffect.java b/src/main/java/forge/card/ability/effects/RevealHandEffect.java
index 895d4345710..95031980122 100644
--- a/src/main/java/forge/card/ability/effects/RevealHandEffect.java
+++ b/src/main/java/forge/card/ability/effects/RevealHandEffect.java
@@ -5,7 +5,7 @@ import java.util.List;
import forge.Card;
import forge.card.ability.SpellAbilityEffect;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.player.Player;
import forge.game.zone.ZoneType;
@@ -35,7 +35,7 @@ public class RevealHandEffect extends SpellAbilityEffect {
public void resolve(SpellAbility sa) {
final Card host = sa.getSourceCard();
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
for (final Player p : getTargetPlayers(sa)) {
if ((tgt == null) || p.canBeTargetedBy(sa)) {
diff --git a/src/main/java/forge/card/ability/effects/ScryEffect.java b/src/main/java/forge/card/ability/effects/ScryEffect.java
index 34e7af9cd27..2b7ef554f32 100644
--- a/src/main/java/forge/card/ability/effects/ScryEffect.java
+++ b/src/main/java/forge/card/ability/effects/ScryEffect.java
@@ -10,7 +10,7 @@ import forge.Card;
import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityEffect;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.player.Player;
import forge.game.zone.PlayerZone;
import forge.game.zone.ZoneType;
@@ -44,7 +44,7 @@ public class ScryEffect extends SpellAbilityEffect {
num = AbilityUtils.calculateAmount(sa.getSourceCard(), sa.getParam("ScryNum"), sa);
}
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
final List tgtPlayers = getTargetPlayers(sa);
for (final Player p : tgtPlayers) {
diff --git a/src/main/java/forge/card/ability/effects/SetStateEffect.java b/src/main/java/forge/card/ability/effects/SetStateEffect.java
index 9345dd6dda1..31ecc174062 100644
--- a/src/main/java/forge/card/ability/effects/SetStateEffect.java
+++ b/src/main/java/forge/card/ability/effects/SetStateEffect.java
@@ -48,7 +48,7 @@ public class SetStateEffect extends SpellAbilityEffect {
final boolean remChanged = sa.hasParam("RememberChanged");
for (final Card tgt : tgtCards) {
- if (sa.getTarget() != null && !tgt.canBeTargetedBy(sa)) {
+ if (sa.usesTargeting() && !tgt.canBeTargetedBy(sa)) {
continue;
}
diff --git a/src/main/java/forge/card/ability/effects/ShuffleEffect.java b/src/main/java/forge/card/ability/effects/ShuffleEffect.java
index 8c03948851a..08672350706 100644
--- a/src/main/java/forge/card/ability/effects/ShuffleEffect.java
+++ b/src/main/java/forge/card/ability/effects/ShuffleEffect.java
@@ -5,7 +5,7 @@ import java.util.List;
import forge.card.ability.SpellAbilityEffect;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.player.Player;
public class ShuffleEffect extends SpellAbilityEffect {
@@ -16,7 +16,7 @@ public class ShuffleEffect extends SpellAbilityEffect {
final List tgtPlayers = getTargetPlayers(sa);
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
for (final Player p : tgtPlayers) {
if ((tgt == null) || p.canBeTargetedBy(sa)) {
diff --git a/src/main/java/forge/card/ability/effects/TapAllEffect.java b/src/main/java/forge/card/ability/effects/TapAllEffect.java
index e715cdfceea..1fd79ecce56 100644
--- a/src/main/java/forge/card/ability/effects/TapAllEffect.java
+++ b/src/main/java/forge/card/ability/effects/TapAllEffect.java
@@ -38,7 +38,7 @@ public class TapAllEffect extends SpellAbilityEffect {
List cards = null;
- final List tgtPlayers = getTargetPlayersEmptyAsDefault(sa);
+ final List tgtPlayers = getTargetPlayers(sa);
if ((tgtPlayers == null) || tgtPlayers.isEmpty()) {
cards = game.getCardsIn(ZoneType.Battlefield);
diff --git a/src/main/java/forge/card/ability/effects/TapEffect.java b/src/main/java/forge/card/ability/effects/TapEffect.java
index 132b1e60615..00a6a0b3efa 100644
--- a/src/main/java/forge/card/ability/effects/TapEffect.java
+++ b/src/main/java/forge/card/ability/effects/TapEffect.java
@@ -7,7 +7,7 @@ import org.apache.commons.lang3.StringUtils;
import forge.Card;
import forge.card.ability.SpellAbilityEffect;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
public class TapEffect extends SpellAbilityEffect {
@@ -22,7 +22,7 @@ public class TapEffect extends SpellAbilityEffect {
card.clearRemembered();
}
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
final List tgtCards = getTargetCards(sa);
for (final Card tgtC : tgtCards) {
diff --git a/src/main/java/forge/card/ability/effects/TapOrUntapAllEffect.java b/src/main/java/forge/card/ability/effects/TapOrUntapAllEffect.java
index de3455b61c4..fcd1153339b 100644
--- a/src/main/java/forge/card/ability/effects/TapOrUntapAllEffect.java
+++ b/src/main/java/forge/card/ability/effects/TapOrUntapAllEffect.java
@@ -48,7 +48,7 @@ public class TapOrUntapAllEffect extends SpellAbilityEffect {
final Game game = activator.getGame();
- List targetedPlayers = getTargetPlayersEmptyAsDefault(sa);
+ List targetedPlayers = getTargetPlayers(sa);
if (sa.hasParam("ValidCards")) {
validCards = game.getCardsIn(ZoneType.Battlefield);
diff --git a/src/main/java/forge/card/ability/effects/TapOrUntapEffect.java b/src/main/java/forge/card/ability/effects/TapOrUntapEffect.java
index 2761649317f..1ccdd9aaf56 100644
--- a/src/main/java/forge/card/ability/effects/TapOrUntapEffect.java
+++ b/src/main/java/forge/card/ability/effects/TapOrUntapEffect.java
@@ -7,7 +7,7 @@ import org.apache.commons.lang3.StringUtils;
import forge.Card;
import forge.card.ability.SpellAbilityEffect;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.gui.GuiChoose;
public class TapOrUntapEffect extends SpellAbilityEffect {
@@ -33,7 +33,7 @@ public class TapOrUntapEffect extends SpellAbilityEffect {
public void resolve(SpellAbility sa) {
final List tgtCards = getTargetCards(sa);
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
for (final Card tgtC : tgtCards) {
if (tgtC.isInPlay() && ((tgt == null) || tgtC.canBeTargetedBy(sa))) {
diff --git a/src/main/java/forge/card/ability/effects/TwoPilesEffect.java b/src/main/java/forge/card/ability/effects/TwoPilesEffect.java
index a022b1dae4d..3af4da33655 100644
--- a/src/main/java/forge/card/ability/effects/TwoPilesEffect.java
+++ b/src/main/java/forge/card/ability/effects/TwoPilesEffect.java
@@ -10,7 +10,7 @@ import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityEffect;
import forge.card.spellability.AbilitySub;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.ai.ComputerUtilCard;
import forge.game.player.Player;
import forge.game.zone.ZoneType;
@@ -64,7 +64,7 @@ public class TwoPilesEffect extends SpellAbilityEffect {
valid = sa.getParam("ValidCards");
}
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
final List tgtPlayers = getTargetPlayers(sa);
Player separator = card.getController();
diff --git a/src/main/java/forge/card/ability/effects/UnattachAllEffect.java b/src/main/java/forge/card/ability/effects/UnattachAllEffect.java
index eaae52e172f..61656e04434 100644
--- a/src/main/java/forge/card/ability/effects/UnattachAllEffect.java
+++ b/src/main/java/forge/card/ability/effects/UnattachAllEffect.java
@@ -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 = getTargetObjects(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 = getTargetObjects(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/ability/effects/UntapAllEffect.java b/src/main/java/forge/card/ability/effects/UntapAllEffect.java
index b0f2017cf93..c850db3a13b 100644
--- a/src/main/java/forge/card/ability/effects/UntapAllEffect.java
+++ b/src/main/java/forge/card/ability/effects/UntapAllEffect.java
@@ -32,7 +32,7 @@ public class UntapAllEffect extends SpellAbilityEffect {
String valid = "";
List list = null;
- List tgtPlayers = getTargetPlayersEmptyAsDefault(sa);
+ List tgtPlayers = getTargetPlayers(sa);
if (sa.hasParam("ValidCards")) {
valid = sa.getParam("ValidCards");
diff --git a/src/main/java/forge/card/ability/effects/UntapEffect.java b/src/main/java/forge/card/ability/effects/UntapEffect.java
index 934ef7f2a5c..d11518ba63a 100644
--- a/src/main/java/forge/card/ability/effects/UntapEffect.java
+++ b/src/main/java/forge/card/ability/effects/UntapEffect.java
@@ -11,7 +11,7 @@ import forge.CardPredicates.Presets;
import forge.card.ability.AbilityUtils;
import forge.card.ability.SpellAbilityEffect;
import forge.card.spellability.SpellAbility;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.game.ai.ComputerUtilCard;
import forge.game.player.Player;
import forge.game.zone.ZoneType;
@@ -43,7 +43,7 @@ public class UntapEffect extends SpellAbilityEffect {
@Override
public void resolve(SpellAbility sa) {
- final Target tgt = sa.getTarget();
+ final TargetRestrictions tgt = sa.getTargetRestrictions();
if (sa.hasParam("UntapUpTo")) {
untapChooseUpTo(sa);
diff --git a/src/main/java/forge/card/cardfactory/CardFactory.java b/src/main/java/forge/card/cardfactory/CardFactory.java
index fe25a3a583c..7ab7fd6fb3e 100644
--- a/src/main/java/forge/card/cardfactory/CardFactory.java
+++ b/src/main/java/forge/card/cardfactory/CardFactory.java
@@ -28,6 +28,7 @@ import forge.CardColor;
import forge.CardUtil;
import forge.Command;
import forge.CounterType;
+import forge.ITargetable;
import forge.ImageCache;
import forge.card.CardCharacteristics;
import forge.card.CardDb;
@@ -43,7 +44,7 @@ import forge.card.spellability.AbilitySub;
import forge.card.spellability.OptionalCost;
import forge.card.spellability.SpellAbility;
import forge.card.spellability.SpellPermanent;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.card.trigger.Trigger;
import forge.card.trigger.TriggerHandler;
import forge.game.player.Player;
@@ -138,7 +139,7 @@ public class CardFactory {
* a boolean.
*/
public final static void copySpellontoStack(final Card source, final Card original, final SpellAbility sa,
- final boolean bCopyDetails, final Object definedTarget) {
+ final boolean bCopyDetails, final ITargetable definedTarget) {
//Player originalController = original.getController();
Player controller = sa.getActivatingPlayer();
final Card c = copyCard(original);
@@ -188,14 +189,9 @@ public class CardFactory {
copySA.setCopied(true);
//remove all costs
copySA.setPayCosts(new Cost("", sa.isAbility()));
- if (definedTarget != null) {
- Target target = new Target();
- target.setDefinedTarget(definedTarget);
- copySA.setTarget(target);
- }
- else if (sa.getTarget() != null) {
- Target target = new Target(sa.getTarget());
- copySA.setTarget(target);
+ if (sa.getTargetRestrictions() != null) {
+ TargetRestrictions target = new TargetRestrictions(sa.getTargetRestrictions());
+ copySA.setTargetRestrictions(target);
}
copySA.setActivatingPlayer(controller);
diff --git a/src/main/java/forge/card/cardfactory/CardFactoryCreatures.java b/src/main/java/forge/card/cardfactory/CardFactoryCreatures.java
index 809b40b55b5..a1af176638a 100644
--- a/src/main/java/forge/card/cardfactory/CardFactoryCreatures.java
+++ b/src/main/java/forge/card/cardfactory/CardFactoryCreatures.java
@@ -38,7 +38,7 @@ import forge.card.spellability.AbilityActivated;
import forge.card.spellability.AbilityStatic;
import forge.card.spellability.SpellAbility;
import forge.card.spellability.SpellPermanent;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.card.trigger.Trigger;
import forge.card.trigger.TriggerHandler;
import forge.game.Game;
@@ -132,16 +132,16 @@ public class CardFactoryCreatures {
private static void getCard_MasterOfTheWildHunt(final Card card) {
final Cost abCost = new Cost("T", true);
- final Target abTgt = new Target("Target a creature to Hunt", new String[]{"Creature"}, "1", "1");
+ final TargetRestrictions abTgt = new TargetRestrictions("Target a creature to Hunt", new String[]{"Creature"}, "1", "1");
class MasterOfTheWildHuntAbility extends AbilityActivated {
- public MasterOfTheWildHuntAbility(final Card ca, final Cost co, final Target t) {
+ public MasterOfTheWildHuntAbility(final Card ca, final Cost co, final TargetRestrictions t) {
super(ca, co, t);
}
@Override
public AbilityActivated getCopy() {
return new MasterOfTheWildHuntAbility(getSourceCard(),
- getPayCosts(), new Target(getTarget()));
+ getPayCosts(), new TargetRestrictions(getTargetRestrictions()));
}
private static final long serialVersionUID = 35050145102566898L;
@@ -170,7 +170,7 @@ public class CardFactoryCreatures {
return false;
}
- this.getTarget().resetTargets();
+ this.resetTargets();
this.setTargetCard(ComputerUtilCard.getBestCreatureAI(targetables));
return true;
diff --git a/src/main/java/forge/card/cardfactory/CardFactoryUtil.java b/src/main/java/forge/card/cardfactory/CardFactoryUtil.java
index e4127313db1..d39e25f61e1 100644
--- a/src/main/java/forge/card/cardfactory/CardFactoryUtil.java
+++ b/src/main/java/forge/card/cardfactory/CardFactoryUtil.java
@@ -57,7 +57,7 @@ import forge.card.spellability.Spell;
import forge.card.spellability.SpellAbility;
import forge.card.spellability.SpellAbilityRestriction;
import forge.card.spellability.SpellPermanent;
-import forge.card.spellability.Target;
+import forge.card.spellability.TargetRestrictions;
import forge.card.trigger.Trigger;
import forge.card.trigger.TriggerHandler;
import forge.card.trigger.TriggerType;
@@ -100,14 +100,14 @@ public class CardFactoryUtil {
final Cost cost = new Cost(manaCost, true);
class AbilityUnearth extends AbilityActivated {
- public AbilityUnearth(final Card ca, final Cost co, final Target t) {
+ public AbilityUnearth(final Card ca, final Cost co, final TargetRestrictions t) {
super(ca, co, t);
}
@Override
public AbilityActivated getCopy() {
AbilityActivated res = new AbilityUnearth(getSourceCard(),
- getPayCosts(), getTarget() == null ? null : new Target(getTarget()));
+ getPayCosts(), getTargetRestrictions() == null ? null : new TargetRestrictions(getTargetRestrictions()));
CardFactory.copySpellAbility(this, res);
final SpellAbilityRestriction restrict = new SpellAbilityRestriction();
restrict.setZone(ZoneType.Graveyard);
@@ -311,14 +311,14 @@ public class CardFactoryUtil {
transmuteCost += " Discard<1/CARDNAME>";
final Cost abCost = new Cost(transmuteCost, true);
class AbilityTransmute extends AbilityActivated {
- public AbilityTransmute(final Card ca, final Cost co, final Target t) {
+ public AbilityTransmute(final Card ca, final Cost co, final TargetRestrictions t) {
super(ca, co, t);
}
@Override
public AbilityActivated getCopy() {
AbilityActivated res = new AbilityTransmute(getSourceCard(),
- getPayCosts(), getTarget() == null ? null : new Target(getTarget()));
+ getPayCosts(), getTargetRestrictions() == null ? null : new TargetRestrictions(getTargetRestrictions()));
CardFactory.copySpellAbility(this, res);
res.getRestrictions().setZone(ZoneType.Hand);
return res;
@@ -695,7 +695,7 @@ public class CardFactoryUtil {
}
final Card source = ability.getSourceCard();
- final Target tgt = ability.getTarget();
+ final TargetRestrictions tgt = ability.getTargetRestrictions();
if (tgt != null) {
// Reconfirm the Validity of a TgtValid, or if the Creature is still
// a Creature
@@ -923,7 +923,7 @@ public class CardFactoryUtil {
* a {@link forge.Card} object.
* @return a int.
*/
- public static int objectXCount(final ArrayList objects, final String s, final Card source) {
+ public static int objectXCount(final List> objects, final String s, final Card source) {
if (objects.isEmpty()) {
return 0;
}
@@ -1303,7 +1303,7 @@ public class CardFactoryUtil {
for (final SpellAbility sa : c.getCharacteristics().getSpellAbility()) {
final SpellAbility saTargeting = sa.getSATargetingPlayer();
if (saTargeting != null) {
- for (final Player tgtP : saTargeting.getTarget().getTargetPlayers()) {
+ for (final Player tgtP : saTargeting.getTargets().getTargetPlayers()) {
return doXMath(tgtP.getLife(), m, c);
}
}
@@ -1712,7 +1712,7 @@ public class CardFactoryUtil {
for (final SpellAbility sa : c.getCharacteristics().getSpellAbility()) {
final SpellAbility saTargeting = sa.getSATargetingPlayer();
if (saTargeting != null) {
- for (final Player tgtP : saTargeting.getTarget().getTargetPlayers()) {
+ for (final Player tgtP : saTargeting.getTargets().getTargetPlayers()) {
someCards.addAll(tgtP.getCardsIn(ZoneType.Hand));
}
}
diff --git a/src/main/java/forge/card/spellability/AbilityActivated.java b/src/main/java/forge/card/spellability/AbilityActivated.java
index 221c036861b..8a762b9fbc9 100644
--- a/src/main/java/forge/card/spellability/AbilityActivated.java
+++ b/src/main/java/forge/card/spellability/AbilityActivated.java
@@ -64,12 +64,12 @@ public abstract class AbilityActivated extends SpellAbility implements java.io.S
* @param abCost
* a {@link forge.card.cost.Cost} object.
* @param tgt
- * a {@link forge.card.spellability.Target} object.
+ * a {@link forge.card.spellability.TargetRestrictions} object.
*/
- public AbilityActivated(final Card sourceCard, final Cost abCost, final Target tgt) {
+ public AbilityActivated(final Card sourceCard, final Cost abCost, final TargetRestrictions tgt) {
super(sourceCard, abCost);
if ((tgt != null) && tgt.doesTarget()) {
- this.setTarget(tgt);
+ this.setTargetRestrictions(tgt);
}
}
diff --git a/src/main/java/forge/card/spellability/AbilityStatic.java b/src/main/java/forge/card/spellability/AbilityStatic.java
index a8b87f27ad9..3bfbc0101cb 100644
--- a/src/main/java/forge/card/spellability/AbilityStatic.java
+++ b/src/main/java/forge/card/spellability/AbilityStatic.java
@@ -44,10 +44,10 @@ public abstract class AbilityStatic extends Ability {
super(sourceCard, manaCost);
}
- public AbilityStatic(final Card sourceCard, final Cost abCost, final Target tgt) {
+ public AbilityStatic(final Card sourceCard, final Cost abCost, final TargetRestrictions tgt) {
super(sourceCard, abCost);
if ((tgt != null) && tgt.doesTarget()) {
- this.setTarget(tgt);
+ this.setTargetRestrictions(tgt);
}
}
}
diff --git a/src/main/java/forge/card/spellability/AbilitySub.java b/src/main/java/forge/card/spellability/AbilitySub.java
index a33cd2e5b11..f9364631c98 100644
--- a/src/main/java/forge/card/spellability/AbilitySub.java
+++ b/src/main/java/forge/card/spellability/AbilitySub.java
@@ -90,9 +90,9 @@ public final class AbilitySub extends SpellAbility implements java.io.Serializab
return ai;
}
- public AbilitySub(ApiType api0, final Card ca, final Target tgt, Map params0) {
+ public AbilitySub(ApiType api0, final Card ca, final TargetRestrictions tgt, Map params0) {
super(ca, Cost.Zero);
- this.setTarget(tgt);
+ this.setTargetRestrictions(tgt);
api = api0;
params = params0;
@@ -109,7 +109,7 @@ public final class AbilitySub extends SpellAbility implements java.io.Serializab
}
public AbilitySub getCopy() {
- Target t = getTarget() == null ? null : new Target(getTarget());
+ TargetRestrictions t = getTargetRestrictions() == null ? null : new TargetRestrictions(getTargetRestrictions());
AbilitySub res = new AbilitySub(api, getSourceCard(), t, params);
CardFactory.copySpellAbility(this, res);
return res;
diff --git a/src/main/java/forge/card/spellability/HumanPlaySpellAbility.java b/src/main/java/forge/card/spellability/HumanPlaySpellAbility.java
index 0511aafb84a..ff58593cc7f 100644
--- a/src/main/java/forge/card/spellability/HumanPlaySpellAbility.java
+++ b/src/main/java/forge/card/spellability/HumanPlaySpellAbility.java
@@ -18,10 +18,10 @@
package forge.card.spellability;
import java.util.ArrayList;
-import java.util.List;
-
import org.apache.commons.lang3.StringUtils;
+import com.google.common.collect.Iterables;
+
import forge.Card;
import forge.CardCharacteristicName;
import forge.ITargetable;
@@ -102,7 +102,7 @@ public class HumanPlaySpellAbility {
// (or trigger case where its already targeted)
SpellAbility beingTargeted = ability;
do {
- Target tgt = beingTargeted.getTarget();
+ TargetRestrictions tgt = beingTargeted.getTargetRestrictions();
if( tgt != null && tgt.doesTarget()) {
clearTargets(beingTargeted);
final TargetSelection select = new TargetSelection(beingTargeted);
@@ -116,9 +116,9 @@ public class HumanPlaySpellAbility {
}
public final void clearTargets(SpellAbility ability) {
- Target tg = ability.getTarget();
+ TargetRestrictions tg = ability.getTargetRestrictions();
if (tg != null) {
- tg.resetTargets();
+ ability.resetTargets();
tg.calculateStillToDivide(ability.getParam("DividedAsYouChoose"), ability.getSourceCard(), ability);
}
}
@@ -203,11 +203,11 @@ public class HumanPlaySpellAbility {
// For older abilities that don't setStackDescription set it here
final StringBuilder sb = new StringBuilder();
sb.append(ability.getSourceCard().getName());
- if (ability.getTarget() != null) {
- final List targets = ability.getTarget().getTargets();
- if (targets.size() > 0) {
+ if (ability.getTargetRestrictions() != null) {
+ final Iterable