diff --git a/.gitattributes b/.gitattributes index 4398423678c..0d4fcff85e2 100644 --- a/.gitattributes +++ b/.gitattributes @@ -12459,7 +12459,6 @@ src/main/java/forge/card/UnOpenedMeta.java -text src/main/java/forge/card/UnOpenedProduct.java -text src/main/java/forge/card/abilityfactory/AbilityFactory.java svneol=native#text/plain src/main/java/forge/card/abilityfactory/AbilityFactoryAttach.java svneol=native#text/plain -src/main/java/forge/card/abilityfactory/AbilityFactoryBond.java -text src/main/java/forge/card/abilityfactory/AbilityFactoryChangeZone.java svneol=native#text/plain src/main/java/forge/card/abilityfactory/AbilityFactoryCharm.java svneol=native#text/plain src/main/java/forge/card/abilityfactory/AbilityFactoryChoose.java svneol=native#text/plain @@ -12499,6 +12498,7 @@ src/main/java/forge/card/abilityfactory/UniversalDrawback.java svneol=native#tex src/main/java/forge/card/abilityfactory/UniversalSpell.java -text src/main/java/forge/card/abilityfactory/ai/AnimateAi.java -text src/main/java/forge/card/abilityfactory/ai/AnimateAllAi.java -text +src/main/java/forge/card/abilityfactory/ai/BondAi.java -text src/main/java/forge/card/abilityfactory/ai/ExchangeLifeAi.java -text src/main/java/forge/card/abilityfactory/ai/GainLifeAi.java -text src/main/java/forge/card/abilityfactory/ai/LoseLifeAi.java -text @@ -12506,6 +12506,7 @@ src/main/java/forge/card/abilityfactory/ai/PoisonAi.java -text src/main/java/forge/card/abilityfactory/ai/SetLifeAi.java -text src/main/java/forge/card/abilityfactory/effects/AnimateAllEffect.java -text src/main/java/forge/card/abilityfactory/effects/AnimateEffect.java -text +src/main/java/forge/card/abilityfactory/effects/BondEffect.java -text src/main/java/forge/card/abilityfactory/effects/ExchangeLifeEffect.java -text src/main/java/forge/card/abilityfactory/effects/GainLifeEffect.java -text src/main/java/forge/card/abilityfactory/effects/HelperAnimate.java svneol=native#text/plain diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactory.java b/src/main/java/forge/card/abilityfactory/AbilityFactory.java index 1fa9a48526f..b4d28c1a13f 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactory.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactory.java @@ -463,9 +463,8 @@ public class AbilityFactory { } else if (this.api.equals("Bond")) { - if (this.isAb) { - spellAbility = AbilityFactoryBond.createAbilityBond(this); - } + se = new BondEffect(); + ai = new BondAi(); } else if (this.api.equals("ChangeZone")) { diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryBond.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryBond.java deleted file mode 100644 index 29bf1ef827c..00000000000 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryBond.java +++ /dev/null @@ -1,355 +0,0 @@ -/* - * Forge: Play Magic: the Gathering. - * Copyright (C) 2011 Forge Team - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package forge.card.abilityfactory; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -import forge.Card; -import forge.Singletons; - -import forge.card.spellability.AbilityActivated; -import forge.card.spellability.AbilitySub; -import forge.card.spellability.SpellAbility; -import forge.card.spellability.Target; -import forge.card.cardfactory.CardFactoryUtil; -import forge.card.cost.Cost; -import forge.game.player.ComputerUtil; -import forge.game.player.Player; -import forge.game.zone.ZoneType; -import forge.gui.GuiChoose; - -/** - *

- * AbilityFactoryBond class. - *

- * - * @author Forge - * @version $Id: AbilityFactoryBond.java 15090 2012-04-07 12:50:31Z Max mtg $ - */ -public final class AbilityFactoryBond { - - private AbilityFactoryBond() { - throw new AssertionError(); - } - - // ************************************************************** - // ************************** Bond *************************** - // ************************************************************** - - /** - *

- * createAbilityBond. - *

- * - * @param af - * a {@link forge.card.abilityfactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createAbilityBond(final AbilityFactory af) { - class AbilityBond extends AbilityActivated { - public AbilityBond(final Card ca, final Cost co, final Target t) { - super(ca, co, t); - } - - @Override - public AbilityActivated getCopy() { - AbilityActivated res = new AbilityBond(getSourceCard(), - getPayCosts(), getTarget() == null ? null : new Target(getTarget())); - CardFactoryUtil.copySpellAbility(this, res); - return res; - } - - private static final long serialVersionUID = 1938171749867735256L; - - @Override - public boolean canPlayAI() { - return AbilityFactoryBond.bondCanPlayAI(af, this); - } - - @Override - public void resolve() { - AbilityFactoryBond.bondResolve(af, this); - } - - @Override - public String getStackDescription() { - return AbilityFactoryBond.bondStackDescription(af, this); - } - - @Override - public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryBond.bondTriggerAI(getActivatingPlayer(), af, this, mandatory); - } - } - final SpellAbility abBond = new AbilityBond(af.getHostCard(), af.getAbCost(), af.getAbTgt()); - - return abBond; - } - -// /** -// *

-// * createSpellBond. -// *

-// * -// * @param af -// * a {@link forge.card.abilityfactory.AbilityFactory} object. -// * @return a {@link forge.card.spellability.SpellAbility} object. -// */ -// public static SpellAbility createSpellBond(final AbilityFactory af) { -// final SpellAbility spBond = new Spell(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { -// private static final long serialVersionUID = -4047747186919390147L; -// -// @Override -// public boolean canPlayAI() { -// return AbilityFactoryBond.bondCanPlayAI(af, this); -// } -// -// @Override -// public void resolve() { -// AbilityFactoryBond.bondResolve(af, this); -// } -// -// @Override -// public String getStackDescription() { -// return AbilityFactoryBond.bondStackDescription(af, this); -// } -// }; -// return spBond; -// } -// -// /** -// *

-// * createDrawbackBond. -// *

-// * -// * @param af -// * a {@link forge.card.abilityfactory.AbilityFactory} object. -// * @return a {@link forge.card.spellability.SpellAbility} object. -// */ -// public static SpellAbility createDrawbackBond(final AbilityFactory af) { -// final SpellAbility dbBond = new AbilitySub(af.getHostCard(), af.getAbTgt()) { -// private static final long serialVersionUID = -8659938411460952874L; -// -// @Override -// public void resolve() { -// AbilityFactoryBond.bondResolve(af, this); -// } -// -// @Override -// public boolean chkAIDrawback() { -// return AbilityFactoryBond.bondPlayDrawbackAI(af, this); -// } -// -// @Override -// public String getStackDescription() { -// return AbilityFactoryBond.bondStackDescription(af, this); -// } -// -// @Override -// public boolean doTrigger(final boolean mandatory) { -// return AbilityFactoryBond.bondTriggerAI(af, this, mandatory); -// } -// }; -// return dbBond; -// } - - /** - *

- * bondStackDescription. - *

- * - * @param af - * a {@link forge.card.abilityfactory.AbilityFactory} object. - * @param sa - * a {@link forge.card.spellability.SpellAbility} object. - * @return a {@link java.lang.String} object. - */ - private static String bondStackDescription(final AbilityFactory af, final SpellAbility sa) { - final HashMap params = af.getMapParams(); - - ArrayList tgts; - tgts = AbilityFactory.getDefinedCards(sa.getSourceCard(), params.get("Defined"), sa); - - final StringBuilder sb = new StringBuilder(); - - for (final Card c : tgts) { - sb.append(c).append(" "); - } - sb.append("pairs with another unpaired creature you control."); - - final AbilitySub abSub = sa.getSubAbility(); - if (abSub != null) { - sb.append(abSub.getStackDescription()); - } - - return sb.toString(); - } // end bondStackDescription() - - /** - *

- * bondCanPlayAI. - *

- * - * @param af - * a {@link forge.card.abilityfactory.AbilityFactory} object. - * @param sa - * a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean bondCanPlayAI(final AbilityFactory af, final SpellAbility sa) { - -// final HashMap params = af.getMapParams(); -// final Target tgt = sa.getTarget(); -// final Card source = sa.getSourceCard(); - - boolean chance = AbilityFactoryBond.bondTgtAI(af, sa); - - final AbilitySub subAb = sa.getSubAbility(); - if (subAb != null) { - chance &= subAb.chkAIDrawback(); - } - - return chance; - } // end bondCanPlayAI() - -// /** -// *

-// * bondPlayDrawbackAI. -// *

-// * -// * @param af -// * a {@link forge.card.abilityfactory.AbilityFactory} object. -// * @param sa -// * a {@link forge.card.spellability.SpellAbility} object. -// * @return a boolean. -// */ -// private static boolean bondPlayDrawbackAI(final AbilityFactory af, final SpellAbility sa) { -// // AI should only activate this during Human's turn -// boolean chance = AbilityFactoryBond.bondTgtAI(af, sa); -// -// // TODO - restrict the subAbility a bit -// -// final AbilitySub subAb = sa.getSubAbility(); -// if (subAb != null) { -// chance &= subAb.chkAIDrawback(); -// } -// -// return chance; -// } - - /** - *

- * bondTriggerAI. - *

- * - * @param af - * a {@link forge.card.abilityfactory.AbilityFactory} object. - * @param sa - * a {@link forge.card.spellability.SpellAbility} object. - * @param mandatory - * a boolean. - * @return a boolean. - */ - private static boolean bondTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { - if (!ComputerUtil.canPayCost(sa, ai)) { // If there is a cost payment - return false; - } - - boolean chance = AbilityFactoryBond.bondTgtAI(af, sa); - - final AbilitySub subAb = sa.getSubAbility(); - if (subAb != null) { - chance &= subAb.chkAIDrawback(); - } - - return chance || mandatory; - } - - /** - *

- * bondTgtAI. - *

- * - * @param af - * a {@link forge.card.abilityfactory.AbilityFactory} object. - * @param sa - * a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean bondTgtAI(final AbilityFactory af, final SpellAbility sa) { - // TODO - add some kind of check to if there good creature to Soulbond with - // initially AI will always use Soulbound if triggered - return true; - } - - /** - *

- * bondResolve. - *

- * - * @param af - * a {@link forge.card.abilityfactory.AbilityFactory} object. - * @param sa - * a {@link forge.card.spellability.SpellAbility} object. - */ - private static void bondResolve(final AbilityFactory af, final SpellAbility sa) { - final HashMap params = af.getMapParams(); -// final Card source = sa.getSourceCard(); -// final Card host = af.getHostCard(); -// final Map svars = host.getSVars(); - - // find card that triggered pairing first - ArrayList trigCards; - trigCards = AbilityFactory.getDefinedCards(sa.getSourceCard(), params.get("Defined"), sa); - - // Check that this card hasn't already become paired by an earlier trigger - if (trigCards.get(0).isPaired() || !trigCards.get(0).isInZone(ZoneType.Battlefield)) { - return; - } - - // find list of valid cards to pair with - List cards = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); - cards = AbilityFactory.filterListByType(cards, params.get("ValidCards"), sa); - if (cards.isEmpty()) { - return; - } - - Card partner = null; - // skip choice if only one card on list - if (cards.size() == 1) { - partner = cards.get(0); - } else if (sa.getActivatingPlayer().isHuman()) { - Object o = GuiChoose.one("Select a card to pair with", cards); - - if (o != null) { - partner = (Card) o; - } - } else { - // TODO - Pick best creature instead of just the first on the list - partner = CardFactoryUtil.getBestCreatureAI(cards); - } - - // pair choices together - trigCards.get(0).setPairedWith(partner); - partner.setPairedWith(trigCards.get(0)); - - } // bondResolve - -} // end class AbilityFactoryBond diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryChangeZone.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryChangeZone.java index bc960d18e34..b26996d744d 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryChangeZone.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryChangeZone.java @@ -20,6 +20,7 @@ package forge.card.abilityfactory; import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Random; import com.google.common.base.Predicate; @@ -99,7 +100,7 @@ public final class AbilityFactoryChangeZone { AbilityActivated res = new AbilityChangeZone(getSourceCard(), getPayCosts(), getTarget() == null ? null : new Target(getTarget())); CardFactoryUtil.copySpellAbility(this, res); - AbilityFactoryChangeZone.setMiscellaneous(af, res); + AbilityFactoryChangeZone.setMiscellaneous(af.getMapParams(), res); return res; } @@ -127,7 +128,7 @@ public final class AbilityFactoryChangeZone { } final SpellAbility abChangeZone = new AbilityChangeZone(af.getHostCard(), af.getAbCost(), af.getAbTgt()); - AbilityFactoryChangeZone.setMiscellaneous(af, abChangeZone); + AbilityFactoryChangeZone.setMiscellaneous(af.getMapParams(), abChangeZone); return abChangeZone; } @@ -168,7 +169,7 @@ public final class AbilityFactoryChangeZone { return AbilityFactoryChangeZone.changeZoneTriggerAI(getActivatingPlayer(), af, this, mandatory); } }; - AbilityFactoryChangeZone.setMiscellaneous(af, spChangeZone); + AbilityFactoryChangeZone.setMiscellaneous(af.getMapParams(), spChangeZone); return spChangeZone; } @@ -192,7 +193,7 @@ public final class AbilityFactoryChangeZone { AbilitySub res = new DrawbackChangeZone(getSourceCard(), getTarget() == null ? null : new Target(getTarget())); CardFactoryUtil.copySpellAbility(this, res); - AbilityFactoryChangeZone.setMiscellaneous(af, res); + AbilityFactoryChangeZone.setMiscellaneous(af.getMapParams(), res); return res; } private static final long serialVersionUID = 3270484211099902059L; @@ -224,7 +225,7 @@ public final class AbilityFactoryChangeZone { } final SpellAbility dbChangeZone = new DrawbackChangeZone(af.getHostCard(), af.getAbTgt()); - AbilityFactoryChangeZone.setMiscellaneous(af, dbChangeZone); + AbilityFactoryChangeZone.setMiscellaneous(af.getMapParams(), dbChangeZone); return dbChangeZone; } @@ -277,8 +278,7 @@ public final class AbilityFactoryChangeZone { * @param sa * a {@link forge.card.spellability.SpellAbility} object. */ - private static void setMiscellaneous(final AbilityFactory af, final SpellAbility sa) { - final HashMap params = af.getMapParams(); + private static void setMiscellaneous(final Map params, final SpellAbility sa) { List origin = new ArrayList(); if (params.containsKey("Origin")) { origin = ZoneType.listValueOf(params.get("Origin")); @@ -1540,7 +1540,7 @@ public final class AbilityFactoryChangeZone { } else { // non-targeted retrieval final List retrieval = AbilityFactoryChangeZone - .knownDetermineDefined(sa, params.get("Defined"), origin); + .knownDetermineDefined(sa, params.get("Defined")); if ((retrieval == null) || retrieval.isEmpty()) { return false; @@ -2060,7 +2060,7 @@ public final class AbilityFactoryChangeZone { } else { // otherwise add self to list and go from there tgts = new ArrayList(); - for (final Card c : AbilityFactoryChangeZone.knownDetermineDefined(sa, params.get("Defined"), origin)) { + for (final Card c : AbilityFactoryChangeZone.knownDetermineDefined(sa, params.get("Defined"))) { tgts.add(c); } } @@ -2181,7 +2181,7 @@ public final class AbilityFactoryChangeZone { } else { tgtCards = new ArrayList(); for(ZoneType o : origin) { - for (final Card c : AbilityFactoryChangeZone.knownDetermineDefined(sa, params.get("Defined"), o)) { + for (final Card c : AbilityFactoryChangeZone.knownDetermineDefined(sa, params.get("Defined"))) { tgtCards.add(c); } } @@ -2332,11 +2332,9 @@ public final class AbilityFactoryChangeZone { * a {@link forge.card.spellability.SpellAbility} object. * @param defined * a {@link java.lang.String} object. - * @param origin - * a {@link java.lang.String} object. * @return a {@link forge.CardList} object. */ - private static List knownDetermineDefined(final SpellAbility sa, final String defined, final ZoneType origin) { + private static List knownDetermineDefined(final SpellAbility sa, final String defined) { final List ret = new ArrayList(); final ArrayList list = AbilityFactory.getDefinedCards(sa.getSourceCard(), defined, sa); @@ -2423,7 +2421,7 @@ public final class AbilityFactoryChangeZone { AbilityActivated res = new AbilityChangeZoneAll(getSourceCard(), getPayCosts(), getTarget() == null ? null : new Target(getTarget())); CardFactoryUtil.copySpellAbility(this, res); - AbilityFactoryChangeZone.setMiscellaneous(af, res); + AbilityFactoryChangeZone.setMiscellaneous(af.getMapParams(), res); return res; } @@ -2451,7 +2449,7 @@ public final class AbilityFactoryChangeZone { } final SpellAbility abChangeZone = new AbilityChangeZoneAll(af.getHostCard(), af.getAbCost(), af.getAbTgt()); - AbilityFactoryChangeZone.setMiscellaneous(af, abChangeZone); + AbilityFactoryChangeZone.setMiscellaneous(af.getMapParams(), abChangeZone); return abChangeZone; } @@ -2491,7 +2489,7 @@ public final class AbilityFactoryChangeZone { return AbilityFactoryChangeZone.changeZoneAllDoTriggerAI(getActivatingPlayer(), af, this, mandatory); } }; - AbilityFactoryChangeZone.setMiscellaneous(af, spChangeZone); + AbilityFactoryChangeZone.setMiscellaneous(af.getMapParams(), spChangeZone); return spChangeZone; } @@ -2515,7 +2513,7 @@ public final class AbilityFactoryChangeZone { AbilitySub res = new DrawbackChangeZoneAll(getSourceCard(), getTarget() == null ? null : new Target(getTarget())); CardFactoryUtil.copySpellAbility(this, res); - AbilityFactoryChangeZone.setMiscellaneous(af, res); + AbilityFactoryChangeZone.setMiscellaneous(af.getMapParams(), res); return res; } @@ -2548,7 +2546,7 @@ public final class AbilityFactoryChangeZone { } final SpellAbility dbChangeZone = new DrawbackChangeZoneAll(af.getHostCard(), af.getAbTgt()); - AbilityFactoryChangeZone.setMiscellaneous(af, dbChangeZone); + AbilityFactoryChangeZone.setMiscellaneous(af.getMapParams(), dbChangeZone); return dbChangeZone; } diff --git a/src/main/java/forge/card/abilityfactory/ai/BondAi.java b/src/main/java/forge/card/abilityfactory/ai/BondAi.java new file mode 100644 index 00000000000..2ee13445b76 --- /dev/null +++ b/src/main/java/forge/card/abilityfactory/ai/BondAi.java @@ -0,0 +1,65 @@ +/* + * Forge: Play Magic: the Gathering. + * Copyright (C) 2011 Forge Team + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package forge.card.abilityfactory.ai; + +import forge.card.spellability.AbilitySub; +import forge.card.spellability.SpellAbility; +import forge.card.abilityfactory.SpellAiLogic; +import forge.game.player.Player; + +/** + *

+ * AbilityFactoryBond class. + *

+ * + * @author Forge + * @version $Id: AbilityFactoryBond.java 15090 2012-04-07 12:50:31Z Max mtg $ + */ +public final class BondAi extends SpellAiLogic { + + + + // ************************************************************** + // ************************** Bond *************************** + // ************************************************************** + + + + /** + *

+ * bondCanPlayAI. + *

+ * + * @param af + * a {@link forge.card.abilityfactory.AbilityFactory} object. + * @param sa + * a {@link forge.card.spellability.SpellAbility} object. + * @return a boolean. + */ + @Override + public boolean canPlayAI(Player aiPlayer, java.util.Map params, SpellAbility sa) { + boolean chance = true; + + final AbilitySub subAb = sa.getSubAbility(); + if (subAb != null) { + chance &= subAb.chkAIDrawback(); + } + + return chance; + } // end bondCanPlayAI() +} diff --git a/src/main/java/forge/card/abilityfactory/effects/BondEffect.java b/src/main/java/forge/card/abilityfactory/effects/BondEffect.java new file mode 100644 index 00000000000..7e957e658ad --- /dev/null +++ b/src/main/java/forge/card/abilityfactory/effects/BondEffect.java @@ -0,0 +1,168 @@ +package forge.card.abilityfactory.effects; + +import java.util.ArrayList; +import java.util.List; + +import forge.Card; +import forge.Singletons; +import forge.card.abilityfactory.AbilityFactory; +import forge.card.abilityfactory.SpellEffect; +import forge.card.cardfactory.CardFactoryUtil; +import forge.card.spellability.AbilitySub; +import forge.card.spellability.SpellAbility; +import forge.game.zone.ZoneType; +import forge.gui.GuiChoose; + +public class BondEffect extends SpellEffect { + /** + *

+ * bondResolve. + *

+ * + * @param af + * a {@link forge.card.abilityfactory.AbilityFactory} object. + * @param sa + * a {@link forge.card.spellability.SpellAbility} object. + */ + @Override + public void resolve(java.util.Map params, SpellAbility sa) { +// final Card source = sa.getSourceCard(); +// final Card host = af.getHostCard(); +// final Map svars = host.getSVars(); + + // find card that triggered pairing first + ArrayList trigCards; + trigCards = AbilityFactory.getDefinedCards(sa.getSourceCard(), params.get("Defined"), sa); + + // Check that this card hasn't already become paired by an earlier trigger + if (trigCards.get(0).isPaired() || !trigCards.get(0).isInZone(ZoneType.Battlefield)) { + return; + } + + // find list of valid cards to pair with + List cards = Singletons.getModel().getGame().getCardsIn(ZoneType.Battlefield); + cards = AbilityFactory.filterListByType(cards, params.get("ValidCards"), sa); + if (cards.isEmpty()) { + return; + } + + Card partner = null; + // skip choice if only one card on list + if (cards.size() == 1) { + partner = cards.get(0); + } else if (sa.getActivatingPlayer().isHuman()) { + Object o = GuiChoose.one("Select a card to pair with", cards); + + if (o != null) { + partner = (Card) o; + } + } else { + // TODO - Pick best creature instead of just the first on the list + partner = CardFactoryUtil.getBestCreatureAI(cards); + } + + // pair choices together + trigCards.get(0).setPairedWith(partner); + partner.setPairedWith(trigCards.get(0)); + + } // bondResolve + + // /** + // *

+ // * createSpellBond. + // *

+ // * + // * @param af + // * a {@link forge.card.abilityfactory.AbilityFactory} object. + // * @return a {@link forge.card.spellability.SpellAbility} object. + // */ + // public static SpellAbility createSpellBond(final AbilityFactory af) { + // final SpellAbility spBond = new Spell(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { + // private static final long serialVersionUID = -4047747186919390147L; + // + // @Override + // public boolean canPlayAI() { + // return AbilityFactoryBond.bondCanPlayAI(af, this); + // } + // + // @Override + // public void resolve() { + // AbilityFactoryBond.bondResolve(af, this); + // } + // + // @Override + // public String getStackDescription() { + // return AbilityFactoryBond.bondStackDescription(af, this); + // } + // }; + // return spBond; + // } + // + // /** + // *

+ // * createDrawbackBond. + // *

+ // * + // * @param af + // * a {@link forge.card.abilityfactory.AbilityFactory} object. + // * @return a {@link forge.card.spellability.SpellAbility} object. + // */ + // public static SpellAbility createDrawbackBond(final AbilityFactory af) { + // final SpellAbility dbBond = new AbilitySub(af.getHostCard(), af.getAbTgt()) { + // private static final long serialVersionUID = -8659938411460952874L; + // + // @Override + // public void resolve() { + // AbilityFactoryBond.bondResolve(af, this); + // } + // + // @Override + // public boolean chkAIDrawback() { + // return AbilityFactoryBond.bondPlayDrawbackAI(af, this); + // } + // + // @Override + // public String getStackDescription() { + // return AbilityFactoryBond.bondStackDescription(af, this); + // } + // + // @Override + // public boolean doTrigger(final boolean mandatory) { + // return AbilityFactoryBond.bondTriggerAI(af, this, mandatory); + // } + // }; + // return dbBond; + // } + + /** + *

+ * bondStackDescription. + *

+ * + * @param af + * a {@link forge.card.abilityfactory.AbilityFactory} object. + * @param sa + * a {@link forge.card.spellability.SpellAbility} object. + * @return a {@link java.lang.String} object. + */ + @Override + public String getStackDescription(java.util.Map params, SpellAbility sa) { + ArrayList tgts; + tgts = AbilityFactory.getDefinedCards(sa.getSourceCard(), params.get("Defined"), sa); + + final StringBuilder sb = new StringBuilder(); + + for (final Card c : tgts) { + sb.append(c).append(" "); + } + sb.append("pairs with another unpaired creature you control."); + + final AbilitySub abSub = sa.getSubAbility(); + if (abSub != null) { + sb.append(abSub.getStackDescription()); + } + + return sb.toString(); + } // end bondStackDescription() + +} // end class AbilityFactoryBond \ No newline at end of file