From b8485e3e9194e217345491f6e0e7e38fecc375cc Mon Sep 17 00:00:00 2001 From: Maxmtg Date: Tue, 30 Oct 2012 06:50:31 +0000 Subject: [PATCH] refactored AF:Play --- .gitattributes | 3 +- .../card/abilityfactory/AbilityFactory.java | 9 +- .../forge/card/abilityfactory/ai/PlayAi.java | 83 +++++ .../PlayEffect.java} | 284 +----------------- 4 files changed, 102 insertions(+), 277 deletions(-) create mode 100644 src/main/java/forge/card/abilityfactory/ai/PlayAi.java rename src/main/java/forge/card/abilityfactory/{AbilityFactoryPlay.java => effects/PlayEffect.java} (54%) diff --git a/.gitattributes b/.gitattributes index eaf05c73d91..829d265ffd6 100644 --- a/.gitattributes +++ b/.gitattributes @@ -12480,7 +12480,6 @@ src/main/java/forge/card/abilityfactory/AbilityFactoryEndGameCondition.java svne src/main/java/forge/card/abilityfactory/AbilityFactoryGainControl.java svneol=native#text/plain src/main/java/forge/card/abilityfactory/AbilityFactoryMana.java svneol=native#text/plain src/main/java/forge/card/abilityfactory/AbilityFactoryPermanentState.java svneol=native#text/plain -src/main/java/forge/card/abilityfactory/AbilityFactoryPlay.java -text src/main/java/forge/card/abilityfactory/AbilityFactoryPump.java svneol=native#text/plain src/main/java/forge/card/abilityfactory/AbilityFactoryRegenerate.java svneol=native#text/plain src/main/java/forge/card/abilityfactory/AbilityFactoryRepeat.java -text @@ -12508,6 +12507,7 @@ src/main/java/forge/card/abilityfactory/ai/LifeGainAi.java -text src/main/java/forge/card/abilityfactory/ai/LifeLoseAi.java -text src/main/java/forge/card/abilityfactory/ai/LifeSetAi.java -text src/main/java/forge/card/abilityfactory/ai/MillAi.java -text +src/main/java/forge/card/abilityfactory/ai/PlayAi.java -text src/main/java/forge/card/abilityfactory/ai/PoisonAi.java -text src/main/java/forge/card/abilityfactory/ai/ProtectAi.java -text src/main/java/forge/card/abilityfactory/ai/ProtectAllAi.java -text @@ -12529,6 +12529,7 @@ src/main/java/forge/card/abilityfactory/effects/LifeGainEffect.java -text src/main/java/forge/card/abilityfactory/effects/LifeLoseEffect.java -text src/main/java/forge/card/abilityfactory/effects/LifeSetEffect.java -text src/main/java/forge/card/abilityfactory/effects/MillEffect.java -text +src/main/java/forge/card/abilityfactory/effects/PlayEffect.java -text src/main/java/forge/card/abilityfactory/effects/PoisonEffect.java -text src/main/java/forge/card/abilityfactory/effects/ProtectAllEffect.java -text src/main/java/forge/card/abilityfactory/effects/ProtectEffect.java -text diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactory.java b/src/main/java/forge/card/abilityfactory/AbilityFactory.java index d13dd1ab183..cf106f5f3d1 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactory.java +++ b/src/main/java/forge/card/abilityfactory/AbilityFactory.java @@ -905,13 +905,8 @@ public class AbilityFactory { } else if (this.api.equals("Play")) { - if (this.isAb) { - spellAbility = AbilityFactoryPlay.createAbilityPlay(this); - } else if (this.isSp) { - spellAbility = AbilityFactoryPlay.createSpellPlay(this); - } else if (this.isDb) { - spellAbility = AbilityFactoryPlay.createDrawbackPlay(this); - } + ai = new PlayAi(); + se = new PlayEffect(); } else if (this.api.equals("Poison")) { diff --git a/src/main/java/forge/card/abilityfactory/ai/PlayAi.java b/src/main/java/forge/card/abilityfactory/ai/PlayAi.java new file mode 100644 index 00000000000..70ed479d94f --- /dev/null +++ b/src/main/java/forge/card/abilityfactory/ai/PlayAi.java @@ -0,0 +1,83 @@ +package forge.card.abilityfactory.ai; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Random; + +import forge.Card; +import forge.CardLists; +import forge.Singletons; +import forge.card.abilityfactory.AbilityFactory; +import forge.card.abilityfactory.SpellAiLogic; +import forge.card.cardfactory.CardFactoryUtil; +import forge.card.cost.Cost; +import forge.card.cost.CostUtil; +import forge.card.spellability.SpellAbility; +import forge.card.spellability.Target; +import forge.game.player.Player; +import forge.game.zone.ZoneType; +import forge.util.MyRandom; + +public class PlayAi extends SpellAiLogic { + + /* (non-Javadoc) + * @see forge.card.abilityfactory.SpellAiLogic#chkAIDrawback(java.util.Map, forge.card.spellability.SpellAbility, forge.game.player.Player) + */ + @Override + public boolean chkAIDrawback(Map params, SpellAbility sa, Player aiPlayer) { + return true; + } + + @Override + public boolean canPlayAI(Player ai, java.util.Map params, SpellAbility sa) { + final Cost abCost = sa.getAbilityFactory().getAbCost(); + final Card source = sa.getAbilityFactory().getHostCard(); + + final Random r = MyRandom.getRandom(); + + if (abCost != null) { + // AI currently disabled for these costs + if (!CostUtil.checkSacrificeCost(ai, abCost, source)) { + return false; + } + + if (!CostUtil.checkLifeCost(ai, abCost, source, 4, null)) { + return false; + } + + if (!CostUtil.checkDiscardCost(ai, abCost, source)) { + return false; + } + + if (!CostUtil.checkRemoveCounterCost(abCost, source)) { + return false; + } + } + + // don't use this as a response + if (!Singletons.getModel().getGame().getStack().isEmpty()) { + return false; + } + + // prevent run-away activations - first time will always return true + boolean chance = r.nextFloat() <= Math.pow(.6667, sa.getRestrictions().getNumberTurnActivations()); + + List cards; + final Target tgt = sa.getTarget(); + if (tgt != null) { + ZoneType zone = tgt.getZone().get(0); + cards = CardLists.getValidCards(Singletons.getModel().getGame().getCardsIn(zone), tgt.getValidTgts(), ai, source); + if (cards.isEmpty()) { + return false; + } + tgt.addTarget(CardFactoryUtil.getBestAI(cards)); + } else if (!params.containsKey("Valid")) { + cards = new ArrayList(AbilityFactory.getDefinedCards(sa.getSourceCard(), params.get("Defined"), sa)); + if (cards.isEmpty()) { + return false; + } + } + return chance; + } +} \ No newline at end of file diff --git a/src/main/java/forge/card/abilityfactory/AbilityFactoryPlay.java b/src/main/java/forge/card/abilityfactory/effects/PlayEffect.java similarity index 54% rename from src/main/java/forge/card/abilityfactory/AbilityFactoryPlay.java rename to src/main/java/forge/card/abilityfactory/effects/PlayEffect.java index 77e57760c92..b27c83278b5 100644 --- a/src/main/java/forge/card/abilityfactory/AbilityFactoryPlay.java +++ b/src/main/java/forge/card/abilityfactory/effects/PlayEffect.java @@ -1,42 +1,23 @@ -/* - * Forge: Play Magic: the Gathering. - * Copyright (C) 2011 Forge Team - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package forge.card.abilityfactory; +package forge.card.abilityfactory.effects; import java.util.ArrayList; -import java.util.HashMap; import java.util.Iterator; import java.util.List; -import java.util.Random; +import java.util.Map; import com.google.common.base.Predicate; import forge.Card; import forge.CardCharacteristicName; - import forge.CardLists; import forge.GameActionUtil; import forge.Singletons; +import forge.card.abilityfactory.AbilityFactory; +import forge.card.abilityfactory.SpellEffect; import forge.card.cardfactory.CardFactoryUtil; import forge.card.cost.Cost; import forge.card.cost.CostMana; import forge.card.cost.CostPart; -import forge.card.cost.CostUtil; -import forge.card.spellability.AbilityActivated; import forge.card.spellability.AbilitySub; import forge.card.spellability.Spell; import forge.card.spellability.SpellAbility; @@ -47,159 +28,8 @@ import forge.game.player.Player; import forge.game.zone.ZoneType; import forge.gui.GuiChoose; import forge.item.CardDb; -import forge.util.MyRandom; - -/** - *

