use of pcgen.core.Race in project pcgen by PCGen.
the class CompanionListLst method parseTokenWithSeparator.
@Override
protected ParseResult parseTokenWithSeparator(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);
}
StringTokenizer tok = new StringTokenizer(value, LstUtils.PIPE);
String companionType = tok.nextToken();
if (!tok.hasMoreTokens()) {
return new ParseResult.Fail(getTokenName() + " requires more than just a Type: " + value, context);
}
String list = tok.nextToken();
ParseResult pr = checkForIllegalSeparator(',', list);
if (!pr.passed()) {
return pr;
}
StringTokenizer subTok = new StringTokenizer(list, LstUtils.COMMA);
Set<CDOMReference<Race>> races = new HashSet<>();
boolean foundAny = false;
while (subTok.hasMoreTokens()) {
String tokString = subTok.nextToken();
if (Constants.LST_ANY.equalsIgnoreCase(tokString)) {
foundAny = true;
races.add(context.getReferenceContext().getCDOMAllReference(Race.class));
} else if (tokString.startsWith("RACETYPE=")) {
String raceType = tokString.substring(9);
if (raceType.isEmpty()) {
return new ParseResult.Fail(getTokenName() + " Error: RaceType was not specified.", context);
}
races.add(new ObjectMatchingReference<>(tokString, Race.class, context.getReferenceContext().getCDOMAllReference(Race.class), ObjectKey.RACETYPE, RaceType.getConstant(raceType)));
} else if (tokString.startsWith("RACESUBTYPE=")) {
String raceSubType = tokString.substring(12);
if (raceSubType.isEmpty()) {
return new ParseResult.Fail(getTokenName() + " Error: RaceSubType was not specified.", context);
}
races.add(new ListMatchingReference<>(tokString, Race.class, context.getReferenceContext().getCDOMAllReference(Race.class), ListKey.RACESUBTYPE, RaceSubType.getConstant(raceSubType)));
} else if (looksLikeAPrerequisite(tokString)) {
return new ParseResult.Fail(getTokenName() + " Error: " + tokString + " found where companion race expected.", context);
} else {
races.add(context.getReferenceContext().getCDOMReference(Race.class, tokString));
}
}
if (foundAny && races.size() > 1) {
return new ParseResult.Fail("Non-sensical Race List includes Any and specific races: " + value, context);
}
if (!tok.hasMoreTokens()) {
// No other args, so we're done
finish(context, obj, companionType, races, null, null);
return ParseResult.SUCCESS;
}
// The remainder of the elements are optional.
Integer followerAdjustment = null;
String optArg = tok.nextToken();
while (true) {
if (optArg.startsWith(FOLLOWERADJUSTMENT)) {
if (followerAdjustment != null) {
return new ParseResult.Fail(getTokenName() + " Error: Multiple " + FOLLOWERADJUSTMENT + " tags specified.", context);
}
int faStringLength = FOLLOWERADJUSTMENT.length();
if (optArg.length() <= faStringLength + 1) {
return new ParseResult.Fail("Empty FOLLOWERADJUSTMENT value in " + getTokenName() + " is prohibited", context);
}
String adj = optArg.substring(faStringLength + 1);
try {
followerAdjustment = Integer.valueOf(adj);
} catch (NumberFormatException nfe) {
ComplexParseResult cpr = new ComplexParseResult();
cpr.addErrorMessage("Expecting a number for FOLLOWERADJUSTMENT: " + adj);
cpr.addErrorMessage(" was parsing Token " + getTokenName());
return cpr;
}
} else if (looksLikeAPrerequisite(optArg)) {
break;
} else {
return new ParseResult.Fail(getTokenName() + ": Unknown argument (was expecting FOLLOWERADJUSTMENT: or PRExxx): " + optArg, context);
}
if (!tok.hasMoreTokens()) {
// No prereqs, so we're done
finish(context, obj, companionType, races, followerAdjustment, null);
return ParseResult.SUCCESS;
}
optArg = tok.nextToken();
}
List<Prerequisite> prereqs = new ArrayList<>();
while (true) {
Prerequisite prereq = getPrerequisite(optArg);
if (prereq == null) {
return new ParseResult.Fail(" (Did you put items after the " + "PRExxx tags in " + getTokenName() + ":?)", context);
}
prereqs.add(prereq);
if (!tok.hasMoreTokens()) {
break;
}
optArg = tok.nextToken();
}
finish(context, obj, companionType, races, followerAdjustment, prereqs);
return ParseResult.SUCCESS;
}
use of pcgen.core.Race in project pcgen by PCGen.
the class CompanionListLst method finish.
private void finish(LoadContext context, CDOMObject obj, String companionType, Set<CDOMReference<Race>> races, Integer followerAdjustment, List<Prerequisite> prereqs) {
context.getReferenceContext().constructIfNecessary(CompanionList.class, companionType);
CDOMSingleRef<CompanionList> ref = context.getReferenceContext().getCDOMReference(CompanionList.class, companionType);
for (CDOMReference<Race> race : races) {
final FollowerOption option = new FollowerOption(race, ref);
if (prereqs != null && !prereqs.isEmpty()) {
option.addAllPrerequisites(prereqs);
}
if (followerAdjustment != null && followerAdjustment != 0) {
option.setAdjustment(followerAdjustment.intValue());
}
context.getObjectContext().addToList(obj, ListKey.COMPANIONLIST, option);
}
}
use of pcgen.core.Race in project pcgen by PCGen.
the class DomainChoiceManagerTest method test001.
/**
* Test the constructor
*/
public void test001() {
Race pObj = new Race();
pObj.setName("My PObject");
LoadContext context = Globals.getContext();
Domain foo = context.getReferenceContext().constructCDOMObject(Domain.class, "KEY_Foo");
Domain bar = context.getReferenceContext().constructCDOMObject(Domain.class, "KEY_Bar");
Domain baz = context.getReferenceContext().constructCDOMObject(Domain.class, "KEY_Baz");
Domain qux = context.getReferenceContext().constructCDOMObject(Domain.class, "KEY_Qux");
Domain quux = context.getReferenceContext().constructCDOMObject(Domain.class, "KEY_Quux");
context.unconditionallyProcess(pObj, "CHOOSE", "DOMAIN|KEY_Foo|KEY_Bar|KEY_Baz|KEY_Qux|KEY_Quux");
assertTrue(context.getReferenceContext().resolveReferences(null));
assertNotNull(pObj.get(ObjectKey.CHOOSE_INFO));
pObj.put(FormulaKey.NUMCHOICES, FormulaFactory.getFormulaFor(4));
PlayerCharacter aPC = getCharacter();
ChoiceManagerList choiceManager = ChooserUtilities.getChoiceManager(pObj, aPC);
is(choiceManager, not(eq(null)), "Found the chooser");
List<Domain> aList = new ArrayList<>();
List<Domain> sList = new ArrayList<>();
choiceManager.getChoices(aPC, aList, sList);
assertEquals(5, aList.size());
assertTrue(aList.contains(foo));
assertTrue(aList.contains(bar));
assertTrue(aList.contains(baz));
assertTrue(aList.contains(qux));
assertTrue(aList.contains(quux));
assertEquals(0, sList.size());
}
use of pcgen.core.Race in project pcgen by PCGen.
the class RaceFavClassTest method testList.
@Test
public void testList() throws PersistenceLayerException {
Race source = create(Race.class, "Source");
ParseResult result = token.parseToken(context, source, "%LIST");
if (result != ParseResult.SUCCESS) {
result.printMessages();
fail("Test Setup Failed");
}
result = CHOOSE_CLASS_TOKEN.parseToken(context, source, "Favorite");
if (result != ParseResult.SUCCESS) {
result.printMessages();
fail("Test Setup Failed");
}
finishLoad();
assertEquals(baseCount(), targetFacetCount());
raceInputFacet.set(id, source);
assertTrue(containsExpected());
assertEquals(baseCount() + 1, targetFacetCount());
raceInputFacet.remove(id);
assertEquals(baseCount(), targetFacetCount());
}
use of pcgen.core.Race in project pcgen by PCGen.
the class RaceFavClassTest method testDirect.
@Test
public void testDirect() throws PersistenceLayerException {
Race source = create(Race.class, "Source");
ParseResult result = token.parseToken(context, source, "Favorite");
if (result != ParseResult.SUCCESS) {
result.printMessages();
fail("Test Setup Failed");
}
finishLoad();
assertEquals(baseCount(), targetFacetCount());
raceFacet.directSet(id, source, getAssoc());
assertTrue(containsExpected());
assertEquals(baseCount() + 1, targetFacetCount());
raceFacet.remove(id);
assertEquals(baseCount(), targetFacetCount());
}
Aggregations