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 @@
@@ -62,9 +62,9 @@
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()