mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-16 02:38:02 +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/UnOpenedProduct.java -text
|
||||||
src/main/java/forge/card/abilityfactory/AbilityFactory.java svneol=native#text/plain
|
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/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/AbilityFactoryChangeZone.java svneol=native#text/plain
|
||||||
src/main/java/forge/card/abilityfactory/AbilityFactoryCharm.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
|
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/UniversalSpell.java -text
|
||||||
src/main/java/forge/card/abilityfactory/ai/AnimateAi.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/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/ExchangeLifeAi.java -text
|
||||||
src/main/java/forge/card/abilityfactory/ai/GainLifeAi.java -text
|
src/main/java/forge/card/abilityfactory/ai/GainLifeAi.java -text
|
||||||
src/main/java/forge/card/abilityfactory/ai/LoseLifeAi.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/ai/SetLifeAi.java -text
|
||||||
src/main/java/forge/card/abilityfactory/effects/AnimateAllEffect.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/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/ExchangeLifeEffect.java -text
|
||||||
src/main/java/forge/card/abilityfactory/effects/GainLifeEffect.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
|
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")) {
|
else if (this.api.equals("Bond")) {
|
||||||
if (this.isAb) {
|
se = new BondEffect();
|
||||||
spellAbility = AbilityFactoryBond.createAbilityBond(this);
|
ai = new BondAi();
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (this.api.equals("ChangeZone")) {
|
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.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
import com.google.common.base.Predicate;
|
import com.google.common.base.Predicate;
|
||||||
@@ -99,7 +100,7 @@ public final class AbilityFactoryChangeZone {
|
|||||||
AbilityActivated res = new AbilityChangeZone(getSourceCard(),
|
AbilityActivated res = new AbilityChangeZone(getSourceCard(),
|
||||||
getPayCosts(), getTarget() == null ? null : new Target(getTarget()));
|
getPayCosts(), getTarget() == null ? null : new Target(getTarget()));
|
||||||
CardFactoryUtil.copySpellAbility(this, res);
|
CardFactoryUtil.copySpellAbility(this, res);
|
||||||
AbilityFactoryChangeZone.setMiscellaneous(af, res);
|
AbilityFactoryChangeZone.setMiscellaneous(af.getMapParams(), res);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -127,7 +128,7 @@ public final class AbilityFactoryChangeZone {
|
|||||||
}
|
}
|
||||||
final SpellAbility abChangeZone = new AbilityChangeZone(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
final SpellAbility abChangeZone = new AbilityChangeZone(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
||||||
|
|
||||||
AbilityFactoryChangeZone.setMiscellaneous(af, abChangeZone);
|
AbilityFactoryChangeZone.setMiscellaneous(af.getMapParams(), abChangeZone);
|
||||||
return abChangeZone;
|
return abChangeZone;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -168,7 +169,7 @@ public final class AbilityFactoryChangeZone {
|
|||||||
return AbilityFactoryChangeZone.changeZoneTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
return AbilityFactoryChangeZone.changeZoneTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
AbilityFactoryChangeZone.setMiscellaneous(af, spChangeZone);
|
AbilityFactoryChangeZone.setMiscellaneous(af.getMapParams(), spChangeZone);
|
||||||
return spChangeZone;
|
return spChangeZone;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -192,7 +193,7 @@ public final class AbilityFactoryChangeZone {
|
|||||||
AbilitySub res = new DrawbackChangeZone(getSourceCard(),
|
AbilitySub res = new DrawbackChangeZone(getSourceCard(),
|
||||||
getTarget() == null ? null : new Target(getTarget()));
|
getTarget() == null ? null : new Target(getTarget()));
|
||||||
CardFactoryUtil.copySpellAbility(this, res);
|
CardFactoryUtil.copySpellAbility(this, res);
|
||||||
AbilityFactoryChangeZone.setMiscellaneous(af, res);
|
AbilityFactoryChangeZone.setMiscellaneous(af.getMapParams(), res);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
private static final long serialVersionUID = 3270484211099902059L;
|
private static final long serialVersionUID = 3270484211099902059L;
|
||||||
@@ -224,7 +225,7 @@ public final class AbilityFactoryChangeZone {
|
|||||||
}
|
}
|
||||||
final SpellAbility dbChangeZone = new DrawbackChangeZone(af.getHostCard(), af.getAbTgt());
|
final SpellAbility dbChangeZone = new DrawbackChangeZone(af.getHostCard(), af.getAbTgt());
|
||||||
|
|
||||||
AbilityFactoryChangeZone.setMiscellaneous(af, dbChangeZone);
|
AbilityFactoryChangeZone.setMiscellaneous(af.getMapParams(), dbChangeZone);
|
||||||
return dbChangeZone;
|
return dbChangeZone;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -277,8 +278,7 @@ public final class AbilityFactoryChangeZone {
|
|||||||
* @param sa
|
* @param sa
|
||||||
* a {@link forge.card.spellability.SpellAbility} object.
|
* a {@link forge.card.spellability.SpellAbility} object.
|
||||||
*/
|
*/
|
||||||
private static void setMiscellaneous(final AbilityFactory af, final SpellAbility sa) {
|
private static void setMiscellaneous(final Map<String, String> params, final SpellAbility sa) {
|
||||||
final HashMap<String, String> params = af.getMapParams();
|
|
||||||
List<ZoneType> origin = new ArrayList<ZoneType>();
|
List<ZoneType> origin = new ArrayList<ZoneType>();
|
||||||
if (params.containsKey("Origin")) {
|
if (params.containsKey("Origin")) {
|
||||||
origin = ZoneType.listValueOf(params.get("Origin"));
|
origin = ZoneType.listValueOf(params.get("Origin"));
|
||||||
@@ -1540,7 +1540,7 @@ public final class AbilityFactoryChangeZone {
|
|||||||
} else {
|
} else {
|
||||||
// non-targeted retrieval
|
// non-targeted retrieval
|
||||||
final List<Card> retrieval = AbilityFactoryChangeZone
|
final List<Card> retrieval = AbilityFactoryChangeZone
|
||||||
.knownDetermineDefined(sa, params.get("Defined"), origin);
|
.knownDetermineDefined(sa, params.get("Defined"));
|
||||||
|
|
||||||
if ((retrieval == null) || retrieval.isEmpty()) {
|
if ((retrieval == null) || retrieval.isEmpty()) {
|
||||||
return false;
|
return false;
|
||||||
@@ -2060,7 +2060,7 @@ public final class AbilityFactoryChangeZone {
|
|||||||
} else {
|
} else {
|
||||||
// otherwise add self to list and go from there
|
// otherwise add self to list and go from there
|
||||||
tgts = new ArrayList<Card>();
|
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);
|
tgts.add(c);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2181,7 +2181,7 @@ public final class AbilityFactoryChangeZone {
|
|||||||
} else {
|
} else {
|
||||||
tgtCards = new ArrayList<Card>();
|
tgtCards = new ArrayList<Card>();
|
||||||
for(ZoneType o : origin) {
|
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);
|
tgtCards.add(c);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2332,11 +2332,9 @@ public final class AbilityFactoryChangeZone {
|
|||||||
* a {@link forge.card.spellability.SpellAbility} object.
|
* a {@link forge.card.spellability.SpellAbility} object.
|
||||||
* @param defined
|
* @param defined
|
||||||
* a {@link java.lang.String} object.
|
* a {@link java.lang.String} object.
|
||||||
* @param origin
|
|
||||||
* a {@link java.lang.String} object.
|
|
||||||
* @return a {@link forge.CardList} 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 List<Card> ret = new ArrayList<Card>();
|
||||||
final ArrayList<Card> list = AbilityFactory.getDefinedCards(sa.getSourceCard(), defined, sa);
|
final ArrayList<Card> list = AbilityFactory.getDefinedCards(sa.getSourceCard(), defined, sa);
|
||||||
|
|
||||||
@@ -2423,7 +2421,7 @@ public final class AbilityFactoryChangeZone {
|
|||||||
AbilityActivated res = new AbilityChangeZoneAll(getSourceCard(),
|
AbilityActivated res = new AbilityChangeZoneAll(getSourceCard(),
|
||||||
getPayCosts(), getTarget() == null ? null : new Target(getTarget()));
|
getPayCosts(), getTarget() == null ? null : new Target(getTarget()));
|
||||||
CardFactoryUtil.copySpellAbility(this, res);
|
CardFactoryUtil.copySpellAbility(this, res);
|
||||||
AbilityFactoryChangeZone.setMiscellaneous(af, res);
|
AbilityFactoryChangeZone.setMiscellaneous(af.getMapParams(), res);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2451,7 +2449,7 @@ public final class AbilityFactoryChangeZone {
|
|||||||
}
|
}
|
||||||
final SpellAbility abChangeZone = new AbilityChangeZoneAll(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
final SpellAbility abChangeZone = new AbilityChangeZoneAll(af.getHostCard(), af.getAbCost(), af.getAbTgt());
|
||||||
|
|
||||||
AbilityFactoryChangeZone.setMiscellaneous(af, abChangeZone);
|
AbilityFactoryChangeZone.setMiscellaneous(af.getMapParams(), abChangeZone);
|
||||||
return abChangeZone;
|
return abChangeZone;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2491,7 +2489,7 @@ public final class AbilityFactoryChangeZone {
|
|||||||
return AbilityFactoryChangeZone.changeZoneAllDoTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
return AbilityFactoryChangeZone.changeZoneAllDoTriggerAI(getActivatingPlayer(), af, this, mandatory);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
AbilityFactoryChangeZone.setMiscellaneous(af, spChangeZone);
|
AbilityFactoryChangeZone.setMiscellaneous(af.getMapParams(), spChangeZone);
|
||||||
return spChangeZone;
|
return spChangeZone;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2515,7 +2513,7 @@ public final class AbilityFactoryChangeZone {
|
|||||||
AbilitySub res = new DrawbackChangeZoneAll(getSourceCard(),
|
AbilitySub res = new DrawbackChangeZoneAll(getSourceCard(),
|
||||||
getTarget() == null ? null : new Target(getTarget()));
|
getTarget() == null ? null : new Target(getTarget()));
|
||||||
CardFactoryUtil.copySpellAbility(this, res);
|
CardFactoryUtil.copySpellAbility(this, res);
|
||||||
AbilityFactoryChangeZone.setMiscellaneous(af, res);
|
AbilityFactoryChangeZone.setMiscellaneous(af.getMapParams(), res);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2548,7 +2546,7 @@ public final class AbilityFactoryChangeZone {
|
|||||||
}
|
}
|
||||||
final SpellAbility dbChangeZone = new DrawbackChangeZoneAll(af.getHostCard(), af.getAbTgt());
|
final SpellAbility dbChangeZone = new DrawbackChangeZoneAll(af.getHostCard(), af.getAbTgt());
|
||||||
|
|
||||||
AbilityFactoryChangeZone.setMiscellaneous(af, dbChangeZone);
|
AbilityFactoryChangeZone.setMiscellaneous(af.getMapParams(), dbChangeZone);
|
||||||
return 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