package magic.model.trigger; import magic.model.MagicGame; import magic.model.MagicPayedCost; import magic.model.MagicPermanent; import magic.model.MagicPlayer; import magic.model.MagicSource; import magic.model.MagicSubType; import magic.model.action.ExileLinkAction; import magic.model.action.SacrificeAction; import magic.model.choice.MagicMayChoice; import magic.model.choice.MagicTargetChoice; import magic.model.event.MagicEvent; import magic.model.target.MagicExileTargetPicker; import magic.model.target.MagicOtherPermanentTargetFilter; import magic.model.target.MagicPermanentFilterImpl; import magic.model.target.MagicTargetFilter; import magic.model.target.MagicTargetFilterFactory; import magic.model.target.MagicTargetHint; public class ChampionTrigger extends EntersBattlefieldTrigger { private final MagicSubType[] subtypes; private final String targets; public ChampionTrigger(final String targets) { this.targets = targets; if ("creature".equalsIgnoreCase(targets)) { subtypes = new MagicSubType[0]; } else { final String[] tokens = targets.split(" or "); subtypes = new MagicSubType[tokens.length]; for (int i = 0; i < tokens.length; i++) { subtypes[i] = MagicSubType.getSubType(tokens[i]); } } } @Override public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent, final MagicPayedCost payedCost) { final MagicTargetFilter<MagicPermanent> targetFilter = subtypes.length == 0 ? MagicTargetFilterFactory.CREATURE_YOU_CONTROL : new MagicPermanentFilterImpl() { public boolean accept(final MagicSource source,final MagicPlayer player,final MagicPermanent tribal) { boolean hasSubType = false; for (final MagicSubType subtype : subtypes) { hasSubType |= tribal.hasSubType(subtype); } return hasSubType && tribal.isController(player); } }; final MagicTargetChoice targetChoice = new MagicTargetChoice( new MagicOtherPermanentTargetFilter(targetFilter, permanent), MagicTargetHint.None, "another " + targets + " to exile" ); return new MagicEvent( permanent, new MagicMayChoice( targetChoice ), MagicExileTargetPicker.create(), this, "You may$ exile another " + targets + " you control$. " + "If you don't, sacrifice SN."); } @Override public void executeEvent(final MagicGame game, final MagicEvent event) { final MagicPermanent permanent = event.getPermanent(); if (event.isYes()) { event.processTargetPermanent(game, (final MagicPermanent creature) -> { final ExileLinkAction act = new ExileLinkAction(permanent,creature); game.doAction(act); game.executeTrigger(MagicTriggerType.WhenChampioned, act); }); } else { game.doAction(new SacrificeAction(permanent)); } } }