- * AbilityFactory_Copy class. - *

- * - * @author Forge - * @version $Id: AbilityFactoryCopy.java 13784 2012-02-03 16:29:28Z Sloth $ - */ -public final class AbilityFactoryPlay { - - // ************************************************************************* - // ************************* Play ************************************* - // ************************************************************************* - - /** - *

- * createAbilityPlay. - *

- * - * @param af - * a {@link forge.card.abilityfactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createAbilityPlay(final AbilityFactory af) { - class AbilityPlay extends AbilityActivated { - public AbilityPlay(final Card ca, final Cost co, final Target t) { - super(ca, co, t); - } - - @Override - public AbilityActivated getCopy() { - AbilityActivated res = new AbilityPlay(getSourceCard(), - getPayCosts(), getTarget() == null ? null : new Target(getTarget())); - CardFactoryUtil.copySpellAbility(this, res); - return res; - } - - private static final long serialVersionUID = 5232548517225345052L; - - @Override - public String getStackDescription() { - return AbilityFactoryPlay.playStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - return AbilityFactoryPlay.playCanPlayAI(getActivatingPlayer(), af, this); - } - - @Override - public void resolve() { - AbilityFactoryPlay.playResolve(af, this); - } - - @Override - public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryPlay.playTriggerAI(getActivatingPlayer(), af, this, mandatory); - } - } - final SpellAbility abCopySpell = new AbilityPlay(af.getHostCard(), af.getAbCost(), af.getAbTgt()); - - return abCopySpell; - } - - /** - *

- * createSpellPlay. - *

- * - * @param af - * a {@link forge.card.abilityfactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createSpellPlay(final AbilityFactory af) { - final SpellAbility spCopySpell = new Spell(af.getHostCard(), af.getAbCost(), af.getAbTgt()) { - private static final long serialVersionUID = 1878946074608916745L; - - @Override - public String getStackDescription() { - return AbilityFactoryPlay.playStackDescription(af, this); - } - - @Override - public boolean canPlayAI() { - return AbilityFactoryPlay.playCanPlayAI(getActivatingPlayer(), af, this); - } - - @Override - public void resolve() { - AbilityFactoryPlay.playResolve(af, this); - } - - @Override - public boolean canPlayFromEffectAI(final boolean mandatory, final boolean withOutManaCost) { - return AbilityFactoryPlay.playTriggerAI(getActivatingPlayer(), af, this, mandatory); - } - - }; - return spCopySpell; - } - - /** - *

- * createDrawbackPlay. - *

- * - * @param af - * a {@link forge.card.abilityfactory.AbilityFactory} object. - * @return a {@link forge.card.spellability.SpellAbility} object. - */ - public static SpellAbility createDrawbackPlay(final AbilityFactory af) { - class DrawbackPlay extends AbilitySub { - public DrawbackPlay(final Card ca, final Target t) { - super(ca, t); - } - - @Override - public AbilitySub getCopy() { - AbilitySub res = new DrawbackPlay(getSourceCard(), - getTarget() == null ? null : new Target(getTarget())); - CardFactoryUtil.copySpellAbility(this, res); - return res; - } - - private static final long serialVersionUID = 1927508119173644632L; - - @Override - public String getStackDescription() { - return AbilityFactoryPlay.playStackDescription(af, this); - } - - @Override - public void resolve() { - AbilityFactoryPlay.playResolve(af, this); - } - - @Override - public boolean chkAIDrawback() { - return true; - } - - @Override - public boolean doTrigger(final boolean mandatory) { - return AbilityFactoryPlay.playTriggerAI(getActivatingPlayer(), af, this, mandatory); - } - } - final SpellAbility dbCopySpell = new DrawbackPlay(af.getHostCard(), af.getAbTgt()); - - return dbCopySpell; - } +public class PlayEffect extends SpellEffect { /** *

* playStackDescription. @@ -211,10 +41,10 @@ public final class AbilityFactoryPlay { * a {@link forge.card.spellability.SpellAbility} object. * @return a {@link java.lang.String} object. */ - private static String playStackDescription(final AbilityFactory af, final SpellAbility sa) { + @Override + public String getStackDescription(Map params, SpellAbility sa) { final StringBuilder sb = new StringBuilder(); - final HashMap params = af.getMapParams(); - + if (!(sa instanceof AbilitySub)) { sb.append(sa.getSourceCard().getName()).append(" - "); } else { @@ -222,14 +52,14 @@ public final class AbilityFactoryPlay { } sb.append("Play "); ArrayList tgtCards; - + final Target tgt = sa.getTarget(); if (tgt != null) { tgtCards = tgt.getTargetCards(); } else { tgtCards = AbilityFactory.getDefinedCards(sa.getSourceCard(), params.get("Defined"), sa); } - + if (params.containsKey("Valid")) { sb.append("cards"); } else { @@ -245,99 +75,15 @@ public final class AbilityFactoryPlay { sb.append(" without paying the mana cost"); } sb.append("."); - + final AbilitySub abSub = sa.getSubAbility(); if (abSub != null) { sb.append(abSub.getStackDescription()); } - + return sb.toString(); } - /** - *

- * playCanPlayAI. - *

- * - * @param af - * a {@link forge.card.abilityfactory.AbilityFactory} object. - * @param sa - * a {@link forge.card.spellability.SpellAbility} object. - * @return a boolean. - */ - private static boolean playCanPlayAI(final Player ai, final AbilityFactory af, final SpellAbility sa) { - final Cost abCost = af.getAbCost(); - final Card source = af.getHostCard(); - final HashMap params = af.getMapParams(); - final Random r = MyRandom.getRandom(); - - if (abCost != null) { - // AI currently disabled for these costs - if (!CostUtil.checkSacrificeCost(ai, abCost, source)) { - return false; - } - - if (!CostUtil.checkLifeCost(ai, abCost, source, 4, null)) { - return false; - } - - if (!CostUtil.checkDiscardCost(ai, abCost, source)) { - return false; - } - - if (!CostUtil.checkRemoveCounterCost(abCost, source)) { - return false; - } - } - - // don't use this as a response - if (Singletons.getModel().getGame().getStack().size() != 0) { - return false; - } - - // prevent run-away activations - first time will always return true - boolean chance = r.nextFloat() <= Math.pow(.6667, sa.getRestrictions().getNumberTurnActivations()); - - List cards; - final Target tgt = sa.getTarget(); - if (tgt != null) { - ZoneType zone = tgt.getZone().get(0); - cards = CardLists.getValidCards(Singletons.getModel().getGame().getCardsIn(zone), tgt.getValidTgts(), ai, source); - if (cards.isEmpty()) { - return false; - } - tgt.addTarget(CardFactoryUtil.getBestAI(cards)); - } else if (!params.containsKey("Valid")) { - cards = new ArrayList(AbilityFactory.getDefinedCards(sa.getSourceCard(), params.get("Defined"), sa)); - if (cards.isEmpty()) { - return false; - } - } - return chance; - } - - /** - *

- * playTriggerAI. - *

- * - * @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 playTriggerAI(final Player ai, final AbilityFactory af, final SpellAbility sa, final boolean mandatory) { - - if (mandatory) { - return true; - } - - return playCanPlayAI(ai, af, sa); - } - /** *

* playResolve. @@ -348,8 +94,8 @@ public final class AbilityFactoryPlay { * @param sa * a {@link forge.card.spellability.SpellAbility} object. */ - private static void playResolve(final AbilityFactory af, final SpellAbility sa) { - final HashMap params = af.getMapParams(); + @Override + public void resolve(java.util.Map params, SpellAbility sa) { final Card source = sa.getSourceCard(); Player activator = sa.getActivatingPlayer(); boolean optional = params.containsKey("Optional"); @@ -546,4 +292,4 @@ public final class AbilityFactoryPlay { } } // end resolve -} // end class AbilityFactory_Copy +} // end class AbilityFactory_Copy \ No newline at end of file