From 3b3d02b3f822d283431837fa13008ae116a9e4d0 Mon Sep 17 00:00:00 2001
From: magenoxx <magenoxx@gmail>
Date: Fri, 7 Sep 2012 20:05:03 +0400
Subject: [PATCH] Fixed Issue#67: Evernight Shade doesn't loose +1/+1 effects

---
 .../cards/continuous/EvernightShadeTest.java  | 32 +++++++++++++++++++
 .../abilities/effects/ContinuousEffect.java   |  1 +
 .../effects/ContinuousEffectImpl.java         |  5 +++
 .../abilities/effects/ContinuousEffects.java  | 14 ++++----
 .../common/continious/BoostSourceEffect.java  |  3 +-
 .../common/continious/SourceEffect.java       |  9 ++++++
 Mage/src/mage/game/GameImpl.java              |  7 ++--
 7 files changed, 60 insertions(+), 11 deletions(-)
 create mode 100644 Mage.Tests/src/test/java/org/mage/test/cards/continuous/EvernightShadeTest.java
 create mode 100644 Mage/src/mage/abilities/effects/common/continious/SourceEffect.java

diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/continuous/EvernightShadeTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/continuous/EvernightShadeTest.java
new file mode 100644
index 0000000000..66fbf0ef58
--- /dev/null
+++ b/Mage.Tests/src/test/java/org/mage/test/cards/continuous/EvernightShadeTest.java
@@ -0,0 +1,32 @@
+package org.mage.test.cards.continuous;
+
+import mage.Constants;
+import org.junit.Test;
+import org.mage.test.serverside.base.CardTestPlayerBase;
+
+/**
+ * @author magenoxx_at_gmail.com
+ */
+public class EvernightShadeTest extends CardTestPlayerBase {
+
+    /**
+     * Tests boost disappeared after creature died
+     */
+    @Test
+    public void testBoostWithUndying() {
+        addCard(Constants.Zone.BATTLEFIELD, playerA, "Swamp", 3);
+        addCard(Constants.Zone.BATTLEFIELD, playerA, "Mountain", 1);
+        addCard(Constants.Zone.BATTLEFIELD, playerA, "Evernight Shade");
+        addCard(Constants.Zone.HAND, playerA, "Lightning Bolt");
+
+        activateAbility(1, Constants.PhaseStep.PRECOMBAT_MAIN, playerA, "{B}");
+        activateAbility(1, Constants.PhaseStep.PRECOMBAT_MAIN, playerA, "{B}");
+        castSpell(1, Constants.PhaseStep.POSTCOMBAT_MAIN, playerA, "Lightning Bolt", "Evernight Shade");
+
+        setStopAt(1, Constants.PhaseStep.END_TURN);
+        execute();
+
+        assertPowerToughness(playerA, "Evernight Shade", 2, 2);
+    }
+
+}
diff --git a/Mage/src/mage/abilities/effects/ContinuousEffect.java b/Mage/src/mage/abilities/effects/ContinuousEffect.java
index e9cfd8c4f1..d6c7089d09 100644
--- a/Mage/src/mage/abilities/effects/ContinuousEffect.java
+++ b/Mage/src/mage/abilities/effects/ContinuousEffect.java
@@ -46,6 +46,7 @@ public interface ContinuousEffect<T extends ContinuousEffect<T>> extends Effect<
 
     public boolean isUsed();
     public boolean isDiscarded();
+    public void discard();
     public Duration getDuration();
     public Date getTimestamp();
     public void setTimestamp();
diff --git a/Mage/src/mage/abilities/effects/ContinuousEffectImpl.java b/Mage/src/mage/abilities/effects/ContinuousEffectImpl.java
index d50f9d0592..71478b8683 100644
--- a/Mage/src/mage/abilities/effects/ContinuousEffectImpl.java
+++ b/Mage/src/mage/abilities/effects/ContinuousEffectImpl.java
@@ -127,6 +127,11 @@ public abstract class ContinuousEffectImpl<T extends ContinuousEffectImpl<T>> ex
         return discarded;
     }
 
+    @Override
+    public void discard() {
+        this.discarded = true;
+    }
+
     @Override
     public void init(Ability source, Game game) {
         //20100716 - 611.2c
diff --git a/Mage/src/mage/abilities/effects/ContinuousEffects.java b/Mage/src/mage/abilities/effects/ContinuousEffects.java
index 8a98712460..998e33847f 100644
--- a/Mage/src/mage/abilities/effects/ContinuousEffects.java
+++ b/Mage/src/mage/abilities/effects/ContinuousEffects.java
@@ -159,7 +159,7 @@ public class ContinuousEffects implements Serializable {
                 case WhileOnStack:
                 case WhileInGraveyard:
                     Ability ability = layeredEffects.getAbility(effect.getId());
-                    if (ability.isInUseableZone(game, false))
+                    if (ability.isInUseableZone(game, null, false))
                         layerEffects.add(effect);
                     break;
                 default:
@@ -203,7 +203,7 @@ public class ContinuousEffects implements Serializable {
         List<RequirementEffect> effects = new ArrayList<RequirementEffect>();
         for (RequirementEffect effect: requirementEffects) {
             Ability ability = requirementEffects.getAbility(effect.getId());
-            if (!(ability instanceof StaticAbility) || ability.isInUseableZone(game, false)) {
+            if (!(ability instanceof StaticAbility) || ability.isInUseableZone(game, null, false)) {
                 if (effect.applies(permanent, ability, game))
                     effects.add(effect);
             }
@@ -215,7 +215,7 @@ public class ContinuousEffects implements Serializable {
         List<RestrictionEffect> effects = new ArrayList<RestrictionEffect>();
         for (RestrictionEffect effect: restrictionEffects) {
             Ability ability = restrictionEffects.getAbility(effect.getId());
-            if (!(ability instanceof StaticAbility) || ability.isInUseableZone(game, false)) {
+            if (!(ability instanceof StaticAbility) || ability.isInUseableZone(game, permanent, false)) {
                 if (effect.applies(permanent, ability, game))
                     effects.add(effect);
             }
@@ -238,7 +238,7 @@ public class ContinuousEffects implements Serializable {
         //get all applicable transient Replacement effects
         for (ReplacementEffect effect: replacementEffects) {
             Ability ability = replacementEffects.getAbility(effect.getId());
-            if (!(ability instanceof StaticAbility) || ability.isInUseableZone(game, false)) {
+            if (!(ability instanceof StaticAbility) || ability.isInUseableZone(game, null, false)) {
                 if (effect.getDuration() != Duration.OneUse || !effect.isUsed()) {
                     if (effect.applies(event, ability, game)) {
                         replaceEffects.add(effect);
@@ -248,7 +248,7 @@ public class ContinuousEffects implements Serializable {
         }
         for (PreventionEffect effect: preventionEffects) {
             Ability ability = preventionEffects.getAbility(effect.getId());
-            if (!(ability instanceof StaticAbility) || ability.isInUseableZone(game, false)) {
+            if (!(ability instanceof StaticAbility) || ability.isInUseableZone(game, null, false)) {
                 if (effect.getDuration() != Duration.OneUse || !effect.isUsed()) {
                     if (effect.applies(event, ability, game)) {
                         replaceEffects.add(effect);
@@ -270,7 +270,7 @@ public class ContinuousEffects implements Serializable {
 
         for (CostModificationEffect effect: costModificationEffects) {
             Ability ability = costModificationEffects.getAbility(effect.getId());
-            if (!(ability instanceof StaticAbility) || ability.isInUseableZone(game, false)) {
+            if (!(ability instanceof StaticAbility) || ability.isInUseableZone(game, null, false)) {
                 if (effect.getDuration() != Duration.OneUse || !effect.isUsed()) {
                     costEffects.add(effect);
                 }
@@ -304,7 +304,7 @@ public class ContinuousEffects implements Serializable {
 
         for (AsThoughEffect effect: asThoughEffects) {
             Ability ability = asThoughEffects.getAbility(effect.getId());
-            if (!(ability instanceof StaticAbility) || ability.isInUseableZone(game, false)) {
+            if (!(ability instanceof StaticAbility) || ability.isInUseableZone(game, null, false)) {
                 if (effect.getDuration() != Duration.OneUse || !effect.isUsed()) {
                     asThoughEffectsList.add(effect);
                 }
diff --git a/Mage/src/mage/abilities/effects/common/continious/BoostSourceEffect.java b/Mage/src/mage/abilities/effects/common/continious/BoostSourceEffect.java
index c8bd1c8271..dd7f03447c 100644
--- a/Mage/src/mage/abilities/effects/common/continious/BoostSourceEffect.java
+++ b/Mage/src/mage/abilities/effects/common/continious/BoostSourceEffect.java
@@ -43,7 +43,7 @@ import mage.game.permanent.Permanent;
  *
  * @author BetaSteward_at_googlemail.com
  */
-public class BoostSourceEffect extends ContinuousEffectImpl<BoostSourceEffect> {
+public class BoostSourceEffect extends ContinuousEffectImpl<BoostSourceEffect> implements SourceEffect {
     private DynamicValue power;
     private DynamicValue toughness;
     private boolean lockedIn;
@@ -82,6 +82,7 @@ public class BoostSourceEffect extends ContinuousEffectImpl<BoostSourceEffect> {
     @Override
     public void init(Ability source, Game game) {
         super.init(source, game);
+        getAffectedObjects().add(source.getSourceId());
         if (lockedIn) {
             power = new StaticValue(power.calculate(game, source));
             toughness = new StaticValue(toughness.calculate(game, source));
diff --git a/Mage/src/mage/abilities/effects/common/continious/SourceEffect.java b/Mage/src/mage/abilities/effects/common/continious/SourceEffect.java
new file mode 100644
index 0000000000..d659d46bc2
--- /dev/null
+++ b/Mage/src/mage/abilities/effects/common/continious/SourceEffect.java
@@ -0,0 +1,9 @@
+package mage.abilities.effects.common.continious;
+
+/**
+ * Marker interface
+ *
+ * @author magenoxx_at_gmail.com
+ */
+public interface SourceEffect {
+}
diff --git a/Mage/src/mage/game/GameImpl.java b/Mage/src/mage/game/GameImpl.java
index e1322a597c..0611394443 100644
--- a/Mage/src/mage/game/GameImpl.java
+++ b/Mage/src/mage/game/GameImpl.java
@@ -39,6 +39,7 @@ import mage.abilities.effects.ContinuousEffect;
 import mage.abilities.effects.ContinuousEffects;
 import mage.abilities.effects.Effect;
 import mage.abilities.effects.common.CopyEffect;
+import mage.abilities.effects.common.continious.SourceEffect;
 import mage.abilities.keyword.LeylineAbility;
 import mage.abilities.keyword.TransformAbility;
 import mage.abilities.mana.TriggeredManaAbility;
@@ -1447,9 +1448,9 @@ public abstract class GameImpl<T extends GameImpl<T>> implements Game, Serializa
         for (ContinuousEffect effect : getContinuousEffects().getLayeredEffects(this)) {
             if (effect.getAffectedObjects().contains(sourceId)) {
                 effect.getAffectedObjects().remove(sourceId);
-            }
-            if (effect.getAffectedObjects().contains(sourceId)) {
-                effect.getAffectedObjects().remove(sourceId);
+                if (effect instanceof SourceEffect) {
+                    effect.discard();
+                }
             }
         }
         getContinuousEffects().removeGainedEffectsForSource(sourceId);