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
- * 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- * 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-// * 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+ * 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+ * 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+ // * 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