package magic.model.event;
import java.util.Arrays;
import magic.model.MagicCard;
import magic.model.MagicGame;
import magic.model.MagicPayedCost;
import magic.model.MagicPermanent;
import magic.model.MagicSource;
import magic.model.action.PutItemOnStackAction;
import magic.model.stack.MagicAbilityOnStack;
import magic.model.trigger.MagicTrigger;
import magic.model.trigger.MagicTriggerType;
public class MagicCyclingActivation extends MagicCardAbilityActivation {
final MagicMatchedCostEvent matchedCost;
protected MagicCyclingActivation(final MagicMatchedCostEvent aMatchedCost, final String name) {
super(
new MagicActivationHints(MagicTiming.Main,true),
name
);
matchedCost = aMatchedCost;
}
public MagicCyclingActivation(final MagicMatchedCostEvent aMatchedCost) {
this(aMatchedCost, "Cycle");
}
@Override
public Iterable<? extends MagicEvent> getCostEvent(final MagicCard source) {
return Arrays.asList(
matchedCost.getEvent(source),
new MagicDiscardSelfEvent(source)
);
}
@Override
public MagicEvent getCardEvent(final MagicCard card, final MagicPayedCost payedCost) {
return new MagicDrawEvent(card, card.getController(), 1);
}
@Override
public MagicEvent getEvent(final MagicSource source) {
return new MagicEvent(
source,
(final MagicGame game, final MagicEvent event) -> {
final MagicCard card = event.getCard();
final MagicAbilityOnStack abilityOnStack = new MagicAbilityOnStack(
MagicCyclingActivation.this,
getCardEvent(card, game.getPayedCost())
);
game.doAction(new PutItemOnStackAction(abilityOnStack));
game.executeTrigger(MagicTriggerType.WhenOtherCycle, card);
for (final MagicTrigger<MagicCard> trigger : card.getCardDefinition().getCycleTriggers()) {
game.executeTrigger(
trigger,
MagicPermanent.NONE,
card,
card
);
}
},
name + " SN."
);
}
}