package magic.model.trigger; import magic.model.MagicCard; import magic.model.MagicGame; import magic.model.MagicManaCost; import magic.model.MagicPermanent; import magic.model.MagicPlayer; import magic.model.MagicSource; import magic.model.MagicLocationType; import magic.model.choice.MagicMayChoice; import magic.model.choice.MagicPayManaCostChoice; import magic.model.event.MagicEvent; import magic.model.action.AIRevealAction; import magic.model.action.CastCardAction; import magic.model.action.EnqueueTriggerAction; public class MiracleTrigger extends ThisDrawnTrigger { private final MagicManaCost cost; public MiracleTrigger(final MagicManaCost cost) { this.cost = cost; } @Override public boolean usesStack() { return false; } @Override public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent none,final MagicCard card) { final MagicPlayer player = card.getOwner(); return player.getDrawnCards() == 1 ? new MagicEvent( player.isHuman() ? card : MagicSource.NONE, player, new MagicMayChoice( player.isHuman() ? "Reveal this card and cast it for its miracle cost?" : "...", new MagicPayManaCostChoice(game.modCost(card, cost)) ), card, this::executeEvent, "" ): MagicEvent.NONE; } @Override public void executeEvent(final MagicGame game, final MagicEvent event) { final MagicCard card = event.getRefCard(); if (event.isYes() && card.isInHand()) { game.doAction(new AIRevealAction(card)); game.doAction(new EnqueueTriggerAction(new MagicEvent( card, card.getOwner(), card, this::executeTriggerEvent, "PN reveals SN and casts it." ))); } } private void executeTriggerEvent(final MagicGame game, final MagicEvent event) { final MagicCard card = event.getRefCard(); if (card.isInHand()) { game.doAction(CastCardAction.WithoutManaCost( event.getPlayer(), card, MagicLocationType.OwnersHand, MagicLocationType.Graveyard )); } } }