diff --git a/.gitattributes b/.gitattributes index 7049a863ccd..dfaa9ed6f57 100644 --- a/.gitattributes +++ b/.gitattributes @@ -14510,7 +14510,7 @@ src/main/java/forge/GameLog.java -text src/main/java/forge/GameLogEntry.java -text src/main/java/forge/GameLogEntryType.java -text src/main/java/forge/GameLogFormatter.java -text -src/main/java/forge/ITargetable.java -text +src/main/java/forge/GameObject.java -text src/main/java/forge/ImageCache.java svneol=native#text/plain src/main/java/forge/ImageLoader.java -text src/main/java/forge/Singletons.java svneol=native#text/plain diff --git a/src/main/java/forge/GameEntity.java b/src/main/java/forge/GameEntity.java index b634c407645..005a8411832 100644 --- a/src/main/java/forge/GameEntity.java +++ b/src/main/java/forge/GameEntity.java @@ -24,7 +24,6 @@ import java.util.TreeMap; import forge.game.Game; import forge.game.event.GameEventCardAttachment; import forge.game.event.GameEventCardAttachment.AttachMethod; -import forge.game.player.Player; /** *

@@ -34,7 +33,7 @@ import forge.game.player.Player; * @author Forge * @version $Id: Player.java 10091 2011-08-30 16:11:21Z Sloth $ */ -public abstract class GameEntity implements ITargetable { +public abstract class GameEntity extends GameObject { private String name = ""; private int preventNextDamage = 0; private TreeMap> preventionShieldsWithEffects = new TreeMap>(); @@ -342,58 +341,6 @@ public abstract class GameEntity implements ITargetable { return false; } - /** - * Checks if is valid. - * - * @param restrictions - * the restrictions - * @param sourceController - * the source controller - * @param source - * the source - * @return true, if is valid - */ - public boolean isValid(final String[] restrictions, final Player sourceController, final Card source) { - - for (final String restriction : restrictions) { - if (this.isValid(restriction, sourceController, source)) { - return true; - } - } - return false; - - } // isValid - - /** - * Checks if is valid. - * - * @param restriction - * the restriction - * @param sourceController - * the source controller - * @param source - * the source - * @return true, if is valid - */ - public boolean isValid(final String restriction, final Player sourceController, final Card source) { - return false; - } - - /** - * Checks for property. - * - * @param property - * the property - * @param sourceController - * the source controller - * @param source - * the source - * @return true, if successful - */ - public boolean hasProperty(final String property, final Player sourceController, final Card source) { - return false; - } - // GameEntities can now be Enchanted /** *

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

+ * isValid. + *

+ * + * @param restriction + * a {@link java.lang.String} object. + * @param sourceController + * a {@link forge.game.player.Player} object. + * @param source + * a {@link forge.Card} object. + * @return a boolean. + */ + @Override + public final boolean isValid(final String restriction, final Player sourceController, final Card source) { + + // Inclusive restrictions are Card types + final String[] incR = restriction.split("\\.", 2); + + if (incR[0].equals("Spell") && !this.isSpell()) { + return false; + } + + if (incR.length > 1) { + final String excR = incR[1]; + final String[] exR = excR.split("\\+"); // Exclusive Restrictions are ... + for (int j = 0; j < exR.length; j++) { + if (!this.hasProperty(exR[j], sourceController, source)) { + return false; + } + } + } + return true; + } // isValid(String Restriction) + + // Takes arguments like Blue or withFlying + /** + *

+ * hasProperty. + *

+ * + * @param property + * a {@link java.lang.String} object. + * @param sourceController + * a {@link forge.game.player.Player} object. + * @param source + * a {@link forge.Card} object. + * @return a boolean. + */ + @Override + public boolean hasProperty(final String property, final Player sourceController, final Card source) { + return true; + } // Methods enabling multiple instances of conspire public void addConspireInstance() { diff --git a/src/main/java/forge/card/spellability/TargetChoices.java b/src/main/java/forge/card/spellability/TargetChoices.java index 7de69ee65ed..dc00cb04b5b 100644 --- a/src/main/java/forge/card/spellability/TargetChoices.java +++ b/src/main/java/forge/card/spellability/TargetChoices.java @@ -23,7 +23,7 @@ import java.util.List; import com.google.common.collect.Iterables; import forge.Card; -import forge.ITargetable; +import forge.GameObject; import forge.game.player.Player; /** @@ -62,7 +62,7 @@ public class TargetChoices implements Cloneable { * a {@link java.lang.Object} object. * @return a boolean. */ - public final boolean add(final ITargetable o) { + public final boolean add(final GameObject o) { if (o instanceof Player) { return this.addTarget((Player) o); } else if (o instanceof Card) { @@ -137,7 +137,7 @@ public class TargetChoices implements Cloneable { * a {@link forge.Card} object. * @return a boolean. */ - public final boolean remove(final ITargetable target) { + public final boolean remove(final GameObject target) { // remove returns true if element was found in given list if (this.targetCards.remove(target) || this.targetPlayers.remove(target) || this.targetSpells.remove(target)) { this.numTargeted--; @@ -186,8 +186,8 @@ public class TargetChoices implements Cloneable { * * @return a {@link java.util.ArrayList} object. */ - public final List getTargets() { - final ArrayList tgts = new ArrayList(); + public final List getTargets() { + final ArrayList tgts = new ArrayList(); tgts.addAll(this.targetPlayers); tgts.addAll(this.targetCards); tgts.addAll(this.targetSpells); @@ -197,7 +197,7 @@ public class TargetChoices implements Cloneable { public final String getTargetedString() { - final List tgts = this.getTargets(); + final List tgts = this.getTargets(); final StringBuilder sb = new StringBuilder(); for (final Object o : tgts) { if (o instanceof Player) { @@ -231,7 +231,7 @@ public class TargetChoices implements Cloneable { return !targetSpells.isEmpty(); } - public final boolean isTargeting(ITargetable e) { + public final boolean isTargeting(GameObject e) { return targetCards.contains(e) || targetSpells.contains(e) || targetPlayers.contains(e); } diff --git a/src/main/java/forge/card/spellability/TargetRestrictions.java b/src/main/java/forge/card/spellability/TargetRestrictions.java index 6401908348a..7b8fcab579a 100644 --- a/src/main/java/forge/card/spellability/TargetRestrictions.java +++ b/src/main/java/forge/card/spellability/TargetRestrictions.java @@ -25,7 +25,7 @@ import java.util.List; import org.apache.commons.lang.StringUtils; import forge.Card; -import forge.ITargetable; +import forge.GameObject; import forge.card.CardType; import forge.card.ability.AbilityUtils; import forge.game.Game; @@ -499,9 +499,9 @@ public class TargetRestrictions { * Check Valid Candidates and Targeting * @return a List. */ - public final List getAllCandidates(final SpellAbility sa, final boolean isTargeted) { + public final List getAllCandidates(final SpellAbility sa, final boolean isTargeted) { final Game game = sa.getActivatingPlayer().getGame(); - List candidates = new ArrayList(); + List candidates = new ArrayList(); for (Player player : game.getPlayers()) { if (sa.canTarget(player)) { candidates.add(player); diff --git a/src/main/java/forge/card/spellability/TargetSelection.java b/src/main/java/forge/card/spellability/TargetSelection.java index e384d915ad7..613e0506e54 100644 --- a/src/main/java/forge/card/spellability/TargetSelection.java +++ b/src/main/java/forge/card/spellability/TargetSelection.java @@ -25,7 +25,7 @@ import com.google.common.collect.Lists; import forge.Card; import forge.CardLists; -import forge.ITargetable; +import forge.GameObject; import forge.Singletons; import forge.game.Game; import forge.game.player.Player; @@ -97,8 +97,8 @@ public class TargetSelection { final boolean choiceResult; final boolean random = tgt.isRandomTarget(); if (random) { - List candidates = tgt.getAllCandidates(this.ability, true); - ITargetable choice = Aggregates.random(candidates); + List candidates = tgt.getAllCandidates(this.ability, true); + GameObject choice = Aggregates.random(candidates); return ability.getTargets().add(choice); } else if (zone.size() == 1 && zone.get(0) == ZoneType.Stack) { // If Zone is Stack, the choices are handled slightly differently. @@ -149,7 +149,7 @@ public class TargetSelection { choices.remove(ability.getSourceCard()); } } - List targetedObjects = this.ability.getUniqueTargets(); + List targetedObjects = this.ability.getUniqueTargets(); if (tgt.isUniqueTargets()) { for (final Object o : targetedObjects) { diff --git a/src/main/java/forge/card/trigger/WrappedAbility.java b/src/main/java/forge/card/trigger/WrappedAbility.java index fcf4e90ebe9..d250a76dd01 100644 --- a/src/main/java/forge/card/trigger/WrappedAbility.java +++ b/src/main/java/forge/card/trigger/WrappedAbility.java @@ -5,7 +5,7 @@ import java.util.List; import java.util.Map; import forge.Card; -import forge.ITargetable; +import forge.GameObject; import forge.card.ability.ApiType; import forge.card.cost.Cost; import forge.card.mana.ManaCost; @@ -183,7 +183,7 @@ public class WrappedAbility extends Ability implements ISpellAbility { final StringBuilder sb = new StringBuilder(regtrig.toString()); if (this.getTargetRestrictions() != null) { sb.append(" (Targeting "); - for (final ITargetable o : this.getTargets().getTargets()) { + for (final GameObject o : this.getTargets().getTargets()) { sb.append(o.toString()); sb.append(", "); } diff --git a/src/main/java/forge/game/GameAction.java b/src/main/java/forge/game/GameAction.java index 18ce7d582b4..5c7fc953c67 100644 --- a/src/main/java/forge/game/GameAction.java +++ b/src/main/java/forge/game/GameAction.java @@ -43,7 +43,7 @@ import forge.CounterType; import forge.FThreads; import forge.GameEntity; import forge.GameLogEntryType; -import forge.ITargetable; +import forge.GameObject; import forge.card.CardDb; import forge.card.CardType; import forge.card.TriggerReplacementBase; @@ -1420,7 +1420,7 @@ public class GameAction { } /** Delivers a message to all players. (use reveal to show Cards) */ - public void nofityOfValue(SpellAbility saSource, ITargetable relatedTarget, String value, Player playerExcept) { + public void nofityOfValue(SpellAbility saSource, GameObject relatedTarget, String value, Player playerExcept) { for(Player p : game.getPlayers()) { if (playerExcept == p) continue; p.getController().notifyOfValue(saSource, relatedTarget, value); diff --git a/src/main/java/forge/game/ai/ComputerUtil.java b/src/main/java/forge/game/ai/ComputerUtil.java index b63c9192595..96d7dcff3ba 100644 --- a/src/main/java/forge/game/ai/ComputerUtil.java +++ b/src/main/java/forge/game/ai/ComputerUtil.java @@ -36,7 +36,7 @@ import forge.Constant; import forge.CounterType; import forge.CardPredicates.Presets; import forge.CardUtil; -import forge.ITargetable; +import forge.GameObject; import forge.card.CardType; import forge.card.MagicColor; import forge.card.ability.AbilityFactory; @@ -1272,9 +1272,9 @@ public class ComputerUtil { * @return a {@link java.util.ArrayList} object. * @since 1.0.15 */ - public static List predictThreatenedObjects(final Player aiPlayer, final SpellAbility sa) { + public static List predictThreatenedObjects(final Player aiPlayer, final SpellAbility sa) { final Game game = aiPlayer.getGame(); - final List objects = new ArrayList(); + final List objects = new ArrayList(); if (game.getStack().isEmpty()) { return objects; } @@ -1298,10 +1298,10 @@ public class ComputerUtil { * @return a {@link java.util.ArrayList} object. * @since 1.0.15 */ - private static Iterable predictThreatenedObjects(final Player aiPlayer, final SpellAbility saviour, + private static Iterable predictThreatenedObjects(final Player aiPlayer, final SpellAbility saviour, final SpellAbility topStack) { - Iterable objects = new ArrayList(); - final List threatened = new ArrayList(); + Iterable objects = new ArrayList(); + final List threatened = new ArrayList(); ApiType saviourApi = saviour == null ? null : saviour.getApi(); if (topStack == null) { diff --git a/src/main/java/forge/game/player/PlayerController.java b/src/main/java/forge/game/player/PlayerController.java index c9d98c3ca58..cbf4eaef3be 100644 --- a/src/main/java/forge/game/player/PlayerController.java +++ b/src/main/java/forge/game/player/PlayerController.java @@ -13,7 +13,7 @@ import com.google.common.collect.ImmutableList; import forge.Card; import forge.CounterType; import forge.GameEntity; -import forge.ITargetable; +import forge.GameObject; import forge.card.cost.Cost; import forge.card.mana.Mana; import forge.card.replacement.ReplacementEffect; @@ -111,7 +111,7 @@ public abstract class PlayerController { public abstract TargetChoices chooseNewTargetsFor(SpellAbility ability); // Specify a target of a spell (Spellskite) - public abstract Pair chooseTarget(SpellAbility sa, List> allTargets); + public abstract Pair chooseTarget(SpellAbility sa, List> allTargets); public abstract List chooseCardsForEffect(List sourceList, SpellAbility sa, String title, int amount, boolean isOptional); public Card chooseSingleCardForEffect(Collection sourceList, SpellAbility sa, String title) { return chooseSingleCardForEffect(sourceList, sa, title, false); } @@ -129,7 +129,7 @@ public abstract class PlayerController { /** Shows the card to this player*/ public abstract void reveal(String string, Collection cards, ZoneType zone, Player owner); /** Shows message to player to reveal chosen cardName, creatureType, number etc. AI must analyze API to understand what that is */ - public abstract void notifyOfValue(SpellAbility saSource, ITargetable realtedTarget, String value); + public abstract void notifyOfValue(SpellAbility saSource, GameObject realtedTarget, String value); public abstract ImmutablePair, List> arrangeForScry(List topN); public abstract boolean willPutCardOnTop(Card c); public abstract List orderMoveToZoneList(List cards, ZoneType destinationZone); diff --git a/src/main/java/forge/game/player/PlayerControllerAi.java b/src/main/java/forge/game/player/PlayerControllerAi.java index b12f4dc8779..91fb51e11f9 100644 --- a/src/main/java/forge/game/player/PlayerControllerAi.java +++ b/src/main/java/forge/game/player/PlayerControllerAi.java @@ -17,7 +17,7 @@ import forge.CardLists; import forge.CardPredicates; import forge.CounterType; import forge.GameEntity; -import forge.ITargetable; +import forge.GameObject; import forge.card.ability.ApiType; import forge.card.ability.ai.CharmAi; import forge.card.cost.Cost; @@ -408,14 +408,14 @@ public class PlayerControllerAi extends PlayerController { } @Override - public Pair chooseTarget(SpellAbility saSrc, List> allTargets) { + public Pair chooseTarget(SpellAbility saSrc, List> allTargets) { // TODO Teach AI how to use Spellskite return allTargets.get(0); } @Override - public void notifyOfValue(SpellAbility saSource, ITargetable realtedTarget, String value) { + public void notifyOfValue(SpellAbility saSource, GameObject realtedTarget, String value) { // AI should take into consideration creature types, numbers and other information (mostly choices) arriving through this channel } diff --git a/src/main/java/forge/game/player/PlayerControllerHuman.java b/src/main/java/forge/game/player/PlayerControllerHuman.java index 16d9fad75ec..f02eee279f0 100644 --- a/src/main/java/forge/game/player/PlayerControllerHuman.java +++ b/src/main/java/forge/game/player/PlayerControllerHuman.java @@ -20,7 +20,7 @@ import com.google.common.collect.Lists; import forge.Card; import forge.CounterType; import forge.GameEntity; -import forge.ITargetable; +import forge.GameObject; import forge.Singletons; import forge.card.ability.effects.CharmEffect; import forge.card.cost.Cost; @@ -697,30 +697,30 @@ public class PlayerControllerHuman extends PlayerController { @Override - public Pair chooseTarget(SpellAbility saSpellskite, List> allTargets) { + public Pair chooseTarget(SpellAbility saSpellskite, List> allTargets) { if( allTargets.size() < 2) return Iterables.getFirst(allTargets, null); - final Function, String> fnToString = new Function, String>() { + final Function, String> fnToString = new Function, String>() { @Override - public String apply(Pair targ) { + public String apply(Pair targ) { return targ.getRight().toString() + " - " + targ.getLeft().getStackDescription(); } }; - List> chosen = GuiChoose.getChoices(saSpellskite.getSourceCard().getName(), 1, 1, allTargets, null, fnToString); + List> chosen = GuiChoose.getChoices(saSpellskite.getSourceCard().getName(), 1, 1, allTargets, null, fnToString); return Iterables.getFirst(chosen, null); } @Override - public void notifyOfValue(SpellAbility sa, ITargetable realtedTarget, String value) { + public void notifyOfValue(SpellAbility sa, GameObject realtedTarget, String value) { String message = formatNotificationMessage(sa, realtedTarget, value); GuiDialog.message(message, sa.getSourceCard().getName()); } // These are not much related to PlayerController - private String formatNotificationMessage(SpellAbility sa, ITargetable target, String value) { + private String formatNotificationMessage(SpellAbility sa, GameObject target, String value) { if (sa.getApi() == null) { return ("Result: " + value); } @@ -741,7 +741,7 @@ public class PlayerControllerHuman extends PlayerController { } } - private String mayBeYou(ITargetable what, Player you) { + private String mayBeYou(GameObject what, Player you) { return what == you ? "you" : what.toString(); } // end of not related candidates for move. diff --git a/src/main/java/forge/game/zone/MagicStack.java b/src/main/java/forge/game/zone/MagicStack.java index 7a0107744d1..a951aab4c4a 100644 --- a/src/main/java/forge/game/zone/MagicStack.java +++ b/src/main/java/forge/game/zone/MagicStack.java @@ -35,7 +35,7 @@ import forge.Card; import forge.CardLists; import forge.CardPredicates; import forge.FThreads; -import forge.ITargetable; +import forge.GameObject; import forge.Singletons; import forge.CardPredicates.Presets; import forge.GameLogEntryType; @@ -692,7 +692,7 @@ public class MagicStack /* extends MyObservable */ implements Iterable