From 8c0c8633b8d76fa509ed9c22a5d07a0455812d2f Mon Sep 17 00:00:00 2001 From: Maxmtg Date: Sat, 6 Apr 2013 07:08:32 +0000 Subject: [PATCH] Myr Superion added (no restrictions imposed on AI) --- .gitattributes | 1 + res/cardsfolder/i/imperiosaur.txt | 1 + res/cardsfolder/m/myr_superion.txt | 9 +++++ .../java/forge/card/cost/CostPartMana.java | 4 +-- .../forge/card/mana/ManaCostBeingPaid.java | 13 +++++-- src/main/java/forge/card/mana/ManaPool.java | 35 ++++++++----------- .../forge/control/input/InputPayManaBase.java | 15 +++++--- 7 files changed, 49 insertions(+), 29 deletions(-) create mode 100644 res/cardsfolder/m/myr_superion.txt diff --git a/.gitattributes b/.gitattributes index 51a93acab50..9c970317527 100644 --- a/.gitattributes +++ b/.gitattributes @@ -7029,6 +7029,7 @@ res/cardsfolder/m/myr_reservoir.txt -text res/cardsfolder/m/myr_retriever.txt svneol=native#text/plain res/cardsfolder/m/myr_servitor.txt -text res/cardsfolder/m/myr_sire.txt svneol=native#text/plain +res/cardsfolder/m/myr_superion.txt -text res/cardsfolder/m/myr_turbine.txt svneol=native#text/plain res/cardsfolder/m/myr_welder.txt -text res/cardsfolder/m/myrsmith.txt svneol=native#text/plain diff --git a/res/cardsfolder/i/imperiosaur.txt b/res/cardsfolder/i/imperiosaur.txt index d0d40f290cb..1eca1c251b0 100644 --- a/res/cardsfolder/i/imperiosaur.txt +++ b/res/cardsfolder/i/imperiosaur.txt @@ -3,6 +3,7 @@ ManaCost:2 G G Types:Creature Lizard Text:(NOTE: "Spend only mana produced by basic lands to cast Imperiosaur." is not implemented.) PT:5/5 +K:FullCost:Mana<2 G G\Basic> SVar:Picture:http://resources.wizards.com/magic/cards/fut/en-us/card130634.jpg Oracle:Spend only mana produced by basic lands to cast Imperiosaur. SetInfo:FUT Uncommon \ No newline at end of file diff --git a/res/cardsfolder/m/myr_superion.txt b/res/cardsfolder/m/myr_superion.txt new file mode 100644 index 00000000000..90fb10d4ccf --- /dev/null +++ b/res/cardsfolder/m/myr_superion.txt @@ -0,0 +1,9 @@ +Name:Myr Superion +ManaCost:2 +Types:Artifact Creature Myr +PT:5/6 +SVar:FullCost:Mana<2\Creature> +SVar:RemRandomDeck:True +SVar:Picture:http://www.wizards.com/global/images/magic/general/myr_superion.jpg +Oracle:Spend only mana produced by creatures to cast Myr Superion. +SetInfo:NPH Rare \ No newline at end of file diff --git a/src/main/java/forge/card/cost/CostPartMana.java b/src/main/java/forge/card/cost/CostPartMana.java index e175a97c58e..1985bad8fb6 100644 --- a/src/main/java/forge/card/cost/CostPartMana.java +++ b/src/main/java/forge/card/cost/CostPartMana.java @@ -118,7 +118,7 @@ public class CostPartMana extends CostPart { @Override public final boolean payHuman(final SpellAbility ability, final GameState game) { final Card source = ability.getSourceCard(); - ManaCostBeingPaid toPay = new ManaCostBeingPaid(getManaToPay()); + ManaCostBeingPaid toPay = new ManaCostBeingPaid(getManaToPay(), restriction); boolean xWasBilled = false; if (this.getAmountOfX() > 0 && !ability.getSVar("X").equals("Count$xPaid")) { // announce X will overwrite whatever was in card script @@ -141,7 +141,7 @@ public class CostPartMana extends CostPart { FThreads.setInputAndWait(inpPayment); if(!inpPayment.isPaid()) return false; - } + } if (this.getAmountOfX() > 0) { if( !ability.isAnnouncing("X") && !xWasBilled) { source.setXManaCostPaid(0); diff --git a/src/main/java/forge/card/mana/ManaCostBeingPaid.java b/src/main/java/forge/card/mana/ManaCostBeingPaid.java index 2c809203e5d..9dcc552502a 100644 --- a/src/main/java/forge/card/mana/ManaCostBeingPaid.java +++ b/src/main/java/forge/card/mana/ManaCostBeingPaid.java @@ -97,6 +97,7 @@ public class ManaCostBeingPaid { private int cntX = 0; private final ArrayList manaNeededToAvoidNegativeEffect = new ArrayList(); private final ArrayList manaPaidToAvoidNegativeEffect = new ArrayList(); + private final String sourceRestriction; // manaCost can be like "0", "3", "G", "GW", "10", "3 GW", "10 GW" // or "split hybrid mana" like "2/G 2/G", "2/B 2/B 2/B" @@ -111,12 +112,14 @@ public class ManaCostBeingPaid { * a {@link java.lang.String} object. */ public ManaCostBeingPaid(String sCost) { - this("0".equals(sCost) || "C".equals(sCost) || sCost.isEmpty() ? null : new ManaCost(new ManaCostParser(sCost))); + this("0".equals(sCost) || "C".equals(sCost) || sCost.isEmpty() ? ManaCost.ZERO : new ManaCost(new ManaCostParser(sCost))); } public ManaCostBeingPaid(ManaCost manaCost) { - if ( null == manaCost ) - return; + this(manaCost, null); + } + public ManaCostBeingPaid(ManaCost manaCost, String srcRestriction) { + sourceRestriction = srcRestriction; for (ManaCostShard shard : manaCost.getShards()) { if (shard == ManaCostShard.X) { @@ -860,5 +863,9 @@ public class ManaCostBeingPaid { } return usableColors; + } + + public String getSourceRestriction() { + return sourceRestriction; } } diff --git a/src/main/java/forge/card/mana/ManaPool.java b/src/main/java/forge/card/mana/ManaPool.java index d5a48fd5f25..dc06eae51be 100644 --- a/src/main/java/forge/card/mana/ManaPool.java +++ b/src/main/java/forge/card/mana/ManaPool.java @@ -52,11 +52,6 @@ public class ManaPool { /** Constant map. */ private static final Map MAP = new HashMap(); - - /** Constant colors="WUBRG". */ - public static final String COLORS = "WUBRG"; - /** Constant mcolors="1WUBRG". */ - public static final String M_COLORS = "1WUBRG"; private final Player owner; /** @@ -228,7 +223,7 @@ public class ManaPool { * a {@link forge.card.spellability.SpellAbility} object. * @return a {@link forge.card.mana.Mana} object. */ - private Mana getMana(final String manaStr, final SpellAbility saBeingPaidFor) { + private Mana getMana(final String manaStr, final SpellAbility saBeingPaidFor, String restriction) { final ArrayList pool = this.floatingMana; //System.out.format("ManaStr='%s' ...", manaStr); @@ -249,6 +244,9 @@ public class ManaPool { continue; } + if( StringUtils.isNotBlank(restriction) && !thisMana.getSourceCard().isType(restriction) ) + continue; + // prefer colorless mana to spend int weight = thisMana.isColorless() ? 5 : 0; @@ -438,7 +436,7 @@ public class ManaPool { for(String part : splitCost) { int loops = StringUtils.isNumeric(part) ? Integer.parseInt(part) : 1; for(int i = 0; i < loops; i++ ) { - final Mana mana = this.getMana(part, saBeingPaidFor); + final Mana mana = this.getMana(part, saBeingPaidFor, manaCost.getSourceRestriction()); if (mana != null) { manaCost.payMana(mana); manaPaid.add(mana); @@ -466,27 +464,24 @@ public class ManaPool { * a {@link java.lang.String} object. * @return a {@link forge.card.mana.ManaCostBeingPaid} object. */ - public final ManaCostBeingPaid payManaFromPool(final SpellAbility saBeingPaidFor, final ManaCostBeingPaid manaCost, final String manaStr) { + public final void payManaFromPool(final SpellAbility saBeingPaidFor, final ManaCostBeingPaid manaCost, final String manaStr) { if (manaStr.trim().equals("") || manaCost.isPaid()) { - return manaCost; + return; } - final ArrayList manaPaid = saBeingPaidFor.getPayingMana(); - // get a mana of this type from floating, bail if none available - final Mana mana = this.getMana(manaStr, saBeingPaidFor); + final Mana mana = this.getMana(manaStr, saBeingPaidFor, manaCost.getSourceRestriction()); if (mana == null) { - return manaCost; // no matching mana in the pool + return; // no matching mana in the pool } else if (manaCost.isNeeded(mana)) { - manaCost.payMana(mana); - manaPaid.add(mana); - this.removeManaFrom(this.floatingMana, mana); - if (mana.addsNoCounterMagic() && saBeingPaidFor.getSourceCard() != null) { - saBeingPaidFor.getSourceCard().setCanCounter(false); - } + manaCost.payMana(mana); + saBeingPaidFor.getPayingMana().add(mana); + this.removeManaFrom(this.floatingMana, mana); + if (mana.addsNoCounterMagic() && saBeingPaidFor.getSourceCard() != null) { + saBeingPaidFor.getSourceCard().setCanCounter(false); + } } - return manaCost; } /** diff --git a/src/main/java/forge/control/input/InputPayManaBase.java b/src/main/java/forge/control/input/InputPayManaBase.java index f70fe3a52b8..15185d86b49 100644 --- a/src/main/java/forge/control/input/InputPayManaBase.java +++ b/src/main/java/forge/control/input/InputPayManaBase.java @@ -3,6 +3,9 @@ package forge.control.input; import java.util.ArrayList; import java.util.HashSet; import java.util.List; + +import org.apache.commons.lang3.StringUtils; + import forge.Card; import forge.CardUtil; import forge.Constant; @@ -54,7 +57,7 @@ public abstract class InputPayManaBase extends InputSyncronizedBase implements I } public void selectManaPool(String color) { - useManaFromPool(color, this.manaCost); + useManaFromPool(color); } /** @@ -113,6 +116,7 @@ public abstract class InputPayManaBase extends InputSyncronizedBase implements I * * @return ManaCost the amount of mana remaining to be paid after the mana is activated */ + protected void useManaFromPool(String color) { useManaFromPool(color, manaCost); } protected void useManaFromPool(String color, ManaCostBeingPaid manaCost) { ManaPool mp = player.getManaPool(); @@ -122,7 +126,7 @@ public abstract class InputPayManaBase extends InputSyncronizedBase implements I manaStr = CardUtil.getShortColor(color); } - this.manaCost = mp.payManaFromPool(saPaidFor, manaCost, manaStr); + mp.payManaFromPool(saPaidFor, manaCost, manaStr); onManaAbilityPlayed(null); showMessage(); @@ -146,8 +150,7 @@ public abstract class InputPayManaBase extends InputSyncronizedBase implements I if (card.getController() != player) { return; } - - + final StringBuilder cneeded = new StringBuilder(); final StringBuilder colorRequired = new StringBuilder(); boolean choice = true; @@ -166,6 +169,10 @@ public abstract class InputPayManaBase extends InputSyncronizedBase implements I List abilities = new ArrayList(); // you can't remove unneeded abilities inside a for(am:abilities) loop :( + final String typeRes = manaCost.getSourceRestriction(); + if( StringUtils.isNotBlank(typeRes) && !card.isType(typeRes)) + return; + for (SpellAbility ma : card.getManaAbility()) { ma.setActivatingPlayer(player); AbilityManaPart m = null;