package magic.model.trigger;
import magic.model.MagicCounterType;
import magic.model.MagicGame;
import magic.model.MagicPermanent;
import magic.model.MagicPlayer;
import magic.model.action.ChangeCountersAction;
import magic.model.action.SacrificeAction;
import magic.model.event.MagicEvent;
import magic.model.event.MagicEventAction;
public class FadeVanishCounterTrigger extends AtUpkeepTrigger {
private final MagicCounterType counterType;
public static final FadeVanishCounterTrigger Fade = new FadeVanishCounterTrigger(MagicCounterType.Fade);
public static final FadeVanishCounterTrigger Time = new FadeVanishCounterTrigger(MagicCounterType.Time);
private FadeVanishCounterTrigger(final MagicCounterType counterType) {
this.counterType = counterType;
}
@Override
public boolean accept(final MagicPermanent permanent, final MagicPlayer upkeepPlayer) {
return permanent.isController(upkeepPlayer);
}
@Override
public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent, final MagicPlayer upkeepPlayer) {
boolean sacrifice = false;
final int amount = permanent.getCounters(counterType);
if (counterType == MagicCounterType.Fade) {
sacrifice = amount == 0;
return sacrifice ?
new MagicEvent(
permanent,
SAC_PERM,
"PN sacrifices SN."
):
new MagicEvent(
permanent,
REMOVE_FADE_COUNTER,
"PN removes a fade counter from SN."
);
} else if (counterType == MagicCounterType.Time){
sacrifice = amount == 1;
return sacrifice ?
new MagicEvent(
permanent,
REMOVE_AND_SAC,
"PN removes a time counter from SN. PN sacrifices SN."
):
new MagicEvent(
permanent,
REMOVE_TIME_COUNTER,
"PN removes a time counter from SN."
);
}
return MagicEvent.NONE;
}
private static final MagicEventAction SAC_PERM = (final MagicGame game, final MagicEvent event) ->
game.doAction(new SacrificeAction(event.getPermanent()));
private static final MagicEventAction REMOVE_TIME_COUNTER = (final MagicGame game, final MagicEvent event) ->
game.doAction(new ChangeCountersAction(
event.getPermanent(),
MagicCounterType.Time,
-1
));
private static final MagicEventAction REMOVE_AND_SAC = (final MagicGame game, final MagicEvent event) -> {
game.doAction(new ChangeCountersAction(
event.getPermanent(),
MagicCounterType.Time,
-1
));
game.doAction(new SacrificeAction(event.getPermanent()));
};
private static final MagicEventAction REMOVE_FADE_COUNTER = (final MagicGame game, final MagicEvent event) ->
game.doAction(new ChangeCountersAction(
event.getPermanent(),
MagicCounterType.Fade,
-1
));
}