diff --git a/Mage.Sets/src/mage/sets/riseoftheeldrazi/UlamogTheInfiniteGyre.java b/Mage.Sets/src/mage/sets/riseoftheeldrazi/UlamogTheInfiniteGyre.java index 7f3cf02de8..0c43c1abf8 100644 --- a/Mage.Sets/src/mage/sets/riseoftheeldrazi/UlamogTheInfiniteGyre.java +++ b/Mage.Sets/src/mage/sets/riseoftheeldrazi/UlamogTheInfiniteGyre.java @@ -36,7 +36,6 @@ import mage.abilities.effects.OneShotEffect; import mage.abilities.effects.common.DestroyTargetEffect; import mage.abilities.keyword.AnnihilatorAbility; import mage.abilities.keyword.IndestructibleAbility; -import mage.cards.Card; import mage.cards.CardImpl; import mage.constants.CardType; import mage.constants.Outcome; @@ -45,7 +44,6 @@ import mage.constants.Zone; import mage.game.Game; import mage.game.events.GameEvent; import mage.game.events.GameEvent.EventType; -import mage.game.permanent.Permanent; import mage.game.stack.Spell; import mage.players.Player; import mage.target.TargetPermanent; @@ -131,23 +129,10 @@ class UlamogTheInfiniteGyreEnterGraveyardEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { - UUID ownerId = null; - Card card = game.getCard(source.getSourceId()); - if (card != null) { - ownerId = card.getOwnerId(); - } - if (ownerId == null) { - Permanent permanent = (Permanent) game.getLastKnownInformation(source.getSourceId(), Zone.BATTLEFIELD); - if (permanent != null) { - ownerId = permanent.getOwnerId(); - } - } - Player player = game.getPlayer(ownerId); - if (player != null) { - for (Card cardToMove : player.getGraveyard().getCards(game)) { - cardToMove.moveToZone(Zone.LIBRARY, source.getSourceId(), game, true); - } - player.shuffleLibrary(game); + Player owner = game.getPlayer(game.getOwnerId(source.getSourceId())); + if (owner != null) { + owner.moveCards(owner.getGraveyard(), null, Zone.LIBRARY, source, game); + owner.shuffleLibrary(game); return true; } return false; diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/triggers/ReturnToHandEffectsTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/triggers/ReturnToHandEffectsTest.java index 9159d14fd9..63fff00ea5 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/triggers/ReturnToHandEffectsTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/triggers/ReturnToHandEffectsTest.java @@ -36,7 +36,6 @@ import org.mage.test.serverside.base.CardTestPlayerBase; * * @author LevelX2 */ - public class ReturnToHandEffectsTest extends CardTestPlayerBase { /** @@ -49,24 +48,59 @@ public class ReturnToHandEffectsTest extends CardTestPlayerBase { addCard(Zone.BATTLEFIELD, playerA, "Mountain", 2); // Play with your hand revealed. // If you would draw a card, reveal the top card of your library instead. If it's a creature card, put it into your graveyard. Otherwise, draw a card. - // Whenever a creature is put into your graveyard from the battlefield, return it to your hand. + // Whenever a creature is put into your graveyard from the battlefield, return it to your hand. addCard(Zone.BATTLEFIELD, playerA, "Enduring Renewal"); // {T}, Sacrifice an artifact: Target player puts the top three cards of his or her library into his or her graveyard. - // Whenever an artifact enters the battlefield, you may untap Grinding Station. + // Whenever an artifact enters the battlefield, you may untap Grinding Station. addCard(Zone.BATTLEFIELD, playerA, "Grinding Station", 1); addCard(Zone.BATTLEFIELD, playerA, "Ornithopter", 1); activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}, Sacrifice an artifact", playerB); - // addTarget(playerA, "Ornithopter"); + // addTarget(playerA, "Ornithopter"); setChoice(playerA, "Ornithopter"); setStopAt(1, PhaseStep.BEGIN_COMBAT); execute(); - assertGraveyardCount(playerB, 3); + assertGraveyardCount(playerB, 3); assertHandCount(playerA, "Ornithopter", 1); - + } - + + @Test + public void testStormfrontRidersTriggerForToken() { + addCard(Zone.BATTLEFIELD, playerA, "Silvercoat Lion", 2); + addCard(Zone.BATTLEFIELD, playerA, "Swamp", 5); + addCard(Zone.BATTLEFIELD, playerA, "Plains", 1); + // Flying + // When Stormfront Riders enters the battlefield, return two creatures you control to their owner's hand. + // Whenever Stormfront Riders or another creature is returned to your hand from the battlefield, put a 1/1 white Soldier creature token onto the battlefield. + addCard(Zone.HAND, playerA, "Stormfront Riders"); // {4}{W} + // Buyback {4} (You may pay an additional {4} as you cast this spell. If you do, put this card into your hand as it resolves.) + // Put a 1/1 black Rat creature token onto the battlefield. + addCard(Zone.HAND, playerA, "Lab Rats"); // {B} + + addCard(Zone.BATTLEFIELD, playerB, "Island", 2); + addCard(Zone.HAND, playerB, "Boomerang", 1); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Stormfront Riders"); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Lab Rats"); + setChoice(playerA, "No"); + + castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerB, "Boomerang", "Rat"); + + setStopAt(1, PhaseStep.END_TURN); + execute(); + + assertPermanentCount(playerA, "Stormfront Riders", 1); + assertPermanentCount(playerA, "Rat", 0); + assertHandCount(playerA, "Silvercoat Lion", 2); + assertGraveyardCount(playerA, "Lab Rats", 1); + assertGraveyardCount(playerB, "Boomerang", 1); + + assertPermanentCount(playerA, "Soldier", 3); + + } + } diff --git a/Mage/src/mage/game/Game.java b/Mage/src/mage/game/Game.java index e558dc02ad..1b19e9d30c 100644 --- a/Mage/src/mage/game/Game.java +++ b/Mage/src/mage/game/Game.java @@ -107,6 +107,10 @@ public interface Game extends MageItem, Serializable { UUID getControllerId(UUID objectId); + UUID getOwnerId(UUID objectId); + + UUID getOwnerId(MageObject object); + Permanent getPermanent(UUID permanentId); Permanent getPermanentOrLKIBattlefield(UUID permanentId); diff --git a/Mage/src/mage/game/GameImpl.java b/Mage/src/mage/game/GameImpl.java index a4b11aa88b..65f39f5be5 100644 --- a/Mage/src/mage/game/GameImpl.java +++ b/Mage/src/mage/game/GameImpl.java @@ -347,12 +347,12 @@ public abstract class GameImpl implements Game, Serializable { MageObject object; if (state.getBattlefield().containsPermanent(objectId)) { object = state.getBattlefield().getPermanent(objectId); - state.setZone(objectId, Zone.BATTLEFIELD); + state.setZone(objectId, Zone.BATTLEFIELD); // why is this neccessary? return object; } for (StackObject item : state.getStack()) { if (item.getId().equals(objectId)) { - state.setZone(objectId, Zone.STACK); + state.setZone(objectId, Zone.STACK); // why is this neccessary? return item; } if (item.getSourceId().equals(objectId) && item instanceof Spell) { @@ -361,7 +361,7 @@ public abstract class GameImpl implements Game, Serializable { } for (CommandObject commandObject : state.getCommand()) { - if (commandObject instanceof Commander && commandObject.getId().equals(objectId)) { + if (commandObject.getId().equals(objectId)) { return commandObject; } } @@ -369,11 +369,11 @@ public abstract class GameImpl implements Game, Serializable { object = getCard(objectId); if (object == null) { - for (CommandObject commandObject : state.getCommand()) { - if (commandObject.getId().equals(objectId)) { - return commandObject; - } - } +// for (CommandObject commandObject : state.getCommand()) { +// if (commandObject.getId().equals(objectId)) { +// return commandObject; +// } +// } // can be an ability of a sacrificed Token trying to get it's source object object = getLastKnownInformation(objectId, Zone.BATTLEFIELD); } @@ -431,6 +431,29 @@ public abstract class GameImpl implements Game, Serializable { return null; } + @Override + public UUID getOwnerId(UUID objectId) { + return getOwnerId(getObject(objectId)); + } + + @Override + public UUID getOwnerId(MageObject object) { + if (object instanceof Card) { + return ((Card) object).getOwnerId(); + } + if (object instanceof Spell) { + return ((Spell) object).getOwnerId(); + } + if (object instanceof StackObject) { + // maybe this is not correct in all cases? + return ((StackObject) object).getControllerId(); + } + if (object instanceof CommandObject) { + return ((CommandObject) object).getControllerId(); + } + return null; + } + @Override public UUID getControllerId(UUID objectId) { if (objectId == null) {