diff --git a/res/cardsfolder/h/hermit_druid.txt b/res/cardsfolder/h/hermit_druid.txt index b57d5d9d561..964f7a0d60a 100644 --- a/res/cardsfolder/h/hermit_druid.txt +++ b/res/cardsfolder/h/hermit_druid.txt @@ -3,6 +3,7 @@ ManaCost:1 G Types:Creature Human Druid Text:no text PT:1/1 +A:AB$ DigUntil | Cost$ G T | Valid$ Land.Basic | ValidDescription$ Basic Land | FoundDestination$ Hand | RevealedDestination$ Graveyard | SpellDescription$ Reveal cards from the top of your library until you reveal a basic land card. Put that card into your hand and all other cards revealed this way into your graveyard. SVar:RemRandomDeck:True SVar:Rarity:Rare SVar:Picture:http://www.wizards.com/global/images/magic/general/hermit_druid.jpg diff --git a/src/main/java/forge/card/abilityFactory/AbilityFactory.java b/src/main/java/forge/card/abilityFactory/AbilityFactory.java index 2120b5888f3..45920059bb8 100644 --- a/src/main/java/forge/card/abilityFactory/AbilityFactory.java +++ b/src/main/java/forge/card/abilityFactory/AbilityFactory.java @@ -704,6 +704,15 @@ public class AbilityFactory { else if (isDb) SA = AbilityFactory_Reveal.createDrawbackDig(this); } + + else if (API.equals("DigUntil")) { + if (isAb) + SA = AbilityFactory_Reveal.createAbilityDigUntil(this); + else if (isSp) + SA = AbilityFactory_Reveal.createSpellDigUntil(this); + else if (isDb) + SA = AbilityFactory_Reveal.createDrawbackDigUntil(this); + } else if (API.equals("Shuffle")) { if (isAb) @@ -1029,6 +1038,9 @@ public class AbilityFactory { public static int calculateAmount(Card card, String amount, SpellAbility ability) { // amount can be anything, not just 'X' as long as sVar exists + if (amount == null) + return 0; + // If Amount is -X, strip the minus sign before looking for an SVar of that kind int multiplier = 1; if (amount.startsWith("-")) { diff --git a/src/main/java/forge/card/abilityFactory/AbilityFactory_Reveal.java b/src/main/java/forge/card/abilityFactory/AbilityFactory_Reveal.java index ac7a4cabf70..06b62401392 100644 --- a/src/main/java/forge/card/abilityFactory/AbilityFactory_Reveal.java +++ b/src/main/java/forge/card/abilityFactory/AbilityFactory_Reveal.java @@ -10,6 +10,7 @@ import javax.swing.*; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; +import java.util.Iterator; import java.util.Random; /** @@ -446,6 +447,328 @@ public class AbilityFactory_Reveal { return toReturn; } + //********************************************************************** + //******************************* DigUntil *************************** + //********************************************************************** + + /** + *
createAbilityDigUntil.
+ * + * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. + * @return a {@link forge.card.spellability.SpellAbility} object. + */ + public static SpellAbility createAbilityDigUntil(final AbilityFactory af) { + + final SpellAbility abDig = new Ability_Activated(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { + private static final long serialVersionUID = 4239474096624403497L; + + @Override + public String getStackDescription() { + return digUntilStackDescription(af, this); + } + + public boolean canPlayAI() { + return digUntilCanPlayAI(af, this); + } + + @Override + public void resolve() { + digUntilResolve(af, this); + } + + @Override + public boolean doTrigger(boolean mandatory) { + return digUntilTriggerAI(af, this, mandatory); + } + + }; + return abDig; + } + + /** + *createSpellDigUntil.
+ * + * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. + * @return a {@link forge.card.spellability.SpellAbility} object. + */ + public static SpellAbility createSpellDigUntil(final AbilityFactory af) { + final SpellAbility spDig = new Spell(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { + private static final long serialVersionUID = 3389143507816474146L; + + @Override + public String getStackDescription() { + return digUntilStackDescription(af, this); + } + + public boolean canPlayAI() { + return digUntilCanPlayAI(af, this); + } + + @Override + public void resolve() { + digUntilResolve(af, this); + } + + }; + return spDig; + } + + /** + *createDrawbackDigUntil.
+ * + * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. + * @return a {@link forge.card.spellability.SpellAbility} object. + */ + public static SpellAbility createDrawbackDigUntil(final AbilityFactory af) { + final SpellAbility dbDig = new Ability_Sub(af.getHostCard(), af.getAbTgt()) { + private static final long serialVersionUID = -3372788479421357024L; + + @Override + public String getStackDescription() { + return digUntilStackDescription(af, this); + } + + @Override + public void resolve() { + digUntilResolve(af, this); + } + + @Override + public boolean chkAI_Drawback() { + return true; + } + + @Override + public boolean doTrigger(boolean mandatory) { + return digUntilTriggerAI(af, this, mandatory); + } + + }; + return dbDig; + } + + + /** + *digUntilStackDescription.
+ * + * @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 digUntilStackDescription(AbilityFactory af, SpellAbility sa) { + HashMapdigUntilCanPlayAI.
+ * + * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. + * @param sa a {@link forge.card.spellability.SpellAbility} object. + * @return a boolean. + */ + private static boolean digUntilCanPlayAI(final AbilityFactory af, final SpellAbility sa) { + + double chance = .4; // 40 percent chance with instant speed stuff + if (AbilityFactory.isSorcerySpeed(sa)) + chance = .667; // 66.7% chance for sorcery speed (since it will never activate EOT) + Random r = MyRandom.random; + boolean randomReturn = r.nextFloat() <= Math.pow(chance, sa.getActivationsThisTurn() + 1); + + Target tgt = sa.getTarget(); + Player libraryOwner = AllZone.getComputerPlayer(); + + if (sa.getTarget() != null) { + tgt.resetTargets(); + if (!AllZone.getHumanPlayer().canTarget(sa)) + return false; + else + sa.getTarget().addTarget(AllZone.getHumanPlayer()); + libraryOwner = AllZone.getHumanPlayer(); + } + + //return false if nothing to dig into + if (AllZoneUtil.getCardsInZone(Constant.Zone.Library, libraryOwner).isEmpty()) + return false; + + if (af.hasSubAbility()) { + Ability_Sub abSub = sa.getSubAbility(); + if (abSub != null) { + return randomReturn && abSub.chkAI_Drawback(); + } + } + + return randomReturn; + } + + /** + *digUntilTriggerAI.
+ * + * @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 digUntilTriggerAI(final AbilityFactory af, final SpellAbility sa, boolean mandatory) { + if (!ComputerUtil.canPayCost(sa)) + return false; + + Target tgt = sa.getTarget(); + + if (sa.getTarget() != null) { + tgt.resetTargets(); + sa.getTarget().addTarget(AllZone.getComputerPlayer()); + } + + return true; + } + + /** + *digUntilResolve.
+ * + * @param af a {@link forge.card.abilityFactory.AbilityFactory} object. + * @param sa a {@link forge.card.spellability.SpellAbility} object. + */ + private static void digUntilResolve(final AbilityFactory af, final SpellAbility sa) { + HashMap