From 7e2ab48ebed63f570fe136d7636eafe89cee15b9 Mon Sep 17 00:00:00 2001 From: slapshot5 Date: Thu, 9 Feb 2012 04:48:25 +0000 Subject: [PATCH] add an AF GenericChoice. Lets any choice be made during resolution and resolves the SVar for that choice. --- .../card/abilityfactory/AbilityFactory.java | 10 + .../abilityfactory/AbilityFactoryChoose.java | 213 ++++++++++++++++++ 2 files changed, 223 insertions(+) diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactory.java b/src/main/java/forge/card/abilityfactory/AbilityFactory.java index 49646cb43e5..3f4804ce9dd 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactory.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactory.java @@ -813,6 +813,16 @@ public class AbilityFactory { } } + else if (this.api.equals("GenericChoice")) { + if (this.isAb) { + spellAbility = AbilityFactoryChoose.createAbilityChooseGeneric(this); + } else if (this.isSp) { + spellAbility = AbilityFactoryChoose.createSpellChooseGeneric(this); + } else if (this.isDb) { + spellAbility = AbilityFactoryChoose.createDrawbackChooseGeneric(this); + } + } + else if (this.api.equals("LoseLife")) { if (this.isAb) { spellAbility = AbilityFactoryAlterLife.createAbilityLoseLife(this); diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryChoose.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryChoose.java index 72505dbe0fd..9a7f368a4ba 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryChoose.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryChoose.java @@ -26,6 +26,9 @@ import java.util.Random; import javax.swing.JOptionPane; +import com.google.common.collect.BiMap; +import com.google.common.collect.HashBiMap; + import forge.AllZone; import forge.AllZoneUtil; import forge.Card; @@ -1739,4 +1742,214 @@ public final class AbilityFactoryChoose { } } + // ************************************************************************* + // ************************* ChooseGeneric ********************************* + // ************************************************************************* + + /** + *

+ * createAbilityChooseGeneric. + *

+ * + * @param af + * a {@link forge.card.abilityfactory.AbilityFactory} object. + * @return a {@link forge.card.spellability.SpellAbility} object. + * + * @since 1.2.4 + */ + public static SpellAbility createAbilityChooseGeneric(final AbilityFactory af) { + + final SpellAbility abChooseGeneric = new AbilityActivated(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { + private static final long serialVersionUID = -459173435583208151L; + + @Override + public String getStackDescription() { + return AbilityFactoryChoose.chooseGenericStackDescription(af, this); + } + + @Override + public boolean canPlayAI() { + return AbilityFactoryChoose.chooseGenericCanPlayAI(af, this); + } + + @Override + public void resolve() { + AbilityFactoryChoose.chooseGenericResolve(af, this); + } + + @Override + public boolean doTrigger(final boolean mandatory) { + return AbilityFactoryChoose.chooseGenericTriggerAI(af, this, mandatory); + } + + }; + return abChooseGeneric; + } + + /** + *

+ * createSpellChooseGeneric. + *

+ * + * @param af + * a {@link forge.card.abilityfactory.AbilityFactory} object. + * @return a {@link forge.card.spellability.SpellAbility} object. + * + * @since 1.2.4 + */ + public static SpellAbility createSpellChooseGeneric(final AbilityFactory af) { + final SpellAbility spChooseGeneric = new Spell(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { + private static final long serialVersionUID = 4187094641157371974L; + + @Override + public String getStackDescription() { + return AbilityFactoryChoose.chooseGenericStackDescription(af, this); + } + + @Override + public boolean canPlayAI() { + return AbilityFactoryChoose.chooseGenericCanPlayAI(af, this); + } + + @Override + public void resolve() { + AbilityFactoryChoose.chooseGenericResolve(af, this); + } + + }; + return spChooseGeneric; + } + + /** + *

+ * createDrawbackChooseGeneric. + *

+ * + * @param af + * a {@link forge.card.abilityfactory.AbilityFactory} object. + * @return a {@link forge.card.spellability.SpellAbility} object. + * + * @since 1.2.4 + */ + public static SpellAbility createDrawbackChooseGeneric(final AbilityFactory af) { + final SpellAbility dbChooseGeneric = new AbilitySub(af.getHostCard(), af.getAbTgt()) { + private static final long serialVersionUID = 1586980855969921641L; + + @Override + public String getStackDescription() { + return AbilityFactoryChoose.chooseGenericStackDescription(af, this); + } + + @Override + public void resolve() { + AbilityFactoryChoose.chooseGenericResolve(af, this); + } + + @Override + public boolean chkAIDrawback() { + return true; + } + + @Override + public boolean doTrigger(final boolean mandatory) { + return AbilityFactoryChoose.chooseGenericTriggerAI(af, this, mandatory); + } + + }; + return dbChooseGeneric; + } + + private static String chooseGenericStackDescription(final AbilityFactory af, final SpellAbility sa) { + final HashMap params = af.getMapParams(); + final StringBuilder sb = new StringBuilder(); + + if (!(sa instanceof AbilitySub)) { + sb.append(sa.getSourceCard()).append(" - "); + } else { + sb.append(" "); + } + + ArrayList tgtPlayers; + + final Target tgt = sa.getTarget(); + if (tgt != null) { + tgtPlayers = tgt.getTargetPlayers(); + } else { + tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); + } + + for (final Player p : tgtPlayers) { + sb.append(p).append(" "); + } + sb.append("chooses from a list."); + + final AbilitySub abSub = sa.getSubAbility(); + if (abSub != null) { + sb.append(abSub.getStackDescription()); + } + + return sb.toString(); + } + + private static boolean chooseGenericCanPlayAI(final AbilityFactory af, final SpellAbility sa) { + final HashMap params = af.getMapParams(); + if (!params.containsKey("AILogic")) { + return false; + } + + return AbilityFactoryChoose.chooseGenericTriggerAI(af, sa, false); + } + + /** + *

+ * chooseTypeTriggerAI. + *

+ * + * @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 chooseGenericTriggerAI(final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { + if (!ComputerUtil.canPayCost(sa)) { + return false; + } + + return false; + } + + private static void chooseGenericResolve(final AbilityFactory af, final SpellAbility sa) { + final HashMap params = af.getMapParams(); + final Card host = af.getHostCard(); + final BiMap choices = HashBiMap.create(); + for (String s : Arrays.asList(params.get("Choices").split(","))) { + final HashMap theseParams = af.getMapParams(host.getSVar(s), host); + choices.put(s, theseParams.get("ChoiceDescription")); + } + + ArrayList tgtPlayers; + + final Target tgt = sa.getTarget(); + if (tgt != null) { + tgtPlayers = tgt.getTargetPlayers(); + } else { + tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); + } + + for (final Player p : tgtPlayers) { + if ((tgt == null) || p.canBeTargetedBy(sa)) { + String choice = (String) GuiUtils.getChoice("Choose one", choices.values().toArray()); + AbilityFactory afChoice = new AbilityFactory(); + final SpellAbility chosenSA = afChoice.getAbility(host.getSVar(choices.inverse().get(choice)), host); + + chosenSA.setActivatingPlayer(af.getHostCard().getController()); + ((AbilitySub) chosenSA).setParent(sa); + AbilityFactory.resolve(chosenSA, false); + } + } + } + } // end class AbilityFactoryChoose