diff --git a/src/main/java/forge/Card.java b/src/main/java/forge/Card.java index da155315244..bcc7ab3e9b1 100644 --- a/src/main/java/forge/Card.java +++ b/src/main/java/forge/Card.java @@ -358,10 +358,8 @@ public class Card extends GameEntity implements Comparable { private long timestamp = -1; // permanents on the battlefield - private ArrayList newPT = new ArrayList(); // stack - // of - // set - // power/toughness + //stack of set power/toughness + private ArrayList newPT = new ArrayList(); private int baseLoyalty = 0; private String baseAttackString = null; private String baseDefenseString = null; @@ -405,6 +403,7 @@ public class Card extends GameEntity implements Comparable { private String namedCard = ""; private int chosenNumber; private Player chosenPlayer; + private ArrayList chosenCard = new ArrayList(); private Card cloneOrigin = null; private final ArrayList clones = new ArrayList(); @@ -2116,6 +2115,29 @@ public class Card extends GameEntity implements Comparable { this.chosenColor = s; } + /** + *

+ * Getter for the field chosenCard. + *

+ * + * @return an ArrayList object. + */ + public final ArrayList getChosenCard() { + return this.chosenCard; + } + + /** + *

+ * Setter for the field chosenCard. + *

+ * + * @param c + * an ArrayList object. + */ + public final void setChosenCard(final ArrayList c) { + this.chosenCard = c; + } + // used for cards like Meddling Mage... /** *

@@ -4032,9 +4054,8 @@ public class Card extends GameEntity implements Comparable { *

*/ public final void unEquipAllCards() { - while (this.equippedBy.size() > 0) { // while there exists equipment, - // unequip - // the first one + //while there exists equipment, unequip the first one + while (this.equippedBy.size() > 0) { this.equippedBy.get(0).unEquipCard(this); } } @@ -5351,9 +5372,8 @@ public class Card extends GameEntity implements Comparable { public final void clearAllKeywords() { this.getCharacteristics().getIntrinsicKeyword().clear(); this.extrinsicKeyword.clear(); - this.hiddenExtrinsicKeyword.clear(); // Hidden keywords won't be - // displayed on - // the card + //Hidden keywords won't be displayed on the card + this.hiddenExtrinsicKeyword.clear(); } /** @@ -6505,9 +6525,8 @@ public class Card extends GameEntity implements Comparable { return false; } - final String[] incR = restriction.split("\\.", 2); // Inclusive - // restrictions are - // Card types + //Inclusive restrictions are Card types + final String[] incR = restriction.split("\\.", 2); if (incR[0].equals("Spell") && !this.isSpell()) { return false; @@ -6566,6 +6585,10 @@ public class Card extends GameEntity implements Comparable { if (!this.getName().equals(source.getNamedCard())) { return false; } + } else if (property.equals("ChosenCard")) { + if (!source.getChosenCard().contains(this)) { + return false; + } } // ... Card colors else if (property.contains("White") || property.contains("Blue") || property.contains("Black") @@ -7932,11 +7955,8 @@ public class Card extends GameEntity implements Comparable { */ public final void addDamage(final Map sourcesMap) { for (final Entry entry : sourcesMap.entrySet()) { - this.addDamageAfterPrevention(entry.getValue(), entry.getKey(), true); // damage - // prevention - // is - // already - // checked! + //damage prevention is already checked! + this.addDamageAfterPrevention(entry.getValue(), entry.getKey(), true); } } @@ -8447,9 +8467,8 @@ public class Card extends GameEntity implements Comparable { } } - if (!this.isInZone(Constant.Zone.Battlefield)) { // keywords don't work - // outside the - // battlefield + //keywords don't work outside battlefield + if (!this.isInZone(Constant.Zone.Battlefield)) { return true; } diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactory.java b/src/main/java/forge/card/abilityfactory/AbilityFactory.java index 265ee520c97..81b63cc5381 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactory.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactory.java @@ -430,6 +430,16 @@ public class AbilityFactory { } } + else if (this.api.equals("ChooseCard")) { + if (this.isAb) { + spellAbility = AbilityFactoryChoose.createAbilityChooseCard(this); + } else if (this.isSp) { + spellAbility = AbilityFactoryChoose.createSpellChooseCard(this); + } else if (this.isDb) { + spellAbility = AbilityFactoryChoose.createDrawbackChooseCard(this); + } + } + else if (this.api.equals("ChooseColor")) { if (this.isAb) { spellAbility = AbilityFactoryChoose.createAbilityChooseColor(this); @@ -517,9 +527,8 @@ public class AbilityFactory { else if (this.api.equals("Counter")) { final AbilityFactoryCounterMagic c = new AbilityFactoryCounterMagic(this); - if (this.isTargeted) { // Since all "Counter" ABs Counter things on - // the - // Stack no need for it to be everywhere + //Since all "Counter" ABs Counter things on the Stack no need for it to be everywhere + if (this.isTargeted) { this.abTgt.setZone(Zone.Stack); } diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryChoose.java b/src/main/java/forge/card/abilityfactory/AbilityFactoryChoose.java index 41351a2e15a..51602e1ed75 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryChoose.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactoryChoose.java @@ -32,7 +32,7 @@ import forge.item.CardPrinted; /** *

- * AbilityFactory_Choose class. + * AbilityFactoryChoose class. *

* * @author Forge @@ -1156,7 +1156,17 @@ public final class AbilityFactoryChoose { card.setChosenPlayer(chosen); } else { - // TODO - not implemented + if (params.containsKey("AILogic")) { + if (params.get("AILogic").equals("Curse")) { + card.setChosenPlayer(AllZone.getHumanPlayer()); + } + else { + card.setChosenPlayer(AllZone.getComputerPlayer()); + } + } + else { + card.setChosenPlayer(AllZone.getComputerPlayer()); + } } } } @@ -1435,5 +1445,245 @@ public final class AbilityFactoryChoose { } } } + + // ************************************************************************* + // *************************** ChooseCard ********************************** + // ************************************************************************* -} // end class AbilityFactory_Choose + /** + *

+ * createAbilityChooseCard. + *

+ * + * @param af + * a {@link forge.card.abilityFactory.AbilityFactory} object. + * @return a {@link forge.card.spellability.SpellAbility} object. + */ + public static SpellAbility createAbilityChooseCard(final AbilityFactory af) { + final SpellAbility abChooseCard = new AbilityActivated(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { + private static final long serialVersionUID = 2399435577106102311L; + + @Override + public String getStackDescription() { + return chooseCardStackDescription(af, this); + } + + @Override + public boolean canPlayAI() { + return chooseCardCanPlayAI(af, this); + } + + @Override + public void resolve() { + chooseCardResolve(af, this); + } + + @Override + public boolean doTrigger(final boolean mandatory) { + return chooseCardTriggerAI(af, this, mandatory); + } + + }; + return abChooseCard; + } + + /** + *

+ * createSpellChooseCard. + *

+ * + * @param af + * a {@link forge.card.abilityFactory.AbilityFactory} object. + * @return a {@link forge.card.spellability.SpellAbility} object. + * @since 1.1.7 + */ + public static SpellAbility createSpellChooseCard(final AbilityFactory af) { + final SpellAbility spChooseCard = new Spell(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { + private static final long serialVersionUID = 1425536663625668893L; + + @Override + public String getStackDescription() { + return chooseCardStackDescription(af, this); + } + + @Override + public boolean canPlayAI() { + return chooseCardCanPlayAI(af, this); + } + + @Override + public void resolve() { + chooseCardResolve(af, this); + } + + }; + return spChooseCard; + } + + /** + *

+ * createDrawbackChooseCard. + *

+ * + * @param af + * a {@link forge.card.abilityFactory.AbilityFactory} object. + * @return a {@link forge.card.spellability.SpellAbility} object. + */ + public static SpellAbility createDrawbackChooseCard(final AbilityFactory af) { + final SpellAbility dbChooseCard = new AbilitySub(af.getHostCard(), af.getAbTgt()) { + private static final long serialVersionUID = -3255569671897226555L; + + @Override + public String getStackDescription() { + return chooseCardStackDescription(af, this); + } + + @Override + public void resolve() { + chooseCardResolve(af, this); + } + + @Override + public boolean chkAIDrawback() { + return true; + } + + @Override + public boolean doTrigger(final boolean mandatory) { + return chooseCardTriggerAI(af, this, mandatory); + } + + }; + return dbChooseCard; + } + + /** + *

+ * chooseCardStackDescription. + *

+ * + * @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 chooseCardStackDescription(final AbilityFactory af, final SpellAbility sa) { + StringBuilder sb = new StringBuilder(); + + if (sa instanceof AbilitySub) { + 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 card."); + + AbilitySub abSub = sa.getSubAbility(); + if (abSub != null) { + sb.append(abSub.getStackDescription()); + } + + return sb.toString(); + } + + /** + *

+ * chooseCardCanPlayAI. + *

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

+ * chooseCardTriggerAI. + *

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

+ * chooseCardResolve. + *

+ * + * @param af + * a {@link forge.card.abilityFactory.AbilityFactory} object. + * @param sa + * a {@link forge.card.spellability.SpellAbility} object. + */ + private static void chooseCardResolve(final AbilityFactory af, final SpellAbility sa) { + HashMap params = af.getMapParams(); + Card host = af.getHostCard(); + + ArrayList tgtPlayers; + + Target tgt = af.getAbTgt(); + if (tgt != null) { + tgtPlayers = tgt.getTargetPlayers(); + } else { + tgtPlayers = AbilityFactory.getDefinedPlayers(sa.getSourceCard(), params.get("Defined"), sa); + } + + CardList choices = AllZoneUtil.getCardsIn(Zone.Battlefield); + if (params.containsKey("Choices")) { + choices = choices.getValidCards(params.get("Choices"), host.getController(), host); + } + + for (Player p : tgtPlayers) { + if (tgt == null || p.canBeTargetedBy(sa)) { + ArrayList chosen = new ArrayList(); + if (sa.getActivatingPlayer().isHuman()) { + CardList land = AllZoneUtil.getLandsInPlay(); + final ArrayList basic = CardUtil.getBasicTypes(); + + for (final String type : basic) { + final CardList cl = land.getType(type); + if (cl.size() > 0) { + String prompt = "Choose a" + (type.equals("Island") ? "n " : " ") + type; + Object o = GuiUtils.getChoice(prompt, cl.toArray()); + if (null != o) { + Card c = (Card) o; + chosen.add(c); + } + } + } + + } else { + // TODO - not implemented + } + host.setChosenCard(chosen); + } + } + } + +} // end class AbilityFactoryChoose