diff --git a/src/main/java/forge/Card.java b/src/main/java/forge/Card.java index 3acf3e091ac..864228face0 100644 --- a/src/main/java/forge/Card.java +++ b/src/main/java/forge/Card.java @@ -165,6 +165,7 @@ public class Card extends GameEntity implements Comparable { private String chosenType = ""; private String chosenColor = ""; private String namedCard = ""; + private int chosenNumber; private Card cloneOrigin = null; private ArrayList clones = new ArrayList(); @@ -1355,6 +1356,24 @@ public class Card extends GameEntity implements Comparable { public final int getCMC() { return CardUtil.getConvertedManaCost(manaCost); } + + /** + *

Getter for the field chosenNumber.

+ * + * @return an int + */ + public final int getChosenNumber() { + return chosenNumber; + } + + /** + *

Setter for the field chosenNumber.

+ * + * @param s an int + */ + public final void setChosenNumber(final int i) { + chosenNumber = i; + } //used for cards like Belbe's Portal, Conspiracy, Cover of Darkness, etc. /** diff --git a/src/main/java/forge/card/abilityFactory/AbilityFactory.java b/src/main/java/forge/card/abilityFactory/AbilityFactory.java index 8b8c8528f38..c8cbb28650e 100644 --- a/src/main/java/forge/card/abilityFactory/AbilityFactory.java +++ b/src/main/java/forge/card/abilityFactory/AbilityFactory.java @@ -854,6 +854,16 @@ public class AbilityFactory { SA = AbilityFactory_Choose.createDrawbackChooseColor(this); } } + + else if (API.equals("ChooseNumber")) { + if (isAb) { + SA = AbilityFactory_Choose.createAbilityChooseNumber(this); + } else if (isSp) { + SA = AbilityFactory_Choose.createSpellChooseNumber(this); + } else if (isDb) { + SA = AbilityFactory_Choose.createDrawbackChooseNumber(this); + } + } else if (API.equals("CopyPermanent")) { if (isAb) { diff --git a/src/main/java/forge/card/abilityFactory/AbilityFactory_Choose.java b/src/main/java/forge/card/abilityFactory/AbilityFactory_Choose.java index a1367747696..93658704615 100644 --- a/src/main/java/forge/card/abilityFactory/AbilityFactory_Choose.java +++ b/src/main/java/forge/card/abilityFactory/AbilityFactory_Choose.java @@ -24,6 +24,7 @@ import forge.card.spellability.Target; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; +import java.util.Random; import javax.swing.JOptionPane; @@ -585,5 +586,233 @@ public class AbilityFactory_Choose { } } } + + // ************************************************************************* + // ************************* ChooseNumber ********************************** + // ************************************************************************* + + /** + *

createAbilityChooseNumber.

+ * + * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. + * @return a {@link forge.card.spellability.SpellAbility} object. + * @since 1.1.6 + */ + public static SpellAbility createAbilityChooseNumber(final AbilityFactory af) { + + final SpellAbility abChooseNumber = new Ability_Activated(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { + private static final long serialVersionUID = -8268155210011368749L; + + @Override + public String getStackDescription() { + return chooseNumberStackDescription(af, this); + } + + @Override + public boolean canPlayAI() { + return chooseNumberCanPlayAI(af, this); + } + + @Override + public void resolve() { + chooseNumberResolve(af, this); + } + + @Override + public boolean doTrigger(final boolean mandatory) { + return chooseNumberTriggerAI(af, this, mandatory); + } + + }; + return abChooseNumber; + } + + /** + *

createSpellChooseNumber.

+ * + * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. + * @return a {@link forge.card.spellability.SpellAbility} object. + * @since 1.1.6 + */ + public static SpellAbility createSpellChooseNumber(final AbilityFactory af) { + final SpellAbility spChooseNumber = new Spell(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { + private static final long serialVersionUID = 6397887501014311392L; + + @Override + public String getStackDescription() { + return chooseNumberStackDescription(af, this); + } + + @Override + public boolean canPlayAI() { + return chooseNumberCanPlayAI(af, this); + } + + @Override + public void resolve() { + chooseNumberResolve(af, this); + } + + }; + return spChooseNumber; + } + + /** + *

createDrawbackChooseNumber.

+ * + * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. + * @return a {@link forge.card.spellability.SpellAbility} object. + * @since 1.1.6 + */ + public static SpellAbility createDrawbackChooseNumber(final AbilityFactory af) { + final SpellAbility dbChooseNumber = new Ability_Sub(af.getHostCard(), af.getAbTgt()) { + private static final long serialVersionUID = -1339609900364066904L; + + @Override + public String getStackDescription() { + return chooseNumberStackDescription(af, this); + } + + @Override + public void resolve() { + chooseNumberResolve(af, this); + } + + @Override + public boolean chkAI_Drawback() { + return true; + } + + @Override + public boolean doTrigger(final boolean mandatory) { + return chooseNumberTriggerAI(af, this, mandatory); + } + + }; + return dbChooseNumber; + } + + /** + *

chooseNumberStackDescription.

+ * + * @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 chooseNumberStackDescription(final AbilityFactory af, final SpellAbility sa) { + StringBuilder sb = new StringBuilder(); + + if (sa instanceof Ability_Sub) { + sb.append(" "); + } + else { + sb.append(sa.getSourceCard()).append(" - "); + } + + ArrayList tgtPlayers; + + Target tgt = af.getAbTgt(); + if (tgt != null) { + tgtPlayers = tgt.getTargetPlayers(); + } + else { + tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), af.getMapParams().get("Defined"), sa); + } + + for (Player p : tgtPlayers) { + sb.append(p).append(" "); + } + sb.append("chooses a number."); + + Ability_Sub abSub = sa.getSubAbility(); + if (abSub != null) { + sb.append(abSub.getStackDescription()); + } + + return sb.toString(); + } + + /** + *

chooseNumberCanPlayAI.

+ * + * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. + * @param sa a {@link forge.card.spellability.SpellAbility} object. + * @return a boolean. + */ + private static boolean chooseNumberCanPlayAI(final AbilityFactory af, final SpellAbility sa) { + return chooseNumberTriggerAI(af, sa, false); + } + + /** + *

chooseNumberTriggerAI.

+ * + * @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 chooseNumberTriggerAI(final AbilityFactory af, final SpellAbility sa, + final boolean mandatory) + { + return false; + } + + /** + *

chooseNumberResolve.

+ * + * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. + * @param sa a {@link forge.card.spellability.SpellAbility} object. + */ + private static void chooseNumberResolve(final AbilityFactory af, final SpellAbility sa) { + HashMap params = af.getMapParams(); + Card card = af.getHostCard(); + int min = params.containsKey("Min") ? Integer.parseInt(params.get("Min")) : 0; + int max = Integer.parseInt(params.get("Max")); + boolean random = params.containsKey("Random"); + + String[] choices = new String[max + 1]; + if (!random) { + //initialize the array + for (int i = min; i <= max; i++) { + choices[i] = "" + i; + } + } + + ArrayList tgtPlayers; + + Target tgt = af.getAbTgt(); + if (tgt != null) { + tgtPlayers = tgt.getTargetPlayers(); + } + else { + tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); + } + + for (Player p : tgtPlayers) { + if (tgt == null || p.canTarget(sa)) { + if (sa.getActivatingPlayer().isHuman()) { + int chosen; + if (random) { + //TODO - display the random number that was chosen + Random randomGen = new Random(); + chosen = randomGen.nextInt(max - min) + min; + String message = "Randomly chosen number: " + chosen; + JOptionPane.showMessageDialog(null, message, "" + card, JOptionPane.PLAIN_MESSAGE); + } + else { + Object o = GuiUtils.getChoice("Choose a number", choices); + if (null == o) { + return; + } + chosen = Integer.parseInt((String) o); + } + card.setChosenNumber(chosen); + + } else { + //TODO - not implemented + } + } + } + } } //end class AbilityFactory_Choose