diff --git a/Mage.Sets/src/mage/cards/w/WordOfCommand.java b/Mage.Sets/src/mage/cards/w/WordOfCommand.java index dc20f3c483f..19da3214345 100644 --- a/Mage.Sets/src/mage/cards/w/WordOfCommand.java +++ b/Mage.Sets/src/mage/cards/w/WordOfCommand.java @@ -126,22 +126,10 @@ class WordOfCommandEffect extends OneShotEffect { spell.setCommandedBy(controller.getId()); // If the chosen card is cast as a spell, you control the player while that spell is resolving } } - - if (sourceObject != null) { - Effect effect = new LoseControlOnOtherPlayersControllerEffect(controller.getLogName(), targetPlayer.getLogName()); - effect.setTargetPointer(new FixedTarget(targetPlayer.getId())); - // You control the player until Word of Command finishes resolving - // TODO: using a DelayedTriggeredAbility to end the effect isn't the optimal solution, since effects like Time Stop can stop it from triggering even outside the stack - DelayedTriggeredAbility ability = new WordOfCommandDelayedTriggeredAbility(effect, source.getSourceId()); - ability.setSourceId(controller.getId()); - ability.setControllerId(controller.getId()); - game.addDelayedTriggeredAbility(ability); - if (card != null && !card.isLand()) { // this sets up a lose control effect for when the spell finishes resolving - ability = new WordOfCommandDelayedTriggeredAbility(effect, card.getId()); - ability.setSourceId(controller.getId()); - ability.setControllerId(controller.getId()); - game.addDelayedTriggeredAbility(ability); - } + + Spell wordOfCommand = game.getSpell(sourceObject.getId()); + if (wordOfCommand != null) { + wordOfCommand.setCommandedBy(controller.getId()); // You control the player until Word of Command finishes resolving } else { controller.resetOtherTurnsControlled(); targetPlayer.setGameUnderYourControl(true); @@ -177,38 +165,3 @@ class WordOfCommandCantActivateEffect extends RestrictionEffect { return false; } } - -class WordOfCommandDelayedTriggeredAbility extends DelayedTriggeredAbility { - - private UUID cardId; - - WordOfCommandDelayedTriggeredAbility(Effect effect, UUID cardId) { - super(effect, Duration.EndOfTurn); - this.cardId = cardId; - this.usesStack = false; - } - - WordOfCommandDelayedTriggeredAbility(final WordOfCommandDelayedTriggeredAbility ability) { - super(ability); - this.cardId = ability.cardId; - } - - @Override - public WordOfCommandDelayedTriggeredAbility copy() { - return new WordOfCommandDelayedTriggeredAbility(this); - } - - @Override - public boolean checkEventType(GameEvent event, Game game) { - return event.getType() == GameEvent.EventType.ZONE_CHANGE; - } - - @Override - public boolean checkTrigger(GameEvent event, Game game) { - ZoneChangeEvent zEvent = (ZoneChangeEvent) event; - if (zEvent.getFromZone() == Zone.STACK && event.getTargetId().equals(cardId)) { - return true; - } - return false; - } -} diff --git a/Mage/src/main/java/mage/abilities/effects/common/LoseControlOnOtherPlayersControllerEffect.java b/Mage/src/main/java/mage/abilities/effects/common/LoseControlOnOtherPlayersControllerEffect.java index 3f3621caa86..01bb92c2ee4 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/LoseControlOnOtherPlayersControllerEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/LoseControlOnOtherPlayersControllerEffect.java @@ -33,10 +33,6 @@ public class LoseControlOnOtherPlayersControllerEffect extends OneShotEffect { Player player = game.getPlayer(source.getControllerId()); if (player != null) { player.resetOtherTurnsControlled(); - Player targetPlayer = game.getPlayer(this.getTargetPointer().getFirst(game, source)); - if (targetPlayer != null) { - targetPlayer.setGameUnderYourControl(true); - } return true; } return false; diff --git a/Mage/src/main/java/mage/game/Game.java b/Mage/src/main/java/mage/game/Game.java index 5ae398beeab..21418c8a0cd 100644 --- a/Mage/src/main/java/mage/game/Game.java +++ b/Mage/src/main/java/mage/game/Game.java @@ -393,6 +393,8 @@ public interface Game extends MageItem, Serializable { boolean checkStateAndTriggered(); void playPriority(UUID activePlayerId, boolean resuming); + + void resetControlAfterSpellResolve(Spell spell); boolean endTurn(Ability source); diff --git a/Mage/src/main/java/mage/game/GameImpl.java b/Mage/src/main/java/mage/game/GameImpl.java index 259d7e53358..350ff0047a6 100644 --- a/Mage/src/main/java/mage/game/GameImpl.java +++ b/Mage/src/main/java/mage/game/GameImpl.java @@ -1395,7 +1395,13 @@ public abstract class GameImpl implements Game, Serializable { StackObject top = null; try { top = state.getStack().peek(); - top.resolve(this); + Spell topSpell = getSpell(top.getId()); + if (topSpell != null) { + top.resolve(this); + resetControlAfterSpellResolve(topSpell); + } else { + top.resolve(this); + } } finally { if (top != null) { state.getStack().remove(top, this); // seems partly redundant because move card from stack to grave is already done and the stack removed @@ -1409,6 +1415,31 @@ public abstract class GameImpl implements Game, Serializable { } } } + + @Override + public void resetControlAfterSpellResolve(Spell spell) { + // for Word of Command + if (spell.getCommandedBy() != null) { + UUID commandedBy = spell.getCommandedBy(); + UUID spellControllerId = null; + if (commandedBy.equals(spell.getControllerId())) { + spellControllerId = spell.getSpellAbility().getFirstTarget(); // i.e. resolved spell is Word of Command + } else { + spellControllerId = spell.getControllerId(); // i.e. resolved spell is the target opponent's spell + } + if (commandedBy != null && spellControllerId != null) { + Player turnController = getPlayer(commandedBy); + if (turnController != null) { + Player targetPlayer = getPlayer(spellControllerId); + if (targetPlayer != null) { + informPlayers(turnController.getLogName() + " lost control over " + targetPlayer.getLogName()); + turnController.resetOtherTurnsControlled(); + targetPlayer.setGameUnderYourControl(true); + } + } + } + } + } /** * This checks if the stack gets filled iterated, without ever getting empty diff --git a/Mage/src/main/java/mage/game/stack/SpellStack.java b/Mage/src/main/java/mage/game/stack/SpellStack.java index 71ad426f8bb..ecf91441b47 100644 --- a/Mage/src/main/java/mage/game/stack/SpellStack.java +++ b/Mage/src/main/java/mage/game/stack/SpellStack.java @@ -36,7 +36,13 @@ public class SpellStack extends ArrayDeque { StackObject top = null; try { top = this.peek(); - top.resolve(game); + Spell topSpell = getSpell(top.getId()); + if (topSpell != null) { + top.resolve(game); + game.resetControlAfterSpellResolve(topSpell); + } else { + top.resolve(game); + } } finally { if (top != null) { if (contains(top)) {