package magic.model.target; import java.util.regex.Matcher; import java.util.regex.Pattern; import magic.model.ARG; import magic.model.MagicPermanentState; import magic.model.target.MagicTargetFilterFactory.Control; public enum MagicTargetFilterParser { CardNamedFromYourLibrary("card named " + ARG.ANY + " from your library") { public MagicTargetFilter<?> toTargetFilter(final Matcher arg) { return MagicTargetFilterFactory.cardName(ARG.any(arg)).from(MagicTargetType.Library); } }, CardNamedFromYourHand("card named " + ARG.ANY + " from your hand") { public MagicTargetFilter<?> toTargetFilter(final Matcher arg) { return MagicTargetFilterFactory.cardName(ARG.any(arg)).from(MagicTargetType.Hand); } }, CardNamedFromYourGraveyard("card named " + ARG.ANY + " from your graveyard") { public MagicTargetFilter<?> toTargetFilter(final Matcher arg) { return MagicTargetFilterFactory.cardName(ARG.any(arg)).from(MagicTargetType.Graveyard); } }, CardNamedFromOppGraveyard("card named " + ARG.ANY + " from an opponent's graveyard") { public MagicTargetFilter<?> toTargetFilter(final Matcher arg) { return MagicTargetFilterFactory.cardName(ARG.any(arg)).from(MagicTargetType.OpponentsGraveyard); } }, CardNamedFromGraveyard("card named " + ARG.ANY + " from a graveyard") { public MagicTargetFilter<?> toTargetFilter(final Matcher arg) { return MagicTargetFilterFactory.cardName(ARG.any(arg)).from(MagicTargetType.Graveyard).from(MagicTargetType.OpponentsGraveyard); } }, PermanentNamed("permanent named " + ARG.ANY) { public MagicTargetFilter<?> toTargetFilter(final Matcher arg) { return MagicTargetFilterFactory.permanentName(ARG.any(arg), Control.Any); } }, PermanentNotNamed("permanent not named " + ARG.ANY) { public MagicTargetFilter<?> toTargetFilter(final Matcher arg) { return MagicTargetFilterFactory.permanentNotName(ARG.any(arg), Control.Any); } }, CreatureNamedYouControl("creature named " + ARG.ANY + " you control") { public MagicTargetFilter<?> toTargetFilter(final Matcher arg) { return MagicTargetFilterFactory.creatureName(ARG.any(arg), Control.You); } }, CreatureYouControlNamed("creature you control named " + ARG.ANY) { public MagicTargetFilter<?> toTargetFilter(final Matcher arg) { return MagicTargetFilterFactory.creatureName(ARG.any(arg), Control.You); } }, CreatureNamed("creature named " + ARG.ANY) { public MagicTargetFilter<?> toTargetFilter(final Matcher arg) { return MagicTargetFilterFactory.creatureName(ARG.any(arg), Control.Any); } }, LandYouControlNamed("land you control named " + ARG.ANY) { public MagicTargetFilter<?> toTargetFilter(final Matcher arg) { return MagicTargetFilterFactory.landName(ARG.any(arg), Control.You); } }, PermanentCardGraveyard(ARG.WORDRUN + " permanent card from your graveyard") { public MagicTargetFilter<?> toTargetFilter(final Matcher arg) { return MagicTargetFilterFactory.matchPermanentCardPrefix(arg.group(), ARG.wordrun(arg), MagicTargetType.Graveyard); } }, CreatureCardGraveyard(ARG.WORDRUN + " creature card from your graveyard") { public MagicTargetFilter<?> toTargetFilter(final Matcher arg) { return MagicTargetFilterFactory.matchCreatureCardPrefix(arg.group(), ARG.wordrun(arg), MagicTargetType.Graveyard); } }, CardFromGraveyard(ARG.WORDRUN + " card from your graveyard") { public MagicTargetFilter<?> toTargetFilter(final Matcher arg) { return MagicTargetFilterFactory.matchCardPrefix(arg.group(), ARG.wordrun(arg), MagicTargetType.Graveyard); } }, PermanentCardOppGraveyard(ARG.WORDRUN + " permanent card from an opponent's graveyard") { public MagicTargetFilter<?> toTargetFilter(final Matcher arg) { return MagicTargetFilterFactory.matchPermanentCardPrefix(arg.group(), ARG.wordrun(arg), MagicTargetType.OpponentsGraveyard); } }, CreatureCardOppGraveyard(ARG.WORDRUN + " creature card from an opponent's graveyard") { public MagicTargetFilter<?> toTargetFilter(final Matcher arg) { return MagicTargetFilterFactory.matchCreatureCardPrefix(arg.group(), ARG.wordrun(arg), MagicTargetType.OpponentsGraveyard); } }, CardFromOppGraveyard(ARG.WORDRUN + " card from an opponent's graveyard") { public MagicTargetFilter<?> toTargetFilter(final Matcher arg) { return MagicTargetFilterFactory.matchCardPrefix(arg.group(), ARG.wordrun(arg), MagicTargetType.OpponentsGraveyard); } }, PermanentCardHand(ARG.WORDRUN + " permanent card from your hand") { public MagicTargetFilter<?> toTargetFilter(final Matcher arg) { return MagicTargetFilterFactory.matchPermanentCardPrefix(arg.group(), ARG.wordrun(arg), MagicTargetType.Hand); } }, CreatureCardHand(ARG.WORDRUN + " creature card from your hand") { public MagicTargetFilter<?> toTargetFilter(final Matcher arg) { return MagicTargetFilterFactory.matchCreatureCardPrefix(arg.group(), ARG.wordrun(arg), MagicTargetType.Hand); } }, CardFromHand(ARG.WORDRUN + " card from your hand") { public MagicTargetFilter<?> toTargetFilter(final Matcher arg) { return MagicTargetFilterFactory.matchCardPrefix(arg.group(), ARG.wordrun(arg), MagicTargetType.Hand); } }, PermanentCardLibrary(ARG.WORDRUN + " permanent card from your library") { public MagicTargetFilter<?> toTargetFilter(final Matcher arg) { return MagicTargetFilterFactory.matchPermanentCardPrefix(arg.group(), ARG.wordrun(arg), MagicTargetType.Library); } }, CreatureCardLibrary(ARG.WORDRUN + " creature card from your library") { public MagicTargetFilter<?> toTargetFilter(final Matcher arg) { return MagicTargetFilterFactory.matchCreatureCardPrefix(arg.group(), ARG.wordrun(arg), MagicTargetType.Library); } }, CardLibrary(ARG.WORDRUN + " card from your library") { public MagicTargetFilter<?> toTargetFilter(final Matcher arg) { return MagicTargetFilterFactory.matchCardPrefix(arg.group(), ARG.wordrun(arg), MagicTargetType.Library); } }, CardFromAGraveyard(ARG.WORDRUN + " card from a graveyard") { public MagicTargetFilter<?> toTargetFilter(final Matcher arg) { return MagicTargetFilterFactory.matchCardPrefix(arg.group(), ARG.wordrun(arg), MagicTargetType.Graveyard).from(MagicTargetType.OpponentsGraveyard); } }, AttackingOrBlocking("attacking or blocking " + ARG.WORDRUN) { public MagicTargetFilter<?> toTargetFilter(final Matcher arg) { return MagicTargetFilterFactory.permanentOr(MagicPermanentState.Attacking, MagicPermanentState.Blocking, MagicTargetFilterFactory.Permanent(ARG.wordrun(arg))); } }, Attacking("attacking " + ARG.WORDRUN) { public MagicTargetFilter<?> toTargetFilter(final Matcher arg) { return MagicTargetFilterFactory.permanent(MagicPermanentState.Attacking, MagicTargetFilterFactory.Permanent(ARG.wordrun(arg))); } }, Untapped("untapped " + ARG.WORDRUN) { public MagicTargetFilter<?> toTargetFilter(final Matcher arg) { return MagicTargetFilterFactory.untapped(MagicTargetFilterFactory.Permanent(ARG.wordrun(arg))); } }, Tapped("tapped " + ARG.WORDRUN) { public MagicTargetFilter<?> toTargetFilter(final Matcher arg) { return MagicTargetFilterFactory.permanent(MagicPermanentState.Tapped, MagicTargetFilterFactory.Permanent(ARG.wordrun(arg))); } }, CreatureYouControlWith("creature you control with " + ARG.WORDRUN) { public MagicTargetFilter<?> toTargetFilter(final Matcher arg) { return MagicTargetFilterFactory.matchPermanentPrefix(arg.group(), "creature with " + ARG.wordrun(arg), Control.You); } }, CreatureOppControlWith("creature an opponent controls with " + ARG.WORDRUN) { public MagicTargetFilter<?> toTargetFilter(final Matcher arg) { return MagicTargetFilterFactory.matchPermanentPrefix(arg.group(), "creature with " + ARG.wordrun(arg), Control.Opp); } }, CreatureDefControlWith("creature defending player controls with " + ARG.WORDRUN) { public MagicTargetFilter<?> toTargetFilter(final Matcher arg) { return MagicTargetFilterFactory.matchPermanentPrefix(arg.group(), "creature with " + ARG.wordrun(arg), Control.Def); } }, CreatureYouControl(ARG.WORDRUN + " creature you control") { public MagicTargetFilter<?> toTargetFilter(final Matcher arg) { return MagicTargetFilterFactory.matchCreaturePrefix(arg.group(), ARG.wordrun(arg), Control.You); } }, CreatureOppControl(ARG.WORDRUN + " creature (an opponent controls|you don't control)") { public MagicTargetFilter<?> toTargetFilter(final Matcher arg) { return MagicTargetFilterFactory.matchCreaturePrefix(arg.group(), ARG.wordrun(arg), Control.Opp); } }, PermanentYouControl(ARG.WORDRUN + "( permanent)? you control") { public MagicTargetFilter<?> toTargetFilter(final Matcher arg) { return MagicTargetFilterFactory.matchPermanentPrefix(arg.group(), ARG.wordrun(arg), Control.You); } }, PermanentOppControl(ARG.WORDRUN + "( permanent)? (an opponent controls|you don't control)") { public MagicTargetFilter<?> toTargetFilter(final Matcher arg) { return MagicTargetFilterFactory.matchPermanentPrefix(arg.group(), ARG.wordrun(arg), Control.Opp); } }, PermanentDefControl(ARG.WORDRUN + "( permanent)? defending player controls") { public MagicTargetFilter<?> toTargetFilter(final Matcher arg) { return MagicTargetFilterFactory.matchPermanentPrefix(arg.group(), ARG.wordrun(arg), Control.Def); } }, Permanent(ARG.WORDRUN + " permanent") { public MagicTargetFilter<?> toTargetFilter(final Matcher arg) { return MagicTargetFilterFactory.matchPermanentPrefix(arg.group(), ARG.wordrun(arg), Control.Any); } }, Creature(ARG.WORDRUN + " creature") { public MagicTargetFilter<?> toTargetFilter(final Matcher arg) { return MagicTargetFilterFactory.matchCreaturePrefix(arg.group(), ARG.wordrun(arg), Control.Any); } }, Planeswalker(ARG.WORDRUN + " planeswalker") { public MagicTargetFilter<?> toTargetFilter(final Matcher arg) { return MagicTargetFilterFactory.matchPlaneswalkerPrefix(arg.group(), ARG.wordrun(arg), Control.Any); } }, Spell(ARG.WORDRUN + " spell") { public MagicTargetFilter<?> toTargetFilter(final Matcher arg) { return MagicTargetFilterFactory.matchSpellPrefix(arg.group(), ARG.wordrun(arg)); } }, PermanentAlt(ARG.WORDRUN) { public MagicTargetFilter<?> toTargetFilter(final Matcher arg) { return MagicTargetFilterFactory.matchPermanentPrefix(arg.group(), ARG.wordrun(arg), Control.Any); } }, ; private final Pattern pattern; private MagicTargetFilterParser(final String regex) { pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE); } public Matcher matcher(final String rule) { return pattern.matcher(rule); } public abstract MagicTargetFilter<?> toTargetFilter(final Matcher arg); public static final MagicTargetFilter<?> build(final String text) { for (final MagicTargetFilterParser rule : values()) { final Matcher matcher = rule.matcher(text); if (matcher.matches()) { return rule.toTargetFilter(matcher); } } throw new RuntimeException("unknown target filter \"" + text + "\""); } }