package magic.model.trigger;
import magic.data.CardDefinitions;
import magic.model.MagicCard;
import magic.model.MagicCardDefinition;
import magic.model.MagicCounterType;
import magic.model.MagicDamage;
import magic.model.MagicGame;
import magic.model.MagicLocationType;
import magic.model.MagicPermanent;
import magic.model.MagicPermanentState;
import magic.model.action.BecomeMonarchAction;
import magic.model.action.CastCardAction;
import magic.model.action.ChangeCountersAction;
import magic.model.action.ChangeStateAction;
import magic.model.choice.MagicMayChoice;
import magic.model.event.MagicEvent;
import magic.model.event.MagicSourceEvent;
import magic.model.target.MagicTarget;
import magic.model.target.MagicTargetFilter;
import magic.model.target.MagicTargetType;
public abstract class DamageIsDealtTrigger extends MagicTrigger<MagicDamage> {
public DamageIsDealtTrigger(final int priority) {
super(priority);
}
public DamageIsDealtTrigger() {
}
public boolean accept(final MagicPermanent permanent, final MagicDamage damage) {
return damage.getDealtAmount() > 0;
}
public MagicTriggerType getType() {
return MagicTriggerType.WhenDamageIsDealt;
}
public static DamageIsDealtTrigger DamageToTarget(final MagicTargetFilter<MagicPermanent> filter, final MagicTargetFilter<MagicTarget> tfilter, final MagicSourceEvent sourceEvent, final boolean isCombat) {
return new DamageIsDealtTrigger() {
@Override
public boolean accept(final MagicPermanent permanent, final MagicDamage damage) {
return super.accept(permanent, damage) &&
damage.getSource().isPermanent() &&
filter.accept(permanent, permanent.getController(), damage.getSourcePermanent()) &&
((damage.isTargetPlayer() && tfilter.acceptType(MagicTargetType.Player)) ||
(damage.isTargetCreature() && tfilter.acceptType(MagicTargetType.Permanent))) &&
tfilter.accept(permanent, permanent.getController(), damage.getTarget()) &&
(isCombat == false || damage.isCombat());
}
@Override
public MagicEvent executeTrigger(final MagicGame game, final MagicPermanent permanent, final MagicDamage damage) {
return sourceEvent.getTriggerEvent(permanent, damage.getTarget());
}
};
}
public static DamageIsDealtTrigger DamageToYou(final MagicTargetFilter<MagicPermanent> filter, final MagicSourceEvent sourceEvent, final boolean isCombat) {
return new DamageIsDealtTrigger() {
@Override
public boolean accept(final MagicPermanent permanent, final MagicDamage damage) {
return super.accept(permanent, damage) &&
damage.getSource().isPermanent() &&
filter.accept(permanent, permanent.getController(), damage.getSourcePermanent()) &&
permanent.isController(damage.getTarget()) &&
(isCombat == false || damage.isCombat());
}
@Override
public MagicEvent executeTrigger(final MagicGame game, final MagicPermanent permanent, final MagicDamage damage) {
return sourceEvent.getTriggerEvent(permanent, damage.getSourcePermanent());
}
};
}
public static DamageIsDealtTrigger DamageToAny(final MagicTargetFilter<MagicPermanent> filter, final MagicSourceEvent sourceEvent, final boolean isCombat) {
return new DamageIsDealtTrigger() {
@Override
public boolean accept(final MagicPermanent permanent, final MagicDamage damage) {
return super.accept(permanent, damage) &&
damage.getSource().isPermanent() &&
filter.accept(permanent, permanent.getController(), damage.getSourcePermanent()) &&
(isCombat == false || damage.isCombat());
}
@Override
public MagicEvent executeTrigger(final MagicGame game, final MagicPermanent permanent, final MagicDamage damage) {
return sourceEvent.getTriggerEvent(permanent, damage.getSourcePermanent());
}
};
}
public static DamageIsDealtTrigger DealtDamage(final MagicTargetFilter<MagicPermanent> filter, final MagicSourceEvent sourceEvent, final boolean isCombat) {
return new DamageIsDealtTrigger() {
@Override
public boolean accept(final MagicPermanent permanent, final MagicDamage damage) {
return super.accept(permanent, damage) &&
damage.isTargetCreature() &&
filter.accept(permanent, permanent.getController(), damage.getTargetPermanent()) &&
(isCombat == false || damage.isCombat());
}
@Override
public MagicEvent executeTrigger(final MagicGame game, final MagicPermanent permanent, final MagicDamage damage) {
return sourceEvent.getTriggerEvent(permanent, damage.getTargetPermanent());
}
};
}
public static DamageIsDealtTrigger Cipher(final MagicCardDefinition cardDef) {
return new DamageIsDealtTrigger() {
@Override
public boolean accept(final MagicPermanent permanent, final MagicDamage damage) {
return super.accept(permanent, damage) && damage.isSource(permanent) && damage.isCombat() && damage.isTargetPlayer();
}
@Override
public MagicEvent executeTrigger(final MagicGame game, final MagicPermanent permanent, final MagicDamage damage) {
return new MagicEvent(
permanent,
new MagicMayChoice(),
this,
"PN may$ cast " + cardDef + " without paying its mana cost"
);
}
@Override
public void executeEvent(final MagicGame game, final MagicEvent event) {
if (event.isYes()) {
game.doAction(CastCardAction.WithoutManaCost(
event.getPlayer(),
MagicCard.createTokenCard(cardDef, event.getPlayer()),
MagicLocationType.Exile,
MagicLocationType.Graveyard
));
}
}
};
}
public static DamageIsDealtTrigger Poisonous(final int n) {
return new DamageIsDealtTrigger() {
@Override
public boolean accept(final MagicPermanent permanent, final MagicDamage damage) {
return super.accept(permanent, damage) && damage.isSource(permanent) && damage.isCombat() && damage.isTargetPlayer();
}
@Override
public MagicEvent executeTrigger(final MagicGame game, final MagicPermanent permanent, final MagicDamage damage) {
return new MagicEvent(
permanent,
damage.getTarget(),
this,
n == 1 ?
"RN gets a poison counter." :
"RN gets " + n + " poison counters."
);
}
@Override
public void executeEvent(final MagicGame game, final MagicEvent event) {
game.doAction(new ChangeCountersAction(event.getRefPlayer(), MagicCounterType.Poison, n));
}
};
}
public static DamageIsDealtTrigger Renown(final int n) {
return new DamageIsDealtTrigger() {
@Override
public boolean accept(final MagicPermanent permanent, final MagicDamage damage) {
return super.accept(permanent, damage) &&
damage.isSource(permanent) &&
damage.isCombat() &&
damage.isTargetPlayer() &&
permanent.hasState(MagicPermanentState.Renowned) == false;
}
@Override
public MagicEvent executeTrigger(final MagicGame game, final MagicPermanent permanent, final MagicDamage damage) {
return new MagicEvent(
permanent,
this,
n == 1 ?
"PN puts a +1/+1 counter on SN. SN becomes Renowned" :
"PN puts " + n + " +1/+1 counters on SN. SN becomes Renowned"
);
}
@Override
public void executeEvent(final MagicGame game, final MagicEvent event) {
game.doAction(new ChangeCountersAction(event.getPermanent(), MagicCounterType.PlusOne, n));
game.doAction(ChangeStateAction.Set(event.getPermanent(), MagicPermanentState.Renowned));
}
};
}
public static DamageIsDealtTrigger Monarch = new DamageIsDealtTrigger() {
@Override
public boolean accept(final MagicPermanent permanent, final MagicDamage damage) {
return super.accept(permanent, damage) &&
damage.getSource().isCreaturePermanent() &&
damage.isCombat() &&
damage.isTargetPlayer() &&
damage.getTargetPlayer().isMonarch();
}
@Override
public MagicEvent executeTrigger(final MagicGame game, final MagicPermanent permanent, final MagicDamage damage) {
return new MagicEvent(
game.createDelayedSource(CardDefinitions.getCard("The Monarch"), damage.getTargetPlayer()),
damage.getTargetPlayer(),
damage.getSource().getController(),
this,
"RN becomes the monarch."
);
}
@Override
public void executeEvent(final MagicGame game, final MagicEvent event) {
game.doAction(new BecomeMonarchAction(event.getRefPlayer()));
}
};
}