package magic.model.action;
import magic.model.MagicCard;
import magic.model.MagicGame;
import magic.model.MagicLocationType;
import magic.model.MagicPlayer;
import magic.model.event.MagicEvent;
import magic.model.event.MagicPutCardOnStackEvent;
public class CastCardAction extends MagicAction {
private final MagicPlayer player;
private final MagicCard card;
private final boolean withoutManaCost;
private final MagicLocationType from;
private final MagicLocationType to;
public CastCardAction(final MagicPlayer aPlayer, final MagicCard aCard, final MagicLocationType aFrom, final MagicLocationType aTo) {
this(aPlayer, aCard, false, aFrom, aTo);
}
public static CastCardAction WithoutManaCost(final MagicPlayer aPlayer, final MagicCard aCard, final MagicLocationType aFrom, final MagicLocationType aTo) {
return new CastCardAction(aPlayer, aCard, true, aFrom, aTo);
}
private CastCardAction(final MagicPlayer aPlayer, final MagicCard aCard, final boolean aWithoutManaCost, final MagicLocationType aFrom, final MagicLocationType aTo) {
player = aPlayer;
card = aCard;
withoutManaCost = aWithoutManaCost;
from = aFrom;
to = aTo;
}
@Override
public void doAction(final MagicGame game) {
for (final MagicEvent event : card.getAdditionalCostEvent()) {
if (event.isSatisfied() == false) {
game.logAppendMessage(player, "Casting failed as " + player + " is unable to pay additional casting costs.");
return;
}
}
for (final MagicEvent event : withoutManaCost ? card.getAdditionalCostEvent() : card.getCostEvent()) {
game.addEvent(event);
}
game.addEvent(new MagicPutCardOnStackEvent(card, player, from, to));
}
@Override
public void undoAction(final MagicGame game) {}
@Override
public String toString() {
return getClass().getSimpleName()+" (" +player + ',' + card +')';
}
}