Fix handling of provoke when provoker is removed from combat

This commit is contained in:
Kulnaro
2015-07-17 10:54:34 +00:00
parent cc5768b70e
commit 50ee02a3b7
4 changed files with 25 additions and 14 deletions

View File

@@ -4956,6 +4956,7 @@ public class Card extends GameEntity implements Comparable<Card> {
else if (property.startsWith("attacking")) { else if (property.startsWith("attacking")) {
if (null == combat) return false; if (null == combat) return false;
if (property.equals("attacking")) return combat.isAttacking(this); if (property.equals("attacking")) return combat.isAttacking(this);
if (property.equals("attackingLKI")) return combat.isLKIAttacking(this);
if (property.equals("attackingYou")) return combat.isAttacking(this, sourceController); if (property.equals("attackingYou")) return combat.isAttacking(this, sourceController);
} else if (property.startsWith("notattacking")) { } else if (property.startsWith("notattacking")) {
return null == combat || !combat.isAttacking(this); return null == combat || !combat.isAttacking(this);

View File

@@ -243,7 +243,10 @@ public class Combat {
return Lists.newArrayList(attackedByBands.values()); return Lists.newArrayList(attackedByBands.values());
} }
public final boolean isAttacking(final Card c) { /**
* Checks if a card is attacking, returns true if the card was attacking when it left the battlefield
*/
public final boolean isLKIAttacking(final Card c) {
AttackingBand ab = getBandOfAttacker(c); AttackingBand ab = getBandOfAttacker(c);
return ab != null; return ab != null;
} }
@@ -257,6 +260,18 @@ public class Combat {
} }
return false; return false;
} }
/**
* Checks if a card is currently attacking, returns false if the card is not currently attacking, even if its LKI was.
*/
public final boolean isAttacking(Card card) {
for (AttackingBand ab : attackedByBands.values()) {
if (ab.contains(card)) {
return true;
}
}
return false;
}
public final CardCollection getAttackers() { public final CardCollection getAttackers() {
CardCollection result = new CardCollection(); CardCollection result = new CardCollection();

View File

@@ -660,18 +660,13 @@ public class CombatUtil {
// if a creature does not block but should, return false // if a creature does not block but should, return false
for (final Card blocker : defendersArmy) { for (final Card blocker : defendersArmy) {
if (blocker.getMustBlockCards() != null) { if (blocker.getMustBlockCards() != null) {
final int mustBlockAmt = blocker.getMustBlockCards().size(); final CardCollectionView blockedSoFar = combat.getAttackersBlockedBy(blocker);
final CardCollectionView blockedSoFar = combat.getAttackersBlockedBy(blocker); for (Card cardToBeBlocked : blocker.getMustBlockCards()) {
final CardCollection remainingBlockables = new CardCollection(); if (!blockedSoFar.contains(cardToBeBlocked) && CombatUtil.canBlockMoreCreatures(blocker, blockedSoFar)
for (final Card attacker : attackers) { && combat.isAttacking(cardToBeBlocked) && CombatUtil.canBlock(cardToBeBlocked, blocker)) {
if (!blockedSoFar.contains(attacker) && CombatUtil.canBlock(attacker, blocker)) { return String.format("%s must still block %s.", blocker, cardToBeBlocked);
remainingBlockables.add(attacker); }
} }
}
boolean canBlockAnother = CombatUtil.canBlockMoreCreatures(blocker, blockedSoFar);
if (canBlockAnother && mustBlockAmt > blockedSoFar.size() && remainingBlockables.size() > 0) {
return String.format("%s must still block %s.", blocker, Lang.joinHomogenous(remainingBlockables));
}
} }
// lure effects // lure effects
if (!blockers.contains(blocker) && CombatUtil.mustBlockAnAttacker(blocker, combat)) { if (!blockers.contains(blocker) && CombatUtil.mustBlockAnAttacker(blocker, combat)) {

View File

@@ -2,7 +2,7 @@ Name:Kithkin Mourncaller
ManaCost:2 G ManaCost:2 G
Types:Creature Kithkin Scout Types:Creature Kithkin Scout
PT:2/2 PT:2/2
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.Kithkin+attacking+YouOwn,Creature.Elf+attacking+YouOwn | Execute$ TrigDraw | OptionalDecider$ You | TriggerZones$ Battlefield | TriggerDescription$ Whenever an attacking Kithkin or Elf is put into your graveyard from the battlefield, you may draw a card. T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.Kithkin+attackingLKI+YouOwn,Creature.Elf+attackingLKI+YouOwn | Execute$ TrigDraw | OptionalDecider$ You | TriggerZones$ Battlefield | TriggerDescription$ Whenever an attacking Kithkin or Elf is put into your graveyard from the battlefield, you may draw a card.
SVar:TrigDraw:AB$ Draw | Cost$ 0 | Defined$ You | NumCards$ 1 SVar:TrigDraw:AB$ Draw | Cost$ 0 | Defined$ You | NumCards$ 1
SVar:RemRandomDeck:True SVar:RemRandomDeck:True
SVar:Picture:http://www.wizards.com/global/images/magic/general/kithkin_mourncaller.jpg SVar:Picture:http://www.wizards.com/global/images/magic/general/kithkin_mourncaller.jpg