From 1e3f2d8cd4afa551d01c4ab09b0bbb67af52daaf Mon Sep 17 00:00:00 2001 From: jendave Date: Sat, 6 Aug 2011 10:55:30 +0000 Subject: [PATCH] -Added remaining ability cost reducers -Added Elixir of Immortality and fixed Feldon's Cane description -Added Sprouting Phytohydra --- .gitattributes | 5 +++ res/cardsfolder/elixir_of_immortality.txt | 7 +++ res/cardsfolder/feldons_cane.txt | 2 +- res/cardsfolder/fluctuator.txt | 8 ++++ res/cardsfolder/heartstone.txt | 8 ++++ res/cardsfolder/power_artifact.txt | 9 ++++ res/cardsfolder/sprouting_phytohydra.txt | 9 ++++ src/forge/CardFactory.java | 44 +++++++++++++++++- src/forge/CardFactoryUtil.java | 6 ++- src/forge/CardFactory_Creatures.java | 54 +++++++++++++++++++++++ src/forge/Cost_Payment.java | 2 +- src/forge/GameAction.java | 19 +++++--- src/forge/Input_PayCostMana.java | 6 +-- src/forge/SpellAbility.java | 9 ++++ 14 files changed, 175 insertions(+), 13 deletions(-) create mode 100644 res/cardsfolder/elixir_of_immortality.txt create mode 100644 res/cardsfolder/fluctuator.txt create mode 100644 res/cardsfolder/heartstone.txt create mode 100644 res/cardsfolder/power_artifact.txt create mode 100644 res/cardsfolder/sprouting_phytohydra.txt diff --git a/.gitattributes b/.gitattributes index c36f045718f..bdd7d5c8e70 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1340,6 +1340,7 @@ res/cardsfolder/elfhame_palace.txt -text svneol=native#text/plain res/cardsfolder/elite_archers.txt -text svneol=native#text/plain res/cardsfolder/elite_cat_warrior.txt -text svneol=native#text/plain res/cardsfolder/elite_vanguard.txt -text svneol=native#text/plain +res/cardsfolder/elixir_of_immortality.txt svneol=native#text/plain res/cardsfolder/elixir_of_vitality.txt -text svneol=native#text/plain res/cardsfolder/elspeth_knight_errant.txt -text svneol=native#text/plain res/cardsfolder/elspeth_tirel.txt -text svneol=native#text/plain @@ -1647,6 +1648,7 @@ res/cardsfolder/flowstone_surge.txt -text svneol=native#text/plain res/cardsfolder/flowstone_thopter.txt -text svneol=native#text/plain res/cardsfolder/flowstone_wall.txt -text svneol=native#text/plain res/cardsfolder/flowstone_wyvern.txt -text svneol=native#text/plain +res/cardsfolder/fluctuator.txt svneol=native#text/plain res/cardsfolder/flying_carpet.txt -text svneol=native#text/plain res/cardsfolder/flying_men.txt -text svneol=native#text/plain res/cardsfolder/fodder_cannon.txt -text svneol=native#text/plain @@ -2063,6 +2065,7 @@ res/cardsfolder/heart_sliver.txt -text svneol=native#text/plain res/cardsfolder/heart_warden.txt -text svneol=native#text/plain res/cardsfolder/hearthfire_hobgoblin.txt -text svneol=native#text/plain res/cardsfolder/heartmender.txt -text svneol=native#text/plain +res/cardsfolder/heartstone.txt svneol=native#text/plain res/cardsfolder/heartwood_dryad.txt -text svneol=native#text/plain res/cardsfolder/heartwood_shard.txt -text svneol=native#text/plain res/cardsfolder/heartwood_treefolk.txt -text svneol=native#text/plain @@ -3372,6 +3375,7 @@ res/cardsfolder/pongify.txt -text svneol=native#text/plain res/cardsfolder/porphyry_nodes.txt -text svneol=native#text/plain res/cardsfolder/pouncing_jaguar.txt -text svneol=native#text/plain res/cardsfolder/power_armor.txt -text svneol=native#text/plain +res/cardsfolder/power_artifact.txt svneol=native#text/plain res/cardsfolder/power_matrix.txt -text svneol=native#text/plain res/cardsfolder/power_surge.txt -text svneol=native#text/plain res/cardsfolder/pradesh_gypsies.txt -text svneol=native#text/plain @@ -4254,6 +4258,7 @@ res/cardsfolder/springing_tiger.txt -text svneol=native#text/plain res/cardsfolder/springjack_shepherd.txt -text svneol=native#text/plain res/cardsfolder/sprout.txt -text svneol=native#text/plain res/cardsfolder/sprout_swarm.txt -text svneol=native#text/plain +res/cardsfolder/sprouting_phytohydra.txt svneol=native#text/plain res/cardsfolder/sprouting_thrinax.txt -text svneol=native#text/plain res/cardsfolder/sprouting_vines.txt -text svneol=native#text/plain res/cardsfolder/spur_grappler.txt -text svneol=native#text/plain diff --git a/res/cardsfolder/elixir_of_immortality.txt b/res/cardsfolder/elixir_of_immortality.txt new file mode 100644 index 00000000000..27850defd93 --- /dev/null +++ b/res/cardsfolder/elixir_of_immortality.txt @@ -0,0 +1,7 @@ +Name:Elixir of Immortality +ManaCost:1 +Types:Artifact +Text:no text +SVar:Rarity:Uncommon +SVar:Picture:http://www.wizards.com/global/images/magic/general/elixir_of_immortality.jpg +End diff --git a/res/cardsfolder/feldons_cane.txt b/res/cardsfolder/feldons_cane.txt index d6d3f911192..6e9ed442bb1 100644 --- a/res/cardsfolder/feldons_cane.txt +++ b/res/cardsfolder/feldons_cane.txt @@ -1,7 +1,7 @@ Name:Feldon's Cane ManaCost:1 Types:Artifact -Text:tap, Exile Feldon's Cane: Shuffle your graveyard into your library. +Text:no text SVar:RemAIDeck:True SVar:Rarity:Uncommon SVar:Picture:http://www.wizards.com/global/images/magic/general/feldons_cane.jpg diff --git a/res/cardsfolder/fluctuator.txt b/res/cardsfolder/fluctuator.txt new file mode 100644 index 00000000000..8f9dca3a209 --- /dev/null +++ b/res/cardsfolder/fluctuator.txt @@ -0,0 +1,8 @@ +Name:Fluctuator +ManaCost:2 +Types:Artifact +Text:Cycling abilities you activate cost you up to 2 less to activate. +K:CostChange:Player:Less:2:Ability_Cycling:All:All:TargetInHand +SVar:Rarity:Rare +SVar:Picture:http://www.wizards.com/global/images/magic/general/training_grounds.jpg +End diff --git a/res/cardsfolder/heartstone.txt b/res/cardsfolder/heartstone.txt new file mode 100644 index 00000000000..1163bdb7d24 --- /dev/null +++ b/res/cardsfolder/heartstone.txt @@ -0,0 +1,8 @@ +Name:Heartstone +ManaCost:3 +Types:Artifact +Text:Activated abilities of creatures you control cost 1 less to activate. This effect can't reduce the amount of mana an ability costs to activate to less than one mana. +K:CostChange:Player:Less:1:Ability:All:Creature:TargetInPlay +SVar:Rarity:Rare +SVar:Picture:http://www.wizards.com/global/images/magic/general/heartstone.jpg +End diff --git a/res/cardsfolder/power_artifact.txt b/res/cardsfolder/power_artifact.txt new file mode 100644 index 00000000000..c596d533337 --- /dev/null +++ b/res/cardsfolder/power_artifact.txt @@ -0,0 +1,9 @@ +Name:Power Artifact +ManaCost:U U +Types:Enchantment Aura +Text:Enchanted artifact's activated abilities cost 2 less to activate. This effect can't reduce the amount of mana an ability costs to activate to less than one mana. +K:CostChange:Player:Less:2:Enchanted:All:Artifact:TargetInPlay +K:Enchant Artifact +SVar:Rarity:Rare +SVar:Picture:http://www.wizards.com/global/images/magic/general/power_artifact.jpg +End diff --git a/res/cardsfolder/sprouting_phytohydra.txt b/res/cardsfolder/sprouting_phytohydra.txt new file mode 100644 index 00000000000..29e84c1f6c9 --- /dev/null +++ b/res/cardsfolder/sprouting_phytohydra.txt @@ -0,0 +1,9 @@ +Name:Sprouting Phytohydra +ManaCost:4 G +Types:Creature Plant Hydra +Text:Whenever Sprouting Phytohydra is dealt damage, you may put a token that's a copy of Sprouting Phytohydra onto the battlefield. +PT:0/2 +K:Defender +SVar:Rarity:Rare +SVar:Picture:http://www.wizards.com/global/images/magic/general/sprouting_phytohydra.jpg +End diff --git a/src/forge/CardFactory.java b/src/forge/CardFactory.java index f0f9259b757..8cf9f0dfda0 100644 --- a/src/forge/CardFactory.java +++ b/src/forge/CardFactory.java @@ -6659,7 +6659,11 @@ public class CardFactory implements NewConstants { list = list.getType("Creature"); for(int i = 0; i < list.size(); i++) { - if(CardFactoryUtil.canDamage(card, list.get(i))) list.get(i).addDamage(1, card); + if(CardFactoryUtil.canDamage(card, list.get(i))){ + HashMap m = new HashMap(); + m.put(card, 1); + list.get(i).addDamage(m); + } } AllZone.HumanPlayer.addDamage(1, card); @@ -10489,7 +10493,45 @@ public class CardFactory implements NewConstants { StringBuilder sb = new StringBuilder(); sb.append(cardName).append(" - Player shuffles grave into library."); ability.setStackDescription(sb.toString()); + ability.setDescription("tap, Exile CARDNAME: Shuffle your graveyard into your library."); + card.addSpellAbility(ability); + }//*************** END ************ END ************************** + + //*************** START *********** START ************************** + else if(cardName.equals("Elixir of Immortality")) { + /* + * 2, Tap: You gain 5 life. Shuffle Elixir of Immortality and your graveyard into your library. + */ + final Ability_Tap ability = new Ability_Tap(card, "2") { + private static final long serialVersionUID = -1299603105585632846L; + + @Override + public void resolve() { + final Player player = card.getController(); + CardList grave = AllZoneUtil.getPlayerGraveyard(player); + PlayerZone lib = AllZone.getZone(Constant.Zone.Library, player); + AllZone.GameAction.moveToLibrary(card); + + for(Card c:grave) { + lib.add(c); + } + AllZone.getZone(Constant.Zone.Graveyard, player).reset(); + player.shuffle(); + player.gainLife(5, card); + } + + @Override + public boolean canPlayAI() { + PlayerZone lib = AllZone.getZone(Constant.Zone.Library, AllZone.ComputerPlayer); + return lib.size() < 5 || AllZone.ComputerPlayer.getLife() < 3; + } + + };//SpellAbility + StringBuilder sb = new StringBuilder(); + sb.append(cardName).append(" - Player shuffles grave into library."); + ability.setStackDescription(sb.toString()); + ability.setDescription("2, Tap: You gain 5 life. Shuffle Elixir of Immortality and your graveyard into your library."); card.addSpellAbility(ability); }//*************** END ************ END ************************** diff --git a/src/forge/CardFactoryUtil.java b/src/forge/CardFactoryUtil.java index a7285eff010..61fe0622afb 100644 --- a/src/forge/CardFactoryUtil.java +++ b/src/forge/CardFactoryUtil.java @@ -1636,8 +1636,9 @@ public class CardFactoryUtil { sourceCard.cycle(); } }; + cycle.setIsCycling(true); StringBuilder sbDesc = new StringBuilder(); - sbDesc.append("Cycling (").append(abCost.toString()).append(" Draw a card.)"); + sbDesc.append("Cycling ").append(cycle.getManaCost()).append(" (").append(abCost.toString()).append(" Draw a card.)"); cycle.setDescription(sbDesc.toString()); StringBuilder sbStack = new StringBuilder(); @@ -1710,7 +1711,8 @@ public class CardFactoryUtil { }; if(type.contains("Basic")) description = "basic land"; else description = type; - + + cycle.setIsCycling(true); StringBuilder sbDesc = new StringBuilder(); sbDesc.append(description).append("cycling (").append(abCost.toString()).append(" Search your library for a "); sbDesc.append(description).append(" card, reveal it, and put it into your hand. Then shuffle your library."); diff --git a/src/forge/CardFactory_Creatures.java b/src/forge/CardFactory_Creatures.java index a8b55131851..7953e7c76ca 100644 --- a/src/forge/CardFactory_Creatures.java +++ b/src/forge/CardFactory_Creatures.java @@ -17363,6 +17363,60 @@ public class CardFactory_Creatures { return newCard; }//*************** END ************ END ************************** + //*************** START *********** START ************************** + else if(cardName.equals("Sprouting Phytohydra")) { + final Card newCard = new Card() { + @Override + public void addDamage(HashMap map) { + final HashMap m = map; + final Ability ability = new Ability(card, "0") { + @Override + public void resolve() { + if(getController().isHuman() && + AllZone.Display.getChoice("Copy " + getSourceCard(), + new String[] {"Yes", "No"}).equals("No")) + return;//* + PlayerZone play = AllZone.getZone(Constant.Zone.Play, getSourceCard().getController()); + CardList DoublingSeasons = new CardList(play.getCards()); + DoublingSeasons = DoublingSeasons.getName("Doubling Season"); + PlayerZone_ComesIntoPlay.SimultaneousEntry = true; + double Count = DoublingSeasons.size(); + Count = Math.pow(2,Count); + for(int i = 0; i < Count; i++) { + if(i + 1== Count) PlayerZone_ComesIntoPlay.SimultaneousEntry = false; + Card Copy = AllZone.CardFactory.copyCardintoNew(getSourceCard()); + Copy.setToken(true); + Copy.setController(getSourceCard().getController()); + play.add(Copy); + }// */ + } + }; + ability.setStackDescription(toString() + " - you may put a token that's a copy of " + getName() + " onto the battlefield."); + AllZone.Stack.add(ability); + + for(Entry entry : m.entrySet()) { + this.addDamage(entry.getValue(), entry.getKey()); + } + + } + }; + + newCard.setOwner(card.getOwner()); + newCard.setController(card.getController()); + + newCard.setManaCost(card.getManaCost()); + newCard.setName(card.getName()); + newCard.setType(card.getType()); + newCard.setText(card.getSpellText()); + newCard.setBaseAttack(card.getBaseAttack()); + newCard.setBaseDefense(card.getBaseDefense()); + + newCard.addSpellAbility(new Spell_Permanent(newCard)); + + newCard.setSVars(card.getSVars()); + + return newCard; + }//*************** END ************ END ************************** //*************** START *********** START ************************** else if(cardName.equals("Thoughtcutter Agent")) { diff --git a/src/forge/Cost_Payment.java b/src/forge/Cost_Payment.java index fc54812ec49..17179bb99a7 100644 --- a/src/forge/Cost_Payment.java +++ b/src/forge/Cost_Payment.java @@ -204,7 +204,7 @@ public class Cost_Payment { return false; } - if (!payMana && !cost.hasNoManaCost()){ // pay mana here + if (!payMana /*&& !cost.hasNoManaCost()*/){ // pay mana here changeInput.stopSetNext(new Input_PayCostMana(this)); return false; } diff --git a/src/forge/GameAction.java b/src/forge/GameAction.java index bb569e51574..b21d1e790e4 100644 --- a/src/forge/GameAction.java +++ b/src/forge/GameAction.java @@ -2886,7 +2886,8 @@ public class GameAction { Cards_In_Play.add(originalCard); String Mana = manaCost.toString(); CardList Player_Play = new CardList(AllZone.getZone(Constant.Zone.Play, sa.getSourceCard().getController()).getCards()); - int XBonus = 0; + CardList Player_Hand = new CardList(AllZone.getZone(Constant.Zone.Hand, sa.getSourceCard().getController()).getCards()); + int XBonus = 0; int Max = 25; if(sa.isXCost() && !sa.getSourceCard().isCopiedSpell()) sa.getSourceCard().setXManaCostPaid(0); if(sa.isMultiKicker()) CostCutting_GetMultiMickerManaCostPaid_Colored = ""; @@ -2947,8 +2948,9 @@ public class GameAction { } if((k[1].equals("Player") && card.getController().equals(sa.getSourceCard().getController()) || (k[1].equals("Opponent") && card.getController().equals(sa.getSourceCard().getController().getOpponent())) || k[1].equals("All")) - && ((k[4].equals("Spell") && sa.isSpell() == true) || (k[4].equals("Ability") && sa.isAbility() == true) - || (k[4].equals("Self") && originalCard.equals(card)) || k[4].equals("All")) + && ((k[4].equals("Spell") && sa.isSpell() == true) || (k[4].equals("Ability") && sa.isAbility() == true) + || (k[4].startsWith("Ability_Cycling") && sa.isCycling()) || (k[4].equals("Self") && originalCard.equals(card)) + || (k[4].equals("Enchanted") && originalCard.getEnchantedBy().contains(card)) || k[4].equals("All")) && ((CardUtil.getColors(sa.getSourceCard()).contains(k[5])) || k[5].equals("All")) && ((sa.getSourceCard().isType(k[6])) || (!(sa.getSourceCard().isType(k[6])) && k[7].contains("NonType")) || k[6].equals("All"))) { @@ -2958,6 +2960,9 @@ public class GameAction { if(k[7].contains("TargetInPlay")) { if(!Player_Play.contains(sa.getSourceCard())) k[3] = "0"; } + if(k[7].contains("TargetInHand")) { + if(!Player_Hand.contains(sa.getSourceCard())) k[3] = "0"; + } if(k[7].contains("NonType")) { if(originalCard.isType(k[6])) k[3] = "0"; } @@ -3087,7 +3092,8 @@ public class GameAction { if((k[1].equals("Player") && card.getController().equals(sa.getSourceCard().getController()) || (k[1].equals("Opponent") && card.getController().equals(sa.getSourceCard().getController().getOpponent())) || k[1].equals("All")) && ((k[4].equals("Spell") && sa.isSpell() == true) || (k[4].equals("Ability") && sa.isAbility() == true) - || (k[4].equals("Self") && originalCard.equals(card)) || k[4].equals("All")) + || (k[4].startsWith("Ability_Cycling") && sa.isCycling()) || (k[4].equals("Self") && originalCard.equals(card)) + || (k[4].equals("Enchanted") && originalCard.getEnchantedBy().contains(card)) || k[4].equals("All")) && ((CardUtil.getColors(sa.getSourceCard()).contains(k[5])) || k[5].equals("All")) /** * Chris added a test for Changeling. @@ -3103,6 +3109,9 @@ public class GameAction { if(k[7].contains("TargetInPlay")) { if(!Player_Play.contains(sa.getSourceCard())) k[3] = "0"; } + if(k[7].contains("TargetInHand")) { + if(!Player_Hand.contains(sa.getSourceCard())) k[3] = "0"; + } if(k[7].contains("NonType")) { if(originalCard.isType(k[6])) k[3] = "0"; } @@ -3176,7 +3185,7 @@ public class GameAction { } Mana = Mana.trim(); if(Mana.length() == 0 || Mana.equals("0")) { - if(sa.isSpell()) Mana = "0"; + if(sa.isSpell() || sa.isCycling()) Mana = "0"; else { Mana = "1"; } diff --git a/src/forge/Input_PayCostMana.java b/src/forge/Input_PayCostMana.java index d6bc6f56eee..c0969ad84b2 100644 --- a/src/forge/Input_PayCostMana.java +++ b/src/forge/Input_PayCostMana.java @@ -20,8 +20,8 @@ public class Input_PayCostMana extends Input { manaCost = new ManaCost("0"); } else { String mana = payment.getCost().getMana(); - manaCost = AllZone.GameAction.getSpellCostChange(sa, new ManaCost(mana)); - } + manaCost = new ManaCost(mana);//AllZone.GameAction.getSpellCostChange(sa, new ManaCost(mana)); + } //^ already factored into costPayment. } else { @@ -69,7 +69,7 @@ public class Input_PayCostMana extends Input { public void showMessage() { ButtonUtil.enableOnlyCancel(); AllZone.Display.showMessage("Pay Mana Cost: " + manaCost.toString()); - if(manaCost.isPaid() && !new ManaCost(originalManaCost).isPaid()) + if(manaCost.isPaid() /*&& !new ManaCost(originalManaCost).isPaid()*/) done(); } } diff --git a/src/forge/SpellAbility.java b/src/forge/SpellAbility.java index 43455e06509..8a26ec03ed1 100644 --- a/src/forge/SpellAbility.java +++ b/src/forge/SpellAbility.java @@ -38,6 +38,7 @@ public abstract class SpellAbility { private boolean xCost = false; private boolean kickerAbility = false; private boolean kothThirdAbility = false; + private boolean cycling = false; private Input beforePayMana; private Input afterResolve; @@ -197,6 +198,14 @@ public abstract class SpellAbility { return xCost; } + public void setIsCycling(boolean b) { + cycling = b; + } + + public boolean isCycling(){ + return cycling; + } + public void setSourceCard(Card c) { sourceCard = c; }