use of pcgen.core.PCStat in project pcgen by PCGen.
the class DefineStatLst method parseToken.
@Override
public ParseResult parseToken(LoadContext context, CDOMObject obj, String value) {
if (obj instanceof Ungranted) {
return new ParseResult.Fail("Cannot use " + getTokenName() + " on an Ungranted object type: " + obj.getClass().getSimpleName(), context);
}
ParsingSeparator sep = new ParsingSeparator(value, '|');
sep.addGroupingPair('[', ']');
sep.addGroupingPair('(', ')');
if (!sep.hasNext()) {
return new ParseResult.Fail(getTokenName() + " may not be empty", context);
}
String firstItem = sep.next();
DefineStatSubToken subToken;
try {
subToken = DefineStatSubToken.valueOf(firstItem);
} catch (IllegalArgumentException e1) {
return new ParseResult.Fail("Found unexpected sub tag " + firstItem + " in " + getTokenName() + Constants.COLON + value + ". Must be one of " + StringUtils.join(DefineStatSubToken.values(), ", ") + Constants.DOT, context);
}
if (!sep.hasNext()) {
return new ParseResult.Fail(getTokenName() + Constants.COLON + subToken + "| must be followed by a stat.", context);
}
String statKey = sep.next();
CDOMSingleRef<PCStat> stat = context.getReferenceContext().getCDOMReference(PCSTAT_CLASS, statKey);
Formula f = null;
if (subToken == DefineStatSubToken.LOCK || subToken == DefineStatSubToken.MINVALUE || subToken == DefineStatSubToken.MAXVALUE) {
if (!sep.hasNext()) {
return new ParseResult.Fail(getTokenName() + Constants.COLON + subToken + "| must be followed by both a stat and a value.", context);
}
String formula = sep.next();
f = FormulaFactory.getFormulaFor(formula);
if (!f.isValid()) {
return new ParseResult.Fail("Formula in " + getTokenName() + " was not valid: " + f.toString(), context);
}
}
if (sep.hasNext()) {
return new ParseResult.Fail(getTokenName() + Constants.COLON + value + " has too many pipe separated item.", context);
}
switch(subToken) {
case LOCK:
context.getObjectContext().addToList(obj, ListKey.STAT_LOCKS, new StatLock(stat, f));
break;
case UNLOCK:
context.getObjectContext().addToList(obj, ListKey.UNLOCKED_STATS, stat);
break;
case NONSTAT:
context.getObjectContext().addToList(obj, ListKey.NONSTAT_STATS, stat);
break;
case STAT:
context.getObjectContext().addToList(obj, ListKey.NONSTAT_TO_STAT_STATS, stat);
break;
case MINVALUE:
context.getObjectContext().addToList(obj, ListKey.STAT_MINVALUE, new StatLock(stat, f));
break;
case MAXVALUE:
context.getObjectContext().addToList(obj, ListKey.STAT_MAXVALUE, new StatLock(stat, f));
break;
}
return ParseResult.SUCCESS;
}
use of pcgen.core.PCStat in project pcgen by PCGen.
the class StatToken method parseTokenWithSeparator.
@Override
protected ParseResult parseTokenWithSeparator(LoadContext context, KitStat kitStat, String value) {
StringTokenizer st = new StringTokenizer(value, Constants.PIPE);
while (st.hasMoreTokens()) {
String token = st.nextToken();
int equalLoc = token.indexOf('=');
if (equalLoc == -1) {
return new ParseResult.Fail("Illegal " + getTokenName() + " did not have Stat=X format: " + value, context);
}
if (equalLoc != token.lastIndexOf('=')) {
return new ParseResult.Fail("Illegal " + getTokenName() + " had two equal signs, is not Stat=X format: " + value, context);
}
String statName = token.substring(0, equalLoc);
if (statName.isEmpty()) {
return new ParseResult.Fail("Illegal " + getTokenName() + " had no stat, is not Stat=X format: " + value, context);
}
CDOMSingleRef<PCStat> stat = context.getReferenceContext().getCDOMReference(PCStat.class, statName);
String formula = token.substring(equalLoc + 1);
if (formula.isEmpty()) {
return new ParseResult.Fail("Unable to find STAT value: " + value, context);
}
Formula statValue = FormulaFactory.getFormulaFor(formula);
if (!statValue.isValid()) {
return new ParseResult.Fail("StatValue in " + getTokenName() + " was not valid: " + statValue.toString(), context);
}
kitStat.addStat(stat, statValue);
}
return ParseResult.SUCCESS;
}
use of pcgen.core.PCStat in project pcgen by PCGen.
the class StatBonusToken method parseToken.
@Override
public ParseResult parseToken(LoadContext context, EquipmentModifier obj, String value) {
if (value == null) {
return new ParseResult.Fail("CHOOSE:" + getTokenName() + " requires additional arguments", context);
}
if (value.indexOf('[') != -1) {
return new ParseResult.Fail("CHOOSE:" + getTokenName() + " arguments may not contain [] : " + value, context);
}
if (value.charAt(0) == '|') {
return new ParseResult.Fail("CHOOSE:" + getTokenName() + " arguments may not start with | : " + value, context);
}
if (value.charAt(value.length() - 1) == '|') {
return new ParseResult.Fail("CHOOSE:" + getTokenName() + " arguments may not end with | : " + value, context);
}
if (value.indexOf("||") != -1) {
return new ParseResult.Fail("CHOOSE:" + getTokenName() + " arguments uses double separator || : " + value, context);
}
int pipeLoc = value.indexOf(Constants.PIPE);
if (pipeLoc == -1) {
return new ParseResult.Fail("CHOOSE:" + getTokenName() + " must have two or more | delimited arguments : " + value, context);
}
StringTokenizer tok = new StringTokenizer(value, Constants.PIPE);
Collection<PCStat> list = context.getReferenceContext().getConstructedCDOMObjects(PCStat.class);
Integer min = null;
Integer max = null;
while (tok.hasMoreTokens()) {
String tokString = tok.nextToken();
if (tokString.startsWith("MIN=")) {
min = Integer.valueOf(tokString.substring(4));
// OK
} else if (tokString.startsWith("MAX=")) {
max = Integer.valueOf(tokString.substring(4));
// OK
} else if (tokString.startsWith("TITLE=")) {
// OK
} else if (tokString.startsWith("INCREMENT=")) {
// OK
Integer.parseInt(tokString.substring(4));
} else {
// Ensure this is a primitive STAT
boolean found = false;
for (PCStat stat : list) {
if (tokString.equals(stat.getKeyName())) {
found = true;
break;
}
}
if (!found) {
return new ParseResult.Fail("Did not find STAT: " + tokString + " used in CHOOSE:STATBONUS " + value, context);
}
}
}
if (max == null) {
if (min != null) {
return new ParseResult.Fail("Cannot have MIN=n without MAX=m in CHOOSE:STATBONUS: " + value, context);
}
} else {
if (min == null) {
return new ParseResult.Fail("Cannot have MAX=n without MIN=m in CHOOSE:STATBONUS: " + value, context);
}
if (max < min) {
return new ParseResult.Fail("Cannot have MAX= less than MIN= in CHOOSE:STATBONUS: " + value, context);
}
}
StringBuilder sb = new StringBuilder(value.length() + 20);
sb.append(getTokenName()).append('|').append(value);
context.getObjectContext().put(obj, StringKey.CHOICE_STRING, sb.toString());
return ParseResult.SUCCESS;
}
use of pcgen.core.PCStat in project pcgen by PCGen.
the class StatFacetTest method getObject.
@Override
protected PCStat getObject() {
PCStat t = new PCStat();
t.setName("Stat" + n++);
return t;
}
use of pcgen.core.PCStat in project pcgen by PCGen.
the class ObjectKeyActorTest method testWrappedObjectKeyActor.
public void testWrappedObjectKeyActor() {
Deity d = new Deity();
d.setName("Bob");
PCStat str = new PCStat();
str.setName("Strength");
BigDecimal expectedResult = new BigDecimal("4.063");
str.put(ObjectKey.COST, expectedResult);
df.set(id, d);
d.put(ObjectKey.SPELL_STAT, CDOMDirectSingleRef.getRef(str));
ObjectKeyActor<BigDecimal> oka_cost = new ObjectKeyActor<>(ObjectKey.COST);
CDOMObjectWrapper.load(dsid, str.getClass(), "cost", oka_cost);
ObjectKeyActor<CDOMSingleRef<PCStat>> oka_stat = new ObjectKeyActor<>(ObjectKey.SPELL_STAT);
CDOMObjectWrapper.load(dsid, d.getClass(), "stat", oka_stat);
processThroughFreeMarker("${deity.stat}", str.getDisplayName());
processThroughFreeMarker("${deity.stat.cost}", expectedResult.toString());
}
Aggregations