package magic.model.trigger; import magic.data.CardDefinitions; import magic.model.MagicCardDefinition; import magic.model.MagicCounterType; import magic.model.MagicGame; import magic.model.MagicMessage; import magic.model.MagicPayedCost; import magic.model.MagicPermanent; import magic.model.MagicPlayer; import magic.model.MagicPermanentState; import magic.model.action.ChangeCountersAction; import magic.model.action.ChangeStateAction; import magic.model.action.PlayTokensAction; import magic.model.action.SacrificeAction; import magic.model.action.MagicPlayerAction; import magic.model.choice.MagicMayChoice; import magic.model.choice.MagicTargetChoice; import magic.model.event.MagicEvent; import magic.model.event.MagicEventAction; import magic.model.event.MagicSacrificePermanentEvent; import magic.model.event.MagicSourceEvent; public abstract class EntersBattlefieldTrigger extends MagicTrigger<MagicPayedCost> { public static EntersBattlefieldTrigger create(final MagicSourceEvent sourceEvent) { return new EntersBattlefieldTrigger() { @Override public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent, final MagicPayedCost payedCost) { return sourceEvent.getTriggerEvent(permanent, payedCost); } }; } public static final EntersBattlefieldTrigger createKicked(final MagicSourceEvent sourceEvent) { return new EntersBattlefieldTrigger() { @Override public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent, final MagicPayedCost payedCost) { return sourceEvent.getTriggerEvent(permanent, payedCost); } @Override public boolean accept(final MagicPermanent permanent, final MagicPayedCost payedCost) { return payedCost.isKicked(); } }; } public EntersBattlefieldTrigger(final int priority) { super(priority); } public EntersBattlefieldTrigger() {} public MagicTriggerType getType() { return MagicTriggerType.WhenComesIntoPlay; } @Override public void change(final MagicCardDefinition cdef) { cdef.addTrigger(this); } public static final EntersBattlefieldTrigger ChooseOpponent = new EntersBattlefieldTrigger(MagicTrigger.REPLACEMENT) { @Override public MagicEvent executeTrigger(final MagicGame game, final MagicPermanent permanent, final MagicPayedCost payedCost) { permanent.setChosenPlayer(permanent.getOpponent()); return MagicEvent.NONE; } }; public static final EntersBattlefieldTrigger ChoosePlayer = new EntersBattlefieldTrigger(MagicTrigger.REPLACEMENT) { @Override public MagicEvent executeTrigger(MagicGame game, MagicPermanent permanent, MagicPayedCost data) { return new MagicEvent( permanent, MagicTargetChoice.Negative("a player"), this, "PN chooses a player$." ); } @Override public void executeEvent(final MagicGame game, final MagicEvent event) { event.processTargetPlayer(game, new MagicPlayerAction() { @Override public void doAction(final MagicPlayer player) { event.getPermanent().setChosenPlayer(player); } }); } }; public static final EntersBattlefieldTrigger Evoke = new EntersBattlefieldTrigger() { @Override public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent,final MagicPayedCost payedCost) { return payedCost.isKicked() ? new MagicEvent( permanent, this, "Sacrifice SN." ): MagicEvent.NONE; } @Override public void executeEvent(final MagicGame game, final MagicEvent event) { game.doAction(new SacrificeAction(event.getPermanent())); } }; public static final EntersBattlefieldTrigger Exploit = new EntersBattlefieldTrigger() { private final MagicEventAction EVENT_ACTION = (final MagicGame game, final MagicEvent event) -> event.processTargetPermanent(game, (final MagicPermanent permanent) -> { game.doAction(ChangeStateAction.Set(event.getPermanent(), MagicPermanentState.Exploit)); game.doAction(new SacrificeAction(permanent)); }); @Override public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent,final MagicPayedCost payedCost) { return new MagicEvent( permanent, new MagicMayChoice("Sacrifice a creature?"), this, "PN may$ sacrifice a creature." ); } @Override public void executeEvent(final MagicGame game, final MagicEvent event) { final MagicEvent sac = new MagicSacrificePermanentEvent( event.getSource(), event.getPlayer(), MagicTargetChoice.A_CREATURE_YOU_CONTROL, EVENT_ACTION ); if (event.isYes() && sac.isSatisfied()) { game.addEvent(sac); } } }; public static final EntersBattlefieldTrigger Fabricate(final int n) { return new EntersBattlefieldTrigger() { private final MagicEventAction EVENT_ACTION = (final MagicGame game, final MagicEvent event) -> { if (event.isYes()) { game.doAction(new ChangeCountersAction( event.getPermanent(), MagicCounterType.PlusOne, event.getRefInt() )); game.logAppendMessage( event.getPlayer(), event.getPlayer() + " puts " + event.getRefInt() + " +1/+1 counters on " + event.getPermanent() + "." ); } else { game.doAction(new PlayTokensAction( event.getPlayer(), CardDefinitions.getToken("1/1 colorless Servo artifact creature token"), event.getRefInt() )); } }; @Override public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent,final MagicPayedCost payedCost) { return new MagicEvent( permanent, n, this, "Fabriate RN." ); } @Override public void executeEvent(final MagicGame game, final MagicEvent event) { if (event.getPermanent().isValid()) { game.addEvent(new MagicEvent( event.getSource(), event.getPlayer(), new MagicMayChoice( MagicMessage.replaceName( "Put RN +1/+1 counters on SN? If you don’t, create RN Servo tokens.", event.getSource(), event.getPlayer(), event.getRefInt() ) ), event.getRefInt(), EVENT_ACTION, "You may$ put RN +1/+1 counters on SN. If you don’t, create RN 1/1 colorless Servo artifact creature tokens." )); } else { game.doAction(new PlayTokensAction( event.getPlayer(), CardDefinitions.getToken("1/1 colorless Servo artifact creature token"), event.getRefInt() )); } } }; } }