diff --git a/src/main/java/forge/Card.java b/src/main/java/forge/Card.java index 9e4ea8a621a..37654bb8e2a 100644 --- a/src/main/java/forge/Card.java +++ b/src/main/java/forge/Card.java @@ -5035,6 +5035,8 @@ public class Card extends GameEntity implements Comparable { if (getName().equals(Property.substring(8))) return false; } else if (Property.startsWith("sameName")) { if (!getName().equals(source.getName())) return false; + } else if (Property.equals("NamedCard")) { + if (!getName().equals(source.getNamedCard())) return false; } // ... Card colors else if (Property.contains("White") diff --git a/src/main/java/forge/card/abilityFactory/AbilityFactory.java b/src/main/java/forge/card/abilityFactory/AbilityFactory.java index 29a5f52003e..837d9588344 100644 --- a/src/main/java/forge/card/abilityFactory/AbilityFactory.java +++ b/src/main/java/forge/card/abilityFactory/AbilityFactory.java @@ -894,6 +894,16 @@ public class AbilityFactory { SA = AbilityFactory_Choose.createDrawbackChoosePlayer(this); } } + + else if (API.equals("NameCard")) { + if (isAb) { + SA = AbilityFactory_Choose.createAbilityNameCard(this); + } else if (isSp) { + SA = AbilityFactory_Choose.createSpellNameCard(this); + } else if (isDb) { + SA = AbilityFactory_Choose.createDrawbackNameCard(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 ecb4645b295..632c8a4e0d9 100644 --- a/src/main/java/forge/card/abilityFactory/AbilityFactory_Choose.java +++ b/src/main/java/forge/card/abilityFactory/AbilityFactory_Choose.java @@ -1060,5 +1060,229 @@ public class AbilityFactory_Choose { } } } + + // ************************************************************************* + // ***************************** NameCard ********************************** + // ************************************************************************* + + /** + *

createAbilityNameCard.

+ * + * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. + * @return a {@link forge.card.spellability.SpellAbility} object. + * @since 1.1.6 + */ + public static SpellAbility createAbilityNameCard(final AbilityFactory af) { + final SpellAbility abNameCard = new Ability_Activated(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { + private static final long serialVersionUID = 1748714246609515354L; + + @Override + public String getStackDescription() { + return nameCardStackDescription(af, this); + } + + @Override + public boolean canPlayAI() { + return nameCardCanPlayAI(af, this); + } + + @Override + public void resolve() { + nameCardResolve(af, this); + } + + @Override + public boolean doTrigger(final boolean mandatory) { + return nameCardTriggerAI(af, this, mandatory); + } + + }; + return abNameCard; + } + + /** + *

createSpellNameCard.

+ * + * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. + * @return a {@link forge.card.spellability.SpellAbility} object. + * @since 1.1.6 + */ + public static SpellAbility createSpellNameCard(final AbilityFactory af) { + final SpellAbility spNameCard = new Spell(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { + private static final long serialVersionUID = 209265128022008897L; + + @Override + public String getStackDescription() { + return nameCardStackDescription(af, this); + } + + @Override + public boolean canPlayAI() { + return nameCardCanPlayAI(af, this); + } + + @Override + public void resolve() { + nameCardResolve(af, this); + } + + }; + return spNameCard; + } + + /** + *

createDrawbackNameCard.

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

nameCardStackDescription.

+ * + * @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 nameCardStackDescription(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("names a card."); + + Ability_Sub abSub = sa.getSubAbility(); + if (abSub != null) { + sb.append(abSub.getStackDescription()); + } + + return sb.toString(); + } + + /** + *

nameCardCanPlayAI.

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

nameCardTriggerAI.

+ * + * @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 nameCardTriggerAI(final AbilityFactory af, final SpellAbility sa, + final boolean mandatory) + { + //TODO - there is no AILogic implemented yet + return false; + } + + /** + *

nameCardResolve.

+ * + * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. + * @param sa a {@link forge.card.spellability.SpellAbility} object. + */ + private static void nameCardResolve(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); + } + + String valid = "Card"; + String validDesc = "card"; + if (params.containsKey("ValidCards")) { + valid = params.get("ValidCards"); + validDesc = params.get("ValidDesc"); + } + + for (Player p : tgtPlayers) { + if (tgt == null || p.canTarget(sa)) { + boolean ok = false; + String name = null; + while (!ok) { + if (sa.getActivatingPlayer().isHuman()) { + String message = validDesc.equals("card") ? "Name a card" : "Name a " + validDesc + " card"; + name = JOptionPane.showInputDialog(null, message, host.getName(), JOptionPane.QUESTION_MESSAGE); + if (!valid.equals("Card") && !(null == name)) { + Card temp = AllZone.getCardFactory().getCard(name, p); + ok = temp.isValid(valid, host.getController(), host); + } + else { + ok = true; + } + if (ok) { + host.setNamedCard(null == name ? "" : name); + } + + } else { + //TODO - not implemented + } + } + } + } + } } //end class AbilityFactory_Choose