mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-15 18:28:00 +00:00
AF-Bond refactored
This commit is contained in:
3
.gitattributes
vendored
3
.gitattributes
vendored
@@ -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
|
||||
|
||||
@@ -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")) {
|
||||
|
||||
@@ -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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
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;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* AbilityFactoryBond class.
|
||||
* </p>
|
||||
*
|
||||
* @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 ***************************
|
||||
// **************************************************************
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* createAbilityBond.
|
||||
* </p>
|
||||
*
|
||||
* @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;
|
||||
}
|
||||
|
||||
// /**
|
||||
// * <p>
|
||||
// * createSpellBond.
|
||||
// * </p>
|
||||
// *
|
||||
// * @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;
|
||||
// }
|
||||
//
|
||||
// /**
|
||||
// * <p>
|
||||
// * createDrawbackBond.
|
||||
// * </p>
|
||||
// *
|
||||
// * @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;
|
||||
// }
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* bondStackDescription.
|
||||
* </p>
|
||||
*
|
||||
* @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<String, String> params = af.getMapParams();
|
||||
|
||||
ArrayList<Card> 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()
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* bondCanPlayAI.
|
||||
* </p>
|
||||
*
|
||||
* @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<String, String> 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()
|
||||
|
||||
// /**
|
||||
// * <p>
|
||||
// * bondPlayDrawbackAI.
|
||||
// * </p>
|
||||
// *
|
||||
// * @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;
|
||||
// }
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* bondTriggerAI.
|
||||
* </p>
|
||||
*
|
||||
* @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;
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* bondTgtAI.
|
||||
* </p>
|
||||
*
|
||||
* @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;
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* bondResolve.
|
||||
* </p>
|
||||
*
|
||||
* @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<String, String> params = af.getMapParams();
|
||||
// final Card source = sa.getSourceCard();
|
||||
// final Card host = af.getHostCard();
|
||||
// final Map<String, String> svars = host.getSVars();
|
||||
|
||||
// find card that triggered pairing first
|
||||
ArrayList<Card> 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<Card> 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
|
||||
@@ -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<String, String> params = af.getMapParams();
|
||||
private static void setMiscellaneous(final Map<String, String> params, final SpellAbility sa) {
|
||||
List<ZoneType> origin = new ArrayList<ZoneType>();
|
||||
if (params.containsKey("Origin")) {
|
||||
origin = ZoneType.listValueOf(params.get("Origin"));
|
||||
@@ -1540,7 +1540,7 @@ public final class AbilityFactoryChangeZone {
|
||||
} else {
|
||||
// non-targeted retrieval
|
||||
final List<Card> 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<Card>();
|
||||
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<Card>();
|
||||
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<Card> knownDetermineDefined(final SpellAbility sa, final String defined, final ZoneType origin) {
|
||||
private static List<Card> knownDetermineDefined(final SpellAbility sa, final String defined) {
|
||||
final List<Card> ret = new ArrayList<Card>();
|
||||
final ArrayList<Card> 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;
|
||||
}
|
||||
|
||||
|
||||
65
src/main/java/forge/card/abilityfactory/ai/BondAi.java
Normal file
65
src/main/java/forge/card/abilityfactory/ai/BondAi.java
Normal file
@@ -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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
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;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* AbilityFactoryBond class.
|
||||
* </p>
|
||||
*
|
||||
* @author Forge
|
||||
* @version $Id: AbilityFactoryBond.java 15090 2012-04-07 12:50:31Z Max mtg $
|
||||
*/
|
||||
public final class BondAi extends SpellAiLogic {
|
||||
|
||||
|
||||
|
||||
// **************************************************************
|
||||
// ************************** Bond ***************************
|
||||
// **************************************************************
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* bondCanPlayAI.
|
||||
* </p>
|
||||
*
|
||||
* @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<String,String> params, SpellAbility sa) {
|
||||
boolean chance = true;
|
||||
|
||||
final AbilitySub subAb = sa.getSubAbility();
|
||||
if (subAb != null) {
|
||||
chance &= subAb.chkAIDrawback();
|
||||
}
|
||||
|
||||
return chance;
|
||||
} // end bondCanPlayAI()
|
||||
}
|
||||
168
src/main/java/forge/card/abilityfactory/effects/BondEffect.java
Normal file
168
src/main/java/forge/card/abilityfactory/effects/BondEffect.java
Normal file
@@ -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 {
|
||||
/**
|
||||
* <p>
|
||||
* bondResolve.
|
||||
* </p>
|
||||
*
|
||||
* @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<String,String> params, SpellAbility sa) {
|
||||
// final Card source = sa.getSourceCard();
|
||||
// final Card host = af.getHostCard();
|
||||
// final Map<String, String> svars = host.getSVars();
|
||||
|
||||
// find card that triggered pairing first
|
||||
ArrayList<Card> 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<Card> 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
|
||||
|
||||
// /**
|
||||
// * <p>
|
||||
// * createSpellBond.
|
||||
// * </p>
|
||||
// *
|
||||
// * @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;
|
||||
// }
|
||||
//
|
||||
// /**
|
||||
// * <p>
|
||||
// * createDrawbackBond.
|
||||
// * </p>
|
||||
// *
|
||||
// * @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;
|
||||
// }
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* bondStackDescription.
|
||||
* </p>
|
||||
*
|
||||
* @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<String,String> params, SpellAbility sa) {
|
||||
ArrayList<Card> 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
|
||||
Reference in New Issue
Block a user