mirror of
https://github.com/correl/mage.git
synced 2025-04-09 17:00:09 -09:00
Some minor changes.
This commit is contained in:
parent
3c743e781a
commit
391b766b6e
4 changed files with 80 additions and 34 deletions
Mage.Sets/src/mage/sets/riseoftheeldrazi
Mage.Tests/src/test/java/org/mage/test/cards/triggers
Mage/src/mage/game
|
@ -36,7 +36,6 @@ import mage.abilities.effects.OneShotEffect;
|
||||||
import mage.abilities.effects.common.DestroyTargetEffect;
|
import mage.abilities.effects.common.DestroyTargetEffect;
|
||||||
import mage.abilities.keyword.AnnihilatorAbility;
|
import mage.abilities.keyword.AnnihilatorAbility;
|
||||||
import mage.abilities.keyword.IndestructibleAbility;
|
import mage.abilities.keyword.IndestructibleAbility;
|
||||||
import mage.cards.Card;
|
|
||||||
import mage.cards.CardImpl;
|
import mage.cards.CardImpl;
|
||||||
import mage.constants.CardType;
|
import mage.constants.CardType;
|
||||||
import mage.constants.Outcome;
|
import mage.constants.Outcome;
|
||||||
|
@ -45,7 +44,6 @@ import mage.constants.Zone;
|
||||||
import mage.game.Game;
|
import mage.game.Game;
|
||||||
import mage.game.events.GameEvent;
|
import mage.game.events.GameEvent;
|
||||||
import mage.game.events.GameEvent.EventType;
|
import mage.game.events.GameEvent.EventType;
|
||||||
import mage.game.permanent.Permanent;
|
|
||||||
import mage.game.stack.Spell;
|
import mage.game.stack.Spell;
|
||||||
import mage.players.Player;
|
import mage.players.Player;
|
||||||
import mage.target.TargetPermanent;
|
import mage.target.TargetPermanent;
|
||||||
|
@ -131,23 +129,10 @@ class UlamogTheInfiniteGyreEnterGraveyardEffect extends OneShotEffect {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean apply(Game game, Ability source) {
|
public boolean apply(Game game, Ability source) {
|
||||||
UUID ownerId = null;
|
Player owner = game.getPlayer(game.getOwnerId(source.getSourceId()));
|
||||||
Card card = game.getCard(source.getSourceId());
|
if (owner != null) {
|
||||||
if (card != null) {
|
owner.moveCards(owner.getGraveyard(), null, Zone.LIBRARY, source, game);
|
||||||
ownerId = card.getOwnerId();
|
owner.shuffleLibrary(game);
|
||||||
}
|
|
||||||
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);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -36,7 +36,6 @@ import org.mage.test.serverside.base.CardTestPlayerBase;
|
||||||
*
|
*
|
||||||
* @author LevelX2
|
* @author LevelX2
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public class ReturnToHandEffectsTest extends CardTestPlayerBase {
|
public class ReturnToHandEffectsTest extends CardTestPlayerBase {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -49,24 +48,59 @@ public class ReturnToHandEffectsTest extends CardTestPlayerBase {
|
||||||
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 2);
|
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 2);
|
||||||
// Play with your hand revealed.
|
// 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.
|
// 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");
|
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.
|
// {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, "Grinding Station", 1);
|
||||||
addCard(Zone.BATTLEFIELD, playerA, "Ornithopter", 1);
|
addCard(Zone.BATTLEFIELD, playerA, "Ornithopter", 1);
|
||||||
|
|
||||||
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}, Sacrifice an artifact", playerB);
|
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}, Sacrifice an artifact", playerB);
|
||||||
// addTarget(playerA, "Ornithopter");
|
// addTarget(playerA, "Ornithopter");
|
||||||
setChoice(playerA, "Ornithopter");
|
setChoice(playerA, "Ornithopter");
|
||||||
|
|
||||||
setStopAt(1, PhaseStep.BEGIN_COMBAT);
|
setStopAt(1, PhaseStep.BEGIN_COMBAT);
|
||||||
execute();
|
execute();
|
||||||
|
|
||||||
assertGraveyardCount(playerB, 3);
|
assertGraveyardCount(playerB, 3);
|
||||||
assertHandCount(playerA, "Ornithopter", 1);
|
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);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -107,6 +107,10 @@ public interface Game extends MageItem, Serializable {
|
||||||
|
|
||||||
UUID getControllerId(UUID objectId);
|
UUID getControllerId(UUID objectId);
|
||||||
|
|
||||||
|
UUID getOwnerId(UUID objectId);
|
||||||
|
|
||||||
|
UUID getOwnerId(MageObject object);
|
||||||
|
|
||||||
Permanent getPermanent(UUID permanentId);
|
Permanent getPermanent(UUID permanentId);
|
||||||
|
|
||||||
Permanent getPermanentOrLKIBattlefield(UUID permanentId);
|
Permanent getPermanentOrLKIBattlefield(UUID permanentId);
|
||||||
|
|
|
@ -347,12 +347,12 @@ public abstract class GameImpl implements Game, Serializable {
|
||||||
MageObject object;
|
MageObject object;
|
||||||
if (state.getBattlefield().containsPermanent(objectId)) {
|
if (state.getBattlefield().containsPermanent(objectId)) {
|
||||||
object = state.getBattlefield().getPermanent(objectId);
|
object = state.getBattlefield().getPermanent(objectId);
|
||||||
state.setZone(objectId, Zone.BATTLEFIELD);
|
state.setZone(objectId, Zone.BATTLEFIELD); // why is this neccessary?
|
||||||
return object;
|
return object;
|
||||||
}
|
}
|
||||||
for (StackObject item : state.getStack()) {
|
for (StackObject item : state.getStack()) {
|
||||||
if (item.getId().equals(objectId)) {
|
if (item.getId().equals(objectId)) {
|
||||||
state.setZone(objectId, Zone.STACK);
|
state.setZone(objectId, Zone.STACK); // why is this neccessary?
|
||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
if (item.getSourceId().equals(objectId) && item instanceof Spell) {
|
if (item.getSourceId().equals(objectId) && item instanceof Spell) {
|
||||||
|
@ -361,7 +361,7 @@ public abstract class GameImpl implements Game, Serializable {
|
||||||
}
|
}
|
||||||
|
|
||||||
for (CommandObject commandObject : state.getCommand()) {
|
for (CommandObject commandObject : state.getCommand()) {
|
||||||
if (commandObject instanceof Commander && commandObject.getId().equals(objectId)) {
|
if (commandObject.getId().equals(objectId)) {
|
||||||
return commandObject;
|
return commandObject;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -369,11 +369,11 @@ public abstract class GameImpl implements Game, Serializable {
|
||||||
object = getCard(objectId);
|
object = getCard(objectId);
|
||||||
|
|
||||||
if (object == null) {
|
if (object == null) {
|
||||||
for (CommandObject commandObject : state.getCommand()) {
|
// for (CommandObject commandObject : state.getCommand()) {
|
||||||
if (commandObject.getId().equals(objectId)) {
|
// if (commandObject.getId().equals(objectId)) {
|
||||||
return commandObject;
|
// return commandObject;
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
// can be an ability of a sacrificed Token trying to get it's source object
|
// can be an ability of a sacrificed Token trying to get it's source object
|
||||||
object = getLastKnownInformation(objectId, Zone.BATTLEFIELD);
|
object = getLastKnownInformation(objectId, Zone.BATTLEFIELD);
|
||||||
}
|
}
|
||||||
|
@ -431,6 +431,29 @@ public abstract class GameImpl implements Game, Serializable {
|
||||||
return null;
|
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
|
@Override
|
||||||
public UUID getControllerId(UUID objectId) {
|
public UUID getControllerId(UUID objectId) {
|
||||||
if (objectId == null) {
|
if (objectId == null) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue