support trigger: Whenever <permanent> explores, <effect>, closes #1276

master
melvinzhang 2017-09-24 14:59:26 +08:00
parent 54e8c272c1
commit 3771856875
6 changed files with 30 additions and 6 deletions

View File

@ -1062,6 +1062,16 @@ public enum MagicAbility {
));
}
},
ExploreTrigger("Whenever " + ARG.WORDRUN + " explores, " + ARG.EFFECT, 10) {
@Override
protected void addAbilityImpl(final MagicAbilityStore card, final Matcher arg) {
card.add(BecomesStateTrigger.create(
MagicTargetFilterFactory.Permanent(ARG.wordrun(arg)),
MagicPermanentState.Explores,
MagicRuleEventAction.create(ARG.effect(arg))
));
}
},
CreatureBlocksEffect("When(ever)? " + ARG.WORDRUN + " blocks, " + ARG.EFFECT, 10) {
@Override
protected void addAbilityImpl(final MagicAbilityStore card, final Matcher arg) {

View File

@ -8,6 +8,7 @@ public enum MagicPermanentState {
DoesNotUntapDuringNext0("doesn't untap during your next untap step", "{s}"),
DoesNotUntapDuringNext1("doesn't untap during your next untap step", "{s}"),
Exerted("exerted", ""),
Explores("explores", ""),
Regenerated("regenerated", "{r}"),
CannotBeRegenerated("can't be regenerated", "{~r}"),
Attacking("attacking", "{c}"),

View File

@ -35,6 +35,13 @@ public class ChangeStateAction extends MagicAction {
set = aSet;
}
public static void trigger(final MagicGame game, final MagicPermanent perm, final MagicPermanentState state) {
game.executeTrigger(
MagicTriggerType.WhenBecomesState,
ChangeStateAction.Set(perm, state)
);
}
@Override
public void doAction(final MagicGame game) {
changed=permanent.hasState(state)!=set;

View File

@ -16,13 +16,10 @@ public class MagicExertEvent extends MagicEvent {
}
private static final MagicEventAction EVENT_ACTION = (final MagicGame game, final MagicEvent event) -> {
game.doAction(ChangeStateAction.Set(
event.getPermanent(),
MagicPermanentState.Exerted
));
game.doAction(ChangeStateAction.DoesNotUntapDuringNext(
event.getPermanent(),
event.getPlayer()
));
ChangeStateAction.trigger(game, event.getPermanent(), MagicPermanentState.Exerted);
};
}

View File

@ -6,10 +6,12 @@ import magic.model.MagicPermanent;
import magic.model.MagicCard;
import magic.model.MagicCounterType;
import magic.model.MagicLocationType;
import magic.model.MagicPermanentState;
import magic.model.choice.MagicMayChoice;
import magic.model.action.RevealAction;
import magic.model.action.ShiftCardAction;
import magic.model.action.ChangeCountersAction;
import magic.model.action.ChangeStateAction;
public class MagicExploreEvent extends MagicEvent {
@ -46,5 +48,6 @@ public class MagicExploreEvent extends MagicEvent {
));
}
}
ChangeStateAction.trigger(game, perm, MagicPermanentState.Explores);
};
}

View File

@ -6,6 +6,8 @@ import magic.model.MagicPermanentState;
import magic.model.action.ChangeStateAction;
import magic.model.event.MagicEvent;
import magic.model.event.MagicSourceEvent;
import magic.model.target.MagicTargetFilter;
import magic.model.target.MagicTargetFilterFactory;
public abstract class BecomesStateTrigger extends MagicTrigger<ChangeStateAction> {
public BecomesStateTrigger(final int priority) {
@ -19,11 +21,11 @@ public abstract class BecomesStateTrigger extends MagicTrigger<ChangeStateAction
return MagicTriggerType.WhenBecomesState;
}
public static BecomesStateTrigger create(final MagicPermanentState state, final MagicSourceEvent sourceEvent) {
public static BecomesStateTrigger create(final MagicTargetFilter<MagicPermanent> filter, final MagicPermanentState state, final MagicSourceEvent sourceEvent) {
return new BecomesStateTrigger() {
@Override
public boolean accept(final MagicPermanent permanent, final ChangeStateAction data) {
return data.state == state;
return filter.accept(permanent, permanent.getController(), data.permanent) && data.state == state;
}
@Override
public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent, final ChangeStateAction data) {
@ -32,6 +34,10 @@ public abstract class BecomesStateTrigger extends MagicTrigger<ChangeStateAction
};
}
public static BecomesStateTrigger create(final MagicPermanentState state, final MagicSourceEvent sourceEvent) {
return create(MagicTargetFilterFactory.ANY, state, sourceEvent);
}
public static BecomesStateTrigger createSelf(final MagicPermanentState state, final MagicSourceEvent sourceEvent) {
return new BecomesStateTrigger() {
@Override