package magic.model.trigger;
import magic.model.MagicDamage;
import magic.model.MagicGame;
import magic.model.MagicPermanent;
import magic.model.MagicPlayer;
import magic.model.event.MagicEvent;
import magic.model.target.MagicTarget;
import magic.model.target.MagicTargetFilter;
import magic.model.target.MagicTargetType;
import magic.model.action.PreventDamageAction;
public abstract class PreventDamageTrigger extends IfDamageWouldBeDealtTrigger {
public PreventDamageTrigger() {
super(MagicTrigger.PREVENT_DAMAGE);
}
@Override
public boolean accept(final MagicPermanent permanent, final MagicDamage damage) {
return damage.getAmount() > 0 && damage.isUnpreventable() == false;
}
public static final PreventDamageTrigger GlobalPreventDamageToTarget = new PreventDamageTrigger() {
@Override
public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent,final MagicDamage damage) {
final MagicTarget target = damage.getTarget();
// Protection from source prevents all damage
if (target.isPermanent() && damage.getTargetPermanent().hasProtectionFrom(damage.getSource())) {
damage.prevent();
}
// Prevent x amount of damage
final int reduction = Math.min(damage.getAmount(), target.getPreventDamage());
if (reduction > 0) {
damage.setAmount(damage.getAmount() - reduction);
game.doAction(new PreventDamageAction(target, -reduction));
}
return MagicEvent.NONE;
}
};
public static final PreventDamageTrigger PreventCombatDamageDealtToDealtBy = new PreventDamageTrigger() {
@Override
public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent,final MagicDamage damage) {
if (damage.isCombat() && (damage.isTarget(permanent) || damage.isSource(permanent))) {
damage.prevent();
}
return MagicEvent.NONE;
}
};
public static final PreventDamageTrigger PreventCombatDamageDealtTo = new PreventDamageTrigger() {
@Override
public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent,final MagicDamage damage) {
if (damage.isCombat() && damage.isTarget(permanent)) {
damage.prevent();
}
return MagicEvent.NONE;
}
};
public static final PreventDamageTrigger PreventCombatDamageDealtBy = new PreventDamageTrigger() {
@Override
public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent,final MagicDamage damage) {
if (damage.isCombat() && damage.isSource(permanent)) {
damage.prevent();
}
return MagicEvent.NONE;
}
};
public static final PreventDamageTrigger PreventDamageDealtTo = new PreventDamageTrigger() {
@Override
public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent,final MagicDamage damage) {
if (damage.isTarget(permanent)) {
damage.prevent();
}
return MagicEvent.NONE;
}
};
public static final PreventDamageTrigger PreventDamageDealtBy = new PreventDamageTrigger() {
@Override
public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent,final MagicDamage damage) {
if (damage.isSource(permanent)) {
damage.prevent();
}
return MagicEvent.NONE;
}
};
public static final PreventDamageTrigger PreventCombatDamage = new PreventDamageTrigger() {
@Override
public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent,final MagicDamage damage) {
if (damage.isCombat()) {
damage.prevent();
}
return MagicEvent.NONE;
}
};
// prevent all damage that would be dealt to you or creatures you control this turn
public static final PreventDamageTrigger PreventDamageDealtToYouOrCreaturesYouControl(final MagicPlayer player) {
return new PreventDamageTrigger() {
@Override
public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent,final MagicDamage damage) {
if (damage.getTarget().getController().getId() == player.getId()) {
damage.prevent();
}
return MagicEvent.NONE;
}
};
}
// prevent all combat damage that would be dealt to you or creatures you control this turn
public static final PreventDamageTrigger PreventCombatDamageDealtToYouOrCreaturesYouControl(final MagicPlayer player) {
return new PreventDamageTrigger() {
@Override
public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent,final MagicDamage damage) {
if (damage.isCombat() &&
damage.getTarget().getController().getId() == player.getId()) {
damage.prevent();
}
return MagicEvent.NONE;
}
};
}
// prevent all damage that would be dealt to you
public static final PreventDamageTrigger PreventDamageDealtToYou(final MagicPlayer player) {
return new PreventDamageTrigger() {
@Override
public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent,final MagicDamage damage) {
if (damage.getTarget().isPlayer() &&
damage.getTarget().getController().getId() == player.getId()) {
damage.prevent();
}
return MagicEvent.NONE;
}
};
}
// prevent all combat damage that would be dealt to you
public static final PreventDamageTrigger PreventCombatDamageDealtToYou(final MagicPlayer player) {
return new PreventDamageTrigger() {
@Override
public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent,final MagicDamage damage) {
if (damage.isCombat() &&
damage.getTarget().isPlayer() &&
damage.getTarget().getController().getId() == player.getId()) {
damage.prevent();
}
return MagicEvent.NONE;
}
};
}
// prevent all damage that would be dealt to [permanent]
public static final PreventDamageTrigger PreventDamageDealtTo(final MagicTargetFilter<MagicTarget> filter) {
return new PreventDamageTrigger() {
@Override
public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent,final MagicDamage damage) {
if ((damage.isTargetCreature() &&
filter.acceptType(MagicTargetType.Permanent) &&
filter.accept(permanent, permanent.getController(), damage.getTargetPermanent())) ||
(damage.isTargetPlayer() &&
filter.acceptType(MagicTargetType.Player) &&
filter.accept(permanent, permanent.getController(), damage.getTargetPlayer()))) {
damage.prevent();
}
return MagicEvent.NONE;
}
};
}
// prevent all combat damage that would be dealt to [permanent]
public static final PreventDamageTrigger PreventCombatDamageDealtTo(final MagicTargetFilter<MagicTarget> filter) {
return new PreventDamageTrigger() {
@Override
public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent,final MagicDamage damage) {
if ((damage.isTargetCreature() &&
filter.acceptType(MagicTargetType.Permanent) &&
filter.accept(permanent, permanent.getController(), damage.getTargetPermanent())) ||
(damage.isTargetPlayer() &&
filter.acceptType(MagicTargetType.Player) &&
filter.accept(permanent, permanent.getController(), damage.getTargetPlayer()))) {
if (damage.isCombat()) {
damage.prevent();
}
}
return MagicEvent.NONE;
}
};
}
// prevent all noncombat damage that would be dealt to [permanent]
public static final PreventDamageTrigger PreventNonCombatDamageDealtTo(final MagicTargetFilter<MagicTarget> filter) {
return new PreventDamageTrigger() {
@Override
public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent,final MagicDamage damage) {
if ((damage.isTargetCreature() &&
filter.acceptType(MagicTargetType.Permanent) &&
filter.accept(permanent, permanent.getController(), damage.getTargetPermanent())) ||
(damage.isTargetPlayer() &&
filter.acceptType(MagicTargetType.Player) &&
filter.accept(permanent, permanent.getController(), damage.getTargetPlayer()))) {
if (damage.isCombat() == false) {
damage.prevent();
}
}
return MagicEvent.NONE;
}
};
}
// prevent all combat damage dealt by
public static final PreventDamageTrigger PreventCombatDamageDealtBy(final MagicTargetFilter<MagicPermanent> filter) {
return new PreventDamageTrigger() {
@Override
public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent,final MagicDamage damage) {
if (damage.isCombat() &&
damage.isSourcePermanent() &&
filter.accept(permanent, permanent.getController(), damage.getSourcePermanent())) {
damage.prevent();
}
return MagicEvent.NONE;
}
};
}
// prevent all damage dealt by
public static final PreventDamageTrigger PreventDamageDealtBy(final MagicTargetFilter<MagicPermanent> filter) {
return new PreventDamageTrigger() {
@Override
public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent,final MagicDamage damage) {
if (damage.isSourcePermanent() &&
filter.accept(permanent, permanent.getController(), damage.getSourcePermanent())) {
damage.prevent();
}
return MagicEvent.NONE;
}
};
}
}