package magic.model.trigger;
import magic.model.MagicCard;
import magic.model.MagicCardDefinition;
import magic.model.MagicCardList;
import magic.model.MagicGame;
import magic.model.MagicLocationType;
import magic.model.MagicPermanent;
import magic.model.MagicPlayer;
import magic.model.action.MoveCardAction;
import magic.model.action.ShuffleCardsIntoLibraryAction;
import magic.model.action.PlayCardAction;
import magic.model.action.RevealAction;
import magic.model.event.MagicEvent;
public abstract class ThisPutIntoGraveyardTrigger extends MagicTrigger<MoveCardAction> {
public ThisPutIntoGraveyardTrigger(final int priority) {
super(priority);
}
public ThisPutIntoGraveyardTrigger() {}
@Override
public MagicTriggerType getType() {
return MagicTriggerType.WhenPutIntoGraveyard;
}
@Override
public boolean accept(final MagicPermanent permanent, final MoveCardAction act) {
return act.to(MagicLocationType.Graveyard);
}
@Override
public void change(final MagicCardDefinition cdef) {
cdef.addTrigger(this);
}
public static final ThisPutIntoGraveyardTrigger LibraryInsteadOfGraveyard = new ThisPutIntoGraveyardTrigger(MagicTrigger.REPLACEMENT) {
@Override
public MagicEvent executeTrigger(final MagicGame game, final MagicPermanent permanent, final MoveCardAction act) {
game.doAction(new RevealAction(act.card));
act.setToLocation(MagicLocationType.OwnersLibrary);
return MagicEvent.NONE;
}
};
public static final ThisPutIntoGraveyardTrigger OpponentDiscardOntoBattlefield = new ThisPutIntoGraveyardTrigger(MagicTrigger.REPLACEMENT) {
@Override
public MagicEvent executeTrigger(final MagicGame game, final MagicPermanent permanent, final MoveCardAction act) {
final MagicCard card = act.card;
if (card.isEnemy(game.getActiveSource()) &&
act.from(MagicLocationType.OwnersHand) &&
act.to(MagicLocationType.Graveyard)) {
act.setToLocation(MagicLocationType.Battlefield);
game.doAction(new PlayCardAction(card));
}
return MagicEvent.NONE;
}
};
public static final ThisPutIntoGraveyardTrigger RecoverGraveyard = new ThisPutIntoGraveyardTrigger() {
@Override
public MagicEvent executeTrigger(final MagicGame game, final MagicPermanent permanent, final MoveCardAction act) {
final MagicPlayer owner = act.card.getOwner();
return new MagicEvent(
//source may be permanent if on battlefield or card (exile, hand)
permanent.isValid() ? permanent : act.card,
owner,
this,
"PN shuffles his or her graveyard into his or her library."
);
}
@Override
public void executeEvent(final MagicGame game, final MagicEvent event) {
final MagicPlayer player = event.getPlayer();
final MagicCardList graveyard = new MagicCardList(player.getGraveyard());
game.doAction(new ShuffleCardsIntoLibraryAction(graveyard, MagicLocationType.Graveyard));
}
};
}