def ST = new MagicStatic(MagicLayer.Type) { @Override public void modSubTypeFlags(final MagicPermanent permanent, final Set flags) { flags.add(MagicSubType.Illusion); } }; def SacWhenTargeted = new MagicWhenTargetedTrigger() { @Override public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent,final MagicItemOnStack target) { return target.containsInChoiceResults(permanent) ? new MagicEvent( permanent, this, "Sacrifice SN." ): MagicEvent.NONE; } @Override public void executeEvent(final MagicGame game, final MagicEvent event) { game.doAction(new MagicSacrificeAction(event.getPermanent())); } }; [ new MagicSpellCardEvent() { @Override public MagicEvent getEvent(final MagicCardOnStack cardOnStack,final MagicPayedCost payedCost) { return new MagicEvent( cardOnStack, new MagicMayChoice(MagicTargetChoice.CREATURE), MagicCopyTargetPicker.create(), this, "Put SN onto the battlefield. You may\$ have SN enter the battlefield as a copy of any creature\$ on the battlefield, " + "except it's an Illusion in addition to its other types and it gains \"When this creature becomes the target of a spell or ability, sacrifice it.\"" ); } @Override public void executeEvent(final MagicGame game, final MagicEvent event) { if (event.isYes()) { event.processTargetPermanent(game, { final MagicPermanent chosen -> final MagicPlayCardFromStackAction action = new MagicPlayCardFromStackAction( event.getCardOnStack(), chosen.getCardDefinition() ); game.doAction(action); final MagicPermanent perm = action.getPermanent(); game.doAction(new MagicAddStaticAction(perm, ST)); game.doAction(new MagicAddTriggerAction(perm, SacWhenTargeted)); } as MagicPermanentAction); } else { game.doAction(new MagicPlayCardFromStackAction( event.getCardOnStack() )); } } } ]