diff --git a/Mage.Server/plugins/mage-player-ai-ma.jar b/Mage.Server/plugins/mage-player-ai-ma.jar index 847bef09a16..c70fcaf75c6 100644 Binary files a/Mage.Server/plugins/mage-player-ai-ma.jar and b/Mage.Server/plugins/mage-player-ai-ma.jar differ diff --git a/Mage.Server/plugins/mage-player-ai.jar b/Mage.Server/plugins/mage-player-ai.jar index 21077f24fc5..9c1c23cf101 100644 Binary files a/Mage.Server/plugins/mage-player-ai.jar and b/Mage.Server/plugins/mage-player-ai.jar differ diff --git a/Mage.Server/plugins/mage-player-aiminimax.jar b/Mage.Server/plugins/mage-player-aiminimax.jar index f2b225362ae..833943903d7 100644 Binary files a/Mage.Server/plugins/mage-player-aiminimax.jar and b/Mage.Server/plugins/mage-player-aiminimax.jar differ diff --git a/Mage.Server/plugins/mage-player-human.jar b/Mage.Server/plugins/mage-player-human.jar index 3bbbda04793..bd6f0765538 100644 Binary files a/Mage.Server/plugins/mage-player-human.jar and b/Mage.Server/plugins/mage-player-human.jar differ diff --git a/Mage/src/mage/cards/CardImpl.java b/Mage/src/mage/cards/CardImpl.java index ac2ee672127..d69a444ce48 100644 --- a/Mage/src/mage/cards/CardImpl.java +++ b/Mage/src/mage/cards/CardImpl.java @@ -278,6 +278,9 @@ public abstract class CardImpl> extends MageObjectImpl case GRAVEYARD: game.getPlayer(ownerId).removeFromGraveyard(this, game); break; + case HAND: + game.getPlayer(ownerId).removeFromHand(this, game); + break; case LIBRARY: game.getPlayer(ownerId).removeFromLibrary(this, game); break; diff --git a/Mage/src/mage/game/Game.java b/Mage/src/mage/game/Game.java index 5c1c13714ea..8b17894f07d 100644 --- a/Mage/src/mage/game/Game.java +++ b/Mage/src/mage/game/Game.java @@ -154,6 +154,7 @@ public interface Game extends MageItem, Serializable { public void applyEffects(); public boolean checkStateAndTriggered(); public void playPriority(UUID activePlayerId); + public boolean endTurn(UUID playerId); //game transaction methods public void saveState(); diff --git a/Mage/src/mage/game/GameImpl.java b/Mage/src/mage/game/GameImpl.java index 1af4d574127..0ff9ec3da51 100644 --- a/Mage/src/mage/game/GameImpl.java +++ b/Mage/src/mage/game/GameImpl.java @@ -1172,6 +1172,15 @@ public abstract class GameImpl> implements Game, Serializa } } + @Override + public boolean endTurn(UUID playerId) { + if (!getActivePlayerId().equals(playerId)) { + return false; + } + getTurn().endTurn(this, getActivePlayerId()); + return true; + } + @Override public Date getStartTime() { return startTime; diff --git a/Mage/src/mage/game/turn/Turn.java b/Mage/src/mage/game/turn/Turn.java index 212e973df3f..5135d267c97 100644 --- a/Mage/src/mage/game/turn/Turn.java +++ b/Mage/src/mage/game/turn/Turn.java @@ -35,6 +35,7 @@ import java.util.UUID; import mage.Constants.PhaseStep; import mage.Constants.TurnPhase; import mage.game.Game; +import mage.players.Player; /** * @@ -124,6 +125,8 @@ public class Turn implements Serializable { playExtraPhases(game, phase.getType()); } } + if (!currentPhase.equals(phase)) // phase was changed from the card + break; } //20091005 - 500.7 playExtraTurns(game); @@ -173,6 +176,30 @@ public class Turn implements Serializable { } } + public void endTurn(Game game, UUID activePlayerId) { + // Exile all spells and abilities on the stack + game.getStack().clear(); + + // Discard down to your maximum hand size. + Player activePlayer = game.getPlayer(activePlayerId); + game.getState().setPriorityPlayerId(activePlayer.getId()); + //20091005 - 514.1 + if (!activePlayer.hasLeft() && !activePlayer.hasLost()) { + activePlayer.discardToMax(game); + activePlayer.setGameUnderYourControl(true); + } + + // Damage wears off. + //20100423 - 514.2 + game.getBattlefield().endOfTurn(activePlayerId, game); + game.getState().removeEotEffects(game); + + Phase phase = new EndPhase(); + phase.setStep(new CleanupStep()); + currentPhase = phase; + //phase.play(game, activePlayerId); + } + public Turn copy() { return new Turn(this); } diff --git a/Mage/src/mage/players/PlayerImpl.java b/Mage/src/mage/players/PlayerImpl.java index 2c8fbcc1319..1b76d47cc08 100644 --- a/Mage/src/mage/players/PlayerImpl.java +++ b/Mage/src/mage/players/PlayerImpl.java @@ -440,20 +440,8 @@ public abstract class PlayerImpl> implements Player, Ser if (card != null) { if (!game.replaceEvent(GameEvent.getEvent(GameEvent.EventType.CAST_SPELL, ability.getId(), ability.getSourceId(), playerId))) { int bookmark = game.bookmarkState(); - card.cast(game, game.getZone(card.getId()), ability, playerId); - Zone zone = game.getZone(card.getId()); - switch (zone) { - case HAND: - removeFromHand(card, game); - break; - case LIBRARY: - removeFromLibrary(card, game); - break; - case GRAVEYARD: - removeFromGraveyard(card, game); - break; - } + card.cast(game, game.getZone(card.getId()), ability, playerId); Ability spellAbility = game.getStack().getSpell(ability.getId()).getSpellAbility(); if (spellAbility.activate(game, noMana)) {