- Fix cleanup crash with planeswalkers in play

This commit is contained in:
moomarc
2012-09-11 13:02:40 +00:00
parent 0d413290dd
commit 7a4d4bf90e

View File

@@ -58,7 +58,7 @@ public class Combat {
// Defenders are the Defending Player + Each controlled Planeswalker // Defenders are the Defending Player + Each controlled Planeswalker
private List<GameEntity> defenders = new ArrayList<GameEntity>(); private List<GameEntity> defenders = new ArrayList<GameEntity>();
private Map<GameEntity, CardList> defenderMap = new TreeMap<GameEntity, CardList>(); private Map<GameEntity, CardList> defenderMap = new HashMap<GameEntity, CardList>();
private int currentDefender = 0; private int currentDefender = 0;
private int nextDefender = 0; private int nextDefender = 0;
@@ -108,13 +108,13 @@ public class Combat {
public final void initiatePossibleDefenders(final Player defender) { public final void initiatePossibleDefenders(final Player defender) {
this.defenders.clear(); this.defenders.clear();
this.defenderMap.clear(); this.defenderMap.clear();
this.defenders.add((GameEntity)defender); this.defenders.add((GameEntity) defender);
this.defenderMap.put((GameEntity)defender, new CardList()); this.defenderMap.put((GameEntity) defender, new CardList());
CardList planeswalkers = defender.getCardsIn(ZoneType.Battlefield); CardList planeswalkers = defender.getCardsIn(ZoneType.Battlefield);
planeswalkers = planeswalkers.getType("Planeswalker"); planeswalkers = planeswalkers.getType("Planeswalker");
for (final Card pw : planeswalkers) { for (final Card pw : planeswalkers) {
this.defenders.add((GameEntity)pw); this.defenders.add((GameEntity) pw);
this.defenderMap.put((GameEntity)pw, new CardList()); this.defenderMap.put((GameEntity) pw, new CardList());
} }
} }
@@ -202,7 +202,7 @@ public class Combat {
*/ */
public final void setDefenders(final List<GameEntity> newDef) { public final void setDefenders(final List<GameEntity> newDef) {
this.defenders = newDef; this.defenders = newDef;
for(GameEntity entity : this.defenders) { for (GameEntity entity : this.defenders) {
this.defenderMap.put(entity, new CardList()); this.defenderMap.put(entity, new CardList());
} }
} }
@@ -406,7 +406,7 @@ public class Combat {
return defender; return defender;
} }
System.out.println("Attacker " + c + " missing defender " + defender); System.out.println("Attacker " + c + " missing defender " + defender);
return null; return null;
} }
@@ -545,7 +545,8 @@ public class Combat {
* *
* @param attacker * @param attacker
* a {@link forge.Card} object. * a {@link forge.Card} object.
* @return a {@link forge.CardList} object. * @param blockers
* a {@link forge.CardList} object.
*/ */
public void setBlockerList(final Card attacker, final CardList blockers) { public void setBlockerList(final Card attacker, final CardList blockers) {
this.attackerMap.put(attacker, blockers); this.attackerMap.put(attacker, blockers);
@@ -570,7 +571,7 @@ public class Combat {
// Keep track of all of the different maps // Keep track of all of the different maps
CardList blockers = this.attackerMap.get(c); CardList blockers = this.attackerMap.get(c);
this.attackerMap.remove(c); this.attackerMap.remove(c);
for(Card b : blockers) { for (Card b : blockers) {
this.blockerMap.get(b).remove(c); this.blockerMap.get(b).remove(c);
} }
@@ -578,12 +579,12 @@ public class Combat {
GameEntity entity = this.attackerToDefender.get(c); GameEntity entity = this.attackerToDefender.get(c);
this.attackerToDefender.remove(c); this.attackerToDefender.remove(c);
this.defenderMap.get(entity).remove(c); this.defenderMap.get(entity).remove(c);
} else if (this.blockerMap.containsKey(c)){ // card is a blocker } else if (this.blockerMap.containsKey(c)) { // card is a blocker
CardList attackers = this.blockerMap.get(c); CardList attackers = this.blockerMap.get(c);
boolean stillDeclaring = Singletons.getModel().getGameState().getPhaseHandler().is(PhaseType.COMBAT_DECLARE_BLOCKERS); boolean stillDeclaring = Singletons.getModel().getGameState().getPhaseHandler().is(PhaseType.COMBAT_DECLARE_BLOCKERS);
this.blockerMap.remove(c); this.blockerMap.remove(c);
for(Card a : attackers) { for (Card a : attackers) {
this.attackerMap.get(a).remove(c); this.attackerMap.get(a).remove(c);
if (stillDeclaring && this.attackerMap.get(a).size() == 0) { if (stillDeclaring && this.attackerMap.get(a).size() == 0) {
this.blocked.remove(a); this.blocked.remove(a);
@@ -684,8 +685,8 @@ public class Combat {
} }
private final boolean assignDamageAsIfNotBlocked(Card attacker) { private final boolean assignDamageAsIfNotBlocked(Card attacker) {
return attacker.hasKeyword("CARDNAME assigns its combat damage as though it weren't blocked.") || return attacker.hasKeyword("CARDNAME assigns its combat damage as though it weren't blocked.")
(attacker.hasKeyword("You may have CARDNAME assign its combat damage as though it weren't blocked.") || (attacker.hasKeyword("You may have CARDNAME assign its combat damage as though it weren't blocked.")
&& GameActionUtil.showYesNoDialog(attacker, "Do you want to assign its combat damage as though it weren't blocked?")); && GameActionUtil.showYesNoDialog(attacker, "Do you want to assign its combat damage as though it weren't blocked?"));
} }
@@ -694,7 +695,7 @@ public class Combat {
CardList blockers = null; CardList blockers = null;
final CardList attackers = this.getAttackerList(); final CardList attackers = this.getAttackerList();
boolean assignedDamage = false; boolean assignedDamage = false;
for(final Card attacker : attackers) { for (final Card attacker : attackers) {
// If attacker isn't in the right first/regular strike section, continue along // If attacker isn't in the right first/regular strike section, continue along
if (!(attacker.hasDoubleStrike() || attacker.hasFirstStrike() == firstStrikeDamage)) { if (!(attacker.hasDoubleStrike() || attacker.hasFirstStrike() == firstStrikeDamage)) {
continue; continue;
@@ -740,7 +741,6 @@ public class Combat {
return assignedDamage; return assignedDamage;
} }
/** /**
* <p> * <p>
* distributeAIDamage. * distributeAIDamage.