package magic.model.phase;
import magic.model.MagicGame;
import magic.model.MagicPlayer;
import magic.model.MagicSource;
import magic.model.action.ChangeExtraTurnsAction;
import magic.model.action.CleanupPlayerAction;
import magic.model.action.CleanupTurnStaticsAction;
import magic.model.action.CleanupTurnTriggersAction;
import magic.model.action.PayDelayedCostsAction;
import magic.model.event.MagicDiscardEvent;
public class MagicCleanupPhase extends MagicPhase {
private static final MagicPhase INSTANCE=new MagicCleanupPhase();
private MagicCleanupPhase() {
super(MagicPhaseType.Cleanup);
}
public static MagicPhase getInstance() {
return INSTANCE;
}
private static void cleanup(final MagicGame game) {
final MagicPlayer turnPlayer=game.getTurnPlayer();
// discard excess cards
if (turnPlayer.getNumExcessCards() > 0) {
final int amount = turnPlayer.getNumExcessCards();
game.addEvent(new MagicDiscardEvent(MagicSource.NONE,turnPlayer,amount));
}
// remove until EOT triggers/static, clean up player and permanents
game.doAction(new CleanupTurnTriggersAction());
for (final MagicPlayer player : game.getPlayers()) {
game.doAction(new CleanupPlayerAction(player));
}
game.doAction(new CleanupTurnStaticsAction());
game.update();
game.checkStatePutTriggers();
}
private static void nextTurn(final MagicGame game) {
final MagicPlayer turnPlayer=game.getTurnPlayer();
if (!turnPlayer.getBuilderCost().isEmpty()) {
game.doAction(new PayDelayedCostsAction(turnPlayer));
}
if (turnPlayer.getExtraTurns()>0) {
game.doAction(new ChangeExtraTurnsAction(turnPlayer,-1));
final String playerName = turnPlayer.getName();
game.logMessage(turnPlayer,playerName + " takes an extra turn.");
} else {
game.setTurnPlayer(turnPlayer.getOpponent());
}
game.setTurn(game.getTurn()+1);
game.resetLandsPlayed();
game.resetMaxLands();
game.setCreatureDiedThisTurn(false);
game.clearSkipTurnTill();
for (final MagicPlayer player : game.getPlayers()) {
player.setSpellsCastLastTurn(player.getSpellsCast());
player.setSpellsCast(0);
player.setNonCreatureSpellsCast(0);
}
}
@Override
public void executeBeginStep(final MagicGame game) {
cleanup(game);
if (game.getStack().isEmpty()) {
game.setStep(MagicStep.NextPhase);
} else {
game.setStep(MagicStep.ActivePlayer);
}
}
@Override
public void executeEndOfPhase(final MagicGame game) {
nextTurn(game);
}
}