use of pcgen.persistence.lst.prereq.PreParserFactory in project pcgen by PCGen.
the class PCClass method getBonusTo.
/**
* Returns the total bonus to the specified bonus type and name.
*
* <p>
* This method checks only bonuses associated with the class. It makes sure
* to return bonuses that are active only to the max level specified. What
* that means is that bonuses specified on class level lines will have a
* level parameter associated with them. Only bonuses specified on the level
* specified or lower will be totalled.
*
* @param argType
* Bonus type e.g. <code>BONUS:<b>DOMAIN</b></code>
* @param argMname
* Bonus name e.g. <code>BONUS:DOMAIN|<b>NUMBER</b></code>
* @param asLevel
* The maximum level to apply bonuses for.
* @param aPC
* The <tt>PlayerCharacter</tt> bonuses are being calculated
* for.
*
* @return Total bonus value.
*/
/*
* REFACTOR There is potentially redundant information here - level and PC...
* is this ever out of sync or can this method be removed/made private??
*/
public double getBonusTo(final String argType, final String argMname, final int asLevel, final PlayerCharacter aPC) {
double i = 0;
List<BonusObj> rawBonusList = getRawBonusList(aPC);
for (int lvl = 1; lvl < asLevel; lvl++) {
rawBonusList.addAll(aPC.getActiveClassLevel(this, lvl).getRawBonusList(aPC));
}
if ((asLevel == 0) || rawBonusList.isEmpty()) {
return 0;
}
final String type = argType.toUpperCase();
final String mname = argMname.toUpperCase();
for (final BonusObj bonus : rawBonusList) {
final StringTokenizer breakOnPipes = new StringTokenizer(bonus.toString().toUpperCase(), Constants.PIPE, false);
final String theType = breakOnPipes.nextToken();
if (!theType.equals(type)) {
continue;
}
final String str = breakOnPipes.nextToken();
final StringTokenizer breakOnCommas = new StringTokenizer(str, Constants.COMMA, false);
while (breakOnCommas.hasMoreTokens()) {
final String theName = breakOnCommas.nextToken();
if (theName.equals(mname)) {
final String aString = breakOnPipes.nextToken();
final List<Prerequisite> localPreReqList = new ArrayList<>();
if (bonus.hasPrerequisites()) {
localPreReqList.addAll(bonus.getPrerequisiteList());
}
// as the prereqs are processed by the bonus loading code.
while (breakOnPipes.hasMoreTokens()) {
final String bString = breakOnPipes.nextToken();
if (PreParserFactory.isPreReqString(bString)) {
Logging.debugPrint(//$NON-NLS-1$ //$NON-NLS-2$//$NON-NLS-3$
"Why is this prerequisite '" + bString + "' parsed in '" + getClass().getName() + ".getBonusTo(String,String,int)' rather than in the persistence layer?");
try {
final PreParserFactory factory = PreParserFactory.getInstance();
localPreReqList.add(factory.parse(bString));
} catch (PersistenceLayerException ple) {
Logging.errorPrint(ple.getMessage(), ple);
}
}
}
// be referenced in Qualifies statements?
if (PrereqHandler.passesAll(localPreReqList, aPC, null)) {
final double j = aPC.getVariableValue(aString, getQualifiedKey()).doubleValue();
i += j;
}
}
}
}
return i;
}
use of pcgen.persistence.lst.prereq.PreParserFactory in project pcgen by PCGen.
the class GameModeFileLoader method addDefaultWieldCategories.
public static void addDefaultWieldCategories(LoadContext context) throws PersistenceLayerException {
PreParserFactory prereqParser;
try {
prereqParser = PreParserFactory.getInstance();
} catch (final PersistenceLayerException ple) {
Logging.errorPrint("Error Initializing PreParserFactory");
Logging.errorPrint(" " + ple.getMessage(), ple);
throw new UnreachableError(ple);
}
AbstractReferenceContext refContext = context.getReferenceContext();
Collection<WieldCategory> categories = refContext.getConstructedCDOMObjects(WieldCategory.class);
WieldCategory light = null;
WieldCategory twoHanded = null;
WieldCategory oneHanded = null;
WieldCategory tooLarge = null;
WieldCategory tooSmall = null;
for (final WieldCategory wc : categories) {
String name = wc.getKeyName();
if ("Light".equalsIgnoreCase(name)) {
light = wc;
}
if ("TwoHanded".equalsIgnoreCase(name)) {
twoHanded = wc;
}
if ("OneHanded".equalsIgnoreCase(name)) {
oneHanded = wc;
}
if ("TooLarge".equalsIgnoreCase(name)) {
tooLarge = wc;
}
if ("TooSmall".equalsIgnoreCase(name)) {
tooSmall = wc;
}
}
boolean buildLight = false;
if (light == null) {
light = new WieldCategory();
light.setName("Light");
refContext.importObject(light);
buildLight = true;
}
boolean buildTwoHanded = false;
if (twoHanded == null) {
twoHanded = new WieldCategory();
twoHanded.setName("TwoHanded");
refContext.importObject(twoHanded);
buildTwoHanded = true;
}
boolean buildOneHanded = false;
if (oneHanded == null) {
oneHanded = new WieldCategory();
oneHanded.setName("OneHanded");
refContext.importObject(oneHanded);
buildOneHanded = true;
}
boolean buildTooLarge = false;
if (tooLarge == null) {
tooLarge = new WieldCategory();
tooLarge.setName("TooLarge");
refContext.importObject(tooLarge);
buildTooLarge = true;
}
boolean buildTooSmall = false;
if (tooSmall == null) {
tooSmall = new WieldCategory();
tooSmall.setName("TooSmall");
refContext.importObject(tooSmall);
buildTooSmall = true;
}
CDOMDirectSingleRef<WieldCategory> tooSmallRef = CDOMDirectSingleRef.getRef(tooSmall);
CDOMDirectSingleRef<WieldCategory> lightRef = CDOMDirectSingleRef.getRef(light);
CDOMDirectSingleRef<WieldCategory> oneHandedRef = CDOMDirectSingleRef.getRef(oneHanded);
CDOMDirectSingleRef<WieldCategory> twoHandedRef = CDOMDirectSingleRef.getRef(twoHanded);
CDOMDirectSingleRef<WieldCategory> tooLargeRef = CDOMDirectSingleRef.getRef(tooLarge);
if (buildLight) {
light.setHandsRequired(1);
light.setFinessable(true);
light.addDamageMult(1, 1.0f);
light.addDamageMult(2, 1.0f);
Prerequisite p = prereqParser.parse("PREVARLTEQ:EQUIP.SIZE.INT,PC.SIZE.INT-1");
QualifiedObject<CDOMSingleRef<WieldCategory>> qo = new QualifiedObject<>(tooSmallRef);
qo.addPrerequisite(p);
light.addCategorySwitch(qo);
p = prereqParser.parse("PREVAREQ:EQUIP.SIZE.INT,PC.SIZE.INT+1");
qo = new QualifiedObject<>(oneHandedRef);
qo.addPrerequisite(p);
light.addCategorySwitch(qo);
p = prereqParser.parse("PREVAREQ:EQUIP.SIZE.INT,PC.SIZE.INT+2");
qo = new QualifiedObject<>(twoHandedRef);
qo.addPrerequisite(p);
light.addCategorySwitch(qo);
p = prereqParser.parse("PREVARGTEQ:EQUIP.SIZE.INT,PC.SIZE.INT+3");
qo = new QualifiedObject<>(tooLargeRef);
qo.addPrerequisite(p);
light.addCategorySwitch(qo);
light.setWieldCategoryStep(1, oneHandedRef);
light.setWieldCategoryStep(2, twoHandedRef);
}
if (buildTwoHanded) {
twoHanded.setFinessable(false);
twoHanded.setHandsRequired(2);
twoHanded.addDamageMult(2, 1.5f);
Prerequisite p = prereqParser.parse("PREVAREQ:EQUIP.SIZE.INT,PC.SIZE.INT-3");
QualifiedObject<CDOMSingleRef<WieldCategory>> qo = new QualifiedObject<>(tooSmallRef);
qo.addPrerequisite(p);
twoHanded.addCategorySwitch(qo);
p = prereqParser.parse("PREVAREQ:EQUIP.SIZE.INT,PC.SIZE.INT-2");
qo = new QualifiedObject<>(lightRef);
qo.addPrerequisite(p);
twoHanded.addCategorySwitch(qo);
p = prereqParser.parse("PREVAREQ:EQUIP.SIZE.INT,PC.SIZE.INT-1");
qo = new QualifiedObject<>(oneHandedRef);
qo.addPrerequisite(p);
twoHanded.addCategorySwitch(qo);
p = prereqParser.parse("PREVARGTEQ:EQUIP.SIZE.INT,PC.SIZE.INT+1");
qo = new QualifiedObject<>(tooLargeRef);
qo.addPrerequisite(p);
twoHanded.addCategorySwitch(qo);
twoHanded.setWieldCategoryStep(-2, lightRef);
twoHanded.setWieldCategoryStep(-1, oneHandedRef);
}
if (buildOneHanded) {
oneHanded.setHandsRequired(1);
oneHanded.setFinessable(false);
oneHanded.addDamageMult(1, 1.0f);
oneHanded.addDamageMult(2, 1.5f);
Prerequisite p = prereqParser.parse("PREVAREQ:EQUIP.SIZE.INT,PC.SIZE.INT-2");
QualifiedObject<CDOMSingleRef<WieldCategory>> qo = new QualifiedObject<>(tooSmallRef);
qo.addPrerequisite(p);
oneHanded.addCategorySwitch(qo);
p = prereqParser.parse("PREVAREQ:EQUIP.SIZE.INT,PC.SIZE.INT-1");
qo = new QualifiedObject<>(lightRef);
qo.addPrerequisite(p);
oneHanded.addCategorySwitch(qo);
p = prereqParser.parse("PREVAREQ:EQUIP.SIZE.INT,PC.SIZE.INT+1");
qo = new QualifiedObject<>(twoHandedRef);
qo.addPrerequisite(p);
oneHanded.addCategorySwitch(qo);
p = prereqParser.parse("PREVARGTEQ:EQUIP.SIZE.INT,PC.SIZE.INT+2");
qo = new QualifiedObject<>(tooLargeRef);
qo.addPrerequisite(p);
oneHanded.addCategorySwitch(qo);
oneHanded.setWieldCategoryStep(-1, lightRef);
oneHanded.setWieldCategoryStep(1, twoHandedRef);
}
if (buildTooLarge) {
tooLarge.setFinessable(false);
tooLarge.setHandsRequired(999);
tooLarge.setWieldCategoryStep(-3, lightRef);
tooLarge.setWieldCategoryStep(-2, oneHandedRef);
tooLarge.setWieldCategoryStep(-1, twoHandedRef);
tooLarge.setWieldCategoryStep(0, twoHandedRef);
}
if (buildTooSmall) {
tooSmall.setFinessable(false);
tooSmall.setHandsRequired(2);
tooSmall.addDamageMult(2, 1.5f);
Prerequisite p = prereqParser.parse("PREVAREQ:EQUIP.SIZE.INT,PC.SIZE.INT-3");
QualifiedObject<CDOMSingleRef<WieldCategory>> qo = new QualifiedObject<>(tooSmallRef);
qo.addPrerequisite(p);
tooSmall.addCategorySwitch(qo);
p = prereqParser.parse("PREVAREQ:EQUIP.SIZE.INT,PC.SIZE.INT-2");
qo = new QualifiedObject<>(lightRef);
qo.addPrerequisite(p);
tooSmall.addCategorySwitch(qo);
p = prereqParser.parse("PREVAREQ:EQUIP.SIZE.INT,PC.SIZE.INT-1");
qo = new QualifiedObject<>(oneHandedRef);
qo.addPrerequisite(p);
tooSmall.addCategorySwitch(qo);
p = prereqParser.parse("PREVARGTEQ:EQUIP.SIZE.INT,PC.SIZE.INT+1");
qo = new QualifiedObject<>(tooLargeRef);
qo.addPrerequisite(p);
tooSmall.addCategorySwitch(qo);
tooSmall.setWieldCategoryStep(-2, lightRef);
tooSmall.setWieldCategoryStep(-1, oneHandedRef);
}
}
use of pcgen.persistence.lst.prereq.PreParserFactory in project pcgen by PCGen.
the class PreShieldProfTest method testShieldProfAddedWithAutoShieldProf.
/**
* Test the PREPROFWITHSHIELD with shieldprofs added by a AUTO:SHIELDPROF tag
* This is probably more an integration test than a unit test
*
* @throws Exception the exception
*/
public void testShieldProfAddedWithAutoShieldProf() throws Exception {
final PlayerCharacter character = getCharacter();
Prerequisite prereq;
final PreParserFactory factory = PreParserFactory.getInstance();
prereq = factory.parse("PREPROFWITHSHIELD:1,Heavy Steel Shield");
assertFalse("Character has no proficiencies", PrereqHandler.passes(prereq, character, null));
final Ability martialProf = TestHelper.makeAbility("Shield Proficiency (Single)", AbilityCategory.FEAT, "General");
Globals.getContext().unconditionallyProcess(martialProf, "AUTO", "SHIELDPROF|SHIELDTYPE.Heavy");
AbstractCharacterTestCase.applyAbility(character, AbilityCategory.FEAT, martialProf, null);
assertTrue("Character has the Heavy Steel Shield proficiency.", PrereqHandler.passes(prereq, character, null));
prereq = factory.parse("PREPROFWITHSHIELD:1,Heavy Wooden Shield");
assertTrue("Character has the Heavy Wooden Shield proficiency.", PrereqHandler.passes(prereq, character, null));
prereq = factory.parse("PREPROFWITHSHIELD:1,Light Wooden Shield");
assertFalse("Character does not have the Light Wooden Shield proficiency.", PrereqHandler.passes(prereq, character, null));
prereq = factory.parse("PREPROFWITHSHIELD:1,TYPE.Heavy");
assertTrue("Character has heavy shield prof.", PrereqHandler.passes(prereq, character, null));
}
use of pcgen.persistence.lst.prereq.PreParserFactory in project pcgen by PCGen.
the class PreShieldProfTest method testType.
/**
* Test a PREPROFWITHSHIELD that checks for a number of profs of a certain type.
*
* @throws Exception the exception
*/
public void testType() throws Exception {
final PlayerCharacter character = getCharacter();
Globals.getContext().getReferenceContext().constructCDOMObject(Equipment.class, "A Shield");
Prerequisite prereq;
final PreParserFactory factory = PreParserFactory.getInstance();
prereq = factory.parse("PREPROFWITHSHIELD:1,TYPE.Medium");
assertFalse("Character has no proficiencies", PrereqHandler.passes(prereq, character, null));
final Ability martialProf = TestHelper.makeAbility("Shield Proficiency (Single)", "FEAT", "General");
Globals.getContext().unconditionallyProcess(martialProf, "AUTO", "SHIELDPROF|SHIELDTYPE=Medium");
Globals.getContext().getReferenceContext().resolveReferences(null);
AbstractCharacterTestCase.applyAbility(character, AbilityCategory.FEAT, martialProf, null);
assertTrue("Character has Medium Shield Proficiency", PrereqHandler.passes(prereq, character, null));
}
use of pcgen.persistence.lst.prereq.PreParserFactory in project pcgen by PCGen.
the class PreShieldProfTest method testOneOption.
/**
* Test with a simple shield proficiency.
*
* @throws Exception the exception
*/
public void testOneOption() throws Exception {
final PlayerCharacter character = getCharacter();
Prerequisite prereq;
final PreParserFactory factory = PreParserFactory.getInstance();
prereq = factory.parse("PREPROFWITHSHIELD:1,Heavy Wooden Shield");
assertFalse("Character has no proficiencies", PrereqHandler.passes(prereq, character, null));
final Ability martialProf = TestHelper.makeAbility("Shield Proficiency (Single)", "FEAT", "General");
Globals.getContext().unconditionallyProcess(martialProf, "AUTO", "SHIELDPROF|Heavy Wooden Shield");
Globals.getContext().unconditionallyProcess(martialProf, "AUTO", "SHIELDPROF|Heavy Steel Shield");
assertTrue(Globals.getContext().getReferenceContext().resolveReferences(null));
AbstractCharacterTestCase.applyAbility(character, AbilityCategory.FEAT, martialProf, null);
assertTrue("Character has the Heavy Wooden Shield proficiency.", PrereqHandler.passes(prereq, character, null));
prereq = factory.parse("PREPROFWITHSHIELD:1,Light Wooden Shield");
assertFalse("Character does not have the Light Wooden Shield proficiency", PrereqHandler.passes(prereq, character, null));
prereq = factory.parse("PREPROFWITHSHIELD:1,Heavy Steel Shield");
assertTrue("Character has the Heavy Steel Shield proficiency.", PrereqHandler.passes(prereq, character, null));
}
Aggregations