286 lines
11 KiB
Java
286 lines
11 KiB
Java
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;
|
|
}
|
|
}
|
|
}
|