diff --git a/.gitattributes b/.gitattributes index fe931cafa5a..c7a75e907ae 100644 --- a/.gitattributes +++ b/.gitattributes @@ -10455,7 +10455,7 @@ src/main/java/forge/card/abilityfactory/AbilityFactory.java svneol=native#text/p src/main/java/forge/card/abilityfactory/AbilityFactoryAlterLife.java svneol=native#text/plain src/main/java/forge/card/abilityfactory/AbilityFactoryAnimate.java svneol=native#text/plain src/main/java/forge/card/abilityfactory/AbilityFactoryAttach.java svneol=native#text/plain -src/main/java/forge/card/abilityfactory/AbilityFactoryChangeState.java -text svneol=native#text/plain +src/main/java/forge/card/abilityfactory/AbilityFactoryChangeState.java svneol=native#text/plain src/main/java/forge/card/abilityfactory/AbilityFactoryChangeZone.java svneol=native#text/plain src/main/java/forge/card/abilityfactory/AbilityFactoryCharm.java -text svneol=native#text/plain src/main/java/forge/card/abilityfactory/AbilityFactoryChoose.java svneol=native#text/plain diff --git a/src/main/java/forge/MagicStack.java b/src/main/java/forge/MagicStack.java index b414f0e70d8..f9d1c07c89c 100644 --- a/src/main/java/forge/MagicStack.java +++ b/src/main/java/forge/MagicStack.java @@ -901,7 +901,7 @@ public class MagicStack extends MyObservable { if (!zone.is(Constant.Zone.Battlefield) || !c.isCreature()) { return; } - if (CardFactoryUtil.canTarget(source, c)) { + if (c.canTarget(haunterDiesWork)) { haunterDiesWork.setTargetCard(c); MagicStack.this.add(haunterDiesWork); this.stop(); diff --git a/src/main/java/forge/Upkeep.java b/src/main/java/forge/Upkeep.java index bb0cdd6bae4..10505484355 100644 --- a/src/main/java/forge/Upkeep.java +++ b/src/main/java/forge/Upkeep.java @@ -2543,7 +2543,7 @@ public class Upkeep implements java.io.Serializable { @Override public void selectCard(final Card selectedCard, final PlayerZone z) { if (z.is(Constant.Zone.Battlefield) && selectedCard.isCreature() - && CardFactoryUtil.canTarget(c, selectedCard)) { + && selectedCard.canTarget(switchTargets)) { newTarget[0] = selectedCard; final StringBuilder sb = new StringBuilder(); sb.append(c.getCloneOrigin()).append( diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryChangeState.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryChangeState.java index 259570dab8a..316282f137c 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryChangeState.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryChangeState.java @@ -1,375 +1,374 @@ -package forge.card.abilityfactory; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; - -import forge.AllZoneUtil; -import forge.Card; -import forge.CardList; -import forge.Constant.Zone; -import forge.Player; -import forge.card.cardfactory.CardFactoryUtil; -import forge.card.spellability.AbilityActivated; -import forge.card.spellability.AbilitySub; -import forge.card.spellability.Spell; -import forge.card.spellability.SpellAbility; -import forge.card.spellability.Target; - -/** - * AbilityFactory for abilities that cause cards to change states. - * - */ -public class AbilityFactoryChangeState { - - /** - * Gets the change state ability. - * - * @param abilityFactory - * the aF - * @return the change state ability - */ - public static SpellAbility getChangeStateAbility(final AbilityFactory abilityFactory) { - final SpellAbility ret = new AbilityActivated(abilityFactory.getHostCard(), abilityFactory.getAbCost(), - abilityFactory.getAbTgt()) { - private static final long serialVersionUID = -1083427558368639457L; - - @Override - public String getStackDescription() { - return AbilityFactoryChangeState.changeStateStackDescription(abilityFactory, this); - } - - @Override - public void resolve() { - AbilityFactoryChangeState.changeStateResolve(abilityFactory, this); - } - }; - - return ret; - } - - /** - * Gets the change state spell. - * - * @param abilityFactory - * the aF - * @return the change state spell - */ - public static SpellAbility getChangeStateSpell(final AbilityFactory abilityFactory) { - final SpellAbility ret = new Spell(abilityFactory.getHostCard()) { - private static final long serialVersionUID = -7506856902233086859L; - - @Override - public String getStackDescription() { - return AbilityFactoryChangeState.changeStateStackDescription(abilityFactory, this); - } - - @Override - public void resolve() { - AbilityFactoryChangeState.changeStateResolve(abilityFactory, this); - } - }; - - return ret; - } - - /** - * Gets the change state drawback. - * - * @param abilityFactory - * the aF - * @return the change state drawback - */ - public static SpellAbility getChangeStateDrawback(final AbilityFactory abilityFactory) { - final AbilitySub ret = new AbilitySub(abilityFactory.getHostCard(), abilityFactory.getAbTgt()) { - - private static final long serialVersionUID = -3793247725721587468L; - - @Override - public String getStackDescription() { - return AbilityFactoryChangeState.changeStateStackDescription(abilityFactory, this); - } - - @Override - public boolean chkAIDrawback() { - - // Gross generalization, but this always considers alternate - // states more powerful - if (abilityFactory.getHostCard().isInAlternateState()) { - return false; - } - - return true; - } - - @Override - public boolean doTrigger(final boolean mandatory) { - if (!mandatory && abilityFactory.getHostCard().isInAlternateState()) { - return false; - } - - return true; - } - - @Override - public void resolve() { - AbilityFactoryChangeState.changeStateResolve(abilityFactory, this); - } - - }; - - return ret; - } - - private static String changeStateStackDescription(final AbilityFactory abilityFactory, final SpellAbility sa) { - final Map params = abilityFactory.getMapParams(); - - final StringBuilder sb = new StringBuilder(); - final Card host = abilityFactory.getHostCard(); - - final String conditionDesc = params.get("ConditionDescription"); - if (conditionDesc != null) { - sb.append(conditionDesc).append(" "); - } - - ArrayList tgtCards; - - final Target tgt = abilityFactory.getAbTgt(); - if (tgt != null) { - tgtCards = tgt.getTargetCards(); - } else { - tgtCards = AbilityFactory.getDefinedCards(sa.getSourceCard(), params.get("Defined"), sa); - } - - if (sa instanceof AbilitySub) { - sb.append(" "); - } else { - sb.append(host).append(" - "); - } - - if (params.containsKey("Flip")) { - sb.append("Flip"); - } else { - sb.append("Transform "); - } - - final Iterator it = tgtCards.iterator(); - while (it.hasNext()) { - final Card tgtC = it.next(); - if (tgtC.isFaceDown()) { - sb.append("Morph ").append("(").append(tgtC.getUniqueNumber()).append(")"); - } else { - sb.append(tgtC); - } - - if (it.hasNext()) { - sb.append(", "); - } - } - sb.append("."); - - final AbilitySub abSub = sa.getSubAbility(); - if (abSub != null) { - sb.append(abSub.getStackDescription()); - } - - return sb.toString(); - } - - private static void changeStateResolve(final AbilityFactory abilityFactory, final SpellAbility sa) { - - ArrayList tgtCards; - - if (abilityFactory.getAbTgt() != null) { - tgtCards = abilityFactory.getAbTgt().getTargetCards(); - } else { - tgtCards = AbilityFactory.getDefinedCards(abilityFactory.getHostCard(), - abilityFactory.getMapParams().get("Defined"), sa); - } - - for (final Card tgt : tgtCards) { - if (abilityFactory.getAbTgt() != null) { - if (!CardFactoryUtil.canTarget(abilityFactory.getHostCard(), tgt)) { - continue; - } - } - tgt.changeState(); - } - - } - - // ////////////////////////////////////////////// - // changeStateAll // - // ////////////////////////////////////////////// - - /** - * Gets the change state all ability. - * - * @param abilityFactory - * the aF - * @return the change state all ability - */ - public static SpellAbility getChangeStateAllAbility(final AbilityFactory abilityFactory) { - final SpellAbility ret = new AbilityActivated(abilityFactory.getHostCard(), abilityFactory.getAbCost(), - abilityFactory.getAbTgt()) { - - private static final long serialVersionUID = 7841029107610111992L; - - @Override - public String getStackDescription() { - return AbilityFactoryChangeState.changeStateAllStackDescription(abilityFactory, this); - } - - @Override - public void resolve() { - AbilityFactoryChangeState.changeStateAllResolve(abilityFactory, this); - } - - }; - - return ret; - } - - /** - * Gets the change state all spell. - * - * @param abilityFactory - * the aF - * @return the change state all spell - */ - public static SpellAbility getChangeStateAllSpell(final AbilityFactory abilityFactory) { - final SpellAbility ret = new Spell(abilityFactory.getHostCard()) { - - private static final long serialVersionUID = 4217632586060204603L; - - @Override - public String getStackDescription() { - return AbilityFactoryChangeState.changeStateAllStackDescription(abilityFactory, this); - } - - @Override - public void resolve() { - AbilityFactoryChangeState.changeStateAllResolve(abilityFactory, this); - } - }; - - return ret; - } - - /** - * Gets the change state all drawback. - * - * @param abilityFactory - * the aF - * @return the change state all drawback - */ - public static SpellAbility getChangeStateAllDrawback(final AbilityFactory abilityFactory) { - final AbilitySub ret = new AbilitySub(abilityFactory.getHostCard(), abilityFactory.getAbTgt()) { - - private static final long serialVersionUID = 4047514893482113436L; - - @Override - public String getStackDescription() { - return AbilityFactoryChangeState.changeStateAllStackDescription(abilityFactory, this); - } - - @Override - public boolean chkAIDrawback() { - - // Gross generalization, but this always considers alternate - // states more powerful - if (abilityFactory.getHostCard().isInAlternateState()) { - return false; - } - - return true; - } - - @Override - public boolean doTrigger(final boolean mandatory) { - return true; - } - - @Override - public void resolve() { - AbilityFactoryChangeState.changeStateAllResolve(abilityFactory, this); - } - - }; - - return ret; - } - - private static void changeStateAllResolve(final AbilityFactory abilityFactory, final SpellAbility sa) { - final HashMap params = abilityFactory.getMapParams(); - - final Card card = sa.getSourceCard(); - - final Target tgt = abilityFactory.getAbTgt(); - Player targetPlayer = null; - if (tgt != null) { - targetPlayer = tgt.getTargetPlayers().get(0); - } - - String valid = ""; - - if (params.containsKey("ValidCards")) { - valid = params.get("ValidCards"); - } - - // Ugh. If calculateAmount needs to be called with DestroyAll it _needs_ - // to use the X variable - // We really need a better solution to this - if (valid.contains("X")) { - valid = valid.replace("X", Integer.toString(AbilityFactory.calculateAmount(card, "X", sa))); - } - - CardList list = AllZoneUtil.getCardsIn(Zone.Battlefield); - - if (targetPlayer != null) { - list = list.getController(targetPlayer); - } - - list = AbilityFactory.filterListByType(list, valid, sa); - - final boolean remChanged = params.containsKey("RememberChanged"); - if (remChanged) { - card.clearRemembered(); - } - - for (int i = 0; i < list.size(); i++) { - if (list.get(i).changeState()) { - card.addRemembered(list.get(i)); - } - } - } - - private static String changeStateAllStackDescription(final AbilityFactory abilityFactory, final SpellAbility sa) { - - final Card host = abilityFactory.getHostCard(); - final Map params = abilityFactory.getMapParams(); - final StringBuilder sb = new StringBuilder(); - - if (sa instanceof AbilitySub) { - sb.append(" "); - } else { - sb.append(host).append(" - "); - } - - if (params.containsKey("Flip")) { - sb.append("Flip"); - } else { - sb.append("Transform "); - } - - sb.append(" permanents."); - - final AbilitySub abSub = sa.getSubAbility(); - if (abSub != null) { - sb.append(abSub.getStackDescription()); - } - - return sb.toString(); - } -} +package forge.card.abilityfactory; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +import forge.AllZoneUtil; +import forge.Card; +import forge.CardList; +import forge.Constant.Zone; +import forge.Player; +import forge.card.spellability.AbilityActivated; +import forge.card.spellability.AbilitySub; +import forge.card.spellability.Spell; +import forge.card.spellability.SpellAbility; +import forge.card.spellability.Target; + +/** + * AbilityFactory for abilities that cause cards to change states. + * + */ +public class AbilityFactoryChangeState { + + /** + * Gets the change state ability. + * + * @param abilityFactory + * the aF + * @return the change state ability + */ + public static SpellAbility getChangeStateAbility(final AbilityFactory abilityFactory) { + final SpellAbility ret = new AbilityActivated(abilityFactory.getHostCard(), abilityFactory.getAbCost(), + abilityFactory.getAbTgt()) { + private static final long serialVersionUID = -1083427558368639457L; + + @Override + public String getStackDescription() { + return AbilityFactoryChangeState.changeStateStackDescription(abilityFactory, this); + } + + @Override + public void resolve() { + AbilityFactoryChangeState.changeStateResolve(abilityFactory, this); + } + }; + + return ret; + } + + /** + * Gets the change state spell. + * + * @param abilityFactory + * the aF + * @return the change state spell + */ + public static SpellAbility getChangeStateSpell(final AbilityFactory abilityFactory) { + final SpellAbility ret = new Spell(abilityFactory.getHostCard()) { + private static final long serialVersionUID = -7506856902233086859L; + + @Override + public String getStackDescription() { + return AbilityFactoryChangeState.changeStateStackDescription(abilityFactory, this); + } + + @Override + public void resolve() { + AbilityFactoryChangeState.changeStateResolve(abilityFactory, this); + } + }; + + return ret; + } + + /** + * Gets the change state drawback. + * + * @param abilityFactory + * the aF + * @return the change state drawback + */ + public static SpellAbility getChangeStateDrawback(final AbilityFactory abilityFactory) { + final AbilitySub ret = new AbilitySub(abilityFactory.getHostCard(), abilityFactory.getAbTgt()) { + + private static final long serialVersionUID = -3793247725721587468L; + + @Override + public String getStackDescription() { + return AbilityFactoryChangeState.changeStateStackDescription(abilityFactory, this); + } + + @Override + public boolean chkAIDrawback() { + + // Gross generalization, but this always considers alternate + // states more powerful + if (abilityFactory.getHostCard().isInAlternateState()) { + return false; + } + + return true; + } + + @Override + public boolean doTrigger(final boolean mandatory) { + if (!mandatory && abilityFactory.getHostCard().isInAlternateState()) { + return false; + } + + return true; + } + + @Override + public void resolve() { + AbilityFactoryChangeState.changeStateResolve(abilityFactory, this); + } + + }; + + return ret; + } + + private static String changeStateStackDescription(final AbilityFactory abilityFactory, final SpellAbility sa) { + final Map params = abilityFactory.getMapParams(); + + final StringBuilder sb = new StringBuilder(); + final Card host = abilityFactory.getHostCard(); + + final String conditionDesc = params.get("ConditionDescription"); + if (conditionDesc != null) { + sb.append(conditionDesc).append(" "); + } + + ArrayList tgtCards; + + final Target tgt = abilityFactory.getAbTgt(); + if (tgt != null) { + tgtCards = tgt.getTargetCards(); + } else { + tgtCards = AbilityFactory.getDefinedCards(sa.getSourceCard(), params.get("Defined"), sa); + } + + if (sa instanceof AbilitySub) { + sb.append(" "); + } else { + sb.append(host).append(" - "); + } + + if (params.containsKey("Flip")) { + sb.append("Flip"); + } else { + sb.append("Transform "); + } + + final Iterator it = tgtCards.iterator(); + while (it.hasNext()) { + final Card tgtC = it.next(); + if (tgtC.isFaceDown()) { + sb.append("Morph ").append("(").append(tgtC.getUniqueNumber()).append(")"); + } else { + sb.append(tgtC); + } + + if (it.hasNext()) { + sb.append(", "); + } + } + sb.append("."); + + final AbilitySub abSub = sa.getSubAbility(); + if (abSub != null) { + sb.append(abSub.getStackDescription()); + } + + return sb.toString(); + } + + private static void changeStateResolve(final AbilityFactory abilityFactory, final SpellAbility sa) { + + ArrayList tgtCards; + + if (abilityFactory.getAbTgt() != null) { + tgtCards = abilityFactory.getAbTgt().getTargetCards(); + } else { + tgtCards = AbilityFactory.getDefinedCards(abilityFactory.getHostCard(), + abilityFactory.getMapParams().get("Defined"), sa); + } + + for (final Card tgt : tgtCards) { + if (abilityFactory.getAbTgt() != null) { + if (!tgt.canTarget(sa)) { + continue; + } + } + tgt.changeState(); + } + + } + + // ////////////////////////////////////////////// + // changeStateAll // + // ////////////////////////////////////////////// + + /** + * Gets the change state all ability. + * + * @param abilityFactory + * the aF + * @return the change state all ability + */ + public static SpellAbility getChangeStateAllAbility(final AbilityFactory abilityFactory) { + final SpellAbility ret = new AbilityActivated(abilityFactory.getHostCard(), abilityFactory.getAbCost(), + abilityFactory.getAbTgt()) { + + private static final long serialVersionUID = 7841029107610111992L; + + @Override + public String getStackDescription() { + return AbilityFactoryChangeState.changeStateAllStackDescription(abilityFactory, this); + } + + @Override + public void resolve() { + AbilityFactoryChangeState.changeStateAllResolve(abilityFactory, this); + } + + }; + + return ret; + } + + /** + * Gets the change state all spell. + * + * @param abilityFactory + * the aF + * @return the change state all spell + */ + public static SpellAbility getChangeStateAllSpell(final AbilityFactory abilityFactory) { + final SpellAbility ret = new Spell(abilityFactory.getHostCard()) { + + private static final long serialVersionUID = 4217632586060204603L; + + @Override + public String getStackDescription() { + return AbilityFactoryChangeState.changeStateAllStackDescription(abilityFactory, this); + } + + @Override + public void resolve() { + AbilityFactoryChangeState.changeStateAllResolve(abilityFactory, this); + } + }; + + return ret; + } + + /** + * Gets the change state all drawback. + * + * @param abilityFactory + * the aF + * @return the change state all drawback + */ + public static SpellAbility getChangeStateAllDrawback(final AbilityFactory abilityFactory) { + final AbilitySub ret = new AbilitySub(abilityFactory.getHostCard(), abilityFactory.getAbTgt()) { + + private static final long serialVersionUID = 4047514893482113436L; + + @Override + public String getStackDescription() { + return AbilityFactoryChangeState.changeStateAllStackDescription(abilityFactory, this); + } + + @Override + public boolean chkAIDrawback() { + + // Gross generalization, but this always considers alternate + // states more powerful + if (abilityFactory.getHostCard().isInAlternateState()) { + return false; + } + + return true; + } + + @Override + public boolean doTrigger(final boolean mandatory) { + return true; + } + + @Override + public void resolve() { + AbilityFactoryChangeState.changeStateAllResolve(abilityFactory, this); + } + + }; + + return ret; + } + + private static void changeStateAllResolve(final AbilityFactory abilityFactory, final SpellAbility sa) { + final HashMap params = abilityFactory.getMapParams(); + + final Card card = sa.getSourceCard(); + + final Target tgt = abilityFactory.getAbTgt(); + Player targetPlayer = null; + if (tgt != null) { + targetPlayer = tgt.getTargetPlayers().get(0); + } + + String valid = ""; + + if (params.containsKey("ValidCards")) { + valid = params.get("ValidCards"); + } + + // Ugh. If calculateAmount needs to be called with DestroyAll it _needs_ + // to use the X variable + // We really need a better solution to this + if (valid.contains("X")) { + valid = valid.replace("X", Integer.toString(AbilityFactory.calculateAmount(card, "X", sa))); + } + + CardList list = AllZoneUtil.getCardsIn(Zone.Battlefield); + + if (targetPlayer != null) { + list = list.getController(targetPlayer); + } + + list = AbilityFactory.filterListByType(list, valid, sa); + + final boolean remChanged = params.containsKey("RememberChanged"); + if (remChanged) { + card.clearRemembered(); + } + + for (int i = 0; i < list.size(); i++) { + if (list.get(i).changeState()) { + card.addRemembered(list.get(i)); + } + } + } + + private static String changeStateAllStackDescription(final AbilityFactory abilityFactory, final SpellAbility sa) { + + final Card host = abilityFactory.getHostCard(); + final Map params = abilityFactory.getMapParams(); + final StringBuilder sb = new StringBuilder(); + + if (sa instanceof AbilitySub) { + sb.append(" "); + } else { + sb.append(host).append(" - "); + } + + if (params.containsKey("Flip")) { + sb.append("Flip"); + } else { + sb.append("Transform "); + } + + sb.append(" permanents."); + + final AbilitySub abSub = sa.getSubAbility(); + if (abSub != null) { + sb.append(abSub.getStackDescription()); + } + + return sb.toString(); + } +} diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryChangeZone.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryChangeZone.java index 43154ca4aa1..49112778b30 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryChangeZone.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryChangeZone.java @@ -1745,7 +1745,7 @@ public final class AbilityFactoryChangeZone { if ((tgt != null) && origin.equals(Zone.Battlefield)) { // check targeting - if (!CardFactoryUtil.canTarget(sa.getSourceCard(), tgtC)) { + if (!tgtC.canTarget(sa)) { continue; } } diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryCombat.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryCombat.java index 5397e89c3f8..a4f9947107f 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryCombat.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryCombat.java @@ -712,7 +712,7 @@ public final class AbilityFactoryCombat { } for (final Card c : tgtCards) { - if ((tgt == null) || CardFactoryUtil.canTarget(sa, c)) { + if ((tgt == null) || c.canTarget(sa)) { AllZone.getCombat().removeFromCombat(c); } } @@ -997,7 +997,7 @@ public final class AbilityFactoryCombat { } for (final Card c : tgtCards) { - if ((tgt == null) || CardFactoryUtil.canTarget(sa, c)) { + if ((tgt == null) || c.canTarget(sa)) { final Card attacker = cards.get(0); c.addMustBlockCard(attacker); System.out.println(c + " is adding " + attacker + " to mustBlockCards: " + c.getMustBlockCards()); diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryCopy.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryCopy.java index 86fb7ec3be9..5afe9682584 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryCopy.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryCopy.java @@ -342,7 +342,7 @@ public final class AbilityFactoryCopy { hostCard.clearClones(); for (final Card c : tgtCards) { - if ((tgt == null) || CardFactoryUtil.canTarget(hostCard, c)) { + if ((tgt == null) || c.canTarget(sa)) { boolean wasInAlt = false; if (c.isInAlternateState()) { @@ -729,7 +729,7 @@ public final class AbilityFactoryCopy { } chosenSA.setActivatingPlayer(sa.getActivatingPlayer()); - if ((tgt == null) || CardFactoryUtil.canTarget(card, chosenSA.getSourceCard())) { + if ((tgt == null)) { for (int i = 0; i < amount; i++) { AllZone.getCardFactory().copySpellontoStack(card, chosenSA.getSourceCard(), chosenSA, true); } diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryCounters.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryCounters.java index f38d8792a78..771bf8e0b43 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryCounters.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryCounters.java @@ -255,7 +255,7 @@ public class AbilityFactoryCounters { list = list.filter(new CardListFilter() { @Override public boolean addCard(final Card c) { - return CardFactoryUtil.canTarget(source, c) + return c.canTarget(sa) && !c.hasKeyword("CARDNAME can't have counters placed on it.") && !(c.hasKeyword("CARDNAME can't have -1/-1 counters placed on it.") && type.equals("M1M1")); } @@ -408,7 +408,7 @@ public class AbilityFactoryCounters { list = list.filter(new CardListFilter() { @Override public boolean addCard(final Card c) { - return CardFactoryUtil.canTarget(source, c); + return c.canTarget(sa); } }); @@ -673,7 +673,7 @@ public class AbilityFactoryCounters { } for (final Card tgtCard : tgtCards) { - if ((tgt == null) || CardFactoryUtil.canTarget(card, tgtCard)) { + if ((tgt == null) || tgtCard.canTarget(sa)) { if (max != -1) { counterAmount = max - tgtCard.getCounters(Counters.valueOf(type)); } @@ -1045,7 +1045,7 @@ public class AbilityFactoryCounters { } for (final Card tgtCard : tgtCards) { - if ((tgt == null) || CardFactoryUtil.canTarget(card, tgtCard)) { + if ((tgt == null) || tgtCard.canTarget(sa)) { final PlayerZone zone = AllZone.getZoneOf(tgtCard); if (zone.is(Constant.Zone.Battlefield) || zone.is(Constant.Zone.Exile)) { diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryDealDamage.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryDealDamage.java index d2a254e25ab..5247a0df626 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryDealDamage.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryDealDamage.java @@ -773,7 +773,7 @@ public class AbilityFactoryDealDamage { for (final Object o : tgts) { if (o instanceof Card) { final Card c = (Card) o; - if (AllZoneUtil.isCardInPlay(c) && (!targeted || CardFactoryUtil.canTarget(this.abilityFactory.getHostCard(), c))) { + if (AllZoneUtil.isCardInPlay(c) && (!targeted || c.canTarget(saMe))) { if (noPrevention) { c.addDamageWithoutPrevention(dmg, source); } else { @@ -1434,7 +1434,7 @@ public class AbilityFactoryDealDamage { //System.out.println(source+" deals "+dmg+" damage to "+o.toString()); if (o instanceof Card) { final Card c = (Card) o; - if (AllZoneUtil.isCardInPlay(c) && (!targeted || CardFactoryUtil.canTarget(this.abilityFactory.getHostCard(), c))) { + if (AllZoneUtil.isCardInPlay(c) && (!targeted || c.canTarget(sa))) { c.addDamage(dmg, source); } diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryDebuff.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryDebuff.java index ff0173715fb..fe855c119c8 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryDebuff.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryDebuff.java @@ -552,7 +552,7 @@ public final class AbilityFactoryDebuff { for (final Card tgtC : tgtCards) { final ArrayList hadIntrinsic = new ArrayList(); - if (AllZoneUtil.isCardInPlay(tgtC) && CardFactoryUtil.canTarget(host, tgtC)) { + if (AllZoneUtil.isCardInPlay(tgtC) && tgtC.canTarget(sa)) { for (final String kw : kws) { if (tgtC.getIntrinsicKeyword().contains(kw)) { hadIntrinsic.add(kw); @@ -772,7 +772,7 @@ public final class AbilityFactoryDebuff { for (final Card tgtC : list) { final ArrayList hadIntrinsic = new ArrayList(); - if (AllZoneUtil.isCardInPlay(tgtC) && CardFactoryUtil.canTarget(hostCard, tgtC)) { + if (AllZoneUtil.isCardInPlay(tgtC) && tgtC.canTarget(sa)) { for (final String kw : kws) { if (tgtC.getIntrinsicKeyword().contains(kw)) { hadIntrinsic.add(kw); diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryDestroy.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryDestroy.java index d49021a77b0..8b048d35ca8 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryDestroy.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryDestroy.java @@ -500,7 +500,7 @@ public class AbilityFactoryDestroy { } for (final Card tgtC : tgtCards) { - if (AllZoneUtil.isCardInPlay(tgtC) && ((tgt == null) || CardFactoryUtil.canTarget(card, tgtC))) { + if (AllZoneUtil.isCardInPlay(tgtC) && ((tgt == null) || tgtC.canTarget(sa))) { if (sac) { AllZone.getGameAction().sacrifice(tgtC); } else if (noRegen) { diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryGainControl.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryGainControl.java index 28967bb710f..193394c0535 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryGainControl.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryGainControl.java @@ -285,7 +285,7 @@ public class AbilityFactoryGainControl { public boolean addCard(final Card c) { final Map vars = c.getSVars(); return !vars.containsKey("RemAIDeck") - && CardFactoryUtil.canTarget(AbilityFactoryGainControl.this.hostCard, c); + && c.canTarget(sa); } }); @@ -388,7 +388,7 @@ public class AbilityFactoryGainControl { this.hostCard.addGainControlTarget(tgtC); } - if (AllZoneUtil.isCardInPlay(tgtC) && CardFactoryUtil.canTarget(this.hostCard, tgtC)) { + if (AllZoneUtil.isCardInPlay(tgtC) && tgtC.canTarget(sa)) { if (this.params.containsKey("NewController")) { tgtC.addController(newController.get(0)); diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryPermanentState.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryPermanentState.java index f17f948e38c..42e641e9785 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryPermanentState.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryPermanentState.java @@ -550,7 +550,7 @@ public class AbilityFactoryPermanentState { for (final Card tgtC : tgtCards) { if (AllZoneUtil.isCardInPlay(tgtC) - && ((tgt == null) || CardFactoryUtil.canTarget(af.getHostCard(), tgtC))) { + && ((tgt == null) || tgtC.canTarget(sa))) { tgtC.untap(); } } @@ -1115,7 +1115,7 @@ public class AbilityFactoryPermanentState { } for (final Card tgtC : tgtCards) { - if (AllZoneUtil.isCardInPlay(tgtC) && ((tgt == null) || CardFactoryUtil.canTarget(af.getHostCard(), tgtC))) { + if (AllZoneUtil.isCardInPlay(tgtC) && ((tgt == null) || tgtC.canTarget(sa))) { tgtC.tap(); } } @@ -2010,7 +2010,7 @@ public class AbilityFactoryPermanentState { } for (final Card tgtC : tgtCards) { - if (AllZoneUtil.isCardInPlay(tgtC) && ((tgt == null) || CardFactoryUtil.canTarget(af.getHostCard(), tgtC))) { + if (AllZoneUtil.isCardInPlay(tgtC) && ((tgt == null) || tgtC.canTarget(sa))) { if (sa.getActivatingPlayer().isHuman()) { final String[] tapOrUntap = new String[] { "Tap", "Untap" }; final Object z = GuiUtils.getChoiceOptional("Tap or Untap " + tgtC + "?", tapOrUntap); diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryPreventDamage.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryPreventDamage.java index cc15a9889d6..fb9c8206243 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryPreventDamage.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryPreventDamage.java @@ -486,7 +486,7 @@ public class AbilityFactoryPreventDamage { for (final Object o : tgts) { if (o instanceof Card) { final Card c = (Card) o; - if (AllZoneUtil.isCardInPlay(c) && (!targeted || CardFactoryUtil.canTarget(af.getHostCard(), c))) { + if (AllZoneUtil.isCardInPlay(c) && (!targeted || c.canTarget(sa))) { c.addPreventNextDamage(numDam); } diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryProtection.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryProtection.java index 83f41351185..45fbac25df8 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryProtection.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryProtection.java @@ -204,7 +204,7 @@ public final class AbilityFactoryProtection { list = list.filter(new CardListFilter() { @Override public boolean addCard(final Card c) { - if (!CardFactoryUtil.canTarget(hostCard, c)) { + if (!c.canTarget(sa)) { return false; } @@ -719,7 +719,7 @@ public final class AbilityFactoryProtection { } // if this is a target, make sure we can still target now - if ((tgt != null) && !CardFactoryUtil.canTarget(host, tgtC)) { + if ((tgt != null) && !tgtC.canTarget(sa)) { continue; } diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryPump.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryPump.java index 015b168dab4..27b29eb1cdd 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryPump.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryPump.java @@ -228,7 +228,7 @@ public class AbilityFactoryPump { * a int. * @return a {@link forge.CardList} object. */ - private CardList getPumpCreatures(final int defense, final int attack) { + private CardList getPumpCreatures(final int defense, final int attack, final SpellAbility sa) { final boolean kHaste = this.keywords.contains("Haste"); final boolean evasive = (this.keywords.contains("Flying") || this.keywords.contains("Horsemanship") @@ -245,7 +245,7 @@ public class AbilityFactoryPump { list = list.filter(new CardListFilter() { @Override public boolean addCard(final Card c) { - if (!CardFactoryUtil.canTarget(AbilityFactoryPump.this.hostCard, c)) { + if (!c.canTarget(sa)) { return false; } @@ -541,7 +541,7 @@ public class AbilityFactoryPump { if (this.abilityFactory.isCurse()) { list = this.getCurseCreatures(sa, defense, attack); } else { - list = this.getPumpCreatures(defense, attack); + list = this.getPumpCreatures(defense, attack, sa); } list = list.getValidCards(tgt.getValidTgts(), sa.getActivatingPlayer(), sa.getSourceCard()); @@ -893,7 +893,7 @@ public class AbilityFactoryPump { } // if pump is a target, make sure we can still target now - if ((tgt != null) && !CardFactoryUtil.canTarget(this.abilityFactory.getHostCard(), tgtC)) { + if ((tgt != null) && !tgtC.canTarget(sa)) { continue; } diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryRegenerate.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryRegenerate.java index 207386f78e1..226c2a77fcb 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryRegenerate.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryRegenerate.java @@ -460,7 +460,7 @@ public class AbilityFactoryRegenerate { } }; - if (AllZoneUtil.isCardInPlay(tgtC) && ((tgt == null) || CardFactoryUtil.canTarget(hostCard, tgtC))) { + if (AllZoneUtil.isCardInPlay(tgtC) && ((tgt == null) || tgtC.canTarget(sa))) { tgtC.addShield(); AllZone.getEndOfTurn().addUntil(untilEOT); } diff --git a/src/main/java/forge/card/cardfactory/AbstractCardFactory.java b/src/main/java/forge/card/cardfactory/AbstractCardFactory.java index c733b14c672..41a805849bc 100644 --- a/src/main/java/forge/card/cardfactory/AbstractCardFactory.java +++ b/src/main/java/forge/card/cardfactory/AbstractCardFactory.java @@ -999,7 +999,7 @@ public abstract class AbstractCardFactory implements CardFactoryInterface { if (this.getTargetCard() != null) { if (AllZoneUtil.isCardInPlay(this.getTargetCard()) - && CardFactoryUtil.canTarget(card, this.getTargetCard())) { + && this.getTargetCard().canTarget(this)) { this.getTargetCard().addDamage(damage, card); } } else { @@ -1210,7 +1210,7 @@ public abstract class AbstractCardFactory implements CardFactoryInterface { @Override public void resolve() { final Card target = this.getTargetCard(); - if (AllZoneUtil.isCardInPlay(target) && CardFactoryUtil.canTarget(card, target)) { + if (AllZoneUtil.isCardInPlay(target) && target.canTarget(this)) { target.addExtrinsicKeyword("This card doesn't untap during your next untap step."); } // is card in play? } // resolve() @@ -1622,7 +1622,7 @@ public abstract class AbstractCardFactory implements CardFactoryInterface { final Card myc = this.getParent().getTargetCard(); final Card oppc = this.getTargetCard(); if (AllZoneUtil.isCardInPlay(myc) && AllZoneUtil.isCardInPlay(oppc)) { - if (CardFactoryUtil.canTarget(card, myc) && CardFactoryUtil.canTarget(card, oppc)) { + if (myc.canTarget(this) && oppc.canTarget(this)) { final int myPower = myc.getNetAttack(); final int oppPower = oppc.getNetAttack(); myc.addDamage(oppPower, oppc); diff --git a/src/main/java/forge/card/cardfactory/CardFactoryAuras.java b/src/main/java/forge/card/cardfactory/CardFactoryAuras.java index e325442c60d..6f16074fe40 100644 --- a/src/main/java/forge/card/cardfactory/CardFactoryAuras.java +++ b/src/main/java/forge/card/cardfactory/CardFactoryAuras.java @@ -133,7 +133,7 @@ class CardFactoryAuras { final Card c = this.getTargetCard(); - if (AllZoneUtil.isCardInPlay(c) && CardFactoryUtil.canTarget(card, c)) { + if (AllZoneUtil.isCardInPlay(c) && c.canTarget(this)) { card.enchantEntity(c); } @@ -289,7 +289,7 @@ class CardFactoryAuras { CardListUtil.sortAttack(list); for (int i = 0; i < list.size(); i++) { - if (CardFactoryUtil.canTarget(card, list.get(i))) { + if (list.get(i).canTarget(this)) { this.setTargetCard(list.get(i)); return super.canPlayAI(); } @@ -303,7 +303,7 @@ class CardFactoryAuras { final Card c = this.getTargetCard(); - if (AllZoneUtil.isCardInPlay(c) && CardFactoryUtil.canTarget(card, c)) { + if (AllZoneUtil.isCardInPlay(c) && c.canTarget(this)) { card.enchantEntity(c); Log.debug("Enchanted: " + this.getTargetCard()); } @@ -392,7 +392,7 @@ class CardFactoryAuras { CardListUtil.sortFlying(list); for (int i = 0; i < list.size(); i++) { - if (CardFactoryUtil.canTarget(card, list.get(i)) + if (list.get(i).canTarget(this) && (list.get(i).getNetAttack() >= list.get(i).getNetDefense()) && (list.get(i).getNetAttack() >= 3)) { this.setTargetCard(list.get(i)); @@ -410,7 +410,7 @@ class CardFactoryAuras { final Card c = this.getTargetCard(); - if (AllZoneUtil.isCardInPlay(c) && CardFactoryUtil.canTarget(aura, c)) { + if (AllZoneUtil.isCardInPlay(c) && c.canTarget(this)) { aura.enchantEntity(c); } } // resolve() diff --git a/src/main/java/forge/card/cardfactory/CardFactoryCreatures.java b/src/main/java/forge/card/cardfactory/CardFactoryCreatures.java index 63895272f45..7d0092acfcb 100644 --- a/src/main/java/forge/card/cardfactory/CardFactoryCreatures.java +++ b/src/main/java/forge/card/cardfactory/CardFactoryCreatures.java @@ -201,7 +201,7 @@ public class CardFactoryCreatures { if (c.sumAllCounters() == 0) { return; - } else if (AllZoneUtil.isCardInPlay(c) && CardFactoryUtil.canTarget(card, c)) { + } else if (AllZoneUtil.isCardInPlay(c) && c.canTarget(this)) { // zerker clean up: for (final Counters c1 : Counters.values()) { if (c.getCounters(c1) > 0) { @@ -723,7 +723,7 @@ public class CardFactoryCreatures { return; } - if (c.isLand() && zone.is(Constant.Zone.Battlefield) && CardFactoryUtil.canTarget(card, c)) { + if (c.isLand() && zone.is(Constant.Zone.Battlefield) && c.canTarget(ability)) { // System.out.println("c is: " +c); target[index[0]] = c; index[0]++; diff --git a/src/main/java/forge/card/cardfactory/CardFactoryInstants.java b/src/main/java/forge/card/cardfactory/CardFactoryInstants.java index 8618e0c84a4..1a7bfc36812 100644 --- a/src/main/java/forge/card/cardfactory/CardFactoryInstants.java +++ b/src/main/java/forge/card/cardfactory/CardFactoryInstants.java @@ -395,7 +395,7 @@ public class CardFactoryInstants { @Override public void selectCard(final Card card, final PlayerZone zone) { - if (!card.isLand() && zone.is(Constant.Zone.Battlefield) && CardFactoryUtil.canTarget(spell, card)) { + if (!card.isLand() && zone.is(Constant.Zone.Battlefield) && card.canTarget(spell)) { spell.setTargetCard(card); if (this.isFree()) { this.setFree(false); diff --git a/src/main/java/forge/card/cardfactory/CardFactorySorceries.java b/src/main/java/forge/card/cardfactory/CardFactorySorceries.java index 47453a0f0e8..7eba78954ea 100644 --- a/src/main/java/forge/card/cardfactory/CardFactorySorceries.java +++ b/src/main/java/forge/card/cardfactory/CardFactorySorceries.java @@ -718,7 +718,7 @@ public class CardFactorySorceries { @Override public void resolve() { if (AllZoneUtil.isCardInPlay(this.getTargetCard()) - && CardFactoryUtil.canTarget(card, this.getTargetCard())) { + && this.getTargetCard().canTarget(this)) { AllZone.getGameAction().destroy(this.getTargetCard()); diff --git a/src/main/java/forge/card/cardfactory/CardFactoryUtil.java b/src/main/java/forge/card/cardfactory/CardFactoryUtil.java index 15240e45a8b..3dfba4eab0c 100644 --- a/src/main/java/forge/card/cardfactory/CardFactoryUtil.java +++ b/src/main/java/forge/card/cardfactory/CardFactoryUtil.java @@ -333,31 +333,6 @@ public class CardFactoryUtil { return biggest; } - /** - *

- * AI_getHumanArtifact. - *

- * - * @param spell - * a {@link forge.Card} object. - * @param targeted - * a boolean. - * @return a {@link forge.CardList} object. - */ - public static CardList getHumanArtifactAI(final Card spell, final boolean targeted) { - CardList artifact = AllZone.getHumanPlayer().getCardsIn(Zone.Battlefield); - artifact = artifact.getType("Artifact"); - if (targeted) { - artifact = artifact.filter(new CardListFilter() { - @Override - public boolean addCard(final Card c) { - return CardFactoryUtil.canTarget(spell, c); - } - }); - } - return artifact; - } - /** *

* AI_doesCreatureAttack. @@ -1415,7 +1390,7 @@ public class CardFactoryUtil { @Override public void resolve() { final Card targetCard = this.getTargetCard(); - if (AllZoneUtil.isCardInPlay(targetCard) && CardFactoryUtil.canTarget(sourceCard, targetCard)) { + if (AllZoneUtil.isCardInPlay(targetCard) && targetCard.canTarget(this)) { if (sourceCard.isEquipping()) { final Card crd = sourceCard.getEquipping().get(0); @@ -1852,7 +1827,7 @@ public class CardFactoryUtil { @Override public void selectCard(final Card card, final PlayerZone zone) { - if (targeted && !CardFactoryUtil.canTarget(spell, card)) { + if (targeted && !card.canTarget(spell)) { AllZone.getDisplay().showMessage("Cannot target this card (Shroud? Protection?)."); } else if (choices.contains(card)) { spell.setTargetCard(card); @@ -2092,7 +2067,7 @@ public class CardFactoryUtil { @Override public void selectCard(final Card card2, final PlayerZone zone) { if (card2.isCreature() && card2.isArtifact() && zone.is(Constant.Zone.Battlefield) - && CardFactoryUtil.canTarget(ability, card)) { + && card.canTarget(ability)) { ability.setTargetCard(card2); ability.setStackDescription("Put " + card.getCounters(Counters.P1P1) + " +1/+1 counter/s from " + card + " on " + card2); @@ -2392,7 +2367,7 @@ public class CardFactoryUtil { } // Make sure it's still targetable as well - return CardFactoryUtil.canTarget(source, target); + return target.canTarget(ability); } /** @@ -2406,9 +2381,9 @@ public class CardFactoryUtil { * a {@link forge.Card} object. * @return a boolean. */ - public static boolean canTarget(final SpellAbility ability, final Card target) { - return CardFactoryUtil.canTarget(ability.getSourceCard(), target); - } + /*public static boolean canTarget(final SpellAbility ability, final Card target) { + return target.canTarget(ability); + }*/ /** *

diff --git a/src/main/java/forge/card/spellability/TargetSelection.java b/src/main/java/forge/card/spellability/TargetSelection.java index a1f5d8228cf..697b8c35a3e 100644 --- a/src/main/java/forge/card/spellability/TargetSelection.java +++ b/src/main/java/forge/card/spellability/TargetSelection.java @@ -13,7 +13,6 @@ import forge.Constant; import forge.Constant.Zone; import forge.Player; import forge.PlayerZone; -import forge.card.cardfactory.CardFactoryUtil; import forge.gui.GuiUtils; import forge.gui.input.Input; @@ -337,7 +336,7 @@ public class TargetSelection { public void selectCard(final Card card, final PlayerZone zone) { // leave this in temporarily, there some seriously wrong things // going on here - if (targeted && !CardFactoryUtil.canTarget(sa, card)) { + if (targeted && !card.canTarget(sa)) { AllZone.getDisplay().showMessage("Cannot target this card (Shroud? Protection? Restrictions?)."); } else if (choices.contains(card)) { tgt.addTarget(card); diff --git a/src/main/java/forge/card/staticability/StaticAbilityCantTarget.java b/src/main/java/forge/card/staticability/StaticAbilityCantTarget.java index 71f5dc2a376..03b65682a85 100644 --- a/src/main/java/forge/card/staticability/StaticAbilityCantTarget.java +++ b/src/main/java/forge/card/staticability/StaticAbilityCantTarget.java @@ -11,21 +11,6 @@ import forge.card.spellability.SpellAbility; */ public class StaticAbilityCantTarget { - /** - * TODO Write javadoc for this method. - * - * @param stAb - * a StaticAbility - * @param source - * the source - * @param target - * the target - * @param damage - * the damage - * @param isCombat - * the is combat - * @return the int - */ public static boolean applyCantTargetAbility(final StaticAbility stAb, final Card card, SpellAbility sa) { final HashMap params = stAb.getMapParams(); final Card hostCard = stAb.getHostCard();