From 006b514e00fc64abc568cd222002353ad2b11fad Mon Sep 17 00:00:00 2001 From: jendave Date: Sat, 6 Aug 2011 02:57:04 +0000 Subject: [PATCH] - Umezawa's Jitte +2/+2 ability shouldn't be targeted anymore. - Added Chainer, Dementia Master, Vorosh, the Hunter, Rith, the Awakener. - AEther Web should be castable at any time now (flash). - AI should be able to use Tezzeret's first ability now. --- res/card-pictures.txt | 5 +- res/cards.txt | 38 +++-- res/gui/display_layout.xml | 8 +- src/forge/CardFactory_Auras.java | 7 + src/forge/CardFactory_Creatures.java | 196 ++++++++++++++++++++++- src/forge/CardFactory_Equipment.java | 2 +- src/forge/CardFactory_Planeswalkers.java | 2 +- src/forge/GameActionUtil.java | 68 +++++++- src/forge/StateBasedEffects.java | 1 + 9 files changed, 302 insertions(+), 25 deletions(-) diff --git a/res/card-pictures.txt b/res/card-pictures.txt index 8da5f1df46a..68302b50423 100644 --- a/res/card-pictures.txt +++ b/res/card-pictures.txt @@ -18,13 +18,16 @@ forest.jpg http://resources.wizards.com/magic/cards/unh/en-us/card73946.jpg forest1.jpg http://gatherer.wizards.com/handlers/image.ashx?type=card&multiverseid=2748 forest2.jpg http://gatherer.wizards.com/handlers/image.ashx?type=card&multiverseid=587 forest3.jpg http://gatherer.wizards.com/handlers/image.ashx?type=card&multiverseid=586 +chainer_dementia_master.jpg http://www.wizards.com/global/images/magic/general/chainer_dementia_master.jpg +vorosh_the_hunter.jpg http://www.wizards.com/global/images/magic/general/vorosh_the_hunter.jpg +rith_the_awakener.jpg http://www.wizards.com/global/images/magic/general/rith_the_awakener.jpg cantivore.jpg http://www.wizards.com/global/images/magic/general/cantivore.jpg cognivore.jpg http://www.wizards.com/global/images/magic/general/cognivore.jpg mortivore.jpg http://www.wizards.com/global/images/magic/general/mortivore.jpg dimir_cutpurse.jpg http://www.wizards.com/global/images/magic/general/dimir_cutpurse.jpg molimo_maro_sorcerer.jpg http://www.wizards.com/global/images/magic/general/molimo_maro_sorcerer.jpg maro.jpg http://www.wizards.com/global/images/magic/general/maro.jpg -multani_maro_sorcerer.jpg http://www.wizards.com/global/images/magic/general/multani_maro_sorcerer.jpg +multani_maro_sorcerer.jpg http://www.wizards.com/global/images/magic/general/multani_maro_morcerer.jpg meddling_mage.jpg http://www.wizards.com/global/images/magic/general/meddling_mage.jpg gravelgill_duo.jpg http://www.wizards.com/global/images/magic/general/gravelgill_duo.jpg safehold_duo.jpg http://www.wizards.com/global/images/magic/general/safehold_duo.jpg diff --git a/res/cards.txt b/res/cards.txt index f7130ae9c9b..1f2aedfce95 100644 --- a/res/cards.txt +++ b/res/cards.txt @@ -1,3 +1,23 @@ +Chainer, Dementia Master +3 B B +Legendary Creature Human Minion +When Chainer, Dementia Master leaves the battlefield, exile all Nightmares. +3/3 + +Vorosh, the Hunter +3 G U B +Legendary Creature Dragon +Whenever Vorosh, the Hunter deals combat damage to a player, you may pay 2 G. If you do, put six +1/+1 counters on Vorosh. +6/6 +Flying + +Rith, the Awakener +3 R G W +Legendary Creature Dragon +Whenever Rith, the Awakener deals combat damage to a player, you may pay 2 G. If you do, choose a color, then put a 1/1 green Saproling creature token onto the battlefield for each permanent of that color. +6/6 +Flying + Cantivore 1 W W Creature Lhurgoyf @@ -112,44 +132,44 @@ As Meddling Mage enters the battlefield, name a nonland card. The named card can Shorecrasher Mimic 1 GU Creature Shapeshifter -Whenever you cast a spell that's both green and blue, Shorecrasher Mimic becomes 5/3 and gains trample until end of turn. +Whenever you cast a spell that’s both green and blue, Shorecrasher Mimic becomes 5/3 and gains trample until end of turn. 2/1 Woodlurker Mimic 1 BG Creature Shapeshifter -Whenever you cast a spell that's both black and green, Woodlurker Mimic becomes 4/5 and gains wither until end of turn. (It deals damage to creatures in the form of -1/-1 counters.) +Whenever you cast a spell that’s both black and green, Woodlurker Mimic becomes 4/5 and gains wither until end of turn. (It deals damage to creatures in the form of -1/-1 counters.) 2/1 Battlegate Mimic 1 RW Creature Shapeshifter -Whenever you cast a spell that's both red and white, Battlegate Mimic becomes 4/2 and gains first strike until end of turn. +Whenever you cast a spell that’s both red and white, Battlegate Mimic becomes 4/2 and gains first strike until end of turn. 2/1 Nightsky Mimic 1 WB Creature Shapeshifter -Whenever you cast a spell that's both white and black, Nightsky Mimic becomes 4/4 and gains flying until end of turn. +Whenever you cast a spell that’s both white and black, Nightsky Mimic becomes 4/4 and gains flying until end of turn. 2/1 Riverfall Mimic 1 UR Creature Shapeshifter -Whenever you cast a spell that's both blue and red, Riverfall Mimic becomes 3/3 and is unblockable until end of turn. +Whenever you cast a spell that’s both blue and red, Riverfall Mimic becomes 3/3 and is unblockable until end of turn. 2/1 Sapling of Colfenor 3 BG BG Legendary Creature Treefolk Shaman -Whenever Sapling of Colfenor attacks, reveal the top card of your library. If it's a creature card, you gain life equal to that card’s toughness, lose life equal to its power, then put it into your hand. +Whenever Sapling of Colfenor attacks, reveal the top card of your library. If it’s a creature card, you gain life equal to that card’s toughness, lose life equal to its power, then put it into your hand. 2/5 Indestructible Dovescape 3 WU WU WU Enchantment -Whenever a player casts a noncreature spell, counter that spell. That player puts X 1/1 white and blue Bird creature tokens with flying onto the battlefield, where X is the spell's converted mana cost. +Whenever a player casts a noncreature spell, counter that spell. That player puts X 1/1 white and blue Bird creature tokens with flying onto the battlefield, where X is the spell’s converted mana cost. Lurking Informant 1 UB @@ -5357,7 +5377,7 @@ no text Trinket Mage 2 U -Creature Human Wizard +Creature Human Mage When Trinket Mage comes into play, you may search your library for an artifact card with converted mana cost 1 or less, reveal that card, and put it into your hand. If you do, shuffle your library. 2/2 @@ -12901,7 +12921,7 @@ This creature cannot block Funeral Charm B Instant -Choose one - +Choose one - Target player discards a card; or target creature gets +2/-1 until end of turn; or target creature gains swampwalk until end of turn. Echoing Decay 1 B diff --git a/res/gui/display_layout.xml b/res/gui/display_layout.xml index 3c4d574b060..066586efff9 100644 --- a/res/gui/display_layout.xml +++ b/res/gui/display_layout.xml @@ -303,7 +303,7 @@ 254 349 902 - 142 + 138 @@ -322,7 +322,7 @@ 254 - 491 + 487 902 10 @@ -337,9 +337,9 @@ 254 - 501 + 497 902 - 148 + 152 diff --git a/src/forge/CardFactory_Auras.java b/src/forge/CardFactory_Auras.java index 2f30797473d..fae021c36ae 100644 --- a/src/forge/CardFactory_Auras.java +++ b/src/forge/CardFactory_Auras.java @@ -2621,6 +2621,13 @@ class CardFactory_Auras { { private static final long serialVersionUID = -5744948616351896881L; + + //for flash: + public boolean canPlay() + { + return true; + } + public boolean canPlayAI() { CardList list = new CardList(AllZone.Computer_Play.getCards()); diff --git a/src/forge/CardFactory_Creatures.java b/src/forge/CardFactory_Creatures.java index 3639825d751..b809dcd7afd 100644 --- a/src/forge/CardFactory_Creatures.java +++ b/src/forge/CardFactory_Creatures.java @@ -10771,12 +10771,14 @@ public class CardFactory_Creatures { ButtonUtil.disableAll(); } else if (card.getController().equals(Constant.Player.Computer)) { - Card human = CardFactoryUtil.AI_getBestCreature(hum); - ability.setTargetCard(human); - AllZone.Stack.add(ability); + if (hum.size() > 0 ) + { + Card human = CardFactoryUtil.AI_getBestCreature(hum); + ability.setTargetCard(human); + AllZone.Stack.add(ability); + } } } - }//execute() };//Command card.addComesIntoPlayCommand(intoPlay); @@ -12107,6 +12109,91 @@ public class CardFactory_Creatures { }//*************** END ************ END ************************** + + + //*************** START *********** START ************************** + else if (cardName.equals("Rith, the Awakener")) + { + final String player = card.getController(); + + final Ability ability2 = new Ability(card, "2 G") + { + public void resolve() + { + int numberTokens = 0; + if (player.equals("Human")) + { + String choices[] = {"white", "blue" , "black" , "red" , "green"}; + Object o = AllZone.Display.getChoiceOptional("Select Color: ", choices); + //System.out.println("Color:" + o); + numberTokens = CardFactoryUtil.getNumberOfPermanentsByColor((String)o); + } + + for (int i=0;i 0 ) + { + if (card.getController().equals(Constant.Player.Human)) + { + Object o = AllZone.Display.getChoice("Pick creature: " , creatures.toArray()); + if (o!=null) + { + Card c = (Card)o; + PlayerZone zone = AllZone.getZone(c); + zone.remove(c); + play.add(c); + card.untap(); + c.addExtrinsicKeyword(c.getName() + " is black."); + c.addType("Nightmare"); + c.setController(card.getController()); + } + } + else + { + Card c = CardFactoryUtil.AI_getBestCreature(creatures); + PlayerZone zone = AllZone.getZone(c); + zone.remove(c); + play.add(c); + card.untap(); + } + } + } + + public boolean canPlayAI() + { + if(AllZone.Computer_Life.getLife() < 7) + return false; + + PlayerZone hGrave= AllZone.getZone(Constant.Zone.Graveyard, Constant.Player.Human); + PlayerZone cGrave = AllZone.getZone(Constant.Zone.Graveyard, Constant.Player.Computer); + CardList creatures = new CardList(); + creatures.addAll(hGrave.getCards()); + creatures.addAll(cGrave.getCards()); + creatures = creatures.getType("Creature"); + return creatures.size() > 0; + } + + public boolean canPlay() + { + PlayerZone hGrave= AllZone.getZone(Constant.Zone.Graveyard, Constant.Player.Human); + PlayerZone cGrave = AllZone.getZone(Constant.Zone.Graveyard, Constant.Player.Computer); + CardList creatures = new CardList(); + creatures.addAll(hGrave.getCards()); + creatures.addAll(cGrave.getCards()); + creatures = creatures.getType("Creature"); + return creatures.size() > 0; + } + + }; + + card.addSpellAbility(ability); + + final Command leavesPlay = new Command() + { + private static final long serialVersionUID = 3367460511478891560L; + + public void execute() + { + PlayerZone hPlay = AllZone.getZone(Constant.Zone.Play, Constant.Player.Human); + PlayerZone cPlay = AllZone.getZone(Constant.Zone.Play, Constant.Player.Computer); + + CardList list = new CardList(); + list.addAll(hPlay.getCards()); + list.addAll(cPlay.getCards()); + list = list.getType("Nightmare"); + + for (Card c : list) + { + AllZone.GameAction.removeFromGame(c); + } + } + + }; + + card.addLeavesPlayCommand(leavesPlay); + }//*************** END ************ END ************************** // Cards with Cycling abilities // -1 means keyword "Cycling" not found diff --git a/src/forge/CardFactory_Equipment.java b/src/forge/CardFactory_Equipment.java index 69e68394f53..03dea08f569 100644 --- a/src/forge/CardFactory_Equipment.java +++ b/src/forge/CardFactory_Equipment.java @@ -1834,7 +1834,7 @@ class CardFactory_Equipment { }; target[0] = card.getEquipping().get(0); - if(AllZone.GameAction.isCardInPlay(target[0]) && CardFactoryUtil.canTarget(card, target[0])) + if(AllZone.GameAction.isCardInPlay(target[0]) ) { target[0].addTempAttackBoost(2); target[0].addTempDefenseBoost(2); diff --git a/src/forge/CardFactory_Planeswalkers.java b/src/forge/CardFactory_Planeswalkers.java index 45cdb9f8dd6..5666fc60ee6 100644 --- a/src/forge/CardFactory_Planeswalkers.java +++ b/src/forge/CardFactory_Planeswalkers.java @@ -2300,7 +2300,7 @@ class CardFactory_Planeswalkers { }//resolve() public boolean canPlayAI() { - return card2.getCounters(Counters.LOYALTY) < 4 && AllZone.Phase.getPhase().equals(Constant.Phase.Main2); + return card2.getCounters(Counters.LOYALTY) <= 6 && AllZone.Phase.getPhase().equals(Constant.Phase.Main2); } public boolean canPlay() { diff --git a/src/forge/GameActionUtil.java b/src/forge/GameActionUtil.java index e30f2dbd379..7c60c9044ab 100644 --- a/src/forge/GameActionUtil.java +++ b/src/forge/GameActionUtil.java @@ -849,7 +849,7 @@ public class GameActionUtil { SpellAbility sa = AllZone.Stack.pop(); - AllZone.GameAction.moveToGraveyard(sa.getSourceCard()); + AllZone.GameAction.moveToGraveyard(sa.getSourceCard()); } }; // ability2 @@ -2972,6 +2972,10 @@ public class GameActionUtil playerCombatDamage_Rootwater_Thief(c); else if (c.getName().equals("Treva, the Renewer")) playerCombatDamage_Treva(c); + else if (c.getName().equals("Rith, the Awakener")) + playerCombatDamage_Rith(c); + else if (c.getName().equals("Vorosh, the Hunter")) + playerCombatDamage_Vorosh(c); /* if(CardFactoryUtil.hasNumberEquipments(c, "Umezawa's Jitte") == 1) { @@ -2985,7 +2989,7 @@ public class GameActionUtil c.setDealtCombatDmgToOppThisTurn(true); } - + /* public static void executePlayerCombatDmgOptionalEffects(Card[] c) { for (int i=0;i< c.length;i++) @@ -3011,6 +3015,7 @@ public class GameActionUtil }//for } + */ private static void playerCombatDamage_Oros(Card c) { System.out.println("Oros swung unblocked."); @@ -3019,8 +3024,7 @@ public class GameActionUtil AllZone.GameAction.playSpellAbility(sa[1]); else ComputerUtil.playNoStack(sa[1]); - - + } private static void playerCombatDamage_Dimir_Cutpurse(Card c) @@ -3071,6 +3075,24 @@ public class GameActionUtil } + private static void playerCombatDamage_Rith(Card c) + { + SpellAbility[] sa = c.getSpellAbility(); + if (c.getController().equals(Constant.Player.Human)) + AllZone.GameAction.playSpellAbility(sa[1]); + else + ComputerUtil.playNoStack(sa[1]); + } + + private static void playerCombatDamage_Vorosh(Card c) + { + SpellAbility[] sa = c.getSpellAbility(); + if (c.getController().equals(Constant.Player.Human)) + AllZone.GameAction.playSpellAbility(sa[1]); + else + ComputerUtil.playNoStack(sa[1]); + } + private static void playerCombatDamage_Slith(Card c) { final int power = c.getNetAttack(); @@ -12969,6 +12991,43 @@ public class GameActionUtil }// execute() };// Spidersilk Armor + public static Command Chainer = new Command() + { + private static final long serialVersionUID = -5404417712966524986L; + CardList gloriousAnthemList = new CardList(); + + public void execute() + { + CardList list = gloriousAnthemList; + Card c; + // reset all cards in list - aka "old" cards + for (int i = 0; i < list.size(); i++) + { + c = list.get(i); + c.addSemiPermanentAttackBoost(-1); + c.addSemiPermanentDefenseBoost(-1); + } + + // add +1/+1 to cards + list.clear(); + PlayerZone[] zone = getZone("Chainer, Dementia Master"); + + for (int outer = 0; outer < zone.length; outer++) + { + CardList creature = new CardList(zone[outer].getCards()); + creature = creature.getType("Nightmare"); + + for (int i = 0; i < creature.size(); i++) + { + c = creature.get(i); + c.addSemiPermanentAttackBoost(1); + c.addSemiPermanentDefenseBoost(1); + gloriousAnthemList.add(c); + }// for inner + }// for outer + }// execute() + };//Chainer + public static Command Eldrazi_Monument = new Command() { @@ -13442,6 +13501,7 @@ public class GameActionUtil commands.put("Honor_of_the_Pure", Honor_of_the_Pure); commands.put("Beastmaster_Ascension", Beastmaster_Ascension); commands.put("Spidersilk_Armor", Spidersilk_Armor); + commands.put("Chainer", Chainer); commands.put("Eldrazi_Monument", Eldrazi_Monument); commands.put("Muraganda_Petroglyphs", Muraganda_Petroglyphs); diff --git a/src/forge/StateBasedEffects.java b/src/forge/StateBasedEffects.java index 384bcfce330..6ba56fc640c 100644 --- a/src/forge/StateBasedEffects.java +++ b/src/forge/StateBasedEffects.java @@ -92,6 +92,7 @@ public class StateBasedEffects cardToEffectsList.put("Honor of the Pure", new String[] {"Honor_of_the_Pure"}); cardToEffectsList.put("Beastmaster Ascension", new String[] {"Beastmaster_Ascension"}); cardToEffectsList.put("Spidersilk Armor", new String[] {"Spidersilk_Armor"}); + cardToEffectsList.put("Chainer, Dementia Master", new String[] {"Chainer"}); cardToEffectsList.put("Eldrazi Monument", new String[] {"Eldrazi_Monument"}); cardToEffectsList.put("Muraganda Petroglyphs", new String[] {"Muraganda_Petroglyphs"}); cardToEffectsList.put("Engineered Plague", new String[] {"Engineered_Plague"});