diff --git a/.gitattributes b/.gitattributes index 4d0445d3f98..1d139ef6684 100644 --- a/.gitattributes +++ b/.gitattributes @@ -120,6 +120,7 @@ src/forge/DeckIO.java svneol=native#text/plain src/forge/DefaultPlayerZone.java svneol=native#text/plain src/forge/Display.java svneol=native#text/plain src/forge/DownloadDeck.java -text svneol=native#text/plain +src/forge/EndOfCombat.java -text svneol=native#text/plain src/forge/EndOfTurn.java svneol=native#text/plain src/forge/ExternalPanel.java svneol=native#text/plain src/forge/FileUtil.java -text svneol=native#text/plain diff --git a/res/card-pictures.txt b/res/card-pictures.txt index a7bf0e4ae80..aa0d92d85d6 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 +dromad_purebred.jpg http://www.wizards.com/global/images/magic/general/dromad_purebred.jpg +swans_of_bryn_argoll.jpg http://www.wizards.com/global/images/magic/general/swans_of_bryn_argoll.jpg earthbind.jpg http://www.wizards.com/global/images/magic/general/earthbind.jpg honden_of_cleansing_fire.jpg http://www.wizards.com/global/images/magic/general/honden_of_cleansing_fire.jpg honden_of_infinite_rage.jpg http://www.wizards.com/global/images/magic/general/honden_of_infinite_rage.jpg diff --git a/res/cards.txt b/res/cards.txt index 40e7bbe1440..6d0dffced51 100644 --- a/res/cards.txt +++ b/res/cards.txt @@ -1,3 +1,16 @@ +Dromad Purebred +4 W +Creature Camel Beast +Whenever Dromad Purebred is dealt damage, you gain 1 life. +1/5 + +Swans of Bryn Argoll +2 WU WU +Creature Bird Spirit +If a source would deal damage to Swans of Bryn Argoll, prevent that damage. The source's controller draws cards equal to the damage prevented this way. +4/3 +Flying + Honden of Infinite Rage 2 R Legendary Enchantment Shrine diff --git a/res/gui/display_layout.xml b/res/gui/display_layout.xml index 066586efff9..aabfd23c919 100644 --- a/res/gui/display_layout.xml +++ b/res/gui/display_layout.xml @@ -28,7 +28,7 @@ 0 0 244 - 140 + 138 @@ -47,7 +47,7 @@ 0 - 140 + 138 244 10 @@ -62,9 +62,9 @@ 0 - 150 + 148 244 - 179 + 181 diff --git a/src/forge/AllZone.java b/src/forge/AllZone.java index 42ab7b7288b..061791497d7 100644 --- a/src/forge/AllZone.java +++ b/src/forge/AllZone.java @@ -17,6 +17,7 @@ public class AllZone implements NewConstants { public static final NameChanger NameChanger = new NameChanger(); public static EndOfTurn EndOfTurn = new EndOfTurn(); + public static EndOfCombat EndOfCombat = new EndOfCombat(); public static final CardFactory CardFactory = new CardFactory(ForgeProps.getFile(CARDS)); public static final Phase Phase = new Phase(); diff --git a/src/forge/Card.java b/src/forge/Card.java index f202bebb4a0..750db934bb7 100644 --- a/src/forge/Card.java +++ b/src/forge/Card.java @@ -29,6 +29,7 @@ public class Card extends MyObservable private ArrayList manaAbility = new ArrayList(); private HashMap receivedDamageFromThisTurn = new HashMap(); + private HashMap assignedDamageHashMap = new HashMap(); private boolean unCastable; private boolean tapped; @@ -55,7 +56,7 @@ public class Card extends MyObservable private int baseDefense; private int damage; - private int assignedDamage; + private int nShield; private int turnInZone; @@ -483,7 +484,14 @@ public class Card extends MyObservable public void setRarity(String s) {rarity = s;} public String getRarity() {return rarity;} - public void addDamage(int n) + + public void addDamage(int n, CardList sources) + { + for(Card source : sources) + this.addDamage(n, source); + } + + public void addDamage(int n, Card source) { if (this.getName().equals("Cho-Manno, Revolutionary")) n = 0; @@ -497,8 +505,42 @@ public class Card extends MyObservable } public int getDamage() {return damage;} - public void setAssignedDamage(int n) {assignedDamage = n;} - public int getAssignedDamage() {return assignedDamage;} + /*public void setAssignedDamage(int n) + { + assignedDamage = n; + }*/ + + public void addAssignedDamage(int n, Card source) + { + System.out.println(this + " - was assigned " + n +" damage, by " +source); + if (!assignedDamageHashMap.containsKey(source)) + assignedDamageHashMap.put(source, n); + else + { + assignedDamageHashMap.put(source, assignedDamageHashMap.get(source)+n); + } + } + //public void setAssignedDamage(int n) {assignedDamage = n;} + public void clearAssignedDamage() + { + assignedDamageHashMap.clear(); + } + public int getTotalAssignedDamage() + { + int total = 0; + + Collection c = assignedDamageHashMap.values(); + + Iterator itr = c.iterator(); + while(itr.hasNext()) + total+=itr.next(); + + return total; + } + public HashMap getAssignedDamageHashMap() + { + return assignedDamageHashMap; + } public void setImageName(String s) { imageName = s; } public String getImageName() diff --git a/src/forge/CardDetailUtil.java b/src/forge/CardDetailUtil.java index 472da299b21..8d2e6833424 100644 --- a/src/forge/CardDetailUtil.java +++ b/src/forge/CardDetailUtil.java @@ -32,7 +32,7 @@ public class CardDetailUtil } if(card.isCreature()) - label[3].setText("Damage: " +card.getDamage() +" Assigned Damage: " +card.getAssignedDamage()); + label[3].setText("Damage: " +card.getDamage() +" Assigned Damage: " +card.getTotalAssignedDamage()); String uniqueID = card.getUniqueNumber() +" "; label[4].setText("Card ID " +uniqueID); diff --git a/src/forge/CardFactory.java b/src/forge/CardFactory.java index c1c2b987d97..c789a85f892 100644 --- a/src/forge/CardFactory.java +++ b/src/forge/CardFactory.java @@ -1033,7 +1033,7 @@ public class CardFactory implements NewConstants { { Card c = getTargetCard(); //c.addDamage(damage); - AllZone.GameAction.addDamage(c, damage); + AllZone.GameAction.addDamage(c, card, damage); tgtP = c.getController(); } } @@ -1184,19 +1184,27 @@ public class CardFactory implements NewConstants { if (card.getKeyword().contains("Wither")) getTargetCard().addCounter(Counters.M1M1, dmg[0]); else - getTargetCard().addDamage(dmg[0]); + getTargetCard().addDamage(dmg[0], card); if (card.getKeyword().contains("Lifelink")) GameActionUtil.executeLifeLinkEffects(card, dmg[0]); - for(int i=0; i < CardFactoryUtil.hasNumberEnchantments(card, "Guilty Conscience"); i++) - GameActionUtil.executeGuiltyConscienceEffects(card, dmg[0]); + + CardList cl = CardFactoryUtil.getAurasEnchanting(card, "Guilty Conscience"); + for (Card c : cl) + { + GameActionUtil.executeGuiltyConscienceEffects(card, c, dmg[0]); + } } } else { AllZone.GameAction.getPlayerLife(getTargetPlayer()).subtractLife(dmg[0]); if (card.getKeyword().contains("Lifelink")) GameActionUtil.executeLifeLinkEffects(card, dmg[0]); - for(int i=0; i < CardFactoryUtil.hasNumberEnchantments(card, "Guilty Conscience"); i++) - GameActionUtil.executeGuiltyConscienceEffects(card, dmg[0]); + + CardList cl = CardFactoryUtil.getAurasEnchanting(card, "Guilty Conscience"); + for (Card c : cl) + { + GameActionUtil.executeGuiltyConscienceEffects(card, c, dmg[0]); + } } }//resolve() };//Ability_Activated @@ -1232,11 +1240,15 @@ public class CardFactory implements NewConstants { if (card.getKeyword().contains("Wither")) getTargetCard().addCounter(Counters.M1M1, dmg[0]); else - getTargetCard().addDamage(dmg[0]); + getTargetCard().addDamage(dmg[0], card); if (card.getKeyword().contains("Lifelink")) GameActionUtil.executeLifeLinkEffects(card, dmg[0]); - for(int i=0; i < CardFactoryUtil.hasNumberEnchantments(card, "Guilty Conscience"); i++) - GameActionUtil.executeGuiltyConscienceEffects(card, dmg[0]); + + CardList cl = CardFactoryUtil.getAurasEnchanting(card, "Guilty Conscience"); + for (Card c : cl) + { + GameActionUtil.executeGuiltyConscienceEffects(card, c, dmg[0]); + } } } @@ -1244,8 +1256,13 @@ public class CardFactory implements NewConstants { AllZone.GameAction.getPlayerLife(getTargetPlayer()).subtractLife(dmg[0]); if (card.getKeyword().contains("Lifelink")) GameActionUtil.executeLifeLinkEffects(card, dmg[0]); - for(int i=0; i < CardFactoryUtil.hasNumberEnchantments(card, "Guilty Conscience"); i++) - GameActionUtil.executeGuiltyConscienceEffects(card, dmg[0]); + + CardList cl = CardFactoryUtil.getAurasEnchanting(card, "Guilty Conscience"); + for (Card c : cl) + { + GameActionUtil.executeGuiltyConscienceEffects(card, c, dmg[0]); + } + card.setDealtDmgToOppThisTurn(true); } @@ -1282,19 +1299,28 @@ public class CardFactory implements NewConstants { if (card.getKeyword().contains("Wither")) getTargetCard().addCounter(Counters.M1M1, dmg[0]); else - getTargetCard().addDamage(dmg[0]); + getTargetCard().addDamage(dmg[0], card); if (card.getKeyword().contains("Lifelink")) GameActionUtil.executeLifeLinkEffects(card, dmg[0]); - for(int i=0; i < CardFactoryUtil.hasNumberEnchantments(card, "Guilty Conscience"); i++) - GameActionUtil.executeGuiltyConscienceEffects(card, dmg[0]); + + CardList cl = CardFactoryUtil.getAurasEnchanting(card, "Guilty Conscience"); + for (Card c : cl) + { + GameActionUtil.executeGuiltyConscienceEffects(card, c, dmg[0]); + } } } else { AllZone.GameAction.getPlayerLife(getTargetPlayer()).subtractLife(dmg[0]); if (card.getKeyword().contains("Lifelink")) GameActionUtil.executeLifeLinkEffects(card, dmg[0]); - for(int i=0; i < CardFactoryUtil.hasNumberEnchantments(card, "Guilty Conscience"); i++) - GameActionUtil.executeGuiltyConscienceEffects(card, dmg[0]); + + + CardList cl = CardFactoryUtil.getAurasEnchanting(card, "Guilty Conscience"); + for (Card c : cl) + { + GameActionUtil.executeGuiltyConscienceEffects(card, c, dmg[0]); + } card.setDealtDmgToOppThisTurn(true); } @@ -1975,7 +2001,7 @@ public class CardFactory implements NewConstants { { Card crd = creatures.get(i); if (CardFactoryUtil.canDamage(card, crd)) - crd.addDamage(3); + crd.addDamage(3, card); } } @@ -2912,7 +2938,7 @@ public class CardFactory implements NewConstants { for(int i = 0; i < list.size(); i++){ if (CardFactoryUtil.canDamage(card, list.get(i))) - list.get(i).addDamage(1); + list.get(i).addDamage(1, card); } AllZone.Human_Life.subtractLife(1); @@ -2969,7 +2995,7 @@ public class CardFactory implements NewConstants { for(int i = 0; i < list.size(); i++) { if (CardFactoryUtil.canDamage(card, list.get(i))) - list.get(i).addDamage(1); + list.get(i).addDamage(1, card); } AllZone.Human_Life.subtractLife(1); @@ -4260,7 +4286,7 @@ public class CardFactory implements NewConstants { list = list.getType("Creature"); for(int i = 0; i < list.size(); i++) - list.get(i).addDamage(2); + list.get(i).addDamage(2, card); }//resolve() }; card.clearSpellAbility(); @@ -5191,7 +5217,7 @@ public class CardFactory implements NewConstants { for(int i = 0; i < all.size(); i++) if(! all.get(i).getKeyword().contains("Flying") && CardFactoryUtil.canDamage(card,all.get(i))) - all.get(i).addDamage(1); + all.get(i).addDamage(1, card); } }; card.clearSpellAbility(); @@ -5573,7 +5599,7 @@ public class CardFactory implements NewConstants { { if(AllZone.GameAction.isCardInPlay(getTargetCard()) && CardFactoryUtil.canTarget(card, getTargetCard()) ) { - getTargetCard().addDamage(5); + getTargetCard().addDamage(5, card); done(); } else @@ -6655,7 +6681,7 @@ public class CardFactory implements NewConstants { for(int i = 0; i < all.size(); i++) { if (CardFactoryUtil.canDamage(card,all.get(i))) - all.get(i).addDamage(2); + all.get(i).addDamage(2, card); } } public boolean canPlayAI() @@ -6693,7 +6719,7 @@ public class CardFactory implements NewConstants { for(int i = 0; i < all.size(); i++) { if (CardFactoryUtil.canDamage(card,all.get(i))) - all.get(i).addDamage(2); + all.get(i).addDamage(2, card); } PlayerLife compLife = AllZone.GameAction.getPlayerLife(Constant.Player.Computer); @@ -6750,7 +6776,7 @@ public class CardFactory implements NewConstants { if (CardFactoryUtil.canDamage(card, all.get(i))) { all.get(i).setShield(0); - all.get(i).addDamage(3); + all.get(i).addDamage(3, card); } } @@ -7263,7 +7289,7 @@ public class CardFactory implements NewConstants { { if(AllZone.GameAction.isCardInPlay(getTargetCard()) && CardFactoryUtil.canTarget(card, getTargetCard()) ) { - getTargetCard().addDamage(2); + getTargetCard().addDamage(2, card); AllZone.GameAction.getPlayerLife(card.getController()).addLife(2); } }//resolve() @@ -7508,7 +7534,7 @@ public class CardFactory implements NewConstants { if(AllZone.GameAction.isCardInPlay(getTargetCard()) && CardFactoryUtil.canTarget(card, getTargetCard())) { Card c = getTargetCard(); - c.addDamage(damage); + c.addDamage(damage, card); } }//resolve() };//SpellAbility @@ -7674,7 +7700,7 @@ public class CardFactory implements NewConstants { if(AllZone.GameAction.isCardInPlay(getTargetCard()) && CardFactoryUtil.canTarget(card, getTargetCard())) { Card c = getTargetCard(); - c.addDamage(damage); + c.addDamage(damage, card); } } else @@ -7744,7 +7770,7 @@ public class CardFactory implements NewConstants { if(AllZone.GameAction.isCardInPlay(getTargetCard()) && CardFactoryUtil.canTarget(card, getTargetCard())) { Card c = getTargetCard(); - c.addDamage(damage); + c.addDamage(damage, card); } } else @@ -7793,7 +7819,7 @@ public class CardFactory implements NewConstants { if(AllZone.GameAction.isCardInPlay(getTargetCard()) && CardFactoryUtil.canTarget(card, getTargetCard()) ) { Card c = getTargetCard(); - c.addDamage(1); + c.addDamage(1, card); } } else @@ -7862,7 +7888,7 @@ public class CardFactory implements NewConstants { if(AllZone.GameAction.isCardInPlay(getTargetCard()) && CardFactoryUtil.canTarget(card, getTargetCard()) ) { Card c = getTargetCard(); - c.addDamage(damage); + c.addDamage(damage, card); } } else @@ -8010,7 +8036,7 @@ public class CardFactory implements NewConstants { if(AllZone.GameAction.isCardInPlay(getTargetCard()) && CardFactoryUtil.canTarget(card, getTargetCard()) ) { Card c = getTargetCard(); - c.addDamage(damage); + c.addDamage(damage, card); } } else @@ -8098,7 +8124,7 @@ public class CardFactory implements NewConstants { javax.swing.JOptionPane.showMessageDialog(null, "Erratic Explosion causes " +damage +" to " +getTargetCard()); Card c = getTargetCard(); - c.addDamage(damage); + c.addDamage(damage, card); } } else @@ -8203,7 +8229,7 @@ public class CardFactory implements NewConstants { if(AllZone.GameAction.isCardInPlay(getTargetCard()) && CardFactoryUtil.canTarget(card, getTargetCard()) ) { Card c = getTargetCard(); - c.addDamage(damage); + c.addDamage(damage, card); AllZone.GameAction.getPlayerLife(card.getController()).subtractLife(2); } } @@ -8313,7 +8339,7 @@ public class CardFactory implements NewConstants { if(AllZone.GameAction.isCardInPlay(getTargetCard()) && CardFactoryUtil.canTarget(card, getTargetCard())) { Card c = getTargetCard(); - c.addDamage(damage); + c.addDamage(damage, card); AllZone.GameAction.getPlayerLife(card.getController()).subtractLife(2); } } @@ -8726,9 +8752,12 @@ public class CardFactory implements NewConstants { list.addAll(AllZone.Computer_Play.getCards()); list = list.getType("Creature"); - for(int i = 0; i < list.size(); i++) - list.get(i).addDamage(2); + for(int i = 0; i < list.size(); i++) { + if (CardFactoryUtil.canDamage(card, list.get(i))) + list.get(i).addDamage(2, card); + } } + //"Destroy target nonbasic land", if(userChoice.contains(cardChoice[2])) @@ -9983,12 +10012,12 @@ public class CardFactory implements NewConstants { { public boolean addCard(Card c) { - return c.isCreature() && c.getKeyword().contains("Flying"); + return c.isCreature() && c.getKeyword().contains("Flying") && CardFactoryUtil.canDamage(card, c); } }); for(int i = 0; i < list.size(); i++) - list.get(i).addDamage(4); + list.get(i).addDamage(4, card); }//resolve() public boolean canPlayAI() {return CardFactoryUtil.AI_getHumanCreature("Flying", card, false).size() != 0;} @@ -10923,7 +10952,7 @@ public class CardFactory implements NewConstants { if(AllZone.GameAction.isCardInPlay(getTargetCard()) && CardFactoryUtil.canTarget(card, getTargetCard()) ) { int n = countSwamps(); - getTargetCard().addDamage(n); + getTargetCard().addDamage(n, card); PlayerLife life = AllZone.GameAction.getPlayerLife(card.getController()); life.addLife(n); @@ -12694,7 +12723,7 @@ public class CardFactory implements NewConstants { if(AllZone.GameAction.isCardInPlay(getTargetCard()) && CardFactoryUtil.canTarget(card, getTargetCard())) { Card c = getTargetCard(); - c.addDamage(damage); + c.addDamage(damage, card); } } else @@ -13410,7 +13439,7 @@ public class CardFactory implements NewConstants { if(getTargetCard() != null) { if(AllZone.GameAction.isCardInPlay(getTargetCard()) && CardFactoryUtil.canTarget(card, getTargetCard()) ) - getTargetCard().addDamage(2); + getTargetCard().addDamage(2, card); } else AllZone.GameAction.getPlayerLife(getTargetPlayer()).subtractLife(2); @@ -15880,7 +15909,7 @@ return land.size() > 1 && CardFactoryUtil.AI_isMainPhase(); { Card c = getTargetCard(); //c.addDamage(damage); - AllZone.GameAction.addDamage(c, 5); + AllZone.GameAction.addDamage(c, card, 5); } } else @@ -16297,7 +16326,7 @@ return land.size() > 1 && CardFactoryUtil.AI_isMainPhase(); if(getTargetCard() != null) { if(AllZone.GameAction.isCardInPlay(getTargetCard()) && CardFactoryUtil.canTarget(card, getTargetCard()) ) - getTargetCard().addDamage(2); + getTargetCard().addDamage(2, card); } else AllZone.GameAction.getPlayerLife(getTargetPlayer()).subtractLife(2); @@ -16591,7 +16620,7 @@ return land.size() > 1 && CardFactoryUtil.AI_isMainPhase(); if(AllZone.GameAction.isCardInPlay(getTargetCard()) && CardFactoryUtil.canTarget(card, getTargetCard()) ) { Card c = getTargetCard(); - c.addDamage(damage); + c.addDamage(damage, card); AllZone.GameAction.getPlayerLife(card.getController()).addLife(damage); } } @@ -16742,7 +16771,7 @@ return land.size() > 1 && CardFactoryUtil.AI_isMainPhase(); { if(AllZone.GameAction.isCardInPlay(getTargetCard()) && CardFactoryUtil.canTarget(card, getTargetCard())) { - getTargetCard().addDamage(damage); + getTargetCard().addDamage(damage, card); } } else diff --git a/src/forge/CardFactoryUtil.java b/src/forge/CardFactoryUtil.java index 90df1799c47..a61e74776f3 100644 --- a/src/forge/CardFactoryUtil.java +++ b/src/forge/CardFactoryUtil.java @@ -1915,6 +1915,27 @@ public class CardFactoryUtil } + //returns a CardList of all auras named e enchanting Card c + public static CardList getAurasEnchanting(Card c, String e) + { + CardList list = new CardList(); + if (!c.isEnchanted()) + return list; + + final String enchantmentName = e; + CardList cl = new CardList(c.getEnchantedBy().toArray()); + cl = cl.filter(new CardListFilter() + { + public boolean addCard(Card c) { + return c.getName().equals(enchantmentName); + } + + }); + + return cl; + + } + //returns the number of equipments named "e" card c is equipped by public static int hasNumberEquipments(Card c, String e) { diff --git a/src/forge/CardFactory_Auras.java b/src/forge/CardFactory_Auras.java index 3191c3d8b5c..fd75c39790b 100644 --- a/src/forge/CardFactory_Auras.java +++ b/src/forge/CardFactory_Auras.java @@ -2736,7 +2736,12 @@ class CardFactory_Auras { public boolean canPlayAI() { CardList list = new CardList(AllZone.Computer_Play.getCards()); - list = list.getType("Creature"); + list = list.filter(new CardListFilter(){ + public boolean addCard(Card c) + { + return c.isCreature() && c.getKeyword().contains("Flying"); + } + }); if(list.isEmpty()) return false; @@ -5661,7 +5666,6 @@ class CardFactory_Auras { final SpellAbility spell = new Spell(card) { - private static final long serialVersionUID = 142389375702113977L; public boolean canPlayAI() @@ -5720,7 +5724,7 @@ class CardFactory_Auras { if(crd.getKeyword().contains("Flying")) { badTarget[0] = false; - AllZone.GameAction.addDamage(crd, 2); + AllZone.GameAction.addDamage(crd, card, 2); crd.removeIntrinsicKeyword("Flying"); crd.removeExtrinsicKeyword("Flying"); } diff --git a/src/forge/CardFactory_Creatures.java b/src/forge/CardFactory_Creatures.java index 98f45d72d3a..437a71f05b8 100644 --- a/src/forge/CardFactory_Creatures.java +++ b/src/forge/CardFactory_Creatures.java @@ -18,16 +18,15 @@ public class CardFactory_Creatures { public static Card getCard(final Card card, String cardName, String owner, CardFactory cf) { - - + //*************** START *********** START ************************** if(cardName.equals("Filthy Cur")) { final Card newCard = new Card() { - public void addDamage(final int n) + public void addDamage(final int n, Card source) { - super.addDamage(n); + super.addDamage(n, source); SpellAbility ability = new Ability(card, "0") { public void resolve() @@ -56,7 +55,7 @@ public class CardFactory_Creatures { return newCard; }//*************** END ************ END ************************** - //*************** START *********** START ************************** + //*************** START *********** START ************************** else if(cardName.equals("Belligerent Hatchling") || cardName.equals("Noxious Hatchling") ||cardName.equals("Shrewd Hatchling") ||cardName.equals("Sturdy Hatchling") || cardName.equals("Voracious Hatchling")) @@ -152,9 +151,9 @@ public class CardFactory_Creatures { { final Card newCard = new Card() { - public void addDamage(final int n) + public void addDamage(final int n, Card source) { - super.addDamage(n); + super.addDamage(n, source); SpellAbility ability = new Ability(card, "0") { public void resolve() @@ -185,17 +184,14 @@ public class CardFactory_Creatures { }//*************** END ************ END ************************** - - - //*************** START *********** START ************************** else if(cardName.equals("Jackal Pup")) { final Card newCard = new Card() { - public void addDamage(final int n) + public void addDamage(final int n, final Card source) { - super.addDamage(n); + super.addDamage(n, source); SpellAbility ability = new Ability(card, "0") { public void resolve() @@ -226,17 +222,15 @@ public class CardFactory_Creatures { - - //*************** START *********** START ************************** else if(cardName.equals("Stuffy Doll")) { final Card newCard = new Card() { Card c = this; - public void addDamage(final int n) + public void addDamage(final int n, final Card source) { - super.addDamage(n); + super.addDamage(n, source); final String opponent = AllZone.GameAction.getOpponent(card.getOwner()); SpellAbility ability = new Ability(card, "0") @@ -247,8 +241,13 @@ public class CardFactory_Creatures { if (c.getKeyword().contains("Lifelink")) GameActionUtil.executeLifeLinkEffects(c,n); - for(int i=0; i < CardFactoryUtil.hasNumberEnchantments(c, "Guilty Conscience"); i++) - GameActionUtil.executeGuiltyConscienceEffects(c, n); + + CardList cl = CardFactoryUtil.getAurasEnchanting(card, "Guilty Conscience"); + for (Card crd : cl) + { + GameActionUtil.executeGuiltyConscienceEffects(c, crd, n); + } + } }; ability.setStackDescription("Stuffy Doll - causes " +n +" damage to " +opponent); @@ -276,12 +275,16 @@ public class CardFactory_Creatures { public void resolve() { - newCard.addDamage(1); + newCard.addDamage(1, newCard); if (newCard.getKeyword().contains("Lifelink")) GameActionUtil.executeLifeLinkEffects(newCard, 1); - for(int i=0; i < CardFactoryUtil.hasNumberEnchantments(newCard, "Guilty Conscience"); i++) - GameActionUtil.executeGuiltyConscienceEffects(newCard, 1); + + CardList cl = CardFactoryUtil.getAurasEnchanting(newCard, "Guilty Conscience"); + for (Card crd : cl) + { + GameActionUtil.executeGuiltyConscienceEffects(newCard, crd, 1); + } } };//SpellAbility ability.setDescription("tap: Stuffy Doll deals 1 damage to itself."); @@ -377,11 +380,9 @@ public class CardFactory_Creatures { card.addSpellAbility(ability); } //*************** END ************ END ************************** - - //*************** START *********** START ************************** else if(cardName.equals("Caller of the Claw")) { @@ -1982,7 +1983,7 @@ public class CardFactory_Creatures { public void resolve() { if(getTargetCard() != null && CardFactoryUtil.canDamage(card, getTargetCard()) && CardFactoryUtil.canTarget(card,getTargetCard()) ) - getTargetCard().addDamage(3); + getTargetCard().addDamage(3, card); else AllZone.GameAction.getPlayerLife(getTargetPlayer()).subtractLife(3); } @@ -3105,7 +3106,7 @@ public class CardFactory_Creatures { list = list.getType("Creature"); for(int i = 0; i < list.size(); i++) if(! list.get(i).getKeyword().contains("Flying") && CardFactoryUtil.canDamage(card, list.get(i))) - list.get(i).addDamage(5); + list.get(i).addDamage(5, card); } }; Command destroy = new Command() @@ -3199,7 +3200,7 @@ public class CardFactory_Creatures { public void resolve() { if(AllZone.GameAction.isCardInPlay(getTargetCard()) && CardFactoryUtil.canDamage(card, getTargetCard()) && CardFactoryUtil.canTarget(card,getTargetCard()) ) - AllZone.GameAction.addDamage(getTargetCard(), 4); + AllZone.GameAction.addDamage(getTargetCard(), card, 4); } }; Command intoPlay = new Command() @@ -3640,7 +3641,7 @@ public class CardFactory_Creatures { public void resolve() { if(AllZone.GameAction.isCardInPlay(getTargetCard()) && CardFactoryUtil.canDamage(card, getTargetCard()) && CardFactoryUtil.canTarget(card,getTargetCard()) ) - getTargetCard().addDamage(3); + getTargetCard().addDamage(3, card); } }; Command destroy = new Command() @@ -3702,7 +3703,7 @@ public class CardFactory_Creatures { public void resolve() { card.setDamage(0); - card.setAssignedDamage(0); + card.clearAssignedDamage(); card.untap(); //moves card to top of library @@ -3740,7 +3741,7 @@ public class CardFactory_Creatures { public void resolve() { if(AllZone.GameAction.isCardInPlay(getTargetCard()) && CardFactoryUtil.canDamage(card, getTargetCard()) && CardFactoryUtil.canTarget(card,getTargetCard()) ) - getTargetCard().addDamage(2); + getTargetCard().addDamage(2, card); } }; Command intoPlay = new Command() @@ -5474,7 +5475,7 @@ public class CardFactory_Creatures { && CardFactoryUtil.canTarget(card,getTargetCard()) ) { Card c = getTargetCard(); - c.addDamage(damage); + c.addDamage(damage, card); } } else @@ -5498,7 +5499,7 @@ public class CardFactory_Creatures { if((card.isCreature() || card.isPlaneswalker()) && zone.is(Constant.Zone.Play)) { int damage = ((Integer)countZubera.execute()).intValue(); - card.addDamage(damage); + card.addDamage(damage, card); //have to do this since state effects aren't checked //after this "Input" class is done @@ -6264,7 +6265,7 @@ public class CardFactory_Creatures { if(getTargetCard() != null) { if(AllZone.GameAction.isCardInPlay(getTargetCard()) && CardFactoryUtil.canTarget(card, getTargetCard()) ) - getTargetCard().addDamage(1); + getTargetCard().addDamage(1, card); } else AllZone.GameAction.getPlayerLife(getTargetPlayer()).subtractLife(1); @@ -6306,14 +6307,18 @@ public class CardFactory_Creatures { { if(AllZone.GameAction.isCardInPlay(getTargetCard()) && CardFactoryUtil.canTarget(card, getTargetCard()) ) { - getTargetCard().addDamage(2); + getTargetCard().addDamage(2, card); //3 damage to self AllZone.GameAction.getPlayerLife(card.getController()).subtractLife(3); if (card.getKeyword().contains("Lifelink")) GameActionUtil.executeLifeLinkEffects(card, 5); - for(int i=0; i < CardFactoryUtil.hasNumberEnchantments(card, "Guilty Conscience"); i++) - GameActionUtil.executeGuiltyConscienceEffects(card, 5); + + CardList cl = CardFactoryUtil.getAurasEnchanting(card, "Guilty Conscience"); + for (Card crd : cl) + { + GameActionUtil.executeGuiltyConscienceEffects(card, crd, 5); + } } } @@ -6325,8 +6330,12 @@ public class CardFactory_Creatures { if (card.getKeyword().contains("Lifelink")) GameActionUtil.executeLifeLinkEffects(card, 5); - for(int i=0; i < CardFactoryUtil.hasNumberEnchantments(card, "Guilty Conscience"); i++) - GameActionUtil.executeGuiltyConscienceEffects(card, 5); + + CardList cl = CardFactoryUtil.getAurasEnchanting(card, "Guilty Conscience"); + for (Card crd : cl) + { + GameActionUtil.executeGuiltyConscienceEffects(card, crd, 5); + } } }//resolve() @@ -6365,12 +6374,16 @@ public class CardFactory_Creatures { PlayerLife life = AllZone.GameAction.getPlayerLife(card.getController()); life.subtractLife(countGoblins()); - getTargetCard().addDamage(countGoblins()); + getTargetCard().addDamage(countGoblins(), card); if (card.getKeyword().contains("Lifelink")) GameActionUtil.executeLifeLinkEffects(card, 2*countGoblins()); - for(int i=0; i < CardFactoryUtil.hasNumberEnchantments(card, "Guilty Conscience"); i++) - GameActionUtil.executeGuiltyConscienceEffects(card, 2*countGoblins()); + + CardList cl = CardFactoryUtil.getAurasEnchanting(card, "Guilty Conscience"); + for (Card crd : cl) + { + GameActionUtil.executeGuiltyConscienceEffects(card, crd, 2*countGoblins()); + } } }//resolve() int countGoblins() @@ -6899,7 +6912,7 @@ public class CardFactory_Creatures { CardList list = getRadiance(getTargetCard()); for(int i = 0; i < list.size(); i++) { if (CardFactoryUtil.canDamage(card, list.get(i))) - list.get(i).addDamage(1); + list.get(i).addDamage(1, card); } } }//resolve() @@ -7200,7 +7213,7 @@ public class CardFactory_Creatures { if(AllZone.GameAction.isCardInPlay(getTargetCard()) && CardFactoryUtil.canTarget(card, getTargetCard()) && (attackers.contains(getTargetCard()) || blockers.contains(getTargetCard()) ) ) { - getTargetCard().addDamage(2); + getTargetCard().addDamage(2, card); } }//resolve() public boolean canPlayAI() @@ -7257,7 +7270,7 @@ public class CardFactory_Creatures { if(AllZone.GameAction.isCardInPlay(getTargetCard()) && CardFactoryUtil.canTarget(card, getTargetCard()) && (attackers.contains(getTargetCard()) || blockers.contains(getTargetCard()) ) ) { - getTargetCard().addDamage(3); + getTargetCard().addDamage(3, card); } }//resolve() public boolean canPlayAI() @@ -7311,7 +7324,7 @@ public class CardFactory_Creatures { if(AllZone.GameAction.isCardInPlay(getTargetCard()) && CardFactoryUtil.canTarget(card, getTargetCard()) && attackers.contains(getTargetCard()) && getTargetCard().getKeyword().contains("Flying")) { - getTargetCard().addDamage(4); + getTargetCard().addDamage(4, card); } }//resolve() public boolean canPlayAI() @@ -7816,7 +7829,7 @@ public class CardFactory_Creatures { card.setIntrinsicKeyword(new ArrayList()); card.addIntrinsicKeyword("Flying"); - card.setAssignedDamage(0); + card.clearAssignedDamage(); card.setDamage(0); card.untap(); AllZone.getZone(card).remove(card); @@ -7952,7 +7965,8 @@ public class CardFactory_Creatures { }); for(int i = 0; i < list.size(); i++) - list.get(i).addDamage(1); + if (CardFactoryUtil.canDamage(card, list.get(i))) + list.get(i).addDamage(1, card); }//resolve() };//SpellAbility @@ -8686,7 +8700,7 @@ public class CardFactory_Creatures { public void resolve() { if(AllZone.GameAction.isCardInPlay(getTargetCard()) && CardFactoryUtil.canTarget(card, getTargetCard()) ) - getTargetCard().addDamage(1); + getTargetCard().addDamage(1, card); }//resolve() };//SpellAbility @@ -8785,7 +8799,7 @@ public class CardFactory_Creatures { if(getTargetCard() != null) { if(AllZone.GameAction.isCardInPlay(getTargetCard()) && CardFactoryUtil.canTarget(card, getTargetCard()) ) - getTargetCard().addDamage(1); + getTargetCard().addDamage(1, card); } else AllZone.GameAction.getPlayerLife(getTargetPlayer()).subtractLife(1); @@ -8838,7 +8852,7 @@ public class CardFactory_Creatures { { if(AllZone.GameAction.isCardInPlay(getTargetCard()) && CardFactoryUtil.canTarget(card, getTargetCard()) ) { - getTargetCard().addDamage(2); + getTargetCard().addDamage(2, card); getTargetCard().removeIntrinsicKeyword("Flying"); getTargetCard().removeExtrinsicKeyword("Flying"); } @@ -9378,7 +9392,7 @@ public class CardFactory_Creatures { } }); for(int i = 0; i < list.size(); i++) - list.get(i).addDamage(4); + list.get(i).addDamage(4, card); AllZone.Human_Life.subtractLife(4); AllZone.Computer_Life.subtractLife(4); @@ -11015,7 +11029,7 @@ public class CardFactory_Creatures { { Card crd = getTargetCard(); //c.addDamage(damage); - AllZone.GameAction.addDamage(crd, 2); + AllZone.GameAction.addDamage(crd, card, 2); } } else @@ -11107,8 +11121,12 @@ public class CardFactory_Creatures { life.subtractLife(power); GameActionUtil.executeLifeLinkEffects(card, power); - for(int i=0; i < CardFactoryUtil.hasNumberEnchantments(card, "Guilty Conscience"); i++) - GameActionUtil.executeGuiltyConscienceEffects(card, power); + + CardList cl = CardFactoryUtil.getAurasEnchanting(card, "Guilty Conscience"); + for (Card crd : cl) + { + GameActionUtil.executeGuiltyConscienceEffects(card, crd, power); + } card.setDealtDmgToOppThisTurn(true); } @@ -12053,9 +12071,10 @@ public class CardFactory_Creatures { for (int i=0;i blocked = new HashSet(); private HashMap unblockedMap = new HashMap(); - + private HashMap defendingFirstStrikeDamageMap = new HashMap(); + private HashMap defendingDamageMap = new HashMap(); + private int attackingDamage; - private int defendingDamage; - private int defendingFirstStrikeDamage; + //private int defendingDamage; + + //private int defendingFirstStrikeDamage; //private int trampleDamage; //private int trampleFirstStrikeDamage; @@ -35,8 +38,8 @@ public class Combat unblockedMap.clear(); attackingDamage = 0; - defendingDamage = 0; - defendingFirstStrikeDamage = 0; + defendingDamageMap.clear(); + defendingFirstStrikeDamageMap.clear(); declaredAttackers = 0; attackingPlayer = ""; @@ -54,11 +57,37 @@ public class Combat public String getDefendingPlayer() {return defendingPlayer;} //relates to defending player damage - public int getDefendingDamage() {return defendingDamage;} - public int getDefendingFirstStrikeDamage() {return defendingFirstStrikeDamage;} - public void setDefendingDamage() + //public int getDefendingDamage() {return defendingDamage;} + + public int getTotalDefendingDamage() { - defendingDamage = 0; + int total = 0; + + Collection c = defendingDamageMap.values(); + + Iterator itr = c.iterator(); + while(itr.hasNext()) + total+=itr.next(); + + return total; + } + + public int getTotalFirstStrikeDefendingDamage() + { + int total = 0; + + Collection c = defendingFirstStrikeDamageMap.values(); + + Iterator itr = c.iterator(); + while(itr.hasNext()) + total+=itr.next(); + + return total; + } + + public void setDefendingDamage() + { + defendingDamageMap.clear(); CardList att = new CardList(getAttackers()); //sum unblocked attackers' power for(int i = 0; i < att.size(); i++) { @@ -70,13 +99,13 @@ public class Combat //if the creature has first strike do not do damage in the normal combat phase //if(att.get(i).hasSecondStrike()) if(!att.get(i).hasFirstStrike() || (att.get(i).hasFirstStrike() && att.get(i).hasDoubleStrike()) ) - defendingDamage += damageDealt; + addDefendingDamage(damageDealt, att.get(i)); } } } public void setDefendingFirstStrikeDamage() { - defendingFirstStrikeDamage = 0; + defendingFirstStrikeDamageMap.clear(); CardList att = new CardList(getAttackers()); //sum unblocked attackers' power for(int i = 0; i < att.size(); i++) { @@ -88,13 +117,30 @@ public class Combat //if the creature has first strike or double strike do damage in the first strike combat phase if(att.get(i).hasFirstStrike() || att.get(i).hasDoubleStrike()){ - defendingFirstStrikeDamage += damageDealt; + addDefendingFirstStrikeDamage(damageDealt, att.get(i)); } } } } - public void addDefendingDamage(int n) {defendingDamage += n;} - public void addDefendingFirstStrikeDamage(int n) {defendingFirstStrikeDamage += n;} + public void addDefendingDamage(int n, Card source) + { + if (!defendingDamageMap.containsKey(source)) + defendingDamageMap.put(source, n); + else + { + defendingDamageMap.put(source, defendingDamageMap.get(source)+n); + } + } + + public void addDefendingFirstStrikeDamage(int n, Card source) + { + if (!defendingFirstStrikeDamageMap.containsKey(source)) + defendingFirstStrikeDamageMap.put(source, n); + else + { + defendingFirstStrikeDamageMap.put(source, defendingFirstStrikeDamageMap.get(source)+n); + } + } public void addAttackingDamage(int n) {attackingDamage += n;} public int getAttackingDamage() {return attackingDamage;} @@ -140,8 +186,7 @@ public class Combat return block; }//getAllBlockers() - public CardList getBlockers(Card attacker) {return new CardList(getList(attacker).toArray()); - } + public CardList getBlockers(Card attacker) {return new CardList(getList(attacker).toArray());} private CardList getList(Card attacker) {return (CardList)map.get(attacker);} public void removeFromCombat(Card c) @@ -178,88 +223,117 @@ public class Combat CardList attacking = new CardList(getAttackers()); for(int i = 0; i < attacking.size(); i++) { - - block = getBlockers(attacking.get(i)); - - //attacker always gets all blockers' attack - AllZone.GameAction.setAssignedDamage(attacking.get(i), block, CardListUtil.sumFirstStrikeAttack(block)); - //attacking.get(i).setAssignedDamage(CardListUtil.sumFirstStrikeAttack(block)); - if(block.size() == 0)//this damage is assigned to a player by setPlayerDamage() - { - //GameActionUtil.executePlayerCombatDamageEffects(attacking.get(i)); - addUnblockedAttacker(attacking.get(i)); - } - else if(block.size() == 1) - { - if(attacking.get(i).hasFirstStrike() || attacking.get(i).hasDoubleStrike()){ - int damageDealt = attacking.get(i).getNetAttack(); - if (CombatUtil.isDoranInPlay()) - damageDealt = attacking.get(i).getNetDefense(); - - //block.get(0).setAssignedDamage(damageDealt); - CardList cl = new CardList(); - cl.add(attacking.get(i)); - AllZone.GameAction.setAssignedDamage(block.get(0), cl , damageDealt); - - //trample - int trample = damageDealt - block.get(0).getNetDefense(); - if(attacking.get(i).getKeyword().contains("Trample") && 0 < trample) - { - this.addDefendingFirstStrikeDamage(trample); - //System.out.println("First Strike trample damage: " + trample); - } - } - }//1 blocker - else if(getAttackingPlayer().equals(Constant.Player.Computer)) - { - if(attacking.get(i).hasFirstStrike() || attacking.get(i).hasDoubleStrike()){ - int damageDealt = attacking.get(i).getNetAttack(); - if (CombatUtil.isDoranInPlay()) - damageDealt = attacking.get(i).getNetDefense(); - setAssignedFirstStrikeDamage(attacking.get(i), block, damageDealt); - } - } - else//human - { - if(attacking.get(i).hasFirstStrike() || attacking.get(i).hasDoubleStrike()){ - //GuiDisplay2 gui = (GuiDisplay2) AllZone.Display; - int damageDealt = attacking.get(i).getNetAttack(); - if (CombatUtil.isDoranInPlay()) - damageDealt = attacking.get(i).getNetDefense(); - AllZone.Display.assignDamage(attacking.get(i),block, damageDealt); - //System.out.println("setAssignedFirstStrikeDmg called for:" + damageDealt + " damage."); - } - } + if(attacking.get(i).hasFirstStrike() || (attacking.get(i).hasDoubleStrike() )){ + block = getBlockers(attacking.get(i)); + + //attacker always gets all blockers' attack + //AllZone.GameAction.setAssignedDamage(attacking.get(i), block, CardListUtil.sumFirstStrikeAttack(block)); + + for (Card b : block) + { + if (b.hasFirstStrike() || b.hasDoubleStrike()) { + int attack = b.getNetAttack(); + if (CombatUtil.isDoranInPlay()) + attack = b.getNetDefense(); + AllZone.GameAction.addAssignedDamage(attacking.get(i), b, attack); + } + } + + //attacking.get(i).setAssignedDamage(CardListUtil.sumFirstStrikeAttack(block)); + if(block.size() == 0)//this damage is assigned to a player by setPlayerDamage() + { + //GameActionUtil.executePlayerCombatDamageEffects(attacking.get(i)); + addUnblockedAttacker(attacking.get(i)); + } + else if(block.size() == 1) + { + if(attacking.get(i).hasFirstStrike() || attacking.get(i).hasDoubleStrike()){ + int damageDealt = attacking.get(i).getNetAttack(); + if (CombatUtil.isDoranInPlay()) + damageDealt = attacking.get(i).getNetDefense(); + + CardList cl = new CardList(); + cl.add(attacking.get(i)); + + AllZone.GameAction.addAssignedDamage(block.get(0), attacking.get(i), damageDealt); + + + //trample + int trample = damageDealt - block.get(0).getNetDefense(); + if(attacking.get(i).getKeyword().contains("Trample") && 0 < trample) + { + this.addDefendingFirstStrikeDamage(trample, attacking.get(i)); + //System.out.println("First Strike trample damage: " + trample); + } + } + }//1 blocker + else if(getAttackingPlayer().equals(Constant.Player.Computer)) + { + if(attacking.get(i).hasFirstStrike() || attacking.get(i).hasDoubleStrike()){ + int damageDealt = attacking.get(i).getNetAttack(); + if (CombatUtil.isDoranInPlay()) + damageDealt = attacking.get(i).getNetDefense(); + addAssignedFirstStrikeDamage(attacking.get(i), block, damageDealt); + } + } + else//human + { + if(attacking.get(i).hasFirstStrike() || attacking.get(i).hasDoubleStrike()){ + //GuiDisplay2 gui = (GuiDisplay2) AllZone.Display; + int damageDealt = attacking.get(i).getNetAttack(); + if (CombatUtil.isDoranInPlay()) + damageDealt = attacking.get(i).getNetDefense(); + AllZone.Display.assignDamage(attacking.get(i),block, damageDealt); + + /* + for (Card b : block) + { + AllZone.Display.assignDamage(attacking.get(i), b, damageDealt); + //System.out.println("setAssignedFirstStrikeDmg called for:" + damageDealt + " damage."); + } + AllZone.Display.addAssignDamage(attacking.get(i),damageDealt); + */ + } + }//if(hasFirstStrike || doubleStrike) }//for //should first strike affect the following? if(getPlaneswalker() != null) { //System.out.println("defendingDmg (setAssignedFirstStrikeDamage) :" +defendingFirstStrikeDamage); - planeswalker.setAssignedDamage(defendingFirstStrikeDamage); - defendingFirstStrikeDamage = 0; + // + + Iterator iter = defendingFirstStrikeDamageMap.keySet().iterator(); + while(iter.hasNext()) { + Card crd = iter.next(); + planeswalker.addAssignedDamage(defendingFirstStrikeDamageMap.get(crd), crd); + } + + defendingFirstStrikeDamageMap.clear(); + } + } }//setAssignedFirstStrikeDamage() - private void setAssignedFirstStrikeDamage(Card attacker, CardList list, int damage) + + private void addAssignedFirstStrikeDamage (Card attacker, CardList block, int damage) { - CardListUtil.sortAttack(list); - Card c; - for(int i = 0; i < list.size(); i++) - { - c = list.get(i); - if(c.getKillDamage() <= damage) - { - damage -= c.getKillDamage(); - CardList cl = new CardList(); - cl.add(attacker); - - AllZone.GameAction.setAssignedDamage(c, cl, c.getKillDamage()); - //c.setAssignedDamage(c.getKillDamage()); - } + + Card c = attacker; + for (Card b:block) { + if(c.getKillDamage() <= damage) + { + damage -= c.getKillDamage(); + CardList cl = new CardList(); + cl.add(attacker); + + AllZone.GameAction.addAssignedDamage(b, c, c.getKillDamage()); + //c.setAssignedDamage(c.getKillDamage()); + } }//for }//setAssignedFirstStrikeDamage() - //set Card.setAssignedDamage() for all creatures in combat + + //set Card.setAssignedDamage() for all creatures in combat //also assigns player damage by setPlayerDamage() public void setAssignedDamage() { @@ -275,7 +349,16 @@ public class Combat //attacker always gets all blockers' attack //attacking.get(i).setAssignedDamage(CardListUtil.sumAttack(block)); - AllZone.GameAction.setAssignedDamage(attacking.get(i), block, CardListUtil.sumAttack(block)); + //AllZone.GameAction.setAssignedDamage(attacking.get(i), block, CardListUtil.sumAttack(block)); + + for (Card b : block) + { + int attack = b.getNetAttack(); + if (CombatUtil.isDoranInPlay()) + attack = b.getNetDefense(); + AllZone.GameAction.addAssignedDamage(attacking.get(i), b, attack ); + } + if(block.size() == 0)//this damage is assigned to a player by setPlayerDamage() { //GameActionUtil.executePlayerCombatDamageEffects(attacking.get(i)); @@ -287,17 +370,13 @@ public class Combat if (CombatUtil.isDoranInPlay()) damageDealt = attacking.get(i).getNetDefense(); - //block.get(0).setAssignedDamage(damageDealt); - CardList cl = new CardList(); - cl.add(attacking.get(i)); - AllZone.GameAction.setAssignedDamage(block.get(0), cl , damageDealt); - - + AllZone.GameAction.addAssignedDamage(block.get(0), attacking.get(i), damageDealt); + //trample int trample = damageDealt - block.get(0).getNetDefense(); - if(attacking.get(i).getKeyword().contains("Trample") && 0 < trample) { - this.addDefendingDamage(trample); - //System.out.println("Reg trample damage: " + trample); + if(attacking.get(i).getKeyword().contains("Trample") && 0 < trample) + { + this.addDefendingDamage(trample, attacking.get(i)); } }//1 blocker else if(getAttackingPlayer().equals(Constant.Player.Computer)) @@ -305,7 +384,7 @@ public class Combat int damageDealt = attacking.get(i).getNetAttack(); if (CombatUtil.isDoranInPlay()) damageDealt = attacking.get(i).getNetDefense(); - setAssignedDamage(attacking.get(i),block, damageDealt); + addAssignedDamage(attacking.get(i),block , damageDealt); } else//human @@ -314,8 +393,17 @@ public class Combat int damageDealt = attacking.get(i).getNetAttack(); if (CombatUtil.isDoranInPlay()) damageDealt = attacking.get(i).getNetDefense(); - AllZone.Display.assignDamage(attacking.get(i), block, damageDealt); + + AllZone.Display.assignDamage(attacking.get(i), block, damageDealt); + + /* + * + * + for (Card b :block) + AllZone.Display.addAssignDamage(attacking.get(i), b, damageDealt); //System.out.println("setAssignedDmg called for:" + damageDealt + " damage."); + * + */ } }//if !hasFirstStrike ... //hacky code, to ensure surviving non-first-strike blockers will hit first strike attackers: @@ -324,13 +412,16 @@ public class Combat //System.out.println("block size: " + block.size()); if( (attacking.get(i).hasFirstStrike() || attacking.get(i).hasDoubleStrike()) ) { - int blockerDamage = 0; for(int j=0; j < block.size(); j++) { - blockerDamage += block.get(j).getNetAttack(); + //blockerDamage += block.get(j).getNetAttack(); + int damage = block.get(j).getNetAttack(); + if (CombatUtil.isDoranInPlay()) + damage = block.get(j).getNetDefense(); + AllZone.GameAction.addAssignedDamage(attacking.get(i), block.get(j), damage); } //attacking.get(i).setAssignedDamage(blockerDamage); - AllZone.GameAction.setAssignedDamage(attacking.get(i), block , blockerDamage); + //AllZone.GameAction.setAssignedDamage(attacking.get(i), block , blockerDamage); } } }//for @@ -339,10 +430,16 @@ public class Combat if(getPlaneswalker() != null) { //System.out.println("defendingDmg (setAssignedDamage): " + defendingDamage); - planeswalker.setAssignedDamage(defendingDamage); - defendingDamage = 0; + Iterator iter = defendingDamageMap.keySet().iterator(); + while(iter.hasNext()) { + Card crd = iter.next(); + planeswalker.addAssignedDamage(defendingDamageMap.get(crd), crd); + } + defendingDamageMap.clear(); } }//assignDamage() + + /* private void setAssignedDamage(Card attacker, CardList list, int damage) { CardListUtil.sortAttack(list); @@ -356,13 +453,29 @@ public class Combat damage -= c.getKillDamage(); CardList cl = new CardList(); cl.add(attacker); - AllZone.GameAction.setAssignedDamage(c, cl, c.getKillDamage()); + AllZone.GameAction.addAssignedDamage(c, cl, c.getKillDamage()); //c.setAssignedDamage(c.getKillDamage()); } //} }//for }//assignDamage() - + */ + + private void addAssignedDamage (Card attacker, CardList block, int damage) + { + Card c = attacker; + for (Card b:block) { + if(c.getKillDamage() <= damage) + { + damage -= c.getKillDamage(); + CardList cl = new CardList(); + cl.add(attacker); + + AllZone.GameAction.addAssignedDamage(b, c, c.getKillDamage()); + //c.setAssignedDamage(c.getKillDamage()); + } + }//for + }//setAssignedDamage() public Card[] getUnblockedAttackers() { diff --git a/src/forge/CombatPlaneswalker.java b/src/forge/CombatPlaneswalker.java index 08c5e06c01b..75d87b2f4b0 100644 --- a/src/forge/CombatPlaneswalker.java +++ b/src/forge/CombatPlaneswalker.java @@ -7,9 +7,11 @@ public class CombatPlaneswalker //value is CardList of blockers private Map map = new HashMap(); private Set blocked = new HashSet(); + private HashMap defendingFirstStrikeDamageMap = new HashMap(); + private HashMap defendingDamageMap = new HashMap(); - private int attackingDamage; - private int defendingDamage; + //private int attackingDamage; + //private int defendingDamage; private String attackingPlayer; private String defendingPlayer; @@ -25,8 +27,8 @@ public class CombatPlaneswalker map.clear(); blocked.clear(); - attackingDamage = 0; - defendingDamage = 0; + defendingFirstStrikeDamageMap.clear(); + defendingDamageMap.clear(); attackingPlayer = ""; defendingPlayer = ""; @@ -41,20 +43,51 @@ public class CombatPlaneswalker public String getDefendingPlayer() {return defendingPlayer;} //relates to defending player damage - public int getDefendingDamage() {return defendingDamage;} + public int getTotalDefendingDamage() + { + int total = 0; + + Collection c = defendingDamageMap.values(); + + Iterator itr = c.iterator(); + while(itr.hasNext()) + total+=itr.next(); + + return total; + } + public void setDefendingDamage() { - defendingDamage = 0; - CardList att = new CardList(getAttackers()); - //sum unblocked attackers' power - for(int i = 0; i < att.size(); i++) - if(! isBlocked(att.get(i))) - defendingDamage += att.get(i).getNetAttack(); - } - public void addDefendingDamage(int n) {defendingDamage += n;} + defendingDamageMap.clear(); + CardList att = new CardList(getAttackers()); + //sum unblocked attackers' power + for(int i = 0; i < att.size(); i++) { + if(! isBlocked(att.get(i))) { + int damageDealt = att.get(i).getNetAttack(); + if (CombatUtil.isDoranInPlay()) + damageDealt = att.get(i).getNetDefense(); + //if the creature has first strike do not do damage in the normal combat phase + //if(att.get(i).hasSecondStrike()) + addDefendingDamage(damageDealt, att.get(i)); + } + } + } + + public void addDefendingDamage(int n, Card source) + { + if (!defendingDamageMap.containsKey(source)) + defendingDamageMap.put(source, n); + else + { + defendingDamageMap.put(source, defendingDamageMap.get(source)+n); + } + } + + /*//Needed ?? public void addAttackingDamage(int n) {attackingDamage += n;} public int getAttackingDamage() {return attackingDamage;} + */ public void addAttacker(Card c) {map.put(c, new CardList());} public void resetAttackers() {map.clear();} @@ -132,42 +165,63 @@ public class CombatPlaneswalker { block = getBlockers(attacking.get(i)); + //attacker always gets all blockers' attack - AllZone.GameAction.setAssignedDamage(attacking.get(i), block, CardListUtil.sumAttack(block)); + for (Card b : block) { + int attack = b.getNetAttack(); + if (CombatUtil.isDoranInPlay()) + attack = b.getNetDefense(); + AllZone.GameAction.addAssignedDamage(attacking.get(i), b, attack); + } //attacking.get(i).setAssignedDamage(CardListUtil.sumAttack(block)); if(block.size() == 0)//this damage is assigned to a player by setPlayerDamage() ; else if(block.size() == 1) { - block.get(0).setAssignedDamage(attacking.get(i).getNetAttack()); + block.get(0).addAssignedDamage(attacking.get(i).getNetAttack(), attacking.get(i)); //trample int trample = attacking.get(i).getNetAttack() - block.get(0).getNetDefense(); + if (CombatUtil.isDoranInPlay()) + { + trample = attacking.get(i).getNetDefense() - block.get(0).getNetDefense(); + } if(attacking.get(i).getKeyword().contains("Trample") && 0 < trample) - this.addDefendingDamage(trample); + this.addDefendingDamage(trample, attacking.get(i)); + /* trample = block.get(0).getNetAttack() - attacking.get(i).getNetDefense(); if(block.get(0).getKeyword().contains("Trample") && 0 < trample) this.addAttackingDamage(trample); + */ }//1 blocker else if(getAttackingPlayer().equals(Constant.Player.Computer)) { - setAssignedDamage(block, attacking.get(i).getNetAttack()); + for (Card b : block) + addAssignedDamage(b, attacking.get(i), attacking.get(i).getNetAttack()); } else//human { GuiDisplay2 gui = (GuiDisplay2) AllZone.Display; + //gui.assignDamage(attacking.get(i), block.get(0), attacking.get(i).getNetAttack()); gui.assignDamage(attacking.get(i), block, attacking.get(i).getNetAttack()); } }//for - planeswalker.setAssignedDamage(defendingDamage); - defendingDamage = 0; + Iterator iter = defendingDamageMap.keySet().iterator(); + while(iter.hasNext()) { + Card crd = iter.next(); + planeswalker.addAssignedDamage(defendingDamageMap.get(crd), crd); + } + + defendingDamageMap.clear(); + }//assignDamage() - private void setAssignedDamage(CardList list, int damage) + private void addAssignedDamage(Card b, Card a, int damage) { + /* CardListUtil.sortAttack(list); Card c; for(int i = 0; i < list.size(); i++) @@ -179,6 +233,16 @@ public class CombatPlaneswalker c.setAssignedDamage(c.getKillDamage()); } }//for + */ + if (b.getKillDamage() <= damage) + { + damage -= b.getKillDamage(); + b.addAssignedDamage(b.getKillDamage(), a); + } + + + + }//assignDamage() } diff --git a/src/forge/Computer.java b/src/forge/Computer.java index 17b88799dd6..37aa8e2b172 100644 --- a/src/forge/Computer.java +++ b/src/forge/Computer.java @@ -13,6 +13,7 @@ public interface Computer public void end_of_turn();//end of Human's turn public void addNumberPlayLands(int n); + public void setNumberPlayLands(int n); public void stack_not_empty(); } diff --git a/src/forge/ComputerAI_Burn.java b/src/forge/ComputerAI_Burn.java index 0197de545a3..c3a663636fe 100644 --- a/src/forge/ComputerAI_Burn.java +++ b/src/forge/ComputerAI_Burn.java @@ -132,6 +132,11 @@ public class ComputerAI_Burn implements Computer { numberPlayLand += n; } + public void setNumberPlayLands(int n) + { + numberPlayLand = n; + } + public void stack_not_empty() { //same as Input.stop() method //ends the method diff --git a/src/forge/ComputerAI_Burn2.java b/src/forge/ComputerAI_Burn2.java index 3a26613e30e..8998fad3632 100644 --- a/src/forge/ComputerAI_Burn2.java +++ b/src/forge/ComputerAI_Burn2.java @@ -174,6 +174,11 @@ public class ComputerAI_Burn2 implements Computer { numberPlayLand += n; } + public void setNumberPlayLands(int n) + { + numberPlayLand = n; + } + public void stack_not_empty() { //same as Input.stop() method //ends the method diff --git a/src/forge/ComputerAI_General.java b/src/forge/ComputerAI_General.java index b3bcaf889a9..d23df6b6627 100644 --- a/src/forge/ComputerAI_General.java +++ b/src/forge/ComputerAI_General.java @@ -9,7 +9,7 @@ import java.util.TreeSet; public class ComputerAI_General implements Computer { //private boolean playLand = true; //private int numberPlayLand = 1; - private int numberPlayLand = CardFactoryUtil.getCanPlayNumberOfLands(Constant.Player.Computer); + public int numberPlayLand = CardFactoryUtil.getCanPlayNumberOfLands(Constant.Player.Computer); private Collection playMain1Cards; @SuppressWarnings("unchecked") @@ -313,6 +313,11 @@ public class ComputerAI_General implements Computer { numberPlayLand += n; } + public void setNumberPlayLands(int n) + { + numberPlayLand = n; + } + public void stack_not_empty() { //same as Input.stop() method //ends the method diff --git a/src/forge/ComputerAI_Rats2.java b/src/forge/ComputerAI_Rats2.java index d5ad69ef1b3..734a4baef4a 100644 --- a/src/forge/ComputerAI_Rats2.java +++ b/src/forge/ComputerAI_Rats2.java @@ -139,6 +139,11 @@ public class ComputerAI_Rats2 implements Computer numberPlayLand += n; } + public void setNumberPlayLands(int n) + { + numberPlayLand = n; + } + public void stack_not_empty() { AllZone.InputControl.resetInput(); diff --git a/src/forge/ComputerAI_Testing.java b/src/forge/ComputerAI_Testing.java index ca70400b409..362894fe773 100644 --- a/src/forge/ComputerAI_Testing.java +++ b/src/forge/ComputerAI_Testing.java @@ -64,4 +64,9 @@ public class ComputerAI_Testing implements Computer { numberPlayLand += n; } + + public void setNumberPlayLands(int n) + { + numberPlayLand = n; + } } \ No newline at end of file diff --git a/src/forge/ComputerUtil_Attack2.java b/src/forge/ComputerUtil_Attack2.java index a15046335b4..5149723c433 100644 --- a/src/forge/ComputerUtil_Attack2.java +++ b/src/forge/ComputerUtil_Attack2.java @@ -245,23 +245,7 @@ import java.util.*; return list.size(); } - - public void assignDamage(CardList list, int damage) - { - CardListUtil.sortAttack(list); - - int kill; - for(int i = 0; i < list.size(); i++) - { - kill = list.get(i).getKillDamage(); - if(kill <= damage) - { - damage -= kill; - list.get(i).setAssignedDamage(kill); - } - } - }//assignDamage() - + public int getAttack(Card c) { int n = c.getNetAttack(); diff --git a/src/forge/Display.java b/src/forge/Display.java index 3336051f2bf..854a5d637ec 100644 --- a/src/forge/Display.java +++ b/src/forge/Display.java @@ -16,4 +16,6 @@ public interface Display { //assigns combat damage, used by Combat.setAssignedDamage() public void assignDamage(Card attacker, CardList blockers, int damage); + //public void addAssignDamage(Card attacker, Card blocker, int damage); + //public void addAssignDamage(Card attacker, int damage); } diff --git a/src/forge/EndOfCombat.java b/src/forge/EndOfCombat.java new file mode 100644 index 00000000000..d8e967e4a8a --- /dev/null +++ b/src/forge/EndOfCombat.java @@ -0,0 +1,37 @@ +package forge; +//import java.util.*; + +//handles "until end of turn" and "at end of turn" commands from cards +public class EndOfCombat implements java.io.Serializable +{ + + private static final long serialVersionUID = 3035250030566186842L; + + private CommandList at = new CommandList(); + private CommandList until = new CommandList(); + + public void addAt(Command c) {at.add(c);} + public void addUntil(Command c) {until.add(c);} + + public void executeAt() + { + //AllZone.StateBasedEffects.rePopulateStateBasedList(); + execute(at); + }//executeAt() + + + public void executeUntil() { + execute(until); + } + + public int sizeAt() {return at.size();} + public int sizeUntil() {return until.size();} + + private void execute(CommandList c) + { + int length = c.size(); + + for(int i = 0; i < length; i++) + c.remove(0).execute(); + } +} diff --git a/src/forge/GameAction.java b/src/forge/GameAction.java index 36ee5f621db..babb5e396b2 100644 --- a/src/forge/GameAction.java +++ b/src/forge/GameAction.java @@ -1,5 +1,6 @@ package forge; import java.util.*; + import javax.swing.*; @@ -812,7 +813,10 @@ private Card getCurrentCard(int ID) // AllZone.Computer = new ComputerAI_Input(new ComputerAI_General()); System.gc(); //garbage collection... does it make a difference though? lastPlayerToDraw = Constant.Player.Human; - + + Input_Main.canPlayNumberOfLands = 1; + AllZone.Computer.getComputer().setNumberPlayLands(1); + AllZone.Computer_Life.setLife(20); AllZone.Human_Life.setLife(20); @@ -1214,55 +1218,45 @@ private int getDifferentLand(CardList list, String land) } - public void setAssignedDamage(Card card, CardList sourceCards, int damage) + public void addAssignedDamage(Card card, Card sourceCard, int damage) { if (damage < 0) damage = 0; int assignedDamage = damage; - if (sourceCards.size() == 1) - { - Card sourceCard = sourceCards.get(0); - card.addReceivedDamageFromThisTurn(sourceCard, damage); - if (card.getKeyword().contains("Protection from white") && CardUtil.getColors(sourceCard).contains(Constant.Color.White)) - assignedDamage = 0; - if (card.getKeyword().contains("Protection from blue") && CardUtil.getColors(sourceCard).contains(Constant.Color.Blue)) - assignedDamage = 0; - if (card.getKeyword().contains("Protection from black") && CardUtil.getColors(sourceCard).contains(Constant.Color.Black)) - assignedDamage = 0; - if (card.getKeyword().contains("Protection from red") && CardUtil.getColors(sourceCard).contains(Constant.Color.Red)) - assignedDamage = 0; - if (card.getKeyword().contains("Protection from green") && CardUtil.getColors(sourceCard).contains(Constant.Color.Green)) - assignedDamage = 0; - - if (card.getKeyword().contains("Protection from creatures") && sourceCard.isCreature()) - assignedDamage = 0; - if (card.getKeyword().contains("Protection from everything")) - assignedDamage = 0; - if (card.getKeyword().contains("Protection from artifacts") && sourceCard.isArtifact()) - assignedDamage = 0; - - if (card.getKeyword().contains("Protection from Dragons") && sourceCard.getType().contains("Dragon")) - assignedDamage = 0; - if (card.getKeyword().contains("Protection from Demons") && sourceCard.getType().contains("Demon")) - assignedDamage = 0; - if (card.getKeyword().contains("Protection from Goblins") && sourceCard.getType().contains("Goblin")) - assignedDamage = 0; - - if (card.getKeyword().contains("Protection from enchantments") && sourceCard.getType().contains("Enchantment")) - assignedDamage = 0; - } - else //got blocked by multiple blockers - { - for(int i=0;i 1) System.out.println("(MULTIPLE blockers):"); System.out.println("Assigned " + damage + " damage to " + card); @@ -1270,12 +1264,85 @@ private int getDifferentLand(CardList list, String land) System.out.println(sourceCards.get(i).getName() + " assigned damage to " + card.getName()); } System.out.println("***"); + */ } - public void addDamage(Card card, int damage) + public void addDamage(Card card, HashMap map) + { + int totalDamage = 0; + CardList list = new CardList(); + + Iterator iter = map.keySet().iterator(); + while(iter.hasNext()) { + Card source = iter.next(); + list.add(source); + int damage = map.get(source); + int damageToAdd = damage; + //AllZone.GameAction.addDamage(c, crd , assignedDamageMap.get(crd)); + + if (source.getKeyword().contains("Wither")) + { + damageToAdd = 0; + card.addCounter(Counters.M1M1, damage); + } + if (source.getName().equals("Spiritmonger") || source.getName().equals("Mirri the Cursed")) + { + final Card thisCard = source; + Ability ability2 = new Ability(source, "0") + { + public void resolve() + { + thisCard.addCounter(Counters.P1P1, 1); + } + }; // ability2 + + ability2.setStackDescription(source.getName() + " - gets a +1/+1 counter"); + AllZone.Stack.add(ability2); + } + if (source.getKeyword().contains("Deathtouch")) + { + AllZone.GameAction.destroy(card); + AllZone.Combat.removeFromCombat(card); + } + + totalDamage += damageToAdd; + } + + if (isCardInPlay(card)) + card.addDamage(totalDamage, list); + + } + + public void addDamage(Card card, Card source, int damage) { int damageToAdd = damage; + if (source.getKeyword().contains("Wither")) + { + damageToAdd = 0; + card.addCounter(Counters.M1M1, damage); + } + if (source.getName().equals("Spiritmonger") || source.getName().equals("Mirri the Cursed")) + { + final Card thisCard = source; + Ability ability2 = new Ability(source, "0") + { + public void resolve() + { + thisCard.addCounter(Counters.P1P1, 1); + } + }; // ability2 + + ability2.setStackDescription(source.getName() + " - gets a +1/+1 counter"); + AllZone.Stack.add(ability2); + } + if (source.getKeyword().contains("Deathtouch")) + { + AllZone.GameAction.destroy(card); + AllZone.Combat.removeFromCombat(card); + } + //System.out.println("size of sources: " + card.getReceivedDamageFromThisTurn().size()); + /* if (card.getReceivedDamageFromThisTurn().size() >= 1) { for (Card c : card.getReceivedDamageFromThisTurn().keySet() ) { @@ -1311,10 +1378,12 @@ private int getDifferentLand(CardList list, String land) } } } + } + */ System.out.println("Adding " + damageToAdd + " damage to " + card.getName()); if (isCardInPlay(card)) - card.addDamage(damageToAdd); + card.addDamage(damageToAdd, source); } /* diff --git a/src/forge/GameActionUtil.java b/src/forge/GameActionUtil.java index 4cb75f8ca00..f3be7d3c527 100644 --- a/src/forge/GameActionUtil.java +++ b/src/forge/GameActionUtil.java @@ -88,6 +88,8 @@ public class GameActionUtil // card gets played // (called in MagicStack.java) Card c = sa.getSourceCard(); + + playCard_Dovescape(c); //keep this one top playCard_Emberstrike_Duo(c); playCard_Gravelgill_Duo(c); playCard_Safehold_Duo(c); @@ -98,7 +100,6 @@ public class GameActionUtil playCard_Riverfall_Mimic(c); playCard_Shorecrasher_Mimic(c); playCard_Woodlurker_Mimic(c); - playCard_Dovescape(c); playCard_Belligerent_Hatchling(c); playCard_Voracious_Hatchling(c); playCard_Sturdy_Hatchling(c); @@ -831,8 +832,11 @@ public class GameActionUtil } }//Woodlurker Mimic + + public static void playCard_Dovescape(Card c) { + final Card crd1 = c; PlayerZone hplay = AllZone.getZone(Constant.Zone.Play, Constant.Player.Human); PlayerZone cplay = AllZone.getZone(Constant.Zone.Play, @@ -841,8 +845,9 @@ public class GameActionUtil CardList list = new CardList(); list.addAll(hplay.getCards()); list.addAll(cplay.getCards()); - int cmc = CardUtil.getConvertedManaCost(c.getManaCost()); + final int cmc = CardUtil.getConvertedManaCost(c.getManaCost()); list = list.getName("Dovescape"); + final CardList cl = list; if ( ! c.getType().contains("Creature") && list.size()>0 ) { @@ -852,40 +857,62 @@ public class GameActionUtil { public void resolve() { - SpellAbility sa = AllZone.Stack.pop(); + + SpellAbility sa = AllZone.Stack.peek(); - AllZone.GameAction.moveToGraveyard(sa.getSourceCard()); - + if (sa.getSourceCard().equals(crd1)) { + sa = AllZone.Stack.pop(); + + AllZone.GameAction.moveToGraveyard(sa.getSourceCard()); + + for (int j = 0; j < cl.size()*cmc; j++) + { + Card crd = new Card(); + String controller = crd1.getController(); + crd.setOwner(controller); + crd.setController(controller); + + crd.setName("Bird"); + crd.setImageName("WU 1 1 Bird"); + crd.setManaCost("WU"); + crd.setToken(true); + + crd.addType("Creature"); + crd.addType("Bird"); + crd.addIntrinsicKeyword("Flying"); + + crd.setBaseAttack(1); + crd.setBaseDefense(1); + + PlayerZone play = AllZone.getZone(Constant.Zone.Play, controller); + play.add(crd); + } + + + /* + SpellAbility sa = AllZone.Stack.peek + if (!sa.getSourceCard().isCreature() && sa.isSpell()) + { + + } + */ + } + else //TODO + { + ; + } + + } }; // ability2 ability2.setStackDescription("Dovescape Ability"); AllZone.Stack.add(ability2); - for (int j = 0; j < list.size()*cmc; j++) - { - Card crd = new Card(); - String controller = c.getController(); - crd.setOwner(controller); - crd.setController(controller); - - crd.setName("Bird"); - crd.setImageName("WU 1 1 Bird"); - crd.setManaCost("WU"); - crd.setToken(true); - - crd.addType("Creature"); - crd.addType("Bird"); - crd.addIntrinsicKeyword("Flying"); - - crd.setBaseAttack(1); - crd.setBaseDefense(1); - - PlayerZone play = AllZone.getZone(Constant.Zone.Play, controller); - play.add(crd); - } + } } // Dovescape + public static void playCard_Belligerent_Hatchling(Card c) { @@ -1819,7 +1846,7 @@ public class GameActionUtil CardList oppCreatures = new CardList(); for (int i=0;i 0; + return c.isCreature() && c.getTotalAssignedDamage() > 0; } }); diff --git a/src/forge/Input_CombatDamage.java b/src/forge/Input_CombatDamage.java index 861afbf9f5e..162df985591 100644 --- a/src/forge/Input_CombatDamage.java +++ b/src/forge/Input_CombatDamage.java @@ -1,5 +1,7 @@ package forge; import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; public class Input_CombatDamage extends Input { @@ -52,7 +54,9 @@ private void playerDamage(PlayerLife p) if (player.equals("")) //this is a really bad hack, to allow raging goblin to attack on turn 1 player = Constant.Player.Computer; PlayerLife life = AllZone.GameAction.getPlayerLife(player); - life.subtractLife(AllZone.Combat.getDefendingDamage()); + + life.subtractLife(AllZone.Combat.getTotalDefendingDamage()); + //why??? /* @@ -117,8 +121,11 @@ private void playerDamage(PlayerLife p) if (list.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) { @@ -167,8 +174,11 @@ private void playerDamage(PlayerLife p) GameActionUtil.executeLifeLinkEffects(blockers.getCard(i)); } - for(int j=0; j < CardFactoryUtil.hasNumberEnchantments(blockers.getCard(i), "Guilty Conscience"); j++) - GameActionUtil.executeGuiltyConscienceEffects(blockers.getCard(i)); + CardList cl = CardFactoryUtil.getAurasEnchanting(blockers.getCard(i), "Guilty Conscience"); + for (Card c : cl) + { + GameActionUtil.executeGuiltyConscienceEffects(blockers.getCard(i), c); + } /* ArrayList list = blockers.getCard(i).getKeyword(); @@ -205,8 +215,11 @@ private void playerDamage(PlayerLife p) if (pwAttackers.getCard(i).getKeyword().contains("Lifelink")) GameActionUtil.executeLifeLinkEffects(pwAttackers.getCard(i)); - for(int j=0; j < CardFactoryUtil.hasNumberEnchantments(pwAttackers.getCard(i), "Guilty Conscience"); j++) - GameActionUtil.executeGuiltyConscienceEffects(pwAttackers.getCard(i)); + CardList cl = CardFactoryUtil.getAurasEnchanting(pwAttackers.getCard(i), "Guilty Conscience"); + for (Card c : cl) + { + GameActionUtil.executeGuiltyConscienceEffects(pwAttackers.getCard(i), c); + } } } @@ -219,8 +232,11 @@ private void playerDamage(PlayerLife p) if (pwBlockers.getCard(i).getKeyword().contains("Lifelink")) GameActionUtil.executeLifeLinkEffects(pwBlockers.getCard(i)); - for(int j=0; j < CardFactoryUtil.hasNumberEnchantments(pwBlockers.getCard(i), "Guilty Conscience"); j++) - GameActionUtil.executeGuiltyConscienceEffects(pwBlockers.getCard(i)); + CardList cl = CardFactoryUtil.getAurasEnchanting(pwBlockers.getCard(i), "Guilty Conscience"); + for (Card c : cl) + { + GameActionUtil.executeGuiltyConscienceEffects(pwBlockers.getCard(i), c); + } } } @@ -242,12 +258,31 @@ private void playerDamage(PlayerLife p) c = all.get(i); //because this sets off Jackal Pup, and Filthly Cur damage ability //and the stack says "Jack Pup causes 0 damage to the Computer" - if(c.getAssignedDamage() != 0) + if(c.getTotalAssignedDamage() != 0) { + /* //c.addDamage(c.getAssignedDamage()); System.out.println("Calling addDamage for card " + c.getName()); AllZone.GameAction.addDamage(c, c.getAssignedDamage()); c.setAssignedDamage(0); + + */ + //AllZone.GameAction.addDamage(c, c.getTotalAssignedDamage()); + + HashMap assignedDamageMap = c.getAssignedDamageHashMap(); + HashMap damageMap = new HashMap(); + + Iterator iter = assignedDamageMap.keySet().iterator(); + while(iter.hasNext()) { + Card crd = iter.next(); + //AllZone.GameAction.addDamage(c, crd , assignedDamageMap.get(crd)); + damageMap.put(crd, assignedDamageMap.get(crd)); + } + + AllZone.GameAction.addDamage(c, damageMap); + + damageMap.clear(); + c.clearAssignedDamage(); } } }//moveDamage() diff --git a/src/forge/Input_FirstStrikeDamage.java b/src/forge/Input_FirstStrikeDamage.java index 468407aecd8..4f2f128b112 100644 --- a/src/forge/Input_FirstStrikeDamage.java +++ b/src/forge/Input_FirstStrikeDamage.java @@ -1,5 +1,7 @@ package forge; import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; //import java.util.ArrayList; //unused @@ -57,8 +59,9 @@ private void playerDamage(PlayerLife p) if (player.equals("")) //this is a really bad hack, to allow raging goblin to attack on turn 1 player = Constant.Player.Computer; PlayerLife life = AllZone.GameAction.getPlayerLife(player); - life.subtractLife(AllZone.Combat.getDefendingFirstStrikeDamage()); - + life.subtractLife(AllZone.Combat.getTotalFirstStrikeDefendingDamage()); + System.out.println("getTotalFirstStrikeDefendingDamage: " + AllZone.Combat.getTotalFirstStrikeDefendingDamage()); + //What is this even for? doesn't look like it's used. /* life = AllZone.GameAction.getPlayerLife(AllZone.Combat.getAttackingPlayer()); @@ -96,8 +99,16 @@ private void playerDamage(PlayerLife p) 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) @@ -141,8 +152,11 @@ private void playerDamage(PlayerLife p) if (blockers.getCard(i).getKeyword().contains("Lifelink")) GameActionUtil.executeLifeLinkEffects(blockers.getCard(i)); - for(int j=0; j < CardFactoryUtil.hasNumberEnchantments(blockers.getCard(i), "Guilty Conscience"); j++) - GameActionUtil.executeGuiltyConscienceEffects(blockers.getCard(i)); + CardList cl = CardFactoryUtil.getAurasEnchanting(blockers.getCard(i), "Guilty Conscience"); + for (Card c : cl) + { + GameActionUtil.executeGuiltyConscienceEffects(blockers.getCard(i), c); + } } } @@ -158,8 +172,11 @@ private void playerDamage(PlayerLife p) if (pwAttackers.getCard(i).getKeyword().contains("Lifelink")) GameActionUtil.executeLifeLinkEffects(pwAttackers.getCard(i)); - for(int j=0; j < CardFactoryUtil.hasNumberEnchantments(pwAttackers.getCard(i), "Guilty Conscience"); j++) - GameActionUtil.executeGuiltyConscienceEffects(pwAttackers.getCard(i)); + CardList cl = CardFactoryUtil.getAurasEnchanting(pwAttackers.getCard(i), "Guilty Conscience"); + for (Card c : cl) + { + GameActionUtil.executeGuiltyConscienceEffects(pwAttackers.getCard(i), c); + } } } for (int i=0; i < pwBlockers.size(); i++){ @@ -168,9 +185,12 @@ private void playerDamage(PlayerLife p) { if ( pwAttackers.getCard(i).getKeyword().contains("Lifelink")) GameActionUtil.executeLifeLinkEffects(pwBlockers.getCard(i)); - - for(int j=0; j < CardFactoryUtil.hasNumberEnchantments(pwBlockers.getCard(i), "Guilty Conscience"); j++) - GameActionUtil.executeGuiltyConscienceEffects(pwBlockers.getCard(i)); + + CardList cl = CardFactoryUtil.getAurasEnchanting(pwBlockers.getCard(i), "Guilty Conscience"); + for (Card c : cl) + { + GameActionUtil.executeGuiltyConscienceEffects(pwBlockers.getCard(i), c); + } } } @@ -190,11 +210,23 @@ private void playerDamage(PlayerLife p) c = all.get(i); //because this sets off Jackal Pup, and Filthly Cur damage ability //and the stack says "Jack Pup causes 0 damage to the Computer" - if(c.getAssignedDamage() != 0) + if(c.getTotalAssignedDamage() != 0) { //c.addDamage(c.getAssignedDamage()); - AllZone.GameAction.addDamage(c, c.getAssignedDamage()); - c.setAssignedDamage(0); + HashMap assignedDamageMap = c.getAssignedDamageHashMap(); + HashMap damageMap = new HashMap(); + + Iterator iter = assignedDamageMap.keySet().iterator(); + while(iter.hasNext()) { + Card crd = iter.next(); + //AllZone.GameAction.addDamage(c, crd , assignedDamageMap.get(crd)); + damageMap.put(crd, assignedDamageMap.get(crd)); + } + + AllZone.GameAction.addDamage(c, damageMap); + + damageMap.clear(); + c.clearAssignedDamage(); } } }//moveDamage()