- Major combat code rewrite, added Swans of Bryn Argoll and Dromad Purebred.

- Exploration / Fastbond effects shouldn't carry over anymore.
- Vendilion Clique CIP ability should work now.
- AI playing Flight or Launch shouldn't target creatures with flying anymore.
- Small fix to Dovescape.
- Needlestorm, Oros, the Avenger, Incendiary Command and Spitting Spider shouldn't be able to damage creatures with protection anymore.
- Timber Protector should work correctly now.
This commit is contained in:
jendave
2011-08-06 02:58:04 +00:00
parent 570117f58a
commit ed83d3132d
31 changed files with 1018 additions and 393 deletions

1
.gitattributes vendored
View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -28,7 +28,7 @@
<int>0</int>
<int>0</int>
<int>244</int>
<int>140</int>
<int>138</int>
</object>
</void>
<void property="name">
@@ -47,7 +47,7 @@
<void property="bounds">
<object class="java.awt.Rectangle">
<int>0</int>
<int>140</int>
<int>138</int>
<int>244</int>
<int>10</int>
</object>
@@ -62,9 +62,9 @@
<void property="bounds">
<object class="java.awt.Rectangle">
<int>0</int>
<int>150</int>
<int>148</int>
<int>244</int>
<int>179</int>
<int>181</int>
</object>
</void>
<void property="name">

View File

@@ -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();

View File

@@ -29,6 +29,7 @@ public class Card extends MyObservable
private ArrayList<Ability_Mana> manaAbility = new ArrayList<Ability_Mana>();
private HashMap<Card, Integer> receivedDamageFromThisTurn = new HashMap<Card, Integer>();
private HashMap<Card, Integer> assignedDamageHashMap = new HashMap<Card, Integer>();
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<Integer> c = assignedDamageHashMap.values();
Iterator<Integer> itr = c.iterator();
while(itr.hasNext())
total+=itr.next();
return total;
}
public HashMap<Card, Integer> getAssignedDamageHashMap()
{
return assignedDamageHashMap;
}
public void setImageName(String s) { imageName = s; }
public String getImageName()

View File

@@ -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);

View File

@@ -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

View File

@@ -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)
{

View File

@@ -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");
}

View File

@@ -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<String>());
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<cards.size(); i++)
{
if (!CardUtil.getColors(cards.get(i)).contains(Constant.Color.White))
if (!CardUtil.getColors(cards.get(i)).contains(Constant.Color.White)
&& CardFactoryUtil.canDamage(card, cards.get(i)))
{
cards.get(i).addDamage(3);
cards.get(i).addDamage(3, card);
}
}
@@ -12626,7 +12645,7 @@ public class CardFactory_Creatures {
card.setBaseAttack(5);
card.setBaseDefense(5);
card.setAssignedDamage(0);
card.clearAssignedDamage();
card.setDamage(0);
card.untap();
AllZone.getZone(card).remove(card);
@@ -16474,7 +16493,7 @@ public class CardFactory_Creatures {
//*************** START *********** START **************************
else if(cardName.equals("Vendillion Clique"))
else if(cardName.equals("Vendilion Clique"))
{
final SpellAbility ability = new Ability(card, "0")
{
@@ -17349,7 +17368,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);
@@ -17852,7 +17871,7 @@ public class CardFactory_Creatures {
{
final Card newCard = new Card()
{
public void addDamage(final int n)
public void addDamage(final int n, Card source)
{
this.subtractCounter(Counters.P1P1, 1);
}
@@ -17896,7 +17915,7 @@ public class CardFactory_Creatures {
{
final Card newCard = new Card()
{
public void addDamage(final int n)
public void addDamage(final int n, Card source)
{
this.subtractCounter(Counters.P1P1, 1);
}
@@ -18033,7 +18052,84 @@ public class CardFactory_Creatures {
card.addLeavesPlayCommand(leavesPlay);
}//*************** END ************ END **************************
//*************** START *********** START **************************
else if (cardName.equals("Swans of Bryn Argoll"))
{
final Card newCard = new Card()
{
public void addDamage(final int n, final Card source)
{
final Ability ability = new Ability(card, "0")
{
public void resolve(){
String player = source.getController();
for (int i=0;i<n;i++)
AllZone.GameAction.drawCard(player);
}
};
ability.setStackDescription("Swans of Bryn Argoll - " +source.getController() + " draws " + n +" cards.");
AllZone.Stack.add(ability);
}
};
newCard.setOwner(card.getOwner());
newCard.setController(card.getController());
newCard.setManaCost(card.getManaCost());
newCard.setName(card.getName());
newCard.addType("Creature");
newCard.addType("Bird");
newCard.addType("Spirit");
newCard.setText(card.getSpellText());
newCard.setBaseAttack(card.getBaseAttack());
newCard.setBaseDefense(card.getBaseDefense());
newCard.addIntrinsicKeyword("Flying");
newCard.addSpellAbility(new Spell_Permanent(newCard));
return newCard;
}//*************** END ************ END **************************
//*************** START *********** START **************************
else if (cardName.equals("Dromad Purebred"))
{
final Card newCard = new Card()
{
public void addDamage(final int n, CardList sources)
{
final Ability ability = new Ability(card, "0")
{
public void resolve(){
String player = card.getController();
AllZone.GameAction.getPlayerLife(player).addLife(1);
}
};
ability.setStackDescription(card.getName() + " - " +card.getController() + " gains 1 life.");
AllZone.Stack.add(ability);
}
};
newCard.setOwner(card.getOwner());
newCard.setController(card.getController());
newCard.setManaCost(card.getManaCost());
newCard.setName(card.getName());
newCard.addType("Creature");
newCard.addType("Camel");
newCard.addType("Beast");
newCard.setText(card.getSpellText());
newCard.setBaseAttack(card.getBaseAttack());
newCard.setBaseDefense(card.getBaseDefense());
newCard.addSpellAbility(new Spell_Permanent(newCard));
return newCard;
}//*************** END ************ END **************************
//*************** START *********** START **************************
else if(cardName.equals("Thoughtcutter Agent"))
{
final SpellAbility ability = new Ability_Tap(card, "U B")

View File

@@ -14,7 +14,7 @@ class CardFactory_Planeswalkers {
final Card card2 = new Card()
{
public void addDamage(int n)
public void addDamage(int n, Card source)
{
subtractCounter(Counters.LOYALTY, n);
AllZone.GameAction.checkStateEffects();
@@ -265,7 +265,7 @@ class CardFactory_Planeswalkers {
final Card card2 = new Card()
{
public void addDamage(int n)
public void addDamage(int n, Card source)
{
subtractCounter(Counters.LOYALTY, n);
AllZone.GameAction.checkStateEffects();
@@ -518,7 +518,7 @@ class CardFactory_Planeswalkers {
final Card card2 = new Card()
{
public void addDamage(int n)
public void addDamage(int n, Card source)
{
subtractCounter(Counters.LOYALTY, n);
AllZone.GameAction.checkStateEffects();
@@ -866,7 +866,7 @@ class CardFactory_Planeswalkers {
final Card card2 = new Card()
{
public void addDamage(int n)
public void addDamage (int n, Card source)
{
subtractCounter(Counters.LOYALTY,n);
AllZone.GameAction.checkStateEffects();
@@ -1107,7 +1107,7 @@ class CardFactory_Planeswalkers {
final Card card2 = new Card()
{
public void addDamage(int n)
public void addDamage(int n, Card source)
{
subtractCounter(Counters.LOYALTY,n);
AllZone.GameAction.checkStateEffects();
@@ -1357,7 +1357,7 @@ class CardFactory_Planeswalkers {
final Card card2 = new Card()
{
public void addDamage(int n)
public void addDamage(int n, Card source)
{
subtractCounter(Counters.LOYALTY, n);
AllZone.GameAction.checkStateEffects();
@@ -1387,7 +1387,7 @@ class CardFactory_Planeswalkers {
{
Card c = getTargetCard();
if (CardFactoryUtil.canDamage(card2, c))
c.addDamage(1);
c.addDamage(1, card2);
}
}
@@ -1462,7 +1462,7 @@ class CardFactory_Planeswalkers {
card2.subtractCounter(Counters.LOYALTY, damage2[0]);
if (CardFactoryUtil.canDamage(card2, getTargetCard()))
getTargetCard().addDamage(damage2[0]);
getTargetCard().addDamage(damage2[0], card2);
damage2[0] = 0;
}//resolve()
@@ -1554,8 +1554,8 @@ class CardFactory_Planeswalkers {
for(int i = 0; i < list.size(); i++)
{
if (CardFactoryUtil.canDamage(card, list.get(i)))
list.get(i).addDamage(10);
if (CardFactoryUtil.canDamage(card2, list.get(i)))
list.get(i).addDamage(10, card2);
}
}//resolve()
public boolean canPlay()
@@ -1625,7 +1625,7 @@ class CardFactory_Planeswalkers {
final Card card2 = new Card()
{
public void addDamage(int n)
public void addDamage(int n, Card source)
{
subtractCounter(Counters.LOYALTY,n);
AllZone.GameAction.checkStateEffects();
@@ -1896,7 +1896,7 @@ class CardFactory_Planeswalkers {
final Card card2 = new Card()
{
public void addDamage(int n)
public void addDamage(int n, Card source)
{
subtractCounter(Counters.LOYALTY,n);
AllZone.GameAction.checkStateEffects();
@@ -2036,7 +2036,7 @@ class CardFactory_Planeswalkers {
final Card card2 = new Card()
{
public void addDamage(int n)
public void addDamage(int n, Card source)
{
subtractCounter(Counters.LOYALTY,n);
AllZone.GameAction.checkStateEffects();
@@ -2162,7 +2162,7 @@ class CardFactory_Planeswalkers {
if(AllZone.GameAction.isCardInPlay(getTargetCard()) && CardFactoryUtil.canTarget(card2, getTargetCard()))
{
Card c = getTargetCard();
c.addDamage(damage);
c.addDamage(damage, card2);
}
}
else
@@ -2260,7 +2260,7 @@ class CardFactory_Planeswalkers {
final Card card2 = new Card()
{
public void addDamage(int n)
public void addDamage(int n, Card source)
{
subtractCounter(Counters.LOYALTY,n);
AllZone.GameAction.checkStateEffects();
@@ -2572,7 +2572,7 @@ class CardFactory_Planeswalkers {
final Card card2 = new Card()
{
public void addDamage(int n)
public void addDamage(int n, Card source)
{
subtractCounter(Counters.LOYALTY,n);
AllZone.GameAction.checkStateEffects();

View File

@@ -9,10 +9,13 @@ public class Combat
private Set<Card> blocked = new HashSet<Card>();
private HashMap<Card,CardList> unblockedMap = new HashMap<Card,CardList>();
private HashMap<Card, Integer> defendingFirstStrikeDamageMap = new HashMap<Card, Integer>();
private HashMap<Card, Integer> defendingDamageMap = new HashMap<Card, Integer>();
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<Integer> c = defendingDamageMap.values();
Iterator<Integer> itr = c.iterator();
while(itr.hasNext())
total+=itr.next();
return total;
}
public int getTotalFirstStrikeDefendingDamage()
{
int total = 0;
Collection<Integer> c = defendingFirstStrikeDamageMap.values();
Iterator<Integer> 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<Card> 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<Card> 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()
{

View File

@@ -7,9 +7,11 @@ public class CombatPlaneswalker
//value is CardList of blockers
private Map<Card,CardList> map = new HashMap<Card,CardList>();
private Set<Card> blocked = new HashSet<Card>();
private HashMap<Card, Integer> defendingFirstStrikeDamageMap = new HashMap<Card, Integer>();
private HashMap<Card, Integer> defendingDamageMap = new HashMap<Card, Integer>();
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<Integer> c = defendingDamageMap.values();
Iterator<Integer> 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<Card> 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()
}

View File

@@ -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();
}

View File

@@ -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

View File

@@ -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

View File

@@ -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<Card> 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

View File

@@ -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();

View File

@@ -64,4 +64,9 @@ public class ComputerAI_Testing implements Computer
{
numberPlayLand += n;
}
public void setNumberPlayLands(int n)
{
numberPlayLand = n;
}
}

View File

@@ -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();

View File

@@ -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);
}

View File

@@ -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();
}
}

View File

@@ -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<sourceCards.size();i++)
{
Card sourceCard = sourceCards.get(i); //blocker number i
card.addReceivedDamageFromThisTurn(sourceCard, sourceCard.getNetAttack());
}
}
card.setAssignedDamage(assignedDamage);
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;
card.addAssignedDamage(assignedDamage, sourceCard);
System.out.println("***");
/*
if(sourceCards.size() > 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<Card,Integer> map)
{
int totalDamage = 0;
CardList list = new CardList();
Iterator<Card> 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);
}
/*

View File

@@ -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<cards.size();i++)
{
if (cards.get(i).isPlaneswalker() || cards.get(i).isCreature())
if (cards.get(i).isPlaneswalker() || cards.get(i).isCreature() && CardFactoryUtil.canTarget(crd, cards.get(i)))
{
oppCreatures.add(cards.get(i));
}
@@ -1829,7 +1856,7 @@ public class GameActionUtil
{
Object o = AllZone.Display.getChoiceOptional("Pick target creature", oppCreatures.toArray());
Card c = (Card)o;
c.addDamage(1);
c.addDamage(1, crd);
}
}
}
@@ -1839,8 +1866,8 @@ public class GameActionUtil
if(getTargetCard() != null)
{
if(AllZone.GameAction.isCardInPlay(getTargetCard()))
getTargetCard().addDamage(1);
if(AllZone.GameAction.isCardInPlay(getTargetCard()) && CardFactoryUtil.canTarget(crd, getTargetCard()))
getTargetCard().addDamage(1, crd);
}
else
AllZone.GameAction.getPlayerLife(getTargetPlayer()).subtractLife(1);
@@ -2878,19 +2905,20 @@ public class GameActionUtil
AllZone.Stack.add(ability2);
}
public static void executeGuiltyConscienceEffects(Card c)
public static void executeGuiltyConscienceEffects(Card c, Card source)
{
int pwr = c.getNetAttack();
if (CombatUtil.isDoranInPlay())
pwr = c.getNetDefense();
final int damage = pwr;
final Card src = source;
final Card crd = c;
Ability ability2 = new Ability(c, "0")
{
public void resolve()
{
crd.addDamage(damage);
crd.addDamage(damage, src);
}
}; // ability2
@@ -2898,15 +2926,16 @@ public class GameActionUtil
AllZone.Stack.add(ability2);
}
public static void executeGuiltyConscienceEffects(Card c, int n)
public static void executeGuiltyConscienceEffects(Card c, Card source, int n)
{
final int damage = n;
final Card crd = c;
final Card src = source;
Ability ability2 = new Ability(c, "0")
{
public void resolve()
{
crd.addDamage(damage);
crd.addDamage(damage, src);
}
}; // ability2
@@ -6198,7 +6227,7 @@ public class GameActionUtil
Object o = AllZone.Display.getChoiceOptional("Pick target creature", oppCreatures.toArray());
Card c = (Card)o;
c.addDamage(hondlist.size());
c.addDamage(hondlist.size(), card);
}
}
}
@@ -6215,7 +6244,7 @@ public class GameActionUtil
if(targetc != null)
{
if(AllZone.GameAction.isCardInPlay(targetc))
targetc.addDamage(hondlist.size());
targetc.addDamage(hondlist.size(), card);
}
else
AllZone.GameAction.getPlayerLife(Constant.Player.Human).subtractLife(hondlist.size());
@@ -10393,14 +10422,13 @@ public class GameActionUtil
// for each zone found add +1/+1 to each card
for (int outer = 0; outer < zone.length; outer++)
{
CardList creature = new CardList();
creature.addAll(AllZone.Human_Play.getCards());
creature.addAll(AllZone.Computer_Play.getCards());
CardList creature = new CardList(zone[outer].getCards());
creature = creature.filter(new CardListFilter()
{
public boolean addCard(Card c)
{
return c.getType().equals("Treefolk") || c.getType().equals("Forest") || c.getKeyword().contains("Changeling");
return c.getType().contains("Treefolk") || c.getType().contains("Forest") || c.getKeyword().contains("Changeling");
}
});
@@ -10415,7 +10443,7 @@ public class GameActionUtil
c.addExtrinsicKeyword("Indestructible");
gloriousAnthemList.add(c);
}
else if (c.getKeyword().contains("Forest"))
else if (c.getType().contains("Forest"))
{
c.addExtrinsicKeyword("Indestructible");
}

View File

@@ -31,6 +31,8 @@ import forge.properties.NewConstants;
public class GuiDisplay2 extends javax.swing.JFrame implements Display, NewConstants {
private static final long serialVersionUID = 8974795337536720207L;
//private CardList multiBlockers = new CardList();
private GuiInput inputControl;
public static JCheckBoxMenuItem eotCheckboxForMenu = new JCheckBoxMenuItem("Stop at End of Turn", false);
@@ -61,6 +63,15 @@ public class GuiDisplay2 extends javax.swing.JFrame implements Display, NewConst
}
super.setVisible(visible);
}
/*
public void addAssignDamage(Card attacker, Card blocker, int damage) {
multiBlockers.add(blocker);
}
public void addAssignDamage(Card attacker, int damage) {
new Gui_MultipleBlockers(attacker, multiBlockers, damage, this);
}
*/
public void assignDamage(Card attacker, CardList blockers, int damage) {
new Gui_MultipleBlockers(attacker, blockers, damage, this);
@@ -331,9 +342,9 @@ public class GuiDisplay2 extends javax.swing.JFrame implements Display, NewConst
}
if(c.isCreature()) cdLabel4.setText("Damage: " + c.getDamage() + " Assigned Damage: "
+ c.getAssignedDamage());
+ c.getTotalAssignedDamage());
if(c.isPlaneswalker()) cdLabel4.setText("Assigned Damage: " + c.getAssignedDamage());
if(c.isPlaneswalker()) cdLabel4.setText("Assigned Damage: " + c.getTotalAssignedDamage());
String uniqueID = c.getUniqueNumber() + " ";
cdLabel5.setText("Card ID " + uniqueID);

View File

@@ -94,6 +94,8 @@ public class GuiDisplay3 extends JFrame implements Display, NewConstants, NewCon
private Action CONCEDE_ACTION;
public Card cCardHQ;
//private CardList multiBlockers = new CardList();
public GuiDisplay3() {
setupActions();
initComponents();
@@ -123,6 +125,18 @@ public class GuiDisplay3 extends JFrame implements Display, NewConstants, NewCon
new Gui_MultipleBlockers3(attacker, blockers, damage, this);
}
/*
public void addAssignDamage(Card attacker, Card blocker, int damage)
{
multiBlockers.add(blocker);
}
public void addAssignDamage(Card attacker, int damage) {
//new Gui_MultipleBlockers3(attacker, blockers, damage, this);
new Gui_MultipleBlockers3(attacker, multiBlockers, damage, this);
}
*/
private void setupActions() {
HUMAN_GRAVEYARD_ACTION = new ZoneAction(AllZone.Human_Graveyard, HUMAN_GRAVEYARD);
HUMAN_REMOVED_ACTION = new ZoneAction(AllZone.Human_Removed, HUMAN_REMOVED);
@@ -416,9 +430,9 @@ public class GuiDisplay3 extends JFrame implements Display, NewConstants, NewCon
}
if(c.isCreature()) cdLabel4.setText("Damage: " + c.getDamage() + " Assigned Damage: "
+ c.getAssignedDamage());
+ c.getTotalAssignedDamage());
if(c.isPlaneswalker()) cdLabel4.setText("Assigned Damage: " + c.getAssignedDamage());
if(c.isPlaneswalker()) cdLabel4.setText("Assigned Damage: " + c.getTotalAssignedDamage());
String uniqueID = c.getUniqueNumber() + " ";
cdLabel5.setText("Card ID " + uniqueID);
@@ -1328,7 +1342,8 @@ class Gui_MultipleBlockers3 extends JFrame {
//c.setAssignedDamage(c.getAssignedDamage() + 1);
CardList cl = new CardList();
cl.add(att);
AllZone.GameAction.setAssignedDamage(c, cl, c.getAssignedDamage() + 1);
AllZone.GameAction.addAssignedDamage(c, att, /*c.getTotalAssignedDamage() +*/ 1);
if(guiDisplay != null) guiDisplay.updateCardDetail(c);
}

View File

@@ -100,7 +100,7 @@ public class Gui_MultipleBlockers extends JFrame
CardList cl = new CardList();
cl.add(att);
AllZone.GameAction.setAssignedDamage(c, cl, c.getAssignedDamage() + 1);
AllZone.GameAction.addAssignedDamage(c, att, 1);
//c.setAssignedDamage(c.getAssignedDamage() + 1);
if(guiDisplay != null)

View File

@@ -247,7 +247,7 @@ package forge;
all.addAll(AllZone.Human_Play.getCards());
all = all.filter(new CardListFilter(){
public boolean addCard(Card c) {
return c.isCreature() && c.getAssignedDamage() > 0;
return c.isCreature() && c.getTotalAssignedDamage() > 0;
}
});

View File

@@ -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<String> 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<Card, Integer> assignedDamageMap = c.getAssignedDamageHashMap();
HashMap<Card, Integer> damageMap = new HashMap<Card, Integer>();
Iterator<Card> 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()

View File

@@ -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<Card, Integer> assignedDamageMap = c.getAssignedDamageHashMap();
HashMap<Card, Integer> damageMap = new HashMap<Card, Integer>();
Iterator<Card> 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()