diff --git a/res/card-pictures.txt b/res/card-pictures.txt index 85a40e5b460..5df51aa3307 100644 --- a/res/card-pictures.txt +++ b/res/card-pictures.txt @@ -18,6 +18,8 @@ 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 +serpent_generator.jpg http://www.wizards.com/global/images/magic/general/serpent_generator.jpg +pit_scorpion.jpg http://www.wizards.com/global/images/magic/general/pit_scorpion.jpg bridge_from_below.jpg http://www.wizards.com/global/images/magic/general/bridge_from_below.jpg swamp_mosquito.jpg http://www.wizards.com/global/images/magic/general/swamp_mosquito.jpg suqata_assassin.jpg http://www.wizards.com/global/images/magic/general/suqata_assassin.jpg diff --git a/res/cards.txt b/res/cards.txt index 62a50a4156f..d88a331d3e5 100644 --- a/res/cards.txt +++ b/res/cards.txt @@ -1,3 +1,14 @@ +Serpent Generator +6 +Artifact +no text + +Pit Scorpion +2 B +Creature Scorpion +Whenever this creature deals damage to a player, that player gets a poison counter. +1/1 + Bridge from Below B B B Enchantment @@ -13933,7 +13944,7 @@ Radiant, Archangel 3 W W Legendary Creature Angel Radiant, Archangel gets +1/+1 for each creature with flying in play. -2/2 +3/3 Flying Vigilance diff --git a/res/gui/display_layout.xml b/res/gui/display_layout.xml index 55c425bf6a2..92b85de4fdd 100644 --- a/res/gui/display_layout.xml +++ b/res/gui/display_layout.xml @@ -1,5 +1,5 @@ - + @@ -64,7 +64,7 @@ 0 148 244 - 181 + 183 @@ -83,7 +83,7 @@ 0 - 329 + 331 244 10 @@ -98,9 +98,9 @@ 0 - 339 + 341 244 - 115 + 113 @@ -339,7 +339,7 @@ 254 512 902 - 137 + 146 @@ -358,7 +358,7 @@ 254 - 649 + 658 902 10 @@ -373,9 +373,9 @@ 254 - 659 + 668 902 - 168 + 159 diff --git a/src/forge/CardFactory.java b/src/forge/CardFactory.java index cf0320792af..330e657bd21 100644 --- a/src/forge/CardFactory.java +++ b/src/forge/CardFactory.java @@ -17801,8 +17801,46 @@ return land.size() > 1 && CardFactoryUtil.AI_isMainPhase(); }; card.clearSpellAbility(); card.addSpellAbility(spell); - } + }//*************** END ************ END ************************** + + + //*************** START *********** START ************************** + if (cardName.equals("Serpent Generator")) + { + final SpellAbility ability = new Ability_Tap(card, "4") + { + private static final long serialVersionUID = 8428205362391909464L; + + public void resolve() + { + PlayerZone play = AllZone.getZone(card); + Card c = new Card(); + + c.setOwner(card.getController()); + c.setController(card.getController()); + + c.setName("Snake"); + c.setImageName("C 1 1 Snake"); + c.setManaCost(""); + c.setToken(true); + + c.addType("Artifact"); + c.addType("Creature"); + c.addType("Snake"); + c.setBaseAttack(1); + c.setBaseDefense(1); + + c.addIntrinsicKeyword("Whenever this creature deals damage to a player, that player gets a poison counter."); + + play.add(c); + } + }; + ability.setStackDescription("Put a 1/1 colorless Snake artifact creature token onto the battlefield. This creature has \"Whenever this creature deals damage to a player, that player gets a poison counter.\""); + ability.setDescription("4, Tap: Put a 1/1 colorless Snake artifact creature token onto the battlefield. This creature has \"Whenever this creature deals damage to a player, that player gets a poison counter.\" (A player with ten or more poison counters loses the game.)"); + card.addSpellAbility(ability); + + }//*************** END ************ END ************************** // Cards with Cycling abilities // -1 means keyword "Cycling" not found diff --git a/src/forge/CardFactoryUtil.java b/src/forge/CardFactoryUtil.java index 498c32575cd..748eec95f2a 100644 --- a/src/forge/CardFactoryUtil.java +++ b/src/forge/CardFactoryUtil.java @@ -2916,6 +2916,14 @@ public class CardFactoryUtil } return s; } + + public static boolean hasNecropotence(String player) + { + PlayerZone play = AllZone.getZone(Constant.Zone.Play, player); + CardList list = new CardList(play.getCards()); + list = list.getName("Necropotence"); + return list.size() > 0; + } public static int getCanPlayNumberOfLands(String player) { @@ -2941,6 +2949,7 @@ public class CardFactoryUtil return count; } + public static CardList getFastbonds(String player) { CardList list = new CardList(AllZone.getZone(Constant.Zone.Play, player).getCards()); diff --git a/src/forge/CombatUtil.java b/src/forge/CombatUtil.java index 9e298e78e20..d54bb842576 100644 --- a/src/forge/CombatUtil.java +++ b/src/forge/CombatUtil.java @@ -570,6 +570,25 @@ public class CombatUtil return display; }//getPlaneswalkerBlockers() + public static void executeCombatDamageEffects(Card c) + { + if (c.getKeyword().contains("Lifelink")) + GameActionUtil.executeLifeLinkEffects(c); + + CardList cl = CardFactoryUtil.getAurasEnchanting(c, "Guilty Conscience"); + for (Card crd : cl) + GameActionUtil.executeGuiltyConscienceEffects(c, crd); + + if(CardFactoryUtil.hasNumberEquipments(c, "Umezawa's Jitte") == 1 && c.getNetAttack() > 0) + { + PlayerZone play = AllZone.getZone(c); + CardList clist = new CardList(play.getCards()); + clist = clist.getName("Umezawa's Jitte"); + Card jitte = clist.get(0); + jitte.addCounter(Counters.CHARGE, 2); + } + } + private static boolean canBlockProtection(Card attacker, Card blocker) { ArrayList list = attacker.getKeyword(); diff --git a/src/forge/GameAction.java b/src/forge/GameAction.java index b4aa7d18e6c..6b93bc437e1 100644 --- a/src/forge/GameAction.java +++ b/src/forge/GameAction.java @@ -99,6 +99,8 @@ private Card getCurrentCard(int ID) discard_nath(c); discard_megrim(c); moveToGraveyard(c); + if (CardFactoryUtil.hasNecropotence(c.getOwner())) + removeFromGame(c); } public void discardRandom(String player, int numDiscard) diff --git a/src/forge/GameActionUtil.java b/src/forge/GameActionUtil.java index 13fdb1979ea..f5e40f7ac12 100644 --- a/src/forge/GameActionUtil.java +++ b/src/forge/GameActionUtil.java @@ -3630,6 +3630,9 @@ public class GameActionUtil public static void executePlayerCombatDamageEffects(Card c) { + if (c.getKeyword().contains("Whenever this creature deals damage to a player, that player gets a poison counter.")) + playerCombatDamage_PoisonCounter(c); + if (c.getName().equals("Hypnotic Specter")) playerCombatDamage_Hypnotic_Specter(c); else if (c.getName().equals("Dimir Cutpurse")) @@ -3724,6 +3727,18 @@ public class GameActionUtil }//for } */ + + private static void playerCombatDamage_PoisonCounter(Card c) + { + final String player = c.getController(); + final String opponent = AllZone.GameAction.getOpponent(player); + + if (opponent.equals(Constant.Player.Human)) + AllZone.Human_PoisonCounter.addPoisonCounters(1); + else + AllZone.Computer_PoisonCounter.addPoisonCounters(1); + } + private static void playerCombatDamage_Oros(Card c) { SpellAbility[] sa = c.getSpellAbility(); @@ -13291,7 +13306,6 @@ public class GameActionUtil else k = countHand_Computer(); c.setBaseAttack(k); c.setBaseDefense(k); - } } private int countHand_Human() @@ -14036,7 +14050,7 @@ public class GameActionUtil { public boolean addCard(Card c) { - return c.isCreature() && c.getKeyword().contains("Flying"); + return c.isCreature() && c.getKeyword().contains("Flying") && !c.getName().equals("Radiant, Archangel"); } }); return flying.size(); diff --git a/src/forge/Input_CombatDamage.java b/src/forge/Input_CombatDamage.java index a171082d1c8..2496c5d87fc 100644 --- a/src/forge/Input_CombatDamage.java +++ b/src/forge/Input_CombatDamage.java @@ -119,23 +119,7 @@ private void playerDamage(PlayerLife p) } */ - if (list.contains("Lifelink")) - GameActionUtil.executeLifeLinkEffects(attackers.getCard(i)); - - CardList cl = CardFactoryUtil.getAurasEnchanting(attackers.getCard(i), "Guilty Conscience"); - for (Card c : cl) - { - GameActionUtil.executeGuiltyConscienceEffects(attackers.getCard(i), c); - } - - if(CardFactoryUtil.hasNumberEquipments(attackers.getCard(i), "Umezawa's Jitte") == 1 && attackers.get(i).getNetAttack() > 0) - { - PlayerZone play = AllZone.getZone(attackers.getCard(i)); - CardList clist = new CardList(play.getCards()); - clist = clist.getName("Umezawa's Jitte"); - Card jitte = clist.get(0); - jitte.addCounter(Counters.CHARGE, 2); - } + CombatUtil.executeCombatDamageEffects(attackers.getCard(i)); } //not sure if this will work correctly with multiple blockers? @@ -170,17 +154,7 @@ private void playerDamage(PlayerLife p) (blockers.getCard(i).hasFirstStrike() && blockers.getCard(i).hasDoubleStrike())) { - if (blockers.getCard(i).getKeyword().contains("Lifelink")) - { - GameActionUtil.executeLifeLinkEffects(blockers.getCard(i)); - } - - CardList cl = CardFactoryUtil.getAurasEnchanting(blockers.getCard(i), "Guilty Conscience"); - for (Card c : cl) - { - GameActionUtil.executeGuiltyConscienceEffects(blockers.getCard(i), c); - } - + CombatUtil.executeCombatDamageEffects(blockers.getCard(i)); /* ArrayList list = blockers.getCard(i).getKeyword(); for (int j=0; j < list.size(); j++) @@ -213,31 +187,14 @@ private void playerDamage(PlayerLife p) //System.out.println("attacker #" + i + ": " + attackers.getCard(i).getName() +" " + attackers.getCard(i).getAttack()); if ( (!pwAttackers.getCard(i).hasFirstStrike() || (pwAttackers.getCard(i).hasFirstStrike() && pwAttackers.getCard(i).hasDoubleStrike()) ) ) { - if (pwAttackers.getCard(i).getKeyword().contains("Lifelink")) - GameActionUtil.executeLifeLinkEffects(pwAttackers.getCard(i)); - - CardList cl = CardFactoryUtil.getAurasEnchanting(pwAttackers.getCard(i), "Guilty Conscience"); - for (Card c : cl) - { - GameActionUtil.executeGuiltyConscienceEffects(pwAttackers.getCard(i), c); - } - + CombatUtil.executeCombatDamageEffects(pwAttackers.getCard(i)); } } for (int i=0; i < pwBlockers.size(); i++){ - //System.out.println("blocker #" + i + ": " + blockers.getCard(i).getName() +" " + blockers.getCard(i).getAttack()); - //if ( (pwBlockers.getCard(i).hasSecondStrike()) ) if ( (!pwBlockers.getCard(i).hasFirstStrike() || (pwBlockers.getCard(i).hasFirstStrike() && pwBlockers.getCard(i).hasDoubleStrike()) ) ) { - if (pwBlockers.getCard(i).getKeyword().contains("Lifelink")) - GameActionUtil.executeLifeLinkEffects(pwBlockers.getCard(i)); - - CardList cl = CardFactoryUtil.getAurasEnchanting(pwBlockers.getCard(i), "Guilty Conscience"); - for (Card c : cl) - { - GameActionUtil.executeGuiltyConscienceEffects(pwBlockers.getCard(i), c); - } + CombatUtil.executeCombatDamageEffects(pwBlockers.getCard(i)); } } @@ -279,9 +236,10 @@ private void playerDamage(PlayerLife p) //AllZone.GameAction.addDamage(c, crd , assignedDamageMap.get(crd)); damageMap.put(crd, assignedDamageMap.get(crd)); } - AllZone.GameAction.addDamage(c, damageMap); + AllZone.GameAction.checkStateEffects(); + damageMap.clear(); c.clearAssignedDamage(); } diff --git a/src/forge/Input_FirstStrikeDamage.java b/src/forge/Input_FirstStrikeDamage.java index e62b03c64c9..59cc1906855 100644 --- a/src/forge/Input_FirstStrikeDamage.java +++ b/src/forge/Input_FirstStrikeDamage.java @@ -95,31 +95,7 @@ private void playerDamage(PlayerLife p) if ((attackers.getCard(i).hasFirstStrike() || attackers.getCard(i).hasDoubleStrike())) { - if (attackers.getCard(i).getKeyword().contains("Lifelink")) - { - GameActionUtil.executeLifeLinkEffects(attackers.getCard(i)); - } - - /* - for(int j=0; j < CardFactoryUtil.hasNumberEnchantments(attackers.getCard(i), "Guilty Conscience"); j++) - GameActionUtil.executeGuiltyConscienceEffects(attackers.getCard(i)); - */ - CardList cl = CardFactoryUtil.getAurasEnchanting(attackers.getCard(i), "Guilty Conscience"); - for (Card c : cl) - { - GameActionUtil.executeGuiltyConscienceEffects(attackers.getCard(i), c); - } - - - - if(CardFactoryUtil.hasNumberEquipments(attackers.getCard(i), "Umezawa's Jitte") == 1 && attackers.get(i).getNetAttack() > 0) - { - PlayerZone play = AllZone.getZone(attackers.getCard(i)); - CardList clist = new CardList(play.getCards()); - clist = clist.getName("Umezawa's Jitte"); - Card jitte = clist.get(0); - jitte.addCounter(Counters.CHARGE, 2); - } + CombatUtil.executeCombatDamageEffects(attackers.getCard(i)); /* @@ -150,14 +126,7 @@ private void playerDamage(PlayerLife p) //System.out.println("blocker #" + i + ": " + blockers.getCard(i).getName() +" " + blockers.getCard(i).getAttack()); if ( (blockers.getCard(i).hasFirstStrike() || blockers.getCard(i).hasDoubleStrike())) { - if (blockers.getCard(i).getKeyword().contains("Lifelink")) - GameActionUtil.executeLifeLinkEffects(blockers.getCard(i)); - - CardList cl = CardFactoryUtil.getAurasEnchanting(blockers.getCard(i), "Guilty Conscience"); - for (Card c : cl) - { - GameActionUtil.executeGuiltyConscienceEffects(blockers.getCard(i), c); - } + CombatUtil.executeCombatDamageEffects(blockers.getCard(i)); } } @@ -170,31 +139,17 @@ private void playerDamage(PlayerLife p) //System.out.println("attacker #" + i + ": " + attackers.getCard(i).getName() +" " + attackers.getCard(i).getAttack()); if ( (pwAttackers.getCard(i).hasFirstStrike() || pwAttackers.getCard(i).hasDoubleStrike())) { - if (pwAttackers.getCard(i).getKeyword().contains("Lifelink")) - GameActionUtil.executeLifeLinkEffects(pwAttackers.getCard(i)); - - CardList cl = CardFactoryUtil.getAurasEnchanting(pwAttackers.getCard(i), "Guilty Conscience"); - for (Card c : cl) - { - GameActionUtil.executeGuiltyConscienceEffects(pwAttackers.getCard(i), c); - } + CombatUtil.executeCombatDamageEffects(pwAttackers.getCard(i)); } } for (int i=0; i < pwBlockers.size(); i++){ //System.out.println("blocker #" + i + ": " + blockers.getCard(i).getName() +" " + blockers.getCard(i).getAttack()); if ((pwBlockers.getCard(i).hasFirstStrike() || pwBlockers.getCard(i).hasDoubleStrike())) { - if ( pwAttackers.getCard(i).getKeyword().contains("Lifelink")) - GameActionUtil.executeLifeLinkEffects(pwBlockers.getCard(i)); - - CardList cl = CardFactoryUtil.getAurasEnchanting(pwBlockers.getCard(i), "Guilty Conscience"); - for (Card c : cl) - { - GameActionUtil.executeGuiltyConscienceEffects(pwBlockers.getCard(i), c); - } + CombatUtil.executeCombatDamageEffects(pwBlockers.getCard(i)); } } - + //get all attackers and blockers CardList check = new CardList(); check.addAll(AllZone.Human_Play.getCards()); @@ -226,6 +181,8 @@ private void playerDamage(PlayerLife p) AllZone.GameAction.addDamage(c, damageMap); + AllZone.GameAction.checkStateEffects(); + damageMap.clear(); c.clearAssignedDamage(); }