diff --git a/src/main/java/forge/card/abilityFactory/AbilityFactory.java b/src/main/java/forge/card/abilityFactory/AbilityFactory.java index 45920059bb8..2dfc1de3f8b 100644 --- a/src/main/java/forge/card/abilityFactory/AbilityFactory.java +++ b/src/main/java/forge/card/abilityFactory/AbilityFactory.java @@ -338,6 +338,15 @@ public class AbilityFactory { else if (isDb) SA = AbilityFactory_Counters.createDrawbackProliferate(this); } + + else if (API.equals("MoveCounter")) { + if (isAb) + SA = AbilityFactory_Counters.createAbilityMoveCounters(this); + else if (isSp) + SA = AbilityFactory_Counters.createSpellMoveCounters(this); + else if (isDb) + SA = AbilityFactory_Counters.createDrawbackMoveCounters(this); + } else if (API.equals("ChangeZone")) { if (isAb) diff --git a/src/main/java/forge/card/abilityFactory/AbilityFactory_Counters.java b/src/main/java/forge/card/abilityFactory/AbilityFactory_Counters.java index 865499f19ad..6df48259ac8 100644 --- a/src/main/java/forge/card/abilityFactory/AbilityFactory_Counters.java +++ b/src/main/java/forge/card/abilityFactory/AbilityFactory_Counters.java @@ -1636,5 +1636,261 @@ public class AbilityFactory_Counters { tgtCard.subtractCounter(Counters.valueOf(type), counterAmount); } } + + // ******************************************* + // ************ MoveCounters ***************** + // ******************************************* + + /** + *
createAbilityMoveCounters.
+ * + * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. + * @return a {@link forge.card.spellability.SpellAbility} object. + */ + public static SpellAbility createAbilityMoveCounters(final AbilityFactory af) { + final SpellAbility abMoveCounter = new Ability_Activated(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { + private static final long serialVersionUID = 4602375375570571305L; + + @Override + public String getStackDescription() { + return moveCounterStackDescription(af, this); + } + + @Override + public boolean canPlayAI() { + return moveCounterCanPlayAI(af, this); + } + + @Override + public void resolve() { + moveCounterResolve(af, this); + } + + @Override + public boolean doTrigger(boolean mandatory) { + return moveCounterDoTriggerAI(af, this, mandatory); + } + + }; + return abMoveCounter; + } + + /** + *createSpellMoveCounters.
+ * + * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. + * @return a {@link forge.card.spellability.SpellAbility} object. + */ + public static SpellAbility createSpellMoveCounters(final AbilityFactory af) { + final SpellAbility spMoveCounter = new Spell(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { + private static final long serialVersionUID = 7987458386444373863L; + + @Override + public String getStackDescription() { + return moveCounterStackDescription(af, this); + } + + @Override + public boolean canPlayAI() { + return moveCounterCanPlayAI(af, this); + } + + @Override + public void resolve() { + moveCounterResolve(af, this); + } + + }; + return spMoveCounter; + } + + /** + *createDrawbackMoveCounters.
+ * + * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. + * @return a {@link forge.card.spellability.SpellAbility} object. + */ + public static SpellAbility createDrawbackMoveCounters(final AbilityFactory af) { + final SpellAbility dbMoveCounter = new Ability_Sub(af.getHostCard(), af.getAbTgt()) { + private static final long serialVersionUID = -9185934729634278014L; + + @Override + public String getStackDescription() { + return moveCounterStackDescription(af, this); + } + + @Override + public void resolve() { + moveCounterResolve(af, this); + } + + @Override + public boolean chkAI_Drawback() { + return moveCounterPlayDrawbackAI(af, this); + } + + @Override + public boolean doTrigger(boolean mandatory) { + return moveCounterDoTriggerAI(af, this, mandatory); + } + + }; + return dbMoveCounter; + } + + /** + *moveCounterStackDescription.
+ * + * @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 moveCounterStackDescription(AbilityFactory af, SpellAbility sa) { + HashMapmoveCounterCanPlayAI.
+ * + * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. + * @param sa a {@link forge.card.spellability.SpellAbility} object. + * @return a boolean. + */ + private static boolean moveCounterCanPlayAI(final AbilityFactory af, final SpellAbility sa) { + // AI needs to be expanded, since this function can be pretty complex based on what the expected targets could be + HashMapmoveCounterPlayDrawbackAI.
+ * + * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. + * @param sa a {@link forge.card.spellability.SpellAbility} object. + * @return a boolean. + */ + private static boolean moveCounterPlayDrawbackAI(final AbilityFactory af, final SpellAbility sa) { + boolean chance = false; + + Ability_Sub subAb = sa.getSubAbility(); + if (subAb != null) + chance &= subAb.chkAI_Drawback(); + + return chance; + }//moveCounterPlayDrawbackAI + + /** + *moveCounterDoTriggerAI.
+ * + * @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 moveCounterDoTriggerAI(final AbilityFactory af, final SpellAbility sa, boolean mandatory) { + // if there is a cost, it's gotta be optional + if (!ComputerUtil.canPayCost(sa) && !mandatory) + return false; + + Ability_Sub subAb = sa.getSubAbility(); + if (subAb != null) { + //chance &= subAb.doTrigger(mandatory); + } + + return false; + } + + /** + *moveCounterResolve.
+ * + * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. + * @param sa a {@link forge.card.spellability.SpellAbility} object. + */ + private static void moveCounterResolve(final AbilityFactory af, final SpellAbility sa) { + HashMap