package magic.model; import java.util.Collections; import java.util.List; import java.util.regex.Matcher; import magic.data.EnglishToInt; import magic.model.action.MagicPlayMod; import magic.model.event.MagicEvent; import magic.model.stack.MagicItemOnStack; import magic.model.target.MagicTarget; import magic.model.target.MagicTargetFilter; import magic.model.target.MagicTargetFilterFactory; public class ARG { public static final String COLON = "\\s*:\\s*"; public static final String CHOICE = "(?<choice>(a|an|another|target) [^\\.]+?)"; public static final String CARD = "(?<choice>[^\\.]* card [^\\.]+?)"; public static final String GRAVEYARD = "(?<choice>[^\\.]* card [^\\.]+? graveyard)"; public static final String THING = "(permanent|creature|artifact|land|player|opponent|spell or ability|spell|ability)"; public static final String EVENQUOTES = "(?=([^\"]*'[^\"]*')*[^\"]*$)"; public static final String ENERGY = "(?<energy>(\\{E\\})+)"; public static int energy(final Matcher m) { return m.group("energy").length() / 3; } public static final String NUMBER = "(?<number>[0-9]+)"; public static int number(final Matcher m) { return Integer.parseInt(m.group("number")); } public static final String AMOUNT = "(?<amount>(a|an|one|two|three|four|five|six|seven|eight|nine|ten|eleven|twelve|thirteen|fourteen|fifteen|twenty|x|[0-9]+))"; public static int amount(final Matcher m) { return EnglishToInt.convert(m.group("amount")); } public static MagicAmount amountObj(final Matcher m) { return MagicAmountParser.build(m.group("amount")); } public static final String AMOUNT2 = "(?<amount2>[^ ]+?)"; public static int amount2(final Matcher m) { return EnglishToInt.convert(m.group("amount2")); } public static final String COST = "(?<cost>.+)"; public static final String MAY_COST = "(?<cost>(?!search|draw|exile).+)"; public static String cost(final Matcher m) { return m.group("cost"); } public static final String COLOR = "(?<color>[^ ]+)"; public static String color(final Matcher m) {return m.group("color");} public static final String EFFECT = "(?<effect>.+)"; public static String effect(final Matcher m) { return m.group("effect"); } public static final String ANY = "(?<any>.+)"; public static String any(final Matcher m) { return m.group("any"); } public static final String MANA = "(?<mana>[^\\.]+)"; public static String mana(final Matcher m) { return m.group("mana"); } public static final String MANACOST = "(?<manacost>(\\{[A-Z\\d/]+\\})+)"; public static String manacost(final Matcher m) { return m.group("manacost"); } public static final String WORD1 = "(?<word1>[^ ]+)"; public static String word1(final Matcher m) { return m.group("word1"); } public static final String WORD2 = "(?<word2>[^ ]+)"; public static String word2(final Matcher m) { return m.group("word2"); } public static final String WORDRUN = "(?<wordrun>[^\\.\"]+?)"; public static String wordrun(final Matcher m) { return m.group("wordrun"); } public static final String WORDRUN2 = "(?<wordrun2>[^\\.\"]+?)"; public static String wordrun2(final Matcher m) { return m.group("wordrun2"); } public static final String COND = "(?<cond>[^,\\.\"]+)"; public static String cond(final Matcher m) { return m.group("cond"); } public static final String PT = "(?<pt>[+-][0-9]+/[+-][0-9]+)"; public static final String XPT = "(?<pt>[+-][X0]+/[+-][X0]+)"; public static int[] pt(final Matcher m) { final String[] pt = m.group("pt").replace("+","").split("/"); return new int[]{Integer.parseInt(pt[0]), Integer.parseInt(pt[1])}; } public static String[] ptStr(final Matcher m) { return m.group("pt").replace("+","").split("/"); } public static MagicPowerToughness mpt(final Matcher m) { final String[] pt = m.group("pt").replace("+","").split("/"); return new MagicPowerToughness(Integer.parseInt(pt[0]), Integer.parseInt(pt[1])); } public static final String MODS = "(\\.|,)?( )?(?<mods>.+?)??"; public static List<MagicPlayMod> mods(final Matcher m) { return MagicPlayMod.build(m.group("mods")); } public static final String IT = "((?<rn>rn)|(?<sn>sn))"; public static MagicPermanent itPermanent(final MagicEvent event, final Matcher m) { if (m.group("rn") != null) { return event.getRefPermanent(); } else { return event.getPermanent(); } } public static MagicSource itSource(final MagicEvent event, final Matcher m) { if (m.group("rn") != null) { return event.getRefSource(); } else { return event.getSource(); } } public static final String YOU = "((?<rn>(rn))|(?<pn>(pn||you)))"; public static MagicTarget youTarget(final MagicEvent event, final Matcher m) { if (m.group("rn") != null) { return event.getRefTarget(); } else { return event.getPlayer(); } } public static MagicPlayer youPlayer(final MagicEvent event, final Matcher m) { if (m.group("rn") != null) { return event.getRefPlayer(); } else { return event.getPlayer(); } } private static final String TNC = "(that [^ ]+'s|its) controller( or that player)?"; public static final String PLAYERS = "((?<rnc>rn's controller)|(?<tnc>" + TNC + ")|(?<rn>rn)|(?<pn>(pn||you))|" + CHOICE + "|(?<group>[^\\.]+?))"; public static List<MagicPlayer> players(final MagicEvent event, final Matcher m, final MagicTargetFilter<MagicPlayer> filter) { if (m.group("rnc") != null) { return Collections.singletonList(event.getRefObject().getController()); } else if (m.group("tnc") != null) { return event.listTargetController(); } else if (m.group("rn") != null) { return Collections.singletonList(event.getRefPlayer()); } else if (m.group("pn") != null) { return Collections.singletonList(event.getPlayer()); } else if (m.group("choice") != null) { return event.listTargetPlayer(); } else { return filter.filter(event); } } public static MagicTargetFilter<MagicPlayer> playersParse(final Matcher m) { if (m.group("group") != null) { return MagicTargetFilterFactory.Player(m.group("group")); } else { return MagicTargetFilterFactory.PLAYER; } } public static final String PERMANENTS = "((?<rn>rn)|(?<sn>sn)|" + CHOICE + "|(?<group>[^\\.]+?))"; public static List<MagicPermanent> permanents(final MagicEvent event, final Matcher m, final MagicTargetFilter<MagicPermanent> filter) { if (m.group("rn") != null) { return Collections.singletonList(event.getRefPermanent()); } else if (m.group("sn") != null) { return Collections.singletonList(event.getPermanent()); } else if (m.group("choice") != null) { return event.listTargetPermanent(); } else { return filter.filter(event); } } public static MagicTargetFilter<MagicPermanent> permanentsParse(final Matcher m) { if (m.group("group") != null) { return MagicTargetFilterFactory.Permanent(m.group("group")); } else { return MagicTargetFilterFactory.ANY; } } public static final String TARGETS = "((?<rnc1>rn's controller)|(?<tnc1>" + TNC + ")|(?<rn1>rn)|(?<sn1>sn)|(?<pn1>(pn||you))|" + CHOICE + "|(?<group1>[^\\.]+?))"; public static List<? extends MagicTarget> targets(final MagicEvent event, final Matcher m, final MagicTargetFilter<MagicTarget> filter) { if (m.group("rnc1") != null) { return Collections.singletonList(event.getRefObject().getController()); } else if (m.group("tnc1") != null) { return event.listTargetController(); } else if (m.group("rn1") != null) { return Collections.singletonList(event.getRefTarget()); } else if (m.group("pn1") != null) { return Collections.singletonList(event.getPlayer()); } else if (m.group("sn1") != null) { return Collections.singletonList(event.getPermanent()); } else if (m.group("choice") != null) { return event.listTarget(); } else { return filter.filter(event); } } public static MagicTargetFilter<MagicTarget> targetsParse(final Matcher m) { if (m.group("group1") != null) { return MagicTargetFilterFactory.Target(m.group("group1")); } else { return MagicTargetFilterFactory.ONE; } } public static final String TARGETS2 = "((?<tnc2>" + TNC + ")|(?<rn2>rn)|(?<sn2>sn)|(?<pn2>(pn||you))|(?<group2>[^\\.]+?))"; public static List<? extends MagicTarget> targets2(final MagicEvent event, final Matcher m, final MagicTargetFilter<MagicTarget> filter) { if (m.group("tnc2") != null) { return event.listTargetController(); } else if (m.group("rn2") != null) { return Collections.singletonList(event.getRefTarget()); } else if (m.group("pn2") != null) { return Collections.singletonList(event.getPlayer()); } else if (m.group("sn2") != null) { return Collections.singletonList(event.getPermanent()); } else { return filter.filter(event); } } public static MagicTargetFilter<MagicTarget> targets2Parse(final Matcher m) { if (m.group("group2") != null) { return MagicTargetFilterFactory.Target(m.group("group2")); } else { return MagicTargetFilterFactory.ONE; } } public static final String CARDS = "((?<choice>[^\\.]* card [^\\.]+?)|(?<group>[^\\.]* cards [^\\.]+?))"; public static List<MagicCard> cards(final MagicEvent event, final Matcher m, final MagicTargetFilter<MagicCard> filter) { if (m.group("choice") != null) { return event.listTargetCard(); } else { return filter.filter(event); } } public static MagicTargetFilter<MagicCard> cardsParse(final Matcher m) { if (m.group("group") != null) { return MagicTargetFilterFactory.Card(m.group("group")); } else { return MagicTargetFilterFactory.CARD_FROM_HAND; } } public static final String ITEMS = "((?<rn>rn)|(?<sn>sn)|" + CHOICE + "|(?<group>[^\\.]+?))"; public static List<MagicItemOnStack> items(final MagicEvent event, final Matcher m, final MagicTargetFilter<MagicItemOnStack> filter) { if (m.group("rn") != null) { return Collections.singletonList(event.getRefItemOnStack()); } else if (m.group("sn") != null) { return Collections.singletonList(event.getItemOnStack()); } else if (m.group("choice") != null) { return event.listTargetItem(); } else { return filter.filter(event); } } public static MagicTargetFilter<MagicItemOnStack> itemsParse(final Matcher m) { if (m.group("group") != null) { return MagicTargetFilterFactory.ItemOnStack(m.group("group")); } else { return MagicTargetFilterFactory.SPELL_OR_ABILITY; } } }