From 77b3706c9fc01c08c54981ae8c508a50e84857a3 Mon Sep 17 00:00:00 2001 From: LevelX2 <ludwig.hirth@online.de> Date: Wed, 8 Jul 2015 23:40:15 +0200 Subject: [PATCH] * Fixed that permanents that became creatures are not removed from combat if the creature making effect is removed during combat (fixes 366). --- .../test/combat/RemoveFromCombatTest.java | 7 +++++- Mage/src/mage/game/GameImpl.java | 2 +- Mage/src/mage/game/GameState.java | 3 ++- Mage/src/mage/game/combat/Combat.java | 23 +++++++++++++++++-- .../mage/game/permanent/PermanentImpl.java | 6 ++--- 5 files changed, 32 insertions(+), 9 deletions(-) diff --git a/Mage.Tests/src/test/java/org/mage/test/combat/RemoveFromCombatTest.java b/Mage.Tests/src/test/java/org/mage/test/combat/RemoveFromCombatTest.java index 8926458d8e..4e1999515d 100644 --- a/Mage.Tests/src/test/java/org/mage/test/combat/RemoveFromCombatTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/combat/RemoveFromCombatTest.java @@ -29,6 +29,8 @@ package org.mage.test.combat; import mage.constants.PhaseStep; import mage.constants.Zone; +import mage.game.permanent.Permanent; +import org.junit.Assert; import org.junit.Test; import org.mage.test.serverside.base.CardTestPlayerBase; @@ -60,7 +62,7 @@ public class RemoveFromCombatTest extends CardTestPlayerBase { attack(2, playerB, "Stomping Ground"); activateAbility(2, PhaseStep.DECLARE_ATTACKERS, playerB, "{1}{G},Sacrifice an Elf: Target creature gets +3/+3", "Stomping Ground"); castSpell(2, PhaseStep.DECLARE_BLOCKERS, playerA, "Lightning Blast", "Ambush Commander"); - setStopAt(2, PhaseStep.POSTCOMBAT_MAIN); + setStopAt(2, PhaseStep.COMBAT_DAMAGE); execute(); assertGraveyardCount(playerB, "Elvish Mystic", 1); @@ -69,6 +71,9 @@ public class RemoveFromCombatTest extends CardTestPlayerBase { assertPowerToughness(playerB, "Stomping Ground", 0, 0); + Permanent stompingGround = getPermanent("Stomping Ground", playerB); + Assert.assertEquals("Stomping Ground has to be removed from combat", false, stompingGround.isAttacking()); + assertLife(playerA, 20); assertLife(playerB, 20); diff --git a/Mage/src/mage/game/GameImpl.java b/Mage/src/mage/game/GameImpl.java index 1b0dd091dd..ce2a1e7bb1 100644 --- a/Mage/src/mage/game/GameImpl.java +++ b/Mage/src/mage/game/GameImpl.java @@ -2124,7 +2124,7 @@ public abstract class GameImpl implements Game, Serializable { } // check if it's a creature and must be removed from combat if (perm.getCardType().contains(CardType.CREATURE) && this.getCombat() != null) { - this.getCombat().removeFromCombat(perm.getId(), this); + perm.removeFromCombat(this, true); } it.remove(); } diff --git a/Mage/src/mage/game/GameState.java b/Mage/src/mage/game/GameState.java index d33aac385a..6c1aacb48d 100644 --- a/Mage/src/mage/game/GameState.java +++ b/Mage/src/mage/game/GameState.java @@ -534,9 +534,10 @@ public class GameState implements Serializable, Copyable<GameState> { player.reset(); } battlefield.reset(game); - combat.reset(); + combat.reset(game); this.reset(); effects.apply(game); + combat.checkForRemoveFromCombat(game); } // Remove End of Combat effects diff --git a/Mage/src/mage/game/combat/Combat.java b/Mage/src/mage/game/combat/Combat.java index 5ba13a273a..2c61cdbf04 100644 --- a/Mage/src/mage/game/combat/Combat.java +++ b/Mage/src/mage/game/combat/Combat.java @@ -42,6 +42,7 @@ import mage.abilities.effects.RestrictionEffect; import mage.abilities.keyword.CanAttackOnlyAloneAbility; import mage.abilities.keyword.CantAttackAloneAbility; import mage.abilities.keyword.VigilanceAbility; +import mage.constants.CardType; import mage.constants.Outcome; import mage.constants.Zone; import mage.filter.common.FilterControlledCreaturePermanent; @@ -157,11 +158,26 @@ public class Combat implements Serializable, Copyable<Combat> { this.useToughnessForDamageFilters.add(filter); } - public void reset() { + public void reset(Game game) { this.useToughnessForDamage = false; this.useToughnessForDamageFilters.clear(); } + public void checkForRemoveFromCombat(Game game) { + for (UUID creatureId : getAttackers()) { + Permanent creature = game.getPermanent(creatureId); + if (!creature.getCardType().contains(CardType.CREATURE)) { + removeFromCombat(creatureId, game, true); + } + } + for (UUID creatureId : getBlockers()) { + Permanent creature = game.getPermanent(creatureId); + if (!creature.getCardType().contains(CardType.CREATURE)) { + removeFromCombat(creatureId, game, true); + } + } + } + public void clear() { groups.clear(); blockingGroups.clear(); @@ -993,7 +1009,7 @@ public class Combat implements Serializable, Copyable<Combat> { } } - public boolean removeFromCombat(UUID creatureId, Game game) { + public boolean removeFromCombat(UUID creatureId, Game game, boolean withInfo) { boolean result = false; Permanent creature = game.getPermanent(creatureId); if (creature != null) { @@ -1003,6 +1019,9 @@ public class Combat implements Serializable, Copyable<Combat> { for (CombatGroup group : groups) { result |= group.remove(creatureId); } + if (result && withInfo) { + game.informPlayers(creature.getLogName() + " removed from combat"); + } } return result; } diff --git a/Mage/src/mage/game/permanent/PermanentImpl.java b/Mage/src/mage/game/permanent/PermanentImpl.java index 5ba200bae6..eb93cb1d56 100644 --- a/Mage/src/mage/game/permanent/PermanentImpl.java +++ b/Mage/src/mage/game/permanent/PermanentImpl.java @@ -1200,11 +1200,9 @@ public abstract class PermanentImpl extends CardImpl implements Permanent { @Override public boolean removeFromCombat(Game game, boolean withInfo) { if (this.isAttacking() || this.blocking > 0) { - if (game.getCombat().removeFromCombat(objectId, game) && withInfo && !game.isSimulation()) { - game.informPlayers(new StringBuilder(this.getLogName()).append(" removed from combat").toString()); - } + return game.getCombat().removeFromCombat(objectId, game, withInfo); } - return true; + return false; } @Override