move ARG regex helper into separate class, create MagicConditionParser to convert text into MagicCondition

master
melvin 2014-05-05 15:14:34 +08:00
parent 737880c06d
commit 484eeadd11
3 changed files with 119 additions and 62 deletions

57
src/magic/model/ARG.java Normal file
View File

@ -0,0 +1,57 @@
package magic.model;
import magic.data.EnglishToInt;
import java.util.regex.Matcher;
public class ARG {
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>.+)";
public static int amount(final Matcher m) {
return EnglishToInt.convert(m.group("amount"));
}
public static final String COST = "(?<cost>.+)";
public static String cost(final Matcher m) {
return m.group("cost");
}
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 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 PT = "(?<pt>[+-][0-9]+/[+-][0-9]+)";
public static String pt(final Matcher m) {
return m.group("pt");
}
}

View File

@ -8,7 +8,7 @@ import magic.model.target.MagicTargetFilter;
import magic.model.target.MagicTargetFilterFactory;
import magic.model.trigger.*;
import magic.model.condition.MagicCondition;
import magic.model.condition.MagicConditionFactory;
import magic.model.condition.MagicConditionParser;
import magic.model.trigger.MagicThiefTrigger.Player;
import magic.model.trigger.MagicThiefTrigger.Type;
@ -747,15 +747,9 @@ public enum MagicAbility {
));
}
},
ControlPumpGain("SN (gets " + ARG.PT + " )?(and )?(has " + ARG.ANY + " )?as long as you control (a(n)?|(?<another>another)) " + ARG.WORDRUN + "\\.", 0) {
ControlPumpGain("SN (gets " + ARG.PT + " )?(and )?(has " + ARG.ANY + " )?as long as " + ARG.WORDRUN + "\\.", 0) {
protected void addAbilityImpl(final MagicAbilityStore card, final Matcher arg) {
final MagicCondition condition = arg.group("another") != null ?
MagicConditionFactory.YouControlAnother(
MagicTargetFilterFactory.singlePermanent(ARG.wordrun(arg))
):
MagicConditionFactory.YouControl(
MagicTargetFilterFactory.singlePermanent(ARG.wordrun(arg))
);
final MagicCondition condition = MagicConditionParser.build(ARG.wordrun(arg));
if (arg.group("pt") != null) {
final String[] pt = ARG.pt(arg).replace("+","").split("/");
final int power = Integer.parseInt(pt[0]);
@ -772,7 +766,7 @@ public enum MagicAbility {
}
}
},
ControlPumpGainAlt("As long as you control (a(n)?|(?<another>another)) " + ARG.WORDRUN + ", SN (gets " + ARG.PT + " )?(and )?(has " + ARG.ANY + ")?\\.", 0) {
ControlPumpGainAlt("As long as " + ARG.WORDRUN + ", SN (gets " + ARG.PT + " )?(and )?(has " + ARG.ANY + ")?\\.", 0) {
protected void addAbilityImpl(final MagicAbilityStore card, final Matcher arg) {
ControlPumpGain.addAbilityImpl(card, arg);
}
@ -1030,58 +1024,6 @@ public enum MagicAbility {
public static final Set<MagicAbility> LANDWALK_FLAGS = EnumSet.range(Plainswalk, Forestwalk);
private static class ARG {
private static final String NUMBER = "(?<number>[0-9]+)";
private static int number(final Matcher m) {
return Integer.parseInt(m.group("number"));
}
private static final String AMOUNT = "(?<amount>.+)";
private static int amount(final Matcher m) {
return EnglishToInt.convert(m.group("amount"));
}
private static final String COST = "(?<cost>.+)";
private static String cost(final Matcher m) {
return m.group("cost");
}
private static final String EFFECT = "(?<effect>.+)";
private static String effect(final Matcher m) {
return m.group("effect");
}
private static final String ANY = "(?<any>.+)";
private static String any(final Matcher m) {
return m.group("any");
}
private static final String MANA = "(?<mana>[^\\.]+)";
private static String mana(final Matcher m) {
return m.group("mana");
}
private static final String WORD1 = "(?<word1>[^ ]+)";
private static String word1(final Matcher m) {
return m.group("word1");
}
private static final String WORD2 = "(?<word2>[^ ]+)";
private static String word2(final Matcher m) {
return m.group("word2");
}
private static final String WORDRUN = "(?<wordrun>[^\\.]+)";
private static String wordrun(final Matcher m) {
return m.group("wordrun");
}
private static final String PT = "(?<pt>[+-][0-9]+/[+-][0-9]+)";
private static String pt(final Matcher m) {
return m.group("pt");
}
}
private final Pattern pattern;
private final String name;
private final int score;

View File

@ -0,0 +1,58 @@
package magic.model.condition;
import magic.model.ARG;
import magic.model.MagicSource;
import magic.model.target.MagicTargetFilterFactory;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public enum MagicConditionParser {
YouControl("you control a(n)? " + ARG.WORDRUN) {
public MagicCondition toCondition(final Matcher arg) {
return MagicConditionFactory.YouControl(
MagicTargetFilterFactory.singlePermanent(ARG.wordrun(arg))
);
}
},
YouControlAnother("you control another " + ARG.WORDRUN) {
public MagicCondition toCondition(final Matcher arg) {
return MagicConditionFactory.YouControlAnother(
MagicTargetFilterFactory.singlePermanent(ARG.wordrun(arg))
);
}
},
Threshold("seven or more cards are in your graveyard") {
public MagicCondition toCondition(final Matcher arg) {
return MagicCondition.THRESHOLD_CONDITION;
}
},
Metalcraft("you control three or more artifacts") {
public MagicCondition toCondition(final Matcher arg) {
return MagicCondition.METALCRAFT_CONDITION;
}
};
private final Pattern pattern;
private MagicConditionParser(final String regex) {
pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
}
public Matcher matcher(final String rule) {
return pattern.matcher(rule);
}
public abstract MagicCondition toCondition(final Matcher arg);
public static final MagicCondition build(final String cost) {
for (final MagicConditionParser rule : values()) {
final Matcher matcher = rule.matcher(cost);
if (matcher.matches()) {
return rule.toCondition(matcher);
}
}
throw new RuntimeException("Unable to match " + cost + " to a condition");
}
}