package magic.model.event; import java.util.Arrays; import magic.model.MagicCard; import magic.model.MagicGame; import magic.model.MagicLocationType; import magic.model.MagicManaCost; import magic.model.MagicPermanent; import magic.model.MagicSource; import magic.model.MagicSubType; import magic.model.MagicType; import magic.model.action.MagicPlayMod; import magic.model.action.PlayCardFromStackAction; import magic.model.action.PutItemOnStackAction; import magic.model.action.RemoveCardAction; import magic.model.choice.MagicTargetChoice; import magic.model.condition.MagicCondition; import magic.model.stack.MagicCardOnStack; import magic.model.target.MagicPumpTargetPicker; public class MagicBestowActivation extends MagicHandCastActivation { final MagicManaCost cost; final public static MagicPlayAuraEvent BestowEvent = new MagicPlayAuraEvent( MagicTargetChoice.POS_TARGET_CREATURE, MagicTargetChoice.POS_CREATURE, MagicPumpTargetPicker.create() ) { @Override public void executeEvent(final MagicGame game, final MagicEvent event) { final boolean valid = event.processTargetPermanent(game, (final MagicPermanent creature) -> game.doAction(new PlayCardFromStackAction( event.getCardOnStack(), creature, MagicPlayMod.BESTOWED )) ); if (!valid) { game.doAction(new PlayCardFromStackAction(event.getCardOnStack())); } } }; public MagicBestowActivation(final MagicManaCost aCost) { super( new MagicCondition[]{MagicCondition.CARD_CONDITION}, new MagicActivationHints(MagicTiming.Aura, true), "Bestow" ); cost = aCost; } @Override public Iterable<? extends MagicEvent> getCostEvent(final MagicCard source) { return Arrays.asList(MagicPayManaCostEvent.Cast(source, cost)); } @Override public MagicEvent getEvent(final MagicSource source) { return new MagicEvent( source, EVENT_ACTION, "Play SN." ); } private final MagicEventAction EVENT_ACTION = (final MagicGame game, final MagicEvent event) -> { final MagicCard card = event.getCard(); game.doAction(new RemoveCardAction(card,MagicLocationType.OwnersHand)); final MagicCardOnStack cardOnStack=new MagicCardOnStack( card, BestowEvent, game.getPayedCost() ) { @Override public boolean hasType(final MagicType type) { if (type == MagicType.Creature) { return false; } else { return super.hasType(type); } } @Override public boolean hasSubType(final MagicSubType subType) { if (subType == MagicSubType.Aura) { return true; } else if (MagicSubType.ALL_CREATURES.contains(subType)) { return false; } else { return super.hasSubType(subType); } } }; game.doAction(new PutItemOnStackAction(cardOnStack)); }; }