diff --git a/Mage.Sets/src/mage/sets/darkascension/DungeonGeists.java b/Mage.Sets/src/mage/sets/darkascension/DungeonGeists.java index 5709d62fa57..db880ea1b97 100644 --- a/Mage.Sets/src/mage/sets/darkascension/DungeonGeists.java +++ b/Mage.Sets/src/mage/sets/darkascension/DungeonGeists.java @@ -122,7 +122,7 @@ class DungeonGeistsEffect extends ReplacementEffectImpl { @Override public boolean applies(GameEvent event, Ability source, Game game) { if (event.getType() == GameEvent.EventType.LOST_CONTROL) { - if (event.getPlayerId().equals(source.getControllerId()) && event.getTargetId().equals(source.getSourceId())) { + if (event.getTargetId().equals(source.getSourceId())) { this.used = true; return false; } diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/control/ExchangeControlTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/control/ExchangeControlTest.java index 43565960356..be741ab8342 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/control/ExchangeControlTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/control/ExchangeControlTest.java @@ -149,4 +149,32 @@ public class ExchangeControlTest extends CardTestPlayerBase { // this one is still on opponent's side assertPermanentCount(playerB, "Elite Vanguard", 1); } + + /** + * Tests switching controls will affect restriction effect + */ + @Test + public void testRestrictionEffect() { + addCard(Constants.Zone.BATTLEFIELD, playerA, "Island", 5); + addCard(Constants.Zone.HAND, playerA, "Switcheroo"); + + addCard(Constants.Zone.BATTLEFIELD, playerA, "War Falcon"); + addCard(Constants.Zone.BATTLEFIELD, playerA, "Elite Vanguard"); + + addCard(Constants.Zone.BATTLEFIELD, playerB, "Llanowar Elves"); + + castSpell(1, Constants.PhaseStep.PRECOMBAT_MAIN, playerA, "Switcheroo", "War Falcon^Llanowar Elves"); + + attack(2, playerB, "War Falcon"); + + setStopAt(2, Constants.PhaseStep.END_TURN); + execute(); + + // check creatures changes their controllers + assertPermanentCount(playerA, "Llanowar Elves", 1); + assertPermanentCount(playerB, "War Falcon", 1); + + // War Falcon can't attack + assertLife(playerA, 20); + } } diff --git a/Mage/src/mage/abilities/effects/ContinuousEffects.java b/Mage/src/mage/abilities/effects/ContinuousEffects.java index b76b8ed2a31..765d95668dd 100644 --- a/Mage/src/mage/abilities/effects/ContinuousEffects.java +++ b/Mage/src/mage/abilities/effects/ContinuousEffects.java @@ -58,6 +58,8 @@ public class ContinuousEffects implements Serializable { private ContinuousEffectsList asThoughEffects = new ContinuousEffectsList(); private ContinuousEffectsList costModificationEffects = new ContinuousEffectsList(); + private List> allEffectsLists = new ArrayList>(); + private final ApplyCountersEffect applyCounters; private final PlaneswalkerRedirectionEffect planeswalkerRedirectionEffect; private final AuraReplacementEffect auraReplacementEffect; @@ -68,6 +70,7 @@ public class ContinuousEffects implements Serializable { applyCounters = new ApplyCountersEffect(); planeswalkerRedirectionEffect = new PlaneswalkerRedirectionEffect(); auraReplacementEffect = new AuraReplacementEffect(); + collectAllEffects(); } public ContinuousEffects(final ContinuousEffects effect) { @@ -81,6 +84,17 @@ public class ContinuousEffects implements Serializable { restrictionEffects = effect.restrictionEffects.copy(); asThoughEffects = effect.asThoughEffects.copy(); costModificationEffects = effect.costModificationEffects.copy(); + collectAllEffects(); + } + + private void collectAllEffects() { + allEffectsLists.add(layeredEffects); + allEffectsLists.add(replacementEffects); + allEffectsLists.add(preventionEffects); + allEffectsLists.add(requirementEffects); + allEffectsLists.add(restrictionEffects); + allEffectsLists.add(asThoughEffects); + allEffectsLists.add(costModificationEffects); } public ContinuousEffects copy() { @@ -427,14 +441,25 @@ public class ContinuousEffects implements Serializable { } } + public void setController(UUID cardId, UUID controllerId) { + for (ContinuousEffectsList effectsList : allEffectsLists) { + setControllerForEffect(effectsList, cardId, controllerId); + } + } + + private void setControllerForEffect(ContinuousEffectsList effects, UUID cardId, UUID controllerId) { + for (Effect effect : effects) { + Ability ability = effects.getAbility(effect.getId()); + if (ability.getSourceId().equals(cardId)) { + ability.setControllerId(controllerId); + } + } + } + public void clear() { - layeredEffects.clear(); - replacementEffects.clear(); - preventionEffects.clear(); - requirementEffects.clear(); - restrictionEffects.clear(); - asThoughEffects.clear(); - costModificationEffects.clear(); + for (ContinuousEffectsList effectsList : allEffectsLists) { + effectsList.clear(); + } } } diff --git a/Mage/src/mage/game/permanent/PermanentImpl.java b/Mage/src/mage/game/permanent/PermanentImpl.java index b6f22c3ed71..9d50e8b110e 100644 --- a/Mage/src/mage/game/permanent/PermanentImpl.java +++ b/Mage/src/mage/game/permanent/PermanentImpl.java @@ -436,6 +436,7 @@ public abstract class PermanentImpl> extends CardImpl } this.controllerId = controllerId; this.abilities.setControllerId(controllerId); + game.getContinuousEffects().setController(this.objectId, controllerId); return true; } }