package magic.model.trigger;
import magic.model.MagicCard;
import magic.model.MagicGame;
import magic.model.MagicPermanent;
import magic.model.MagicPlayer;
import magic.model.MagicSource;
import magic.model.MagicSubType;
import magic.model.action.LookAction;
import magic.model.action.LoseGameAction;
import magic.model.action.RemoveTriggerAction;
import magic.model.action.RevealAction;
import magic.model.choice.MagicMayChoice;
import magic.model.event.MagicEvent;
import magic.model.event.MagicEventAction;
import magic.model.event.MagicPayManaCostEvent;
import magic.model.event.MagicSourceEvent;
public abstract class AtYourUpkeepTrigger extends AtUpkeepTrigger {
public AtYourUpkeepTrigger(final int priority) {
super(priority);
}
public AtYourUpkeepTrigger() {}
@Override
public boolean accept(final MagicPermanent permanent, final MagicPlayer upkeepPlayer) {
return permanent.isController(upkeepPlayer);
}
public static AtYourUpkeepTrigger create(final MagicSourceEvent sourceEvent) {
return new AtYourUpkeepTrigger() {
@Override
public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent, final MagicPlayer upkeepPlayer) {
return sourceEvent.getTriggerEvent(permanent);
}
};
}
public static AtYourUpkeepTrigger kinship(final String effect, final MagicEventAction action) {
return new AtYourUpkeepTrigger() {
final MagicEventAction EVENT_ACTION = (final MagicGame game, final MagicEvent event) -> {
if (event.isYes()) {
game.doAction(new RevealAction(event.getRefCard()));
action.executeEvent(game, event);
}
};
@Override
public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent,final MagicPlayer upkeepPlayer) {
return new MagicEvent(
permanent,
this,
"PN looks at the top card of his or her library. If it shares a creature type with SN, PN may reveal it. " +
"If PN does, " + effect
);
}
@Override
public void executeEvent(final MagicGame game, final MagicEvent event) {
for (final MagicCard card : event.getPlayer().getLibrary().getCardsFromTop(1)) {
game.doAction(new LookAction(card, event.getPlayer(), "top card of your library"));
for (final MagicSubType st : MagicSubType.ALL_CREATURES) {
if (card.hasSubType(st) && event.getPermanent().hasSubType(st)) {
game.addEvent(new MagicEvent(
event.getSource(),
new MagicMayChoice("Reveal the top card of your library?"),
card,
EVENT_ACTION,
""
));
break;
}
}
}
}
};
}
public static final AtYourUpkeepTrigger PayOrLose(final MagicSource staleSource, final MagicPlayer stalePlayer, final String manaCost) {
return new AtYourUpkeepTrigger() {
@Override
public boolean accept(final MagicPermanent permanent, final MagicPlayer upkeepPlayer) {
return upkeepPlayer.getId() == stalePlayer.getId();
}
@Override
public MagicEvent executeTrigger(final MagicGame game, final MagicPermanent permanent, final MagicPlayer upkeepPlayer) {
game.addDelayedAction(new RemoveTriggerAction(this));
return new MagicEvent(
game.createDelayedSource(staleSource, stalePlayer),
new MagicMayChoice("Pay " + manaCost + "?"),
this,
"PN pays " + manaCost + ". If PN doesn't he or she loses the game."
);
}
@Override
public void executeEvent(final MagicGame game, final MagicEvent event) {
final MagicEvent cost = new MagicPayManaCostEvent(event.getSource(), manaCost);
if (event.isYes() && cost.isSatisfied()) {
game.addEvent(cost);
} else {
game.doAction(new LoseGameAction(event.getPlayer()));
}
}
};
}
}