package magic.model.trigger;
import magic.model.MagicAbility;
import magic.model.MagicCounterType;
import magic.model.MagicGame;
import magic.model.MagicPermanent;
import magic.model.MagicPlayer;
import magic.model.MagicType;
import magic.model.action.ChangeCountersAction;
import magic.model.action.TapAction;
import magic.model.choice.MagicMayChoice;
import magic.model.event.MagicEvent;
import magic.model.event.MagicSoulbondEvent;
import magic.model.event.MagicSourceEvent;
import magic.model.target.MagicTargetFilter;
import magic.model.target.MagicTargetFilterFactory;
public abstract class OtherEntersBattlefieldTrigger extends MagicTrigger<MagicPermanent> {
public OtherEntersBattlefieldTrigger(final int priority) {
super(priority);
}
public OtherEntersBattlefieldTrigger() {}
public MagicTriggerType getType() {
return MagicTriggerType.WhenOtherComesIntoPlay;
}
public static final OtherEntersBattlefieldTrigger createSelfOrAnother(final MagicTargetFilter<MagicPermanent> filter, final MagicSourceEvent sourceEvent) {
return new OtherEntersBattlefieldTrigger() {
@Override
public boolean accept(final MagicPermanent permanent, final MagicPermanent played) {
return permanent == played || filter.accept(permanent, permanent.getController(), played);
}
@Override
public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent, final MagicPermanent played) {
return sourceEvent.getTriggerEvent(permanent, played);
}
};
}
public static final OtherEntersBattlefieldTrigger create(final MagicTargetFilter<MagicPermanent> filter, final MagicSourceEvent sourceEvent) {
return new OtherEntersBattlefieldTrigger() {
@Override
public boolean accept(final MagicPermanent permanent, final MagicPermanent played) {
return filter.accept(permanent, permanent.getController(), played);
}
@Override
public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent, final MagicPermanent played) {
return sourceEvent.getTriggerEvent(permanent, played);
}
};
}
public static final OtherEntersBattlefieldTrigger Evolve = new OtherEntersBattlefieldTrigger() {
@Override
public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent,final MagicPermanent otherPermanent) {
return (otherPermanent.isCreature() &&
permanent.isCreature() &&
permanent.isFriend(otherPermanent) &&
(otherPermanent.getPowerValue() > permanent.getPowerValue() ||
otherPermanent.getToughnessValue() > permanent.getToughnessValue())) ?
new MagicEvent(
permanent,
otherPermanent,
this,
"PN put a +1/+1 counter on SN.") :
MagicEvent.NONE;
}
@Override
public void executeEvent(final MagicGame game, final MagicEvent event) {
if (event.getRefPermanent().getPowerValue() > event.getPermanent().getPowerValue() ||
event.getRefPermanent().getToughnessValue() > event.getPermanent().getToughnessValue()) {
game.doAction(new ChangeCountersAction(
event.getPermanent(),
MagicCounterType.PlusOne,
1
));
}
}
};
public static final OtherEntersBattlefieldTrigger Graft = new OtherEntersBattlefieldTrigger() {
@Override
public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent,final MagicPermanent otherPermanent) {
return (otherPermanent.isCreature() &&
otherPermanent != permanent &&
permanent.getCounters(MagicCounterType.PlusOne)>0) ?
new MagicEvent(
permanent,
new MagicMayChoice("Move a +1/+1 counter?"),
otherPermanent,
this,
"PN may$ move a +1/+1 counter from SN onto RN."
):
MagicEvent.NONE;
}
@Override
public void executeEvent(final MagicGame game, final MagicEvent event) {
if (event.isYes() && event.getPermanent().hasCounters(MagicCounterType.PlusOne)) {
game.doAction(new ChangeCountersAction(
event.getPermanent(),
MagicCounterType.PlusOne,
-1
));
game.doAction(new ChangeCountersAction(
event.getRefPermanent(),
MagicCounterType.PlusOne,
1
));
}
}
};
public static final OtherEntersBattlefieldTrigger Soulbond = new OtherEntersBattlefieldTrigger() {
@Override
public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent NONE,final MagicPermanent otherPermanent) {
final MagicPlayer controller = otherPermanent.getController();
if (otherPermanent.isCreature() &&
controller.getNrOfPermanents(MagicType.Creature) > 1) {
final boolean hasSoulbond = otherPermanent.hasAbility(MagicAbility.Soulbond);
if ((hasSoulbond &&
MagicTargetFilterFactory.UNPAIRED_CREATURE_YOU_CONTROL.filter(controller).size() > 1)
||
(!hasSoulbond &&
MagicTargetFilterFactory.UNPAIRED_SOULBOND_CREATURE.filter(controller).size() > 0)) {
return new MagicSoulbondEvent(otherPermanent,hasSoulbond);
} else {
return MagicEvent.NONE;
}
} else {
return MagicEvent.NONE;
}
}
};
public static final OtherEntersBattlefieldTrigger Tapped(final MagicTargetFilter<MagicPermanent> filter) {
return new OtherEntersBattlefieldTrigger(MagicTrigger.REPLACEMENT) {
@Override
public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent,final MagicPermanent otherPermanent) {
if (filter.accept(permanent, permanent.getController(), otherPermanent)) {
game.doAction(TapAction.Enters(otherPermanent));
}
return MagicEvent.NONE;
}
};
}
}