From 50ee02a3b78fa49296895c61b72b00e32b4387e6 Mon Sep 17 00:00:00 2001 From: Kulnaro Date: Fri, 17 Jul 2015 10:54:34 +0000 Subject: [PATCH] Fix handling of provoke when provoker is removed from combat --- .../src/main/java/forge/game/card/Card.java | 1 + .../main/java/forge/game/combat/Combat.java | 17 ++++++++++++++++- .../java/forge/game/combat/CombatUtil.java | 19 +++++++------------ .../res/cardsfolder/k/kithkin_mourncaller.txt | 2 +- 4 files changed, 25 insertions(+), 14 deletions(-) diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index f3963b0dedf..9c015126903 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -4956,6 +4956,7 @@ public class Card extends GameEntity implements Comparable { else if (property.startsWith("attacking")) { if (null == combat) return false; 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); } else if (property.startsWith("notattacking")) { return null == combat || !combat.isAttacking(this); diff --git a/forge-game/src/main/java/forge/game/combat/Combat.java b/forge-game/src/main/java/forge/game/combat/Combat.java index de4f71b0613..f3e46a9a52c 100644 --- a/forge-game/src/main/java/forge/game/combat/Combat.java +++ b/forge-game/src/main/java/forge/game/combat/Combat.java @@ -243,7 +243,10 @@ public class Combat { 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); return ab != null; } @@ -257,6 +260,18 @@ public class Combat { } 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() { CardCollection result = new CardCollection(); diff --git a/forge-game/src/main/java/forge/game/combat/CombatUtil.java b/forge-game/src/main/java/forge/game/combat/CombatUtil.java index 0b5fa84e160..dbbe90182b8 100644 --- a/forge-game/src/main/java/forge/game/combat/CombatUtil.java +++ b/forge-game/src/main/java/forge/game/combat/CombatUtil.java @@ -660,18 +660,13 @@ public class CombatUtil { // if a creature does not block but should, return false for (final Card blocker : defendersArmy) { if (blocker.getMustBlockCards() != null) { - final int mustBlockAmt = blocker.getMustBlockCards().size(); - final CardCollectionView blockedSoFar = combat.getAttackersBlockedBy(blocker); - final CardCollection remainingBlockables = new CardCollection(); - for (final Card attacker : attackers) { - if (!blockedSoFar.contains(attacker) && CombatUtil.canBlock(attacker, blocker)) { - 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)); - } + final CardCollectionView blockedSoFar = combat.getAttackersBlockedBy(blocker); + for (Card cardToBeBlocked : blocker.getMustBlockCards()) { + if (!blockedSoFar.contains(cardToBeBlocked) && CombatUtil.canBlockMoreCreatures(blocker, blockedSoFar) + && combat.isAttacking(cardToBeBlocked) && CombatUtil.canBlock(cardToBeBlocked, blocker)) { + return String.format("%s must still block %s.", blocker, cardToBeBlocked); + } + } } // lure effects if (!blockers.contains(blocker) && CombatUtil.mustBlockAnAttacker(blocker, combat)) { diff --git a/forge-gui/res/cardsfolder/k/kithkin_mourncaller.txt b/forge-gui/res/cardsfolder/k/kithkin_mourncaller.txt index 73f6f32c37e..cba721359cf 100644 --- a/forge-gui/res/cardsfolder/k/kithkin_mourncaller.txt +++ b/forge-gui/res/cardsfolder/k/kithkin_mourncaller.txt @@ -2,7 +2,7 @@ Name:Kithkin Mourncaller ManaCost:2 G Types:Creature Kithkin Scout 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:RemRandomDeck:True SVar:Picture:http://www.wizards.com/global/images/magic/general/kithkin_mourncaller.jpg