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) { CreatureBlocksEffect("When(ever)? " + ARG.WORDRUN + " blocks, " + ARG.EFFECT, 10) {
@Override @Override
protected void addAbilityImpl(final MagicAbilityStore card, final Matcher arg) { 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}"), DoesNotUntapDuringNext0("doesn't untap during your next untap step", "{s}"),
DoesNotUntapDuringNext1("doesn't untap during your next untap step", "{s}"), DoesNotUntapDuringNext1("doesn't untap during your next untap step", "{s}"),
Exerted("exerted", ""), Exerted("exerted", ""),
Explores("explores", ""),
Regenerated("regenerated", "{r}"), Regenerated("regenerated", "{r}"),
CannotBeRegenerated("can't be regenerated", "{~r}"), CannotBeRegenerated("can't be regenerated", "{~r}"),
Attacking("attacking", "{c}"), Attacking("attacking", "{c}"),

View File

@ -35,6 +35,13 @@ public class ChangeStateAction extends MagicAction {
set = aSet; set = aSet;
} }
public static void trigger(final MagicGame game, final MagicPermanent perm, final MagicPermanentState state) {
game.executeTrigger(
MagicTriggerType.WhenBecomesState,
ChangeStateAction.Set(perm, state)
);
}
@Override @Override
public void doAction(final MagicGame game) { public void doAction(final MagicGame game) {
changed=permanent.hasState(state)!=set; 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) -> { private static final MagicEventAction EVENT_ACTION = (final MagicGame game, final MagicEvent event) -> {
game.doAction(ChangeStateAction.Set(
event.getPermanent(),
MagicPermanentState.Exerted
));
game.doAction(ChangeStateAction.DoesNotUntapDuringNext( game.doAction(ChangeStateAction.DoesNotUntapDuringNext(
event.getPermanent(), event.getPermanent(),
event.getPlayer() 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.MagicCard;
import magic.model.MagicCounterType; import magic.model.MagicCounterType;
import magic.model.MagicLocationType; import magic.model.MagicLocationType;
import magic.model.MagicPermanentState;
import magic.model.choice.MagicMayChoice; import magic.model.choice.MagicMayChoice;
import magic.model.action.RevealAction; import magic.model.action.RevealAction;
import magic.model.action.ShiftCardAction; import magic.model.action.ShiftCardAction;
import magic.model.action.ChangeCountersAction; import magic.model.action.ChangeCountersAction;
import magic.model.action.ChangeStateAction;
public class MagicExploreEvent extends MagicEvent { 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.action.ChangeStateAction;
import magic.model.event.MagicEvent; import magic.model.event.MagicEvent;
import magic.model.event.MagicSourceEvent; import magic.model.event.MagicSourceEvent;
import magic.model.target.MagicTargetFilter;
import magic.model.target.MagicTargetFilterFactory;
public abstract class BecomesStateTrigger extends MagicTrigger<ChangeStateAction> { public abstract class BecomesStateTrigger extends MagicTrigger<ChangeStateAction> {
public BecomesStateTrigger(final int priority) { public BecomesStateTrigger(final int priority) {
@ -19,11 +21,11 @@ public abstract class BecomesStateTrigger extends MagicTrigger<ChangeStateAction
return MagicTriggerType.WhenBecomesState; 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() { return new BecomesStateTrigger() {
@Override @Override
public boolean accept(final MagicPermanent permanent, final ChangeStateAction data) { 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 @Override
public MagicEvent executeTrigger(final MagicGame game,final MagicPermanent permanent, final ChangeStateAction data) { 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) { public static BecomesStateTrigger createSelf(final MagicPermanentState state, final MagicSourceEvent sourceEvent) {
return new BecomesStateTrigger() { return new BecomesStateTrigger() {
@Override @Override