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