From a504833663b94d4e3802e96f4cb868b4e4fdafed Mon Sep 17 00:00:00 2001 From: Hellfish Date: Tue, 18 Oct 2011 15:22:23 +0000 Subject: [PATCH] *Added Epic keyword. *Added Endless Swarm Enduring Ideal Eternal Dominion Neverending Torment Undying Flames can't be done in script currently. --- .gitattributes | 4 ++ res/cardsfolder/d/dream_thief.txt | 1 + res/cardsfolder/e/endless_swarm.txt | 13 +++++ res/cardsfolder/e/enduring_ideal.txt | 12 +++++ res/cardsfolder/e/eternal_dominion.txt | 12 +++++ res/cardsfolder/n/neverending_torment.txt | 11 ++++ src/main/java/forge/GameAction.java | 2 + src/main/java/forge/Player.java | 16 ++++++ .../card/cardFactory/CardFactoryUtil.java | 52 +++++++++++++++++++ .../java/forge/card/spellability/Spell.java | 4 ++ 10 files changed, 127 insertions(+) create mode 100644 res/cardsfolder/e/endless_swarm.txt create mode 100644 res/cardsfolder/e/enduring_ideal.txt create mode 100644 res/cardsfolder/e/eternal_dominion.txt create mode 100644 res/cardsfolder/n/neverending_torment.txt diff --git a/.gitattributes b/.gitattributes index e3ea2975300..43b7843355a 100644 --- a/.gitattributes +++ b/.gitattributes @@ -2411,8 +2411,10 @@ res/cardsfolder/e/endangered_armodon.txt svneol=native#text/plain res/cardsfolder/e/endbringers_revel.txt svneol=native#text/plain res/cardsfolder/e/endless_cockroaches.txt svneol=native#text/plain res/cardsfolder/e/endless_ranks_of_the_dead.txt -text +res/cardsfolder/e/endless_swarm.txt -text res/cardsfolder/e/endoskeleton.txt svneol=native#text/plain res/cardsfolder/e/endure.txt -text +res/cardsfolder/e/enduring_ideal.txt -text res/cardsfolder/e/enemy_of_the_guildpact.txt svneol=native#text/plain res/cardsfolder/e/energizer.txt svneol=native#text/plain res/cardsfolder/e/energy_arc.txt svneol=native#text/plain @@ -2484,6 +2486,7 @@ res/cardsfolder/e/essence_warden.txt svneol=native#text/plain res/cardsfolder/e/etched_champion.txt svneol=native#text/plain res/cardsfolder/e/etched_monstrosity.txt svneol=native#text/plain res/cardsfolder/e/etched_oracle.txt svneol=native#text/plain +res/cardsfolder/e/eternal_dominion.txt -text res/cardsfolder/e/eternal_dragon.txt svneol=native#text/plain res/cardsfolder/e/eternal_flame.txt svneol=native#text/plain res/cardsfolder/e/eternal_warrior.txt svneol=native#text/plain @@ -5409,6 +5412,7 @@ res/cardsfolder/n/neurok_invisimancer.txt svneol=native#text/plain res/cardsfolder/n/neurok_prodigy.txt svneol=native#text/plain res/cardsfolder/n/neurok_replica.txt svneol=native#text/plain res/cardsfolder/n/neurok_spy.txt svneol=native#text/plain +res/cardsfolder/n/neverending_torment.txt -text res/cardsfolder/n/nevermaker.txt svneol=native#text/plain res/cardsfolder/n/nevinyrrals_disk.txt svneol=native#text/plain res/cardsfolder/n/new_benalia.txt svneol=native#text/plain diff --git a/res/cardsfolder/d/dream_thief.txt b/res/cardsfolder/d/dream_thief.txt index 1ea18813bde..34f506d81c2 100644 --- a/res/cardsfolder/d/dream_thief.txt +++ b/res/cardsfolder/d/dream_thief.txt @@ -11,4 +11,5 @@ SVar:Rarity:Common SVar:Picture:http://www.wizards.com/global/images/magic/general/dream_thief.jpg SetInfo:EVE|Common|http://magiccards.info/scans/en/eve/20.jpg Oracle:Flying\nWhen Dream Thief enters the battlefield, draw a card if you've cast another blue spell this turn. +Oracle:Flying\nWhen Dream Thief enters the battlefield, draw a card if you've cast another blue spell this turn. End \ No newline at end of file diff --git a/res/cardsfolder/e/endless_swarm.txt b/res/cardsfolder/e/endless_swarm.txt new file mode 100644 index 00000000000..76005f193b4 --- /dev/null +++ b/res/cardsfolder/e/endless_swarm.txt @@ -0,0 +1,13 @@ +Name:Endless Swarm +ManaCost:5 G G G +Types:Sorcery +Text:no text +K:Epic +A:SP$ Token | Cost$ 5 G G G | TokenAmount$ X | TokenName$ Snake | TokenTypes$ Creature,Snake | TokenOwner$ You | TokenColors$ Green | TokenPower$ 1 | TokenToughness$ 1 | SpellDescription$ Put a 1/1 green Snake creature token onto the battlefield for each card in your hand. +SVar:X:Count$InYourHand +SVar:Rarity:Rare +SVar:RemAIDeck:True +SVar:Picture:http://www.wizards.com/global/images/magic/general/endless_swarm.jpg +SetInfo:SOK|Rare|http://magiccards.info/scans/en/sok/129.jpg +Oracle:Put a 1/1 green Snake creature token onto the battlefield for each card in your hand.\nEpic (For the rest of the game, you can't cast spells. At the beginning of each of your upkeeps, copy this spell except for its epic ability.) +End \ No newline at end of file diff --git a/res/cardsfolder/e/enduring_ideal.txt b/res/cardsfolder/e/enduring_ideal.txt new file mode 100644 index 00000000000..a395af99e85 --- /dev/null +++ b/res/cardsfolder/e/enduring_ideal.txt @@ -0,0 +1,12 @@ +Name:Enduring Ideal +ManaCost:5 W W +Types:Sorcery +Text:no text +K:Epic +A:SP$ChangeZone | Cost$ 5 W W | Origin$ Library | Destination$ Battlefield | ChangeType$ Enchantment | ChangeNum$ 1 | SpellDescription$ Search your library for an enchantment card and put it onto the battlefield. Then shuffle your library. +SVar:Rarity:Rare +SVar:RemAIDeck:True +SVar:Picture:http://www.wizards.com/global/images/magic/general/enduring_ideal.jpg +Oracle:Search your library for an enchantment card and put it onto the battlefield. Then shuffle your library.\nEpic (For the rest of the game, you can't cast spells. At the beginning of each of your upkeeps, copy this spell except for its epic ability.) +SetInfo:SOK|Rare|http://magiccards.info/scans/en/sok/9.jpg +End \ No newline at end of file diff --git a/res/cardsfolder/e/eternal_dominion.txt b/res/cardsfolder/e/eternal_dominion.txt new file mode 100644 index 00000000000..cd97ae3aeca --- /dev/null +++ b/res/cardsfolder/e/eternal_dominion.txt @@ -0,0 +1,12 @@ +Name:Eternal Dominion +ManaCost:7 U U U +Types:Sorcery +Text:no text +K:Epic +A:SP$ ChangeZone | Cost$ 3 U U | Origin$ Library | Destination$ Battlefield | ValidTgts$ Opponent | ChangeType$ Artifact,Creature,Enchantment,Land | ChangeNum$ 1 | GainControl$ True | IsCurse$ True | SpellDescription$ Search target opponent's library for a creature card and put that card onto the battlefield under your control. Then that player shuffles his or her library. +SVar:Rarity:Rare +SVar:RemAIDeck:True +SVar:Picture:http://www.wizards.com/global/images/magic/general/eternal_dominion.jpg +Oracle:Search target opponent's library for an artifact, creature, enchantment, or land card. Put that card onto the battlefield under your control. Then that player shuffles his or her library.\nEpic (For the rest of the game, you can't cast spells. At the beginning of each of your upkeeps, copy this spell except for its epic ability. You may choose a new target for the copy.) +SetInfo:SOK|Rare|http://magiccards.info/scans/en/sok/36.jpg +End \ No newline at end of file diff --git a/res/cardsfolder/n/neverending_torment.txt b/res/cardsfolder/n/neverending_torment.txt new file mode 100644 index 00000000000..9f91a1d9247 --- /dev/null +++ b/res/cardsfolder/n/neverending_torment.txt @@ -0,0 +1,11 @@ +Name:Neverending Torment +ManaCost:4 B B +Types:Sorcery +Text:no text +K:Epic +A:SP$ ChangeZone | Cost$ 4 B B | Origin$ Library | Destination$ Exile | ValidTgts$ Player | ChangeType$ Card | ChangeNum$ X | IsCurse$ True | SpellDescription$ Search target player's library for X cards, where X is the number of cards in your hand, and exile it. Then that player shuffles his or her library. +SVar:X:Count$InYourHand +SVar:Rarity:Rare +SVar:RemAIDeck:True +SVar:Picture:http://www.wizards.com/global/images/magic/general/neverending_torment.jpg +End \ No newline at end of file diff --git a/src/main/java/forge/GameAction.java b/src/main/java/forge/GameAction.java index 17aa0446feb..215b496dc90 100644 --- a/src/main/java/forge/GameAction.java +++ b/src/main/java/forge/GameAction.java @@ -1160,6 +1160,8 @@ public class GameAction { canShowWinLose = true; forge.card.trigger.Trigger.resetIDs(); AllZone.getTriggerHandler().clearTriggerSettings(); + AllZone.getHumanPlayer().setEpicSpell(null); + AllZone.getComputerPlayer().setEpicSpell(null); { //re-number cards just so their unique numbers are low, just for user friendliness CardFactoryInterface c = AllZone.getCardFactory(); diff --git a/src/main/java/forge/Player.java b/src/main/java/forge/Player.java index 01bf1836101..d0d592a3e4c 100644 --- a/src/main/java/forge/Player.java +++ b/src/main/java/forge/Player.java @@ -49,6 +49,8 @@ public abstract class Player extends GameEntity { Map zones = new EnumMap(Constant.Zone.class); public final static List ALL_ZONES = Collections.unmodifiableList(Arrays.asList(Zone.Battlefield, Zone.Library, Zone.Graveyard, Zone.Hand, Zone.Exile, Zone.Command)); + + private SpellAbility epicSpell = null; /** *

Constructor for Player.

@@ -1914,4 +1916,18 @@ public abstract class Player extends GameEntity { return p1.getName().equals(getName()); } else return false; } + + /** + * @return the epicSpell + */ + public SpellAbility getEpicSpell() { + return epicSpell; + } + + /** + * @param epicSpell0 the epicSpell to set + */ + public void setEpicSpell(SpellAbility epicSpell0) { + this.epicSpell = epicSpell0; + } } diff --git a/src/main/java/forge/card/cardFactory/CardFactoryUtil.java b/src/main/java/forge/card/cardFactory/CardFactoryUtil.java index ba91c2f8dd5..91fc7018527 100644 --- a/src/main/java/forge/card/cardFactory/CardFactoryUtil.java +++ b/src/main/java/forge/card/cardFactory/CardFactoryUtil.java @@ -4981,6 +4981,57 @@ public class CardFactoryUtil { card.setSVar("ProvokeAbility", abString); card.setSVar("DBUntap", dbString); } + + if(card.hasKeyword("Epic")) { + final SpellAbility origSA = card.getSpellAbilities().get(0); + + SpellAbility newSA = new Spell(card,origSA.getPayCosts(),origSA.getTarget()) { + private static final long serialVersionUID = -7934420043356101045L; + + @Override + public void resolve() { + card.getController().setEpicSpell(origSA); + + //Create Epic emblem + Card eff = new Card(); + eff.setName(card.toString() + " Epic"); + eff.addType("Effect"); // Or Emblem + eff.setToken(true); // Set token to true, so when leaving play it gets nuked + eff.addController(card.getController()); + eff.setOwner(card.getController()); + eff.setImageName(card.getImageName()); + eff.setColor(card.getColor()); + eff.setImmutable(true); + + eff.addStaticAbility("Mode$ CantBeCast | ValidCard$ Card | Caster$ You | Description$ For the rest of the game, you can't cast spells."); + + Trigger copyTrigger = forge.card.trigger.TriggerHandler.parseTrigger("Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerDescription$ At the beginning of each of your upkeeps, copy " + card.toString() + " except for its epic ability.", card, false); + + copyTrigger.setOverridingAbility(origSA); + + eff.addTrigger(copyTrigger); + AllZone.getTriggerHandler().registerTrigger(copyTrigger); + + AllZone.getTriggerHandler().suppressMode("ChangesZone"); + AllZone.getGameAction().moveToPlay(eff); + AllZone.getTriggerHandler().clearSuppression("ChangesZone"); + + if(card.getController().isHuman()) { + AllZone.getGameAction().playSpellAbility_NoStack(origSA, false); + } + else { + ComputerUtil.playNoStack(origSA); + } + } + }; + newSA.setDescription(origSA.getDescription()); + + origSA.setPayCosts(null); + origSA.setManaCost("0"); + + card.clearSpellAbility(); + card.addSpellAbility(newSA); + } return card; } @@ -5424,6 +5475,7 @@ public class CardFactoryUtil { card.addTrigger(stormTrigger); } // Storm + } } //end class CardFactoryUtil diff --git a/src/main/java/forge/card/spellability/Spell.java b/src/main/java/forge/card/spellability/Spell.java index d0165c91284..51269131b63 100644 --- a/src/main/java/forge/card/spellability/Spell.java +++ b/src/main/java/forge/card/spellability/Spell.java @@ -56,6 +56,10 @@ abstract public class Spell extends SpellAbility implements java.io.Serializable @Override public boolean canPlay() { if (AllZone.getStack().isSplitSecondOnStack()) return false; + + if(getSourceCard().getController().getEpicSpell() != null) { + return false; //Player has cast an Epic spell and can't cast more this game. + } Card card = getSourceCard();