From: <jde...@us...> - 2007-10-18 13:10:33
|
Revision: 4331 http://pcgen.svn.sourceforge.net/pcgen/?rev=4331&view=rev Author: jdempsey Date: 2007-10-18 06:10:33 -0700 (Thu, 18 Oct 2007) Log Message: ----------- Fix bug: PREABILITY doesn't match category - Same problem was affecting PREFEAT. Refactor so there is only one set of code. Issue#: 1796835 Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/prereq/PrerequisiteUtilities.java Trunk/pcgen/code/src/java/plugin/pretokens/test/PreAbilityTester.java Trunk/pcgen/code/src/java/plugin/pretokens/test/PreFeatTester.java Modified: Trunk/pcgen/code/src/java/pcgen/core/prereq/PrerequisiteUtilities.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/prereq/PrerequisiteUtilities.java 2007-10-18 11:56:30 UTC (rev 4330) +++ Trunk/pcgen/code/src/java/pcgen/core/prereq/PrerequisiteUtilities.java 2007-10-18 13:10:33 UTC (rev 4331) @@ -26,13 +26,23 @@ import java.io.StringWriter; import java.util.ArrayList; +import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.StringTokenizer; + +import pcgen.core.Ability; +import pcgen.core.AbilityCategory; +import pcgen.core.Domain; import pcgen.core.Equipment; +import pcgen.core.EquipmentList; +import pcgen.core.Globals; import pcgen.core.PObject; import pcgen.core.PlayerCharacter; import pcgen.core.SettingsHandler; +import pcgen.core.Skill; +import pcgen.core.WeaponProf; +import pcgen.core.spell.Spell; import pcgen.persistence.PersistenceLayerException; import pcgen.persistence.lst.output.prereq.PrerequisiteWriter; import pcgen.util.Logging; @@ -176,4 +186,362 @@ return sBuff.toString(); } + + /** + * Check if the character passes the ability prerequisite. Refactored here + * for use by both PREFEAT and PREABILITY. + * + * @param prereq The prerequisite to be run. + * @param character The character to be checked. + * @param countMults Should multiple occurrences be counted. + * @param numMatches The number of matches required. + * @param key The key that needs to be matched + * @param subKey The sub key that needs to be matched. + * @param categoryName The name of the required category, null if any category will be matched. + * @param category The category to be matched + * @return The number of matches made, 0 if not enough matches were made. + */ + public static int passesAbilityTest(final Prerequisite prereq, + final PlayerCharacter character, final boolean countMults, + final int numMatches, String key, String subKey, String categoryName, + AbilityCategory category) + { + final boolean keyIsAny = + key.equalsIgnoreCase("ANY"); //$NON-NLS-1$ + final boolean keyIsType = + key.startsWith("TYPE=") || key.startsWith("TYPE."); //$NON-NLS-1$ //$NON-NLS-2$ + final boolean subKeyIsType = + subKey != null + && (subKey.startsWith("TYPE=") || subKey.startsWith("TYPE.")); //$NON-NLS-1$ //$NON-NLS-2$ + if (keyIsType) + { + key = key.substring(5); + } + if (subKeyIsType) + { + subKey = subKey.substring(5); + } + + int runningTotal = 0; + final List<Ability> abilityList = + buildAbilityList(character, categoryName, category); + if (!abilityList.isEmpty()) + { + for (Ability ability : abilityList) + { + final String abilityKey = ability.getKeyName(); + if (keyIsAny || (!keyIsType && abilityKey.equalsIgnoreCase(key)) + || (keyIsType && ability.isType(key))) + { + // either this feat has matched on the name, or the type + + if (subKey != null) + { + runningTotal += + checkForSubKeyMatch(character, countMults, key, + subKey, subKeyIsType, ability); + } + else + { + // Subkey == null + + runningTotal++; + if (ability.isMultiples() && countMults) + { + runningTotal += (ability.getAssociatedCount() - 1); + } + } + } + else + { + if (subKey != null) + { + final String s1 = key + " (" + subKey + ")"; + final String s2 = key + "(" + subKey + ")"; + if (abilityKey.equalsIgnoreCase(s1) + || ability.getKeyName().equalsIgnoreCase(s2)) + { + runningTotal++; + if (!countMults) + { + break; + } + } + } + } + } + } + + runningTotal = prereq.getOperator().compare(runningTotal, numMatches); + return runningTotal; + } + + /** + * Having matched the ability on the other criteria, check for a match + * against the sub-key. + * + * @param character The character being tested. + * @param countMults Should multiple occurrences be counted? + * @param key The key that needs to be matched + * @param subKey The sub key that needs to be matched. + * @param subKeyIsType Does the subkey refer to a type? + * @param aFeat The ability being checked for a match. + * @return The number of matches made + */ + private static int checkForSubKeyMatch(final PlayerCharacter character, final boolean countMults, String key, String subKey, final boolean subKeyIsType, Ability aFeat) + { + final String cType = subKey; + final List availableList = new ArrayList(); + final List selectedList = new ArrayList(); + final String aChoiceString = aFeat.getChoiceString(); + int runningTotal = 0; + + aFeat.modChoices(availableList, selectedList, false, + character, true, null); + availableList.clear(); + + if (subKeyIsType) // TYPE syntax + { + if (aChoiceString.startsWith("SKILL")) //$NON-NLS-1$ + { + runningTotal = + subKeySkill(countMults, runningTotal, + cType, selectedList); + } + else if (aChoiceString.startsWith("WEAPONPROFS")) //$NON-NLS-1$ + { + runningTotal = + subKeyWeaponProf(countMults, + runningTotal, cType, selectedList); + } + else if (aChoiceString.startsWith("DOMAIN")) //$NON-NLS-1$ + { + runningTotal = + subKeyDomain(countMults, runningTotal, + cType, selectedList); + } + else if (aChoiceString.startsWith("SPELL")) //$NON-NLS-1$ + { + runningTotal = + subKeySpell(countMults, runningTotal, + cType, selectedList); + } + // End. subKeyIsType + } + else + { + if (aFeat.getKeyName().equalsIgnoreCase(key) + && aFeat.containsAssociated(subKey)) + { + runningTotal++; + if (aFeat.isMultiples() && countMults) + { + runningTotal += + (aFeat.getAssociatedCount() - 1); + } + } + else + { + final int wildCardPos = subKey.indexOf('%'); + + if (wildCardPos > -1) + { + for (int k = 0; k < aFeat + .getAssociatedCount(); ++k) + { + + final String fString = + aFeat.getAssociated(k) + .toUpperCase(); + if (wildCardPos == 0 + || fString.startsWith(subKey + .substring(0, wildCardPos - 1) + .toUpperCase())) + { + runningTotal++; + if (!countMults) + { + break; + } + } + } + } + } + } + return runningTotal; + } + + /** + * Build up a list of the character's abilities which match the category requirements. + * @param character The character to be tested. + * @param categoryName The name of the required category, null if any category will be matched. + * @param category The category to be matched + * @return A list of categories matching. + */ + private static List<Ability> buildAbilityList(final PlayerCharacter character, String categoryName, AbilityCategory category) + { + final List<Ability> abilityList = new ArrayList<Ability>(); + if (character != null) + { + Collection<AbilityCategory> allCats = SettingsHandler.getGame().getAllAbilityCategories(); + if (categoryName == null) + { + for (AbilityCategory aCat : allCats) + { + abilityList.addAll(character.getAggregateAbilityList(aCat)); + } + } + else + { + for (AbilityCategory aCat : allCats) + { + if (aCat.getAbilityCategory().equals(categoryName)) + { + abilityList.addAll(character.getAggregateAbilityList(aCat)); + } + } + } + } + return abilityList; + } + + /** + * @param countMults + * @param runningTotal + * @param cType + * @param selectedList + * @return int + */ + private static int subKeySpell(final boolean countMults, int runningTotal, + final String cType, final List selectedList) + { + int returnTotal = runningTotal; + for (Object aObj : selectedList) + { + final Spell sp; + String spellKey = null; + if (aObj instanceof PObject) + { + spellKey = ((PObject) aObj).getKeyName(); + } + else + { + spellKey = aObj.toString(); + } + sp = Globals.getSpellKeyed(spellKey); + if (sp == null) + { + continue; + } + if (sp.isType(cType)) + { + returnTotal++; + if (!countMults) + { + break; + } + } + } + return returnTotal; + } + + /** + * @param countMults + * @param runningTotal + * @param cType + * @param selectedList + * @return int + */ + private static int subKeyDomain(final boolean countMults, int runningTotal, + final String cType, final List selectedList) + { + int returnTotal = runningTotal; + for (Object aObj : selectedList) + { + final Domain dom; + dom = Globals.getDomainKeyed(aObj.toString()); + if (dom == null) + { + continue; + } + if (dom.isType(cType)) + { + returnTotal++; + if (!countMults) + { + break; + } + } + } + return returnTotal; + } + + /** + * @param countMults + * @param runningTotal + * @param cType + * @param selectedList + * @return int + */ + private static int subKeyWeaponProf(final boolean countMults, int runningTotal, + final String cType, final List selectedList) + { + int returnTotal = runningTotal; + for (Object aObj : selectedList) + { + final WeaponProf wp; + wp = Globals.getWeaponProfKeyed(aObj.toString()); + if (wp == null) + { + continue; + } + final Equipment eq; + eq = EquipmentList.getEquipmentKeyed(wp.getKeyName()); + if (eq == null) + { + continue; + } + if (eq.isType(cType)) + { + returnTotal++; + if (!countMults) + { + break; + } + } + } + return returnTotal; + } + + /** + * @param countMults + * @param runningTotal + * @param cType + * @param selectedList + * @return int + */ + private static int subKeySkill(final boolean countMults, int runningTotal, + final String cType, final List selectedList) + { + int returnTotal = runningTotal; + for (Object aObj : selectedList) + { + final Skill sk; + sk = Globals.getSkillKeyed(aObj.toString()); + if (sk == null) + { + continue; + } + if (sk.isType(cType)) + { + returnTotal++; + if (!countMults) + { + break; + } + } + } + return returnTotal; + } + } Modified: Trunk/pcgen/code/src/java/plugin/pretokens/test/PreAbilityTester.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/pretokens/test/PreAbilityTester.java 2007-10-18 11:56:30 UTC (rev 4330) +++ Trunk/pcgen/code/src/java/plugin/pretokens/test/PreAbilityTester.java 2007-10-18 13:10:33 UTC (rev 4331) @@ -25,16 +25,16 @@ */ package plugin.pretokens.test; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -import pcgen.core.*; +import pcgen.core.AbilityCategory; +import pcgen.core.Equipment; +import pcgen.core.GameMode; +import pcgen.core.PlayerCharacter; +import pcgen.core.SettingsHandler; import pcgen.core.prereq.AbstractPrerequisiteTest; import pcgen.core.prereq.Prerequisite; import pcgen.core.prereq.PrerequisiteException; import pcgen.core.prereq.PrerequisiteTest; -import pcgen.core.spell.Spell; +import pcgen.core.prereq.PrerequisiteUtilities; import pcgen.util.PropertyFactory; /** @@ -87,344 +87,12 @@ String subKey = prereq.getSubKey(); String categoryName = prereq.getCategoryName(); AbilityCategory category = gameMode.getAbilityCategory(categoryName); - final boolean keyIsAny = - key.equalsIgnoreCase("ANY"); //$NON-NLS-1$ - final boolean keyIsType = - key.startsWith("TYPE=") || key.startsWith("TYPE."); //$NON-NLS-1$ //$NON-NLS-2$ - final boolean subKeyIsType = - subKey != null - && (subKey.startsWith("TYPE=") || subKey.startsWith("TYPE.")); //$NON-NLS-1$ //$NON-NLS-2$ - if (keyIsType) - { - key = key.substring(5); - } - if (subKeyIsType) - { - subKey = subKey.substring(5); - } - - int runningTotal = 0; - final List<Ability> abilityList = - buildAbilityList(character, categoryName, category); - if (!abilityList.isEmpty()) - { - for (Ability ability : abilityList) - { - final String abilityKey = ability.getKeyName(); - if (keyIsAny || (!keyIsType && abilityKey.equalsIgnoreCase(key)) - || (keyIsType && ability.isType(key))) - { - // either this feat has matched on the name, or the type - - if (subKey != null) - { - runningTotal += - checkForSubKeyMatch(character, countMults, key, - subKey, subKeyIsType, ability); - } - else - { - // Subkey == null - - runningTotal++; - if (ability.isMultiples() && countMults) - { - runningTotal += (ability.getAssociatedCount() - 1); - } - } - } - else - { - if (subKey != null) - { - final String s1 = key + " (" + subKey + ")"; - final String s2 = key + "(" + subKey + ")"; - if (abilityKey.equalsIgnoreCase(s1) - || ability.getKeyName().equalsIgnoreCase(s2)) - { - runningTotal++; - if (!countMults) - { - break; - } - } - } - } - } - } - - runningTotal = prereq.getOperator().compare(runningTotal, number); + int runningTotal = + PrerequisiteUtilities.passesAbilityTest(prereq, character, + countMults, number, key, subKey, categoryName, category); return countedTotal(prereq, runningTotal); } - /** - * Having matched the ability on the other criteria, check for a match - * against the sub-key. - * - * @param character The character being tested. - * @param countMults Should multiple occurrences be counted? - * @param key The key that needs to be matched - * @param subKey The sub key that needs to be matched. - * @param subKeyIsType Does the subkey refer to a type? - * @param aFeat The ability being checked for a match. - * @return The number of matches made - */ - private int checkForSubKeyMatch(final PlayerCharacter character, final boolean countMults, String key, String subKey, final boolean subKeyIsType, Ability aFeat) - { - final String cType = subKey; - final List availableList = new ArrayList(); - final List selectedList = new ArrayList(); - final String aChoiceString = aFeat.getChoiceString(); - int runningTotal = 0; - - aFeat.modChoices(availableList, selectedList, false, - character, true, null); - availableList.clear(); - - if (subKeyIsType) // TYPE syntax - { - if (aChoiceString.startsWith("SKILL")) //$NON-NLS-1$ - { - runningTotal = - subKeySkill(countMults, runningTotal, - cType, selectedList); - } - else if (aChoiceString.startsWith("WEAPONPROFS")) //$NON-NLS-1$ - { - runningTotal = - subKeyWeaponProf(countMults, - runningTotal, cType, selectedList); - } - else if (aChoiceString.startsWith("DOMAIN")) //$NON-NLS-1$ - { - runningTotal = - subKeyDomain(countMults, runningTotal, - cType, selectedList); - } - else if (aChoiceString.startsWith("SPELL")) //$NON-NLS-1$ - { - runningTotal = - subKeySpell(countMults, runningTotal, - cType, selectedList); - } - // End. subKeyIsType - } - else - { - if (aFeat.getKeyName().equalsIgnoreCase(key) - && aFeat.containsAssociated(subKey)) - { - runningTotal++; - if (aFeat.isMultiples() && countMults) - { - runningTotal += - (aFeat.getAssociatedCount() - 1); - } - } - else - { - final int wildCardPos = subKey.indexOf('%'); - - if (wildCardPos > -1) - { - for (int k = 0; k < aFeat - .getAssociatedCount(); ++k) - { - - final String fString = - aFeat.getAssociated(k) - .toUpperCase(); - if (wildCardPos == 0 - || fString.startsWith(subKey - .substring(0, wildCardPos - 1) - .toUpperCase())) - { - runningTotal++; - if (!countMults) - { - break; - } - } - } - } - } - } - return runningTotal; - } - - /** - * Build up a list of the character's abilities which match the category requirements. - * @param character The character to be tested. - * @param categoryName The name of the required category, null if any category will be matched. - * @param category The category to be matched - * @return A list of categories matching. - */ - private List<Ability> buildAbilityList(final PlayerCharacter character, String categoryName, AbilityCategory category) - { - final List<Ability> abilityList = new ArrayList<Ability>(); - if (character != null) - { - Collection<AbilityCategory> allCats = SettingsHandler.getGame().getAllAbilityCategories(); - if (categoryName == null) - { - for (AbilityCategory aCat : allCats) - { - abilityList.addAll(character.getAggregateAbilityList(aCat)); - } - } - else - { - for (AbilityCategory aCat : allCats) - { - if (aCat.getAbilityCategory().equals(category.getKeyName())) - { - abilityList.addAll(character.getAggregateAbilityList(aCat)); - } - } - } - } - return abilityList; - } - - /** - * @param countMults - * @param runningTotal - * @param cType - * @param selectedList - * @return int - */ - private int subKeySpell(final boolean countMults, int runningTotal, - final String cType, final List selectedList) - { - int returnTotal = runningTotal; - for (Object aObj : selectedList) - { - final Spell sp; - String spellKey = null; - if (aObj instanceof PObject) - { - spellKey = ((PObject) aObj).getKeyName(); - } - else - { - spellKey = aObj.toString(); - } - sp = Globals.getSpellKeyed(spellKey); - if (sp == null) - { - continue; - } - if (sp.isType(cType)) - { - returnTotal++; - if (!countMults) - { - break; - } - } - } - return returnTotal; - } - - /** - * @param countMults - * @param runningTotal - * @param cType - * @param selectedList - * @return int - */ - private int subKeyDomain(final boolean countMults, int runningTotal, - final String cType, final List selectedList) - { - int returnTotal = runningTotal; - for (Object aObj : selectedList) - { - final Domain dom; - dom = Globals.getDomainKeyed(aObj.toString()); - if (dom == null) - { - continue; - } - if (dom.isType(cType)) - { - returnTotal++; - if (!countMults) - { - break; - } - } - } - return returnTotal; - } - - /** - * @param countMults - * @param runningTotal - * @param cType - * @param selectedList - * @return int - */ - private int subKeyWeaponProf(final boolean countMults, int runningTotal, - final String cType, final List selectedList) - { - int returnTotal = runningTotal; - for (Object aObj : selectedList) - { - final WeaponProf wp; - wp = Globals.getWeaponProfKeyed(aObj.toString()); - if (wp == null) - { - continue; - } - final Equipment eq; - eq = EquipmentList.getEquipmentKeyed(wp.getKeyName()); - if (eq == null) - { - continue; - } - if (eq.isType(cType)) - { - returnTotal++; - if (!countMults) - { - break; - } - } - } - return returnTotal; - } - - /** - * @param countMults - * @param runningTotal - * @param cType - * @param selectedList - * @return int - */ - private int subKeySkill(final boolean countMults, int runningTotal, - final String cType, final List selectedList) - { - int returnTotal = runningTotal; - for (Object aObj : selectedList) - { - final Skill sk; - sk = Globals.getSkillKeyed(aObj.toString()); - if (sk == null) - { - continue; - } - if (sk.isType(cType)) - { - returnTotal++; - if (!countMults) - { - break; - } - } - } - return returnTotal; - } - @Override public String toHtmlString(final Prerequisite prereq) { Modified: Trunk/pcgen/code/src/java/plugin/pretokens/test/PreFeatTester.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/pretokens/test/PreFeatTester.java 2007-10-18 11:56:30 UTC (rev 4330) +++ Trunk/pcgen/code/src/java/plugin/pretokens/test/PreFeatTester.java 2007-10-18 13:10:33 UTC (rev 4331) @@ -6,24 +6,14 @@ */ package plugin.pretokens.test; -import java.util.ArrayList; -import java.util.List; - -import pcgen.core.Ability; import pcgen.core.AbilityCategory; -import pcgen.core.Domain; import pcgen.core.Equipment; -import pcgen.core.EquipmentList; -import pcgen.core.Globals; import pcgen.core.PlayerCharacter; -import pcgen.core.PObject; -import pcgen.core.Skill; -import pcgen.core.WeaponProf; import pcgen.core.prereq.AbstractPrerequisiteTest; import pcgen.core.prereq.Prerequisite; import pcgen.core.prereq.PrerequisiteException; import pcgen.core.prereq.PrerequisiteTest; -import pcgen.core.spell.Spell; +import pcgen.core.prereq.PrerequisiteUtilities; import pcgen.util.PropertyFactory; /** @@ -74,287 +64,13 @@ String key = prereq.getKey(); String subKey = prereq.getSubKey(); - final boolean keyIsType = - key.startsWith("TYPE=") || key.startsWith("TYPE."); //$NON-NLS-1$ //$NON-NLS-2$ - final boolean subKeyIsType = - subKey != null - && (subKey.startsWith("TYPE=") || subKey.startsWith("TYPE.")); //$NON-NLS-1$ //$NON-NLS-2$ - if (keyIsType) - { - key = key.substring(5); - } - if (subKeyIsType) - { - subKey = subKey.substring(5); - } - - int runningTotal = 0; - final List<Ability> aFeatList = - character != null ? character.aggregateFeatList() : null; - if ((aFeatList != null) && !aFeatList.isEmpty()) - { - for (Ability aFeat : aFeatList) - { - final String featKey = aFeat.getKeyName(); - if ((!keyIsType && featKey.equalsIgnoreCase(key)) - || (keyIsType && aFeat.isType(key))) - { - // either this feat has matched on the name, or the type - - if (subKey != null) - { - final String cType = subKey; - final List availableList = new ArrayList(); - final List selectedList = new ArrayList(); - final String aChoiceString = aFeat.getChoiceString(); - - aFeat.modChoices(availableList, selectedList, false, - character, true, AbilityCategory.FEAT); - availableList.clear(); - - if (subKeyIsType) // TYPE syntax - { - if (aChoiceString.startsWith("SKILL")) //$NON-NLS-1$ - { - runningTotal = - subKeySkill(countMults, runningTotal, - cType, selectedList); - } - else if (aChoiceString.startsWith("WEAPONPROFS")) //$NON-NLS-1$ - { - runningTotal = - subKeyWeaponProf(countMults, - runningTotal, cType, selectedList); - } - else if (aChoiceString.startsWith("DOMAIN")) //$NON-NLS-1$ - { - runningTotal = - subKeyDomain(countMults, runningTotal, - cType, selectedList); - } - else if (aChoiceString.startsWith("SPELL")) //$NON-NLS-1$ - { - runningTotal = - subKeySpell(countMults, runningTotal, - cType, selectedList); - } - // End. subKeyIsType - } - else - { - if (featKey.equalsIgnoreCase(key) - && aFeat.containsAssociated(subKey)) - { - runningTotal++; - if (aFeat.isMultiples() && countMults) - { - runningTotal += - (aFeat.getAssociatedCount() - 1); - } - } - else - { - final int wildCardPos = subKey.indexOf('%'); - - if (wildCardPos > -1) - { - for (int k = 0; k < aFeat - .getAssociatedCount(); ++k) - { - - final String fString = - aFeat.getAssociated(k) - .toUpperCase(); - if (wildCardPos == 0 - || fString.startsWith(subKey - .substring(0, wildCardPos - 1) - .toUpperCase())) - { - runningTotal++; - if (!countMults) - { - break; - } - } - } - } - } - } - } - else - { - // Subkey == null - - runningTotal++; - if (aFeat.isMultiples() && countMults) - { - runningTotal += (aFeat.getAssociatedCount() - 1); - } - } - } - else - { - if (subKey != null) - { - final String s1 = key + " (" + subKey + ")"; - final String s2 = key + "(" + subKey + ")"; - if (featKey.equalsIgnoreCase(s1) - || aFeat.getKeyName().equalsIgnoreCase(s2)) - { - runningTotal++; - if (!countMults) - { - break; - } - } - } - } - } - } - - runningTotal = prereq.getOperator().compare(runningTotal, number); + int runningTotal = + PrerequisiteUtilities.passesAbilityTest(prereq, character, + countMults, number, key, subKey, AbilityCategory.FEAT + .getKeyName(), AbilityCategory.FEAT); return countedTotal(prereq, runningTotal); } - /** - * @param countMults - * @param runningTotal - * @param cType - * @param selectedList - * @return int - */ - private int subKeySpell(final boolean countMults, int runningTotal, - final String cType, final List selectedList) - { - int returnTotal = runningTotal; - for (Object aObj : selectedList) - { - final Spell sp; - String spellKey = null; - if (aObj instanceof PObject) - { - spellKey = ((PObject) aObj).getKeyName(); - } - else - { - spellKey = aObj.toString(); - } - sp = Globals.getSpellKeyed(spellKey); - if (sp == null) - { - continue; - } - if (sp.isType(cType)) - { - returnTotal++; - if (!countMults) - { - break; - } - } - } - return returnTotal; - } - - /** - * @param countMults - * @param runningTotal - * @param cType - * @param selectedList - * @return int - */ - private int subKeyDomain(final boolean countMults, int runningTotal, - final String cType, final List selectedList) - { - int returnTotal = runningTotal; - for (Object aObj : selectedList) - { - final Domain dom; - dom = Globals.getDomainKeyed(aObj.toString()); - if (dom == null) - { - continue; - } - if (dom.isType(cType)) - { - returnTotal++; - if (!countMults) - { - break; - } - } - } - return returnTotal; - } - - /** - * @param countMults - * @param runningTotal - * @param cType - * @param selectedList - * @return int - */ - private int subKeyWeaponProf(final boolean countMults, int runningTotal, - final String cType, final List selectedList) - { - int returnTotal = runningTotal; - for (Object aObj : selectedList) - { - final WeaponProf wp; - wp = Globals.getWeaponProfKeyed(aObj.toString()); - if (wp == null) - { - continue; - } - final Equipment eq; - eq = EquipmentList.getEquipmentKeyed(wp.getKeyName()); - if (eq == null) - { - continue; - } - if (eq.isType(cType)) - { - returnTotal++; - if (!countMults) - { - break; - } - } - } - return returnTotal; - } - - /** - * @param countMults - * @param runningTotal - * @param cType - * @param selectedList - * @return int - */ - private int subKeySkill(final boolean countMults, int runningTotal, - final String cType, final List selectedList) - { - int returnTotal = runningTotal; - for (Object aObj : selectedList) - { - final Skill sk; - sk = Globals.getSkillKeyed(aObj.toString()); - if (sk == null) - { - continue; - } - if (sk.isType(cType)) - { - returnTotal++; - if (!countMults) - { - break; - } - } - } - return returnTotal; - } - @Override public String toHtmlString(final Prerequisite prereq) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jde...@us...> - 2007-10-24 12:58:45
|
Revision: 4405 http://pcgen.svn.sourceforge.net/pcgen/?rev=4405&view=rev Author: jdempsey Date: 2007-10-24 05:58:49 -0700 (Wed, 24 Oct 2007) Log Message: ----------- Correct ability tokens to report on all ability categories based on a category (so feats even if they came from fighter feats). Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/io/exporttoken/AbilityToken.java Trunk/pcgen/code/src/java/plugin/exporttokens/AbilityAllToken.java Trunk/pcgen/code/src/java/plugin/exporttokens/AbilityAutoToken.java Trunk/pcgen/code/src/java/plugin/exporttokens/VAbilityToken.java Modified: Trunk/pcgen/code/src/java/pcgen/io/exporttoken/AbilityToken.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/exporttoken/AbilityToken.java 2007-10-24 12:56:43 UTC (rev 4404) +++ Trunk/pcgen/code/src/java/pcgen/io/exporttoken/AbilityToken.java 2007-10-24 12:58:49 UTC (rev 4405) @@ -24,6 +24,7 @@ package pcgen.io.exporttoken; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.StringTokenizer; @@ -382,10 +383,15 @@ protected List<Ability> getAbilityList(PlayerCharacter pc, final AbilityCategory aCategory) { - List<Ability> abilityList = new ArrayList<Ability>(); - for (Ability aAbility : pc.getRealAbilityList(aCategory)) + final List<Ability> abilityList = new ArrayList<Ability>(); + Collection<AbilityCategory> allCats = + SettingsHandler.getGame().getAllAbilityCategories(); + for (AbilityCategory aCat : allCats) { - abilityList.add(aAbility); + if (aCat.getAbilityCategory().equals(aCategory.getKeyName())) + { + abilityList.addAll(pc.getRealAbilitiesList(aCat)); + } } return abilityList; } Modified: Trunk/pcgen/code/src/java/plugin/exporttokens/AbilityAllToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/exporttokens/AbilityAllToken.java 2007-10-24 12:56:43 UTC (rev 4404) +++ Trunk/pcgen/code/src/java/plugin/exporttokens/AbilityAllToken.java 2007-10-24 12:58:49 UTC (rev 4405) @@ -24,11 +24,13 @@ package plugin.exporttokens; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import pcgen.core.Ability; import pcgen.core.AbilityCategory; import pcgen.core.PlayerCharacter; +import pcgen.core.SettingsHandler; import pcgen.io.ExportHandler; import pcgen.io.exporttoken.AbilityToken; @@ -71,9 +73,17 @@ final AbilityCategory aCategory) { List<Ability> ret = new ArrayList<Ability>(); - ret.addAll(pc.getRealAbilitiesListAnyCat(aCategory)); - ret.addAll(pc.getAutomaticAbilityList(aCategory)); - ret.addAll(pc.getVirtualAbilityList(aCategory)); + Collection<AbilityCategory> allCats = + SettingsHandler.getGame().getAllAbilityCategories(); + for (AbilityCategory aCat : allCats) + { + if (aCat.getAbilityCategory().equals(aCategory.getKeyName())) + { + ret.addAll(pc.getRealAbilitiesListAnyCat(aCat)); + ret.addAll(pc.getAutomaticAbilityList(aCat)); + ret.addAll(pc.getVirtualAbilityList(aCat)); + } + } return ret; } } Modified: Trunk/pcgen/code/src/java/plugin/exporttokens/AbilityAutoToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/exporttokens/AbilityAutoToken.java 2007-10-24 12:56:43 UTC (rev 4404) +++ Trunk/pcgen/code/src/java/plugin/exporttokens/AbilityAutoToken.java 2007-10-24 12:58:49 UTC (rev 4405) @@ -23,11 +23,14 @@ package plugin.exporttokens; +import java.util.ArrayList; +import java.util.Collection; import java.util.List; import pcgen.core.Ability; import pcgen.core.AbilityCategory; import pcgen.core.PlayerCharacter; +import pcgen.core.SettingsHandler; import pcgen.io.exporttoken.AbilityToken; /** @@ -60,6 +63,16 @@ protected List<Ability> getAbilityList(PlayerCharacter pc, final AbilityCategory aCategory) { - return pc.getAutomaticAbilityList(aCategory); + final List<Ability> abilityList = new ArrayList<Ability>(); + Collection<AbilityCategory> allCats = + SettingsHandler.getGame().getAllAbilityCategories(); + for (AbilityCategory aCat : allCats) + { + if (aCat.getAbilityCategory().equals(aCategory.getKeyName())) + { + abilityList.addAll(pc.getAutomaticAbilityList(aCat)); + } + } + return abilityList; } } Modified: Trunk/pcgen/code/src/java/plugin/exporttokens/VAbilityToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/exporttokens/VAbilityToken.java 2007-10-24 12:56:43 UTC (rev 4404) +++ Trunk/pcgen/code/src/java/plugin/exporttokens/VAbilityToken.java 2007-10-24 12:58:49 UTC (rev 4405) @@ -23,11 +23,14 @@ package plugin.exporttokens; +import java.util.ArrayList; +import java.util.Collection; import java.util.List; import pcgen.core.Ability; import pcgen.core.AbilityCategory; import pcgen.core.PlayerCharacter; +import pcgen.core.SettingsHandler; import pcgen.io.exporttoken.AbilityToken; /** @@ -58,6 +61,16 @@ protected List<Ability> getAbilityList(PlayerCharacter pc, final AbilityCategory aCategory) { - return pc.getVirtualFeatList(); + final List<Ability> abilityList = new ArrayList<Ability>(); + Collection<AbilityCategory> allCats = + SettingsHandler.getGame().getAllAbilityCategories(); + for (AbilityCategory aCat : allCats) + { + if (aCat.getAbilityCategory().equals(aCategory.getKeyName())) + { + abilityList.addAll(pc.getVirtualAbilityList(aCat)); + } + } + return abilityList; } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <nu...@us...> - 2007-10-28 06:51:11
|
Revision: 4449 http://pcgen.svn.sourceforge.net/pcgen/?rev=4449&view=rev Author: nuance Date: 2007-10-27 23:51:14 -0700 (Sat, 27 Oct 2007) Log Message: ----------- Finish Utilities refactoring Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/Globals.java Trunk/pcgen/code/src/java/pcgen/core/Skill.java Trunk/pcgen/code/src/java/pcgen/core/StatList.java Trunk/pcgen/code/src/java/pcgen/core/bonus/BonusObj.java Trunk/pcgen/code/src/java/pcgen/core/prereq/Prerequisite.java Trunk/pcgen/code/src/java/pcgen/core/utils/CoreUtility.java Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoTempMod.java Trunk/pcgen/code/src/java/pcgen/io/ExportHandler.java Trunk/pcgen/code/src/java/pcgen/persistence/lst/PObjectLoader.java Trunk/pcgen/code/src/java/plugin/lsttokens/BonusLst.java Modified: Trunk/pcgen/code/src/java/pcgen/core/Globals.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Globals.java 2007-10-28 04:46:03 UTC (rev 4448) +++ Trunk/pcgen/code/src/java/pcgen/core/Globals.java 2007-10-28 06:51:14 UTC (rev 4449) @@ -25,30 +25,6 @@ */ package pcgen.core; -import java.io.File; -import java.io.IOException; -import java.net.URI; -import java.text.Collator; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.MissingResourceException; -import java.util.Random; -import java.util.ResourceBundle; -import java.util.Set; -import java.util.SortedMap; -import java.util.SortedSet; -import java.util.StringTokenizer; -import java.util.TreeMap; -import java.util.TreeSet; - -import javax.swing.JFrame; - import pcgen.core.character.CompanionMod; import pcgen.core.character.EquipSlot; import pcgen.core.spell.Spell; @@ -58,14 +34,22 @@ import pcgen.util.InputFactory; import pcgen.util.InputInterface; import pcgen.util.Logging; +import pcgen.util.PropertyFactory; import pcgen.util.chooser.ChooserFactory; import pcgen.util.chooser.ChooserInterface; import pcgen.util.enumeration.Load; import pcgen.util.enumeration.Tab; import pcgen.util.enumeration.Visibility; import pcgen.util.enumeration.VisionType; -import pcgen.util.PropertyFactory; +import javax.swing.*; +import java.io.File; +import java.io.IOException; +import java.net.URI; +import java.text.Collator; +import java.util.*; +import java.util.regex.Pattern; + /** * This is like the top level model container. However, * it is build from static methods rather than instantiated. @@ -2568,14 +2552,20 @@ * @param mult * @return Float */ - public static Float maxLoadForLoadScore(final int loadScore, final PlayerCharacter aPC, Float mult) + public static Float maxLoadForLoadScore( + final int loadScore, + final PlayerCharacter aPC, + final Float mult) { - Float loadValue = SystemCollections.getLoadInfo().getLoadScoreValue(loadScore); + final Float loadValue = SystemCollections.getLoadInfo().getLoadScoreValue(loadScore); String formula = SystemCollections.getLoadInfo().getLoadModifierFormula(); if (formula.length() != 0) { - formula = CoreUtility.replaceAll(formula, "$$SCORE$$", new Float(loadValue.doubleValue() * mult.doubleValue() * getLoadMultForSize(aPC)).toString()); - return new Float(aPC.getVariableValue(formula, "").intValue()); + formula = formula.replaceAll(Pattern.quote("$$SCORE$$"), + Double.toString(loadValue.doubleValue() * + mult.doubleValue() * + getLoadMultForSize(aPC))); + return (float) aPC.getVariableValue(formula, "").intValue(); } return new Float(loadValue.doubleValue() * mult.doubleValue() * getLoadMultForSize(aPC)); } @@ -3260,7 +3250,8 @@ String formula = SystemCollections.getLoadInfo().getLoadMoveFormula(load.toString()); if (formula.length() != 0) { - formula = CoreUtility.replaceAll(formula, "$$MOVE$$", new Float(Math.floor(unencumberedMove)).toString()); + formula = formula.replaceAll(Pattern.quote("$$MOVE$$"), + Double.toString(Math.floor(unencumberedMove))); return aPC.getVariableValue(formula, "").doubleValue(); } } Modified: Trunk/pcgen/code/src/java/pcgen/core/Skill.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Skill.java 2007-10-28 04:46:03 UTC (rev 4448) +++ Trunk/pcgen/code/src/java/pcgen/core/Skill.java 2007-10-28 06:51:14 UTC (rev 4449) @@ -22,11 +22,6 @@ */ package pcgen.core; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.StringTokenizer; - import pcgen.core.bonus.Bonus; import pcgen.core.bonus.BonusObj; import pcgen.core.levelability.LevelAbility; @@ -42,6 +37,12 @@ import pcgen.util.enumeration.Load; import pcgen.util.enumeration.Visibility; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.StringTokenizer; +import java.util.regex.Pattern; + /** * <code>Skill</code>. * @@ -1171,11 +1172,12 @@ String aString = Globals.getGameModeRankModFormula(); if (aString.length() != 0) { - aString = CoreUtility.replaceAll(aString, "$$RANK$$", getTotalRank(aPC).toString()); + aString = aString.replaceAll(Pattern.quote("$$RANK$$"), + getTotalRank(aPC).toString()); bonus += aPC.getVariableValue(aString, "").intValue(); } - return Integer.valueOf(bonus); + return bonus; } /** @@ -1712,7 +1714,8 @@ String aString = Globals.getGameModeRankModFormula(); if (aString.length() != 0) { - aString = CoreUtility.replaceAll(aString, "$$RANK$$", getTotalRank(aPC).toString()); + aString = aString.replaceAll(Pattern.quote("$$RANK$$"), + getTotalRank(aPC).toString()); bonus = aPC.getVariableValue(aString, "").intValue(); appendBonusDesc(bonusDetails, bonus, "RANKS"); } Modified: Trunk/pcgen/code/src/java/pcgen/core/StatList.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/StatList.java 2007-10-28 04:46:03 UTC (rev 4448) +++ Trunk/pcgen/code/src/java/pcgen/core/StatList.java 2007-10-28 06:51:14 UTC (rev 4449) @@ -25,13 +25,13 @@ */ package pcgen.core; -import pcgen.core.utils.CoreUtility; +import pcgen.core.bonus.BonusObj; import java.util.ArrayList; +import java.util.Collections; import java.util.Iterator; import java.util.List; -import java.util.Collections; -import pcgen.core.bonus.BonusObj; +import java.util.regex.Pattern; /** * <code>StatList</code>. @@ -106,17 +106,18 @@ String aString = stat.getStatMod(); ///////////////////////////////////////////////////////////////////////// - // Need to replace all occurances of 'SCORE' in the formula, not just the first. - // For some systems (High Adventure Role Playing for example), it is necessary to - // have multiple 'SCORE' values in the formula. + // Need to replace all occurances of 'SCORE' in the formula, not just the + // first. For some systems (High Adventure Role Playing for example), it + // is necessary to have multiple 'SCORE' values in the formula. // - // This whole method should probably be revisited as a valid variable name that - // contains 'SCORE' can be trounced by the replacement (e.g. IQ_SCORE could be changed to IQ_12) + // This whole method should probably be revisited as a valid variable name + // that contains 'SCORE' can be trounced by the replacement (e.g. IQ_SCORE + // could be changed to IQ_12) + // // - Byngl Dec 16, 2004 - // - //aString = aString.replaceFirst("SCORE", Integer.toString(aNum)); //Only works on jdk 1.4 -// aString = CoreUtility.replaceFirst(aString, "SCORE", Integer.toString(aNum)); - aString = CoreUtility.replaceAll(aString, "SCORE", Integer.toString(aNum)); + + aString = aString.replaceAll(Pattern.quote("SCORE"), Integer.toString(aNum)); + ///////////////////////////////////////////////////////////////////////// return ownerPC.getVariableValue(aString, "").intValue(); Modified: Trunk/pcgen/code/src/java/pcgen/core/bonus/BonusObj.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/bonus/BonusObj.java 2007-10-28 04:46:03 UTC (rev 4448) +++ Trunk/pcgen/code/src/java/pcgen/core/bonus/BonusObj.java 2007-10-28 06:51:14 UTC (rev 4449) @@ -920,7 +920,7 @@ public void expandToken(final String token, final String tokenValue) { final String value = getValue(); - setValue( CoreUtility.replaceAll(value, token, tokenValue)); + setValue(value.replaceAll(Pattern.quote(token), tokenValue)); if ( hasPreReqs() ) { Modified: Trunk/pcgen/code/src/java/pcgen/core/prereq/Prerequisite.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/prereq/Prerequisite.java 2007-10-28 04:46:03 UTC (rev 4448) +++ Trunk/pcgen/code/src/java/pcgen/core/prereq/Prerequisite.java 2007-10-28 06:51:14 UTC (rev 4449) @@ -21,12 +21,12 @@ */ package pcgen.core.prereq; +import pcgen.util.PropertyFactory; + import java.util.ArrayList; import java.util.List; +import java.util.regex.Pattern; -import pcgen.core.utils.CoreUtility; -import pcgen.util.PropertyFactory; - /** * @author fr...@pu... * @@ -361,12 +361,12 @@ */ public void expandToken(final String token, final String tokenValue) { - key = CoreUtility.replaceAll(key, token, tokenValue); - operand = CoreUtility.replaceAll(operand, token, tokenValue); + key = key.replaceAll(Pattern.quote(token), tokenValue); + operand = operand.replaceAll(Pattern.quote(token), tokenValue); if (prerequisites != null) { - for ( Prerequisite subreq : prerequisites ) + for ( final Prerequisite subreq : prerequisites ) { subreq.expandToken(token, tokenValue); } Modified: Trunk/pcgen/code/src/java/pcgen/core/utils/CoreUtility.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/utils/CoreUtility.java 2007-10-28 04:46:03 UTC (rev 4448) +++ Trunk/pcgen/code/src/java/pcgen/core/utils/CoreUtility.java 2007-10-28 06:51:14 UTC (rev 4449) @@ -417,7 +417,7 @@ boolean needjoin = false; - for (final Object obj : (Collection<?>) strings) + for (final Object obj : strings) { if (needjoin) { @@ -468,53 +468,6 @@ } /** - * Replace all occurrences of original in source with replacement - * @param source the source string - * @param original the substring to search for - * @param replacement the substring to substitute - * @return a new String based on source where original has been replaced with replacement - */ - public static String replaceAll( - final String source, - final String original, - final String replacement) - { - return source.replaceAll(Pattern.quote(original), replacement); - -// final char[] working = source.toCharArray(); -// final StringBuffer sb = new StringBuffer(source.length() + replacement.length()); -// int startindex = source.indexOf(original); -// -// if (startindex < 0) -// { -// return source; -// } -// -// int currindex = 0; -// -// while (startindex > -1) -// { -// for (int i = currindex; i < startindex; ++i) -// { -// sb.append(working[i]); -// } -// -// currindex = startindex; -// sb.append(replacement); -// currindex += original.length(); -// startindex = source.indexOf(original, currindex); -// } -// -// for (int i = currindex; i < working.length; ++i) -// { -// sb.append(working[i]); -// } -// -// return sb.toString(); - } - - - /** * Turn a 'separator' separated string into a ArrayList of strings, each * corresponding to one trimmed 'separator'-separated portion of the original * string. @@ -525,17 +478,17 @@ */ public static List<String> split(final String aString, final char separator) { - ArrayList<String> temp = new ArrayList<String>(); - String sepStr = "\\" + String.valueOf(separator); + final List<String> temp = new ArrayList<String>(); + final String sepStr = Pattern.quote(String.valueOf(separator)); + if (aString.trim().length() == 0) { return temp; } - for (Iterator<String> iter = Arrays.asList(aString.split(sepStr)).iterator(); iter - .hasNext();) + for (final String s : Arrays.asList(aString.split(sepStr))) { - temp.add(iter.next().trim()); + temp.add(s.trim()); } return temp; @@ -543,12 +496,12 @@ /** * Unescape the : character - * @param in - * @return String + * @param in the string to operate on + * @return the modified string */ public static String unEscapeColons2(final String in) { - return replaceAll(in, ";", ":"); + return in.replaceAll(Pattern.quote(";"), ":"); } /** Modified: Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoTempMod.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoTempMod.java 2007-10-28 04:46:03 UTC (rev 4448) +++ Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoTempMod.java 2007-10-28 06:51:14 UTC (rev 4449) @@ -26,65 +26,13 @@ */ package pcgen.gui.tabs; -import java.awt.BorderLayout; -import java.awt.Component; -import java.awt.Dimension; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.Insets; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.ComponentAdapter; -import java.awt.event.ComponentEvent; -import java.awt.event.FocusAdapter; -import java.awt.event.FocusEvent; -import java.awt.event.KeyEvent; -import java.awt.event.KeyListener; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import java.util.StringTokenizer; - -import javax.swing.BorderFactory; -import javax.swing.JButton; -import javax.swing.JComponent; -import javax.swing.JLabel; -import javax.swing.JMenuItem; -import javax.swing.JPanel; -import javax.swing.JPopupMenu; -import javax.swing.JScrollPane; -import javax.swing.JSplitPane; -import javax.swing.JTree; -import javax.swing.KeyStroke; -import javax.swing.ListSelectionModel; -import javax.swing.border.TitledBorder; -import javax.swing.event.ListSelectionEvent; -import javax.swing.event.ListSelectionListener; -import javax.swing.table.TableColumn; -import javax.swing.tree.TreePath; - -import pcgen.core.Ability; -import pcgen.core.Categorisable; -import pcgen.core.Constants; -import pcgen.core.Equipment; -import pcgen.core.GameMode; -import pcgen.core.Globals; -import pcgen.core.PCClass; -import pcgen.core.PCTemplate; -import pcgen.core.PObject; -import pcgen.core.PlayerCharacter; -import pcgen.core.SettingsHandler; -import pcgen.core.Skill; +import pcgen.core.*; import pcgen.core.bonus.Bonus; import pcgen.core.bonus.BonusObj; +import pcgen.core.character.CharacterSpell; import pcgen.core.prereq.PrereqHandler; import pcgen.core.prereq.Prerequisite; import pcgen.core.spell.Spell; -import pcgen.core.character.CharacterSpell; -import pcgen.core.utils.CoreUtility; import pcgen.core.utils.MessageType; import pcgen.core.utils.ShowMessageDelegate; import pcgen.gui.CharacterInfo; @@ -94,24 +42,25 @@ import pcgen.gui.filter.FilterConstants; import pcgen.gui.filter.FilterFactory; import pcgen.gui.panes.FlippingSplitPane; -import pcgen.gui.utils.AbstractTreeTableModel; -import pcgen.gui.utils.ClickHandler; -import pcgen.gui.utils.InfoLabelTextBuilder; -import pcgen.gui.utils.JLabelPane; -import pcgen.gui.utils.JTreeTable; -import pcgen.gui.utils.JTreeTableMouseAdapter; -import pcgen.gui.utils.JTreeTableSorter; -import pcgen.gui.utils.LabelTreeCellRenderer; -import pcgen.gui.utils.PObjectNode; -import pcgen.gui.utils.ResizeColumnListener; -import pcgen.gui.utils.TreeTableModel; -import pcgen.gui.utils.Utility; +import pcgen.gui.utils.*; import pcgen.util.Logging; import pcgen.util.PropertyFactory; import pcgen.util.chooser.ChooserFactory; import pcgen.util.chooser.ChooserRadio; import pcgen.util.enumeration.Tab; +import javax.swing.*; +import javax.swing.border.TitledBorder; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; +import javax.swing.table.TableColumn; +import javax.swing.tree.TreePath; +import java.awt.*; +import java.awt.event.*; +import java.util.*; +import java.util.List; +import java.util.regex.Pattern; + /** * <code>InfoTempMod</code> creates a new tabbed panel that is used to * allow application of temporary modifiers to PC's and Equipment @@ -366,26 +315,30 @@ /** * allows user to choose value of bonus - * @param newB + * @param newB * @param aChoice * @param repeatValue * @return bonus choice **/ - private String getBonusChoice(BonusObj newB, String aChoice, - String repeatValue) + private String getBonusChoice( + final BonusObj newB, + final String aChoice, + String repeatValue) { // If repeatValue is set, this is a multi BONUS and they all // should get the same value as the first choice if (repeatValue.length() > 0) { + final String aS = newB.getValue(); + // need to parse the aChoice string // and replace %CHOICE with choice - if (newB.getValue().indexOf("%CHOICE") >= 0) //$NON-NLS-1$ + if (aS.indexOf("%CHOICE") >= 0) //$NON-NLS-1$ { - String ac = - CoreUtility.replaceAll(newB.getValue(), "%CHOICE", //$NON-NLS-1$ - repeatValue); + final String ac = aS.replaceAll( + Pattern.quote("%CHOICE"), //$NON-NLS-1$ + repeatValue); newB.setValue(ac); } @@ -464,21 +417,21 @@ ArrayList<String> selectedList = c.getSelectedList(); if (selectedList.size() > 0) { - String aI = selectedList.get(0); - repeatValue = aI; + final String aI = selectedList.get(0); + final String bValue = newB.getValue(); + // need to parse the bonus.getValue() // string and replace %CHOICE - if (newB.getValue().indexOf("%CHOICE") >= 0) //$NON-NLS-1$ + if (bValue.indexOf("%CHOICE") >= 0) //$NON-NLS-1$ { - String ac = - CoreUtility.replaceAll(newB.getValue(), - "%CHOICE", aI); //$NON-NLS-1$ - aI = ac; - newB.setValue(aI); + final String ac = + bValue.replaceAll(Pattern.quote("%CHOICE"), //$NON-NLS-1$ + aI); + newB.setValue(ac); } - return repeatValue; + return aI; } // they hit the cancel button newB.setValue("0"); Modified: Trunk/pcgen/code/src/java/pcgen/io/ExportHandler.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/ExportHandler.java 2007-10-28 04:46:03 UTC (rev 4448) +++ Trunk/pcgen/code/src/java/pcgen/io/ExportHandler.java 2007-10-28 06:51:14 UTC (rev 4449) @@ -25,66 +25,20 @@ */ package pcgen.io; -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.StringWriter; -import java.text.NumberFormat; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.StringTokenizer; - -import pcgen.core.Constants; -import pcgen.core.Equipment; -import pcgen.core.Globals; -import pcgen.core.PCClass; -import pcgen.core.PCTemplate; -import pcgen.core.PObject; -import pcgen.core.PlayerCharacter; -import pcgen.core.SettingsHandler; -import pcgen.core.Skill; +import pcgen.core.*; import pcgen.core.character.CharacterSpell; import pcgen.core.character.Follower; import pcgen.core.utils.CoreUtility; -import pcgen.io.exporttoken.ACCheckToken; -import pcgen.io.exporttoken.AbilityListToken; -import pcgen.io.exporttoken.AbilityToken; -import pcgen.io.exporttoken.AlignmentToken; -import pcgen.io.exporttoken.AttackToken; -import pcgen.io.exporttoken.BonusToken; -import pcgen.io.exporttoken.CheckToken; -import pcgen.io.exporttoken.DRToken; -import pcgen.io.exporttoken.DomainToken; -import pcgen.io.exporttoken.EqToken; -import pcgen.io.exporttoken.EqTypeToken; -import pcgen.io.exporttoken.GameModeToken; -import pcgen.io.exporttoken.HPToken; -import pcgen.io.exporttoken.HeightToken; -import pcgen.io.exporttoken.InitiativeMiscToken; -import pcgen.io.exporttoken.MovementToken; -import pcgen.io.exporttoken.ReachToken; -import pcgen.io.exporttoken.SRToken; -import pcgen.io.exporttoken.SizeLongToken; -import pcgen.io.exporttoken.SkillToken; -import pcgen.io.exporttoken.SkillpointsToken; -import pcgen.io.exporttoken.SpellFailureToken; -import pcgen.io.exporttoken.StatToken; -import pcgen.io.exporttoken.Token; -import pcgen.io.exporttoken.TotalToken; -import pcgen.io.exporttoken.VarToken; -import pcgen.io.exporttoken.WeaponToken; -import pcgen.io.exporttoken.WeaponhToken; -import pcgen.io.exporttoken.WeightToken; +import pcgen.io.exporttoken.*; import pcgen.util.Delta; import pcgen.util.Logging; import pcgen.util.enumeration.Visibility; +import java.io.*; +import java.text.NumberFormat; +import java.util.*; +import java.util.regex.Pattern; + /** * <code>ExportHandler</code>. * @@ -508,67 +462,69 @@ } } - private boolean evaluateExpression(String expr, PlayerCharacter aPC) + private boolean evaluateExpression(final String expr, + final PlayerCharacter aPC) { if (expr.indexOf(".AND.") > 0) { - String part1 = expr.substring(0, expr.indexOf(".AND.")); - String part2 = expr.substring(expr.indexOf(".AND.") + 5); + final String part1 = expr.substring(0, expr.indexOf(".AND.")); + final String part2 = expr.substring(expr.indexOf(".AND.") + 5); - return (evaluateExpression(part1, aPC) && evaluateExpression(part2, - aPC)); + return (evaluateExpression(part1, aPC) && + evaluateExpression(part2, aPC)); } if (expr.indexOf(".OR.") > 0) { - String part1 = expr.substring(0, expr.indexOf(".OR.")); - String part2 = expr.substring(expr.indexOf(".OR.") + 4); + final String part1 = expr.substring(0, expr.indexOf(".OR.")); + final String part2 = expr.substring(expr.indexOf(".OR.") + 4); - return (evaluateExpression(part1, aPC) || evaluateExpression(part2, - aPC)); + return (evaluateExpression(part1, aPC) || + evaluateExpression(part2, aPC)); } - for (Object anObject : loopVariables.keySet()) + String expr1 = expr; + for (final Object anObject : loopVariables.keySet()) { if (anObject == null) { continue; } - String fString = anObject.toString(); - String rString = loopVariables.get(fString).toString(); - expr = CoreUtility.replaceAll(expr, fString, rString); + final String fString = anObject.toString(); + final String rString = loopVariables.get(fString).toString(); + expr1 = expr1.replaceAll(Pattern.quote(fString), rString); } - if (expr.startsWith("HASVAR:")) + if (expr1.startsWith("HASVAR:")) { - expr = expr.substring(7).trim(); + expr1 = expr1.substring(7).trim(); - return (aPC.getVariableValue(expr, "").intValue() > 0); + return (aPC.getVariableValue(expr1, "").intValue() > 0); } - if (expr.startsWith("HASFEAT:")) + if (expr1.startsWith("HASFEAT:")) { - expr = expr.substring(8).trim(); + expr1 = expr1.substring(8).trim(); - return (aPC.getFeatNamed(expr) != null); + return (aPC.getFeatNamed(expr1) != null); } - if (expr.startsWith("HASSA:")) + if (expr1.startsWith("HASSA:")) { - expr = expr.substring(6).trim(); + expr1 = expr1.substring(6).trim(); - return (aPC.hasSpecialAbility(expr)); + return (aPC.hasSpecialAbility(expr1)); } - if (expr.startsWith("HASEQUIP:")) + if (expr1.startsWith("HASEQUIP:")) { - expr = expr.substring(9).trim(); + expr1 = expr1.substring(9).trim(); - return (aPC.getEquipmentNamed(expr) != null); + return (aPC.getEquipmentNamed(expr1) != null); } - if (expr.startsWith("SPELLCASTER:")) + if (expr1.startsWith("SPELLCASTER:")) { // Could look like one of the following: // Arcane @@ -582,7 +538,7 @@ // 0=Wizard (%classNum=className) // 0=Divine (%classNum=spell_type) // 0=Prepare (%classNum=preparation_type) - final String fString = expr.substring(12).trim(); + final String fString = expr1.substring(12).trim(); if (fString.indexOf('=') >= 0) { @@ -615,20 +571,20 @@ } if ("!Prepare".equalsIgnoreCase(cs) - && aClass.getMemorizeSpells()) + && aClass.getMemorizeSpells()) { return true; } if ("Prepare".equalsIgnoreCase(cs) - && (!aClass.getMemorizeSpells())) + && (!aClass.getMemorizeSpells())) { return true; } } else { - for (PCClass pcClass : aPC.getClassList()) + for (final PCClass pcClass : aPC.getClassList()) { if (fString.equalsIgnoreCase(pcClass.getSpellType())) { @@ -646,13 +602,13 @@ } if ("!Prepare".equalsIgnoreCase(fString) - && pcClass.getMemorizeSpells()) + && pcClass.getMemorizeSpells()) { return true; } if ("Prepare".equalsIgnoreCase(fString) - && (!pcClass.getMemorizeSpells())) + && (!pcClass.getMemorizeSpells())) { return true; } @@ -660,13 +616,13 @@ } } - if (expr.startsWith("EVEN:")) + if (expr1.startsWith("EVEN:")) { int i = 0; try { - i = Integer.parseInt(expr.substring(5).trim()); + i = Integer.parseInt(expr1.substring(5).trim()); } catch (NumberFormatException exc) { @@ -678,9 +634,9 @@ return ((i % 2) == 0); } - if (expr.endsWith("UNTRAINED")) + if (expr1.endsWith("UNTRAINED")) { - final StringTokenizer aTok = new StringTokenizer(expr, "."); + final StringTokenizer aTok = new StringTokenizer(expr1, "."); final String fString = aTok.nextToken(); Skill aSkill = null; @@ -708,9 +664,8 @@ } // Test for JEP formula - Float res = - aPC.getVariableProcessor().getJepOnlyVariableValue(null, expr, - "", 0); + final Float res = + aPC.getVariableProcessor().getJepOnlyVariableValue(null, expr1, "", 0); if (res != null) { return res.equals(JEP_TRUE); @@ -725,20 +680,20 @@ // |END IF| // It can theorically be used with any valid token, doing an equal compare // (integer or string equalities are valid) - StringTokenizer aTok = new StringTokenizer(expr, ":"); + final StringTokenizer aTok = new StringTokenizer(expr1, ":"); final String token; final String equals; final int tokenCount = aTok.countTokens(); if (tokenCount == 1) { - token = expr; + token = expr1; equals = "TRUE"; } else if (tokenCount != 2) { Logging - .errorPrint("evaluateExpression: Incorrect syntax (missing parameter)"); + .errorPrint("evaluateExpression: Incorrect syntax (missing parameter)"); return false; } @@ -748,8 +703,8 @@ equals = aTok.nextToken().toUpperCase(); } - StringWriter sWriter = new StringWriter(); - BufferedWriter aWriter = new BufferedWriter(sWriter); + final StringWriter sWriter = new StringWriter(); + final BufferedWriter aWriter = new BufferedWriter(sWriter); replaceToken(token, aWriter, aPC); sWriter.flush(); @@ -765,7 +720,6 @@ String aString = sWriter.toString(); if (token.startsWith("VAR.")) { - aString = token.substring(4); aString = aPC.getVariableValue(token.substring(4), "").toString(); } @@ -774,24 +728,28 @@ // integer values final int i = Integer.parseInt(aString); - return (i != Integer.parseInt(equals)) ? false : true; + return i == Integer.parseInt(equals); } catch (NumberFormatException e) { // String values - return (aString.toUpperCase().indexOf(equals) < 0) ? false : true; + return 0 <= aString.toUpperCase().indexOf(equals); } } - private void evaluateIIF(IIFNode node, BufferedWriter output, - FileAccess fa, PlayerCharacter aPC) + private void evaluateIIF( + final IIFNode node, + final BufferedWriter output, + final FileAccess fa, + final PlayerCharacter aPC) { // - // Comma is a delimiter for a higher-level parser, so we'll use a semicolon and replace it with a comma for + // Comma is a delimiter for a higher-level parser, so + // we'll use a semicolon and replace it with a comma for // expressions like: // |IIF(VAR.IF(var("COUNT[SKILLTYPE=Strength]")>0;1;0):1)| // - String aString = CoreUtility.replaceAll(node.expr(), ";", ","); + final String aString = node.expr().replaceAll(Pattern.quote(";"), ","); if (evaluateExpression(aString, aPC)) { evaluateIIFChildren(node.trueChildren(), output, fa, aPC); @@ -802,44 +760,45 @@ } } - private void evaluateIIFChildren(final List<?> children, - BufferedWriter output, FileAccess fa, PlayerCharacter aPC) + private void evaluateIIFChildren( + final List<?> children, + final BufferedWriter output, + final FileAccess fa, + final PlayerCharacter aPC) { for (int y = 0; y < children.size(); ++y) { if (children.get(y) instanceof FORNode) { - FORNode nextFor = (FORNode) children.get(y); - loopVariables.put(nextFor.var(), Integer.valueOf(0)); + final FORNode nextFor = (FORNode) children.get(y); + loopVariables.put(nextFor.var(), 0); existsOnly = nextFor.exists(); String minString = nextFor.min(); String maxString = nextFor.max(); String stepString = nextFor.step(); - String fString; - String rString; - for (Object anObject : loopVariables.keySet()) + for (final Object anObject : loopVariables.keySet()) { if (anObject == null) { continue; } - fString = anObject.toString(); - rString = loopVariables.get(fString).toString(); - minString = - CoreUtility.replaceAll(minString, fString, rString); - maxString = - CoreUtility.replaceAll(maxString, fString, rString); - stepString = - CoreUtility - .replaceAll(stepString, fString, rString); + final String fString = anObject.toString(); + final String rString = loopVariables.get(fString).toString(); + minString = minString.replaceAll(Pattern.quote(fString), rString); + maxString = maxString.replaceAll(Pattern.quote(fString), rString); + stepString = stepString.replaceAll(Pattern.quote(fString), rString); } - loopFOR(nextFor, getVarValue(minString, aPC), getVarValue( - maxString, aPC), getVarValue(stepString, aPC), output, fa, - aPC); + loopFOR(nextFor, + getVarValue(minString, aPC), + getVarValue(maxString, aPC), + getVarValue(stepString, aPC), + output, + fa, + aPC); existsOnly = nextFor.exists(); loopVariables.remove(nextFor.var()); } @@ -851,18 +810,16 @@ { String lineString = (String) children.get(y); - for (Object anObject : loopVariables.keySet()) + for (final Object anObject : loopVariables.keySet()) { if (anObject == null) { continue; } - String fString = anObject.toString(); - String rString = loopVariables.get(fString).toString(); - lineString = - CoreUtility - .replaceAll(lineString, fString, rString); + final String fString = anObject.toString(); + final String rString = loopVariables.get(fString).toString(); + lineString = lineString.replaceAll(Pattern.quote(fString), rString); } replaceLine(lineString, output, aPC); @@ -880,38 +837,29 @@ * Loop through a set of output as required by a FOR loop. * * @param node The node being processed - * @param min The starting value of the loop - * @param max The ending value fo the loop + * @param start The starting value of the loop + * @param end The ending value fo the loop * @param step The amount by which the counter should be changed each iteration. * @param output The writer output is to be sent to. * @param fa The FileAccess instance to be used to manage the output. * @param aPC The character being processed. */ - private void loopFOR(FORNode node, int min, int max, int step, - BufferedWriter output, FileAccess fa, PlayerCharacter aPC) + private void loopFOR( + final FORNode node, + final int start, + final int end, + final int step, + final BufferedWriter output, + final FileAccess fa, + final PlayerCharacter aPC) { - if (step < 0) + for (int x = start; ((step < 0) ? x >= end : x <= end); x += step) { - for (int x = min; x >= max; x += step) + if (processLoop(node, output, fa, aPC, x)) { - boolean stopLoop = processLoop(node, output, fa, aPC, x); - if (stopLoop) - { - x = max - 1; - } + break; } } - else - { - for (int x = min; x <= max; x += step) - { - boolean stopLoop = processLoop(node, output, fa, aPC, x); - if (stopLoop) - { - x = max + 1; - } - } - } } /** @@ -950,13 +898,9 @@ fString = anObject.toString(); rString = loopVariables.get(fString).toString(); - minString = - CoreUtility.replaceAll(minString, fString, rString); - maxString = - CoreUtility.replaceAll(maxString, fString, rString); - stepString = - CoreUtility - .replaceAll(stepString, fString, rString); + minString = minString.replaceAll(Pattern.quote(fString), rString); + maxString = maxString.replaceAll(Pattern.quote(fString), rString); + stepString = stepString.replaceAll(Pattern.quote(fString), rString); } final int varMin = getVarValue(minString, aPC); @@ -983,9 +927,7 @@ String fString = anObject.toString(); String rString = loopVariables.get(fString).toString(); - lineString = - CoreUtility - .replaceAll(lineString, fString, rString); + lineString = lineString.replaceAll(Pattern.quote(fString), rString); } noMoreItems = false; @@ -1050,8 +992,9 @@ } } - aString = CoreUtility.replaceAll(aString, "[", "("); - aString = CoreUtility.replaceAll(aString, "]", ")"); + + aString = aString.replaceAll(Pattern.quote("["), "("); + aString = aString.replaceAll(Pattern.quote("]"), ")"); final String delimiter = "+-/*"; String valString = ""; @@ -1279,9 +1222,7 @@ } } - attackData = - CoreUtility.replaceAll(newAttackData - .substring(1), "+-", "-"); + attackData = newAttackData.substring(1).replaceAll(Pattern.quote("+-"), "-"); } } else Modified: Trunk/pcgen/code/src/java/pcgen/persistence/lst/PObjectLoader.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/persistence/lst/PObjectLoader.java 2007-10-28 04:46:03 UTC (rev 4448) +++ Trunk/pcgen/code/src/java/pcgen/persistence/lst/PObjectLoader.java 2007-10-28 06:51:14 UTC (rev 4449) @@ -25,17 +25,17 @@ */ package pcgen.persistence.lst; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - import pcgen.core.Campaign; import pcgen.core.PObject; -import pcgen.core.utils.CoreUtility; import pcgen.persistence.PersistenceLayerException; import pcgen.persistence.lst.prereq.PreParserFactory; import pcgen.persistence.lst.utils.PObjectHelper; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.regex.Pattern; + /** * @author David Rice <dav...@jc...> * @version $Revision$ @@ -90,7 +90,10 @@ * @return boolean true if the tag is parsed; else false. * @throws PersistenceLayerException */ - public static boolean parseTagLevel(PObject obj, String aTag, int anInt) + public static boolean parseTagLevel( + final PObject obj, + final String aTag, + final int anInt) throws PersistenceLayerException { if ((obj == null) || (aTag.length() < 1)) @@ -100,19 +103,20 @@ obj.setNewItem(false); - aTag.charAt(0); + // This line seems to be useless ... nuance 28/10/2007 +// aTag.charAt(0); - boolean result = false; - int colonIdx = aTag.indexOf(':'); + final int colonIdx = aTag.indexOf(':'); if (colonIdx < 0) { return false; } - String key = aTag.substring(0, colonIdx); - String value = aTag.substring(colonIdx + 1); - Map<String, LstToken> tokenMap = + final String key = aTag.substring(0, colonIdx); + final String value = aTag.substring(colonIdx + 1); + final Map<String, LstToken> tokenMap = TokenStore.inst().getTokenMap(GlobalLstToken.class); - LstToken token = tokenMap.get(key); + final LstToken token = tokenMap.get(key); + boolean result = false; if (token != null) { LstUtils.deprecationCheck(token, obj, value); @@ -126,27 +130,25 @@ // blank intentionally } else if (PreParserFactory.isPreReqString(aTag) - || aTag.startsWith("RESTRICT:")) + || aTag.startsWith("RESTRICT:")) { - if (aTag.equalsIgnoreCase("PRE:.CLEAR")) + if ("PRE:.CLEAR".equalsIgnoreCase(aTag)) { obj.clearPreReq(); } else { - aTag = - CoreUtility.replaceAll(aTag, "<this>", obj - .getKeyName()); + final String tag = + aTag.replaceAll(Pattern.quote("<this>"), obj.getKeyName()); try { - PreParserFactory factory = - PreParserFactory.getInstance(); - obj.addPreReq(factory.parse(aTag), anInt); + final PreParserFactory factory = PreParserFactory.getInstance(); + obj.addPreReq(factory.parse(tag), anInt); } catch (PersistenceLayerException ple) { throw new PersistenceLayerException( - "Unable to parse a prerequisite: " + "Unable to parse a prerequisite: " + ple.getMessage()); } } Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/BonusLst.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/BonusLst.java 2007-10-28 04:46:03 UTC (rev 4448) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/BonusLst.java 2007-10-28 06:51:14 UTC (rev 4449) @@ -5,9 +5,10 @@ package plugin.lsttokens; import pcgen.core.PObject; -import pcgen.core.utils.CoreUtility; import pcgen.persistence.lst.GlobalLstToken; +import java.util.regex.Pattern; + /** * @author djones4 */ @@ -24,24 +25,20 @@ } /** - * Parse BONUS token - * @param obj - * @param value - * @param anInt - * @return true or false + * Parse BONUS token and use it to add a bonus to a PObject + * + * @param obj the object to make the bonus a part of + * @param value the text of the bonus + * @param anInt the level to add the bonus at + * @return true if the bonus added to the PObject is non null or false otherwise */ - public boolean parse(PObject obj, String value, int anInt) + public boolean parse(final PObject obj, + final String value, + final int anInt) { - boolean result = false; - value = CoreUtility.replaceAll(value, "<this>", obj.getKeyName()); - if (anInt > -9) - { - result = obj.addBonusList(anInt + "|" + value); - } - else - { - result = obj.addBonusList(value); - } - return result; + final String v = value.replaceAll(Pattern.quote("<this>"), obj.getKeyName()); + return (anInt > -9) ? + obj.addBonusList(anInt + "|" + v) : + obj.addBonusList(v); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jde...@us...> - 2007-10-28 07:38:28
|
Revision: 4450 http://pcgen.svn.sourceforge.net/pcgen/?rev=4450&view=rev Author: jdempsey Date: 2007-10-28 00:38:32 -0700 (Sun, 28 Oct 2007) Log Message: ----------- SABs on levels > -9 for a class not included in CLASS.%SALIST - Cause of a couple of GUI unit tests failures. Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/PObject.java Trunk/pcgen/code/src/java/plugin/exporttokens/ClassToken.java Modified: Trunk/pcgen/code/src/java/pcgen/core/PObject.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2007-10-28 06:51:14 UTC (rev 4449) +++ Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2007-10-28 07:38:32 UTC (rev 4450) @@ -1852,14 +1852,17 @@ public void addSABToList(List<SpecialAbility> saList, PlayerCharacter pc) { - List<SpecialAbility> sabs = mapChar.getListFor(MapKey.SAB, -9); - if (sabs != null) + for (Integer lvl : mapChar.getSecondaryKeySet(MapKey.SAB)) { - for (SpecialAbility sa : sabs) + List<SpecialAbility> sabs = mapChar.getListFor(MapKey.SAB, lvl); + if (sabs != null) { - if (pc == null || sa.qualifies(pc)) + for (SpecialAbility sa : sabs) { - saList.add(sa); + if (pc == null || sa.qualifies(pc)) + { + saList.add(sa); + } } } } Modified: Trunk/pcgen/code/src/java/plugin/exporttokens/ClassToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/exporttokens/ClassToken.java 2007-10-28 06:51:14 UTC (rev 4449) +++ Trunk/pcgen/code/src/java/plugin/exporttokens/ClassToken.java 2007-10-28 07:38:32 UTC (rev 4450) @@ -26,6 +26,7 @@ package plugin.exporttokens; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.StringTokenizer; @@ -170,7 +171,8 @@ { return formattedList; } - + Collections.sort(saList); + // From the list of allowed SAs, format the output strings // to include all of the variables for (SpecialAbility sa : saList) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jfr...@us...> - 2007-11-20 01:35:18
|
Revision: 4538 http://pcgen.svn.sourceforge.net/pcgen/?rev=4538&view=rev Author: jfrazierjr Date: 2007-11-19 17:35:22 -0800 (Mon, 19 Nov 2007) Log Message: ----------- Please Implement - PREHD Token Cleanup Issue#: 1810508 Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/PCTemplate.java Trunk/pcgen/code/src/java/plugin/lsttokens/template/HdToken.java Modified: Trunk/pcgen/code/src/java/pcgen/core/PCTemplate.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PCTemplate.java 2007-11-19 21:56:41 UTC (rev 4537) +++ Trunk/pcgen/code/src/java/pcgen/core/PCTemplate.java 2007-11-20 01:35:22 UTC (rev 4538) @@ -1062,7 +1062,7 @@ try { PreParserFactory factory = PreParserFactory.getInstance(); - r = factory.parse("PREHD:" + hdStr); + r = factory.parse("PREHD:MIN=" + hdStr); } catch (PersistenceLayerException notUsed) { Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/template/HdToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/template/HdToken.java 2007-11-19 21:56:41 UTC (rev 4537) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/template/HdToken.java 2007-11-20 01:35:22 UTC (rev 4538) @@ -50,7 +50,7 @@ else { String tagValue = - value.substring(hdStr.length() + 1) + "|PREHD:" + hdStr; + value.substring(hdStr.length() + 1) + "|PREHD:MIN=" + hdStr; try { return PObjectLoader.parseTag(template, tagValue); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jde...@us...> - 2007-12-07 08:40:30
|
Revision: 4677 http://pcgen.svn.sourceforge.net/pcgen/?rev=4677&view=rev Author: jdempsey Date: 2007-12-07 00:40:34 -0800 (Fri, 07 Dec 2007) Log Message: ----------- Implement BONUS:MISC|CR|x Issue#: 1470112 Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java Trunk/pcgen/code/src/java/plugin/bonustokens/Misc.java Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2007-12-07 03:10:23 UTC (rev 4676) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2007-12-07 08:40:34 UTC (rev 4677) @@ -8737,6 +8737,8 @@ { CR += raceCR; } + + CR += (int) getTotalBonusTo("MISC", "CR"); return CR; } Modified: Trunk/pcgen/code/src/java/plugin/bonustokens/Misc.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/bonustokens/Misc.java 2007-12-07 03:10:23 UTC (rev 4676) +++ Trunk/pcgen/code/src/java/plugin/bonustokens/Misc.java 2007-12-07 08:40:34 UTC (rev 4677) @@ -36,7 +36,7 @@ { private static final String[] bonusHandled = {"MISC"}; private static final String[] bonusTags = - {"ACCHECK", "MAXDEX", "SPELLFAILURE", "SR"}; + {"ACCHECK", "MAXDEX", "SPELLFAILURE", "SR", "SR"}; protected String[] getBonusesHandled() { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-01-05 20:48:58
|
Revision: 4831 http://pcgen.svn.sourceforge.net/pcgen/?rev=4831&view=rev Author: thpr Date: 2008-01-05 12:49:02 -0800 (Sat, 05 Jan 2008) Log Message: ----------- [ 1856120 ] Please Implement - Equipment Prof Token Issue#: 1856120 Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/Equipment.java Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java Trunk/pcgen/code/src/java/pcgen/core/chooser/ArmorTypeChoiceManager.java Trunk/pcgen/code/src/java/plugin/lsttokens/auto/ArmorProfToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/equipment/ProficiencyToken.java Trunk/pcgen/code/src/java/plugin/pretokens/test/PreArmorProfTester.java Modified: Trunk/pcgen/code/src/java/pcgen/core/Equipment.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Equipment.java 2008-01-05 15:55:30 UTC (rev 4830) +++ Trunk/pcgen/code/src/java/pcgen/core/Equipment.java 2008-01-05 20:49:02 UTC (rev 4831) @@ -266,6 +266,10 @@ private boolean virtualItem = false; + private String weaponProf; + private String shieldProf; + private String armorProf; + { final SizeAdjustment sizeAdj = SettingsHandler.getGame() .getDefaultSizeAdjustment(); @@ -3583,7 +3587,8 @@ .debugPrint("Could not find weapon proficiency with key '" + profName + "'."); } - if (profName == null || profName.length() == 0) { + String prof = rawProfName(); + if (prof == null || prof.length() == 0) { // For autogenerated proficiencies return the display name since // we don't have anything else to return return this.getDisplayName(); @@ -4068,6 +4073,18 @@ * @return Description of the Return Value */ String rawProfName() { + if (isWeapon() && weaponProf != null) + { + return weaponProf; + } + else if (isArmor() && armorProf != null) + { + return armorProf; + } + else if (isShield() && shieldProf != null) + { + return shieldProf; + } return profName; } @@ -4140,15 +4157,30 @@ baseItem = getKeyName(); } - if (profName.length() == 0) { + String prof = rawProfName(); + if (prof.length() == 0) { final Equipment eq = EquipmentList.getEquipmentKeyed(baseItem); if (eq != null) { - profName = eq.rawProfName(); - - if (profName.length() == 0) { - profName = eq.getName(); + if (eq.isWeapon() && eq.weaponProf != null) + { + weaponProf = eq.weaponProf; } + else if (eq.isArmor() && eq.armorProf != null) + { + armorProf = eq.armorProf; + } + else if (eq.isShield() && eq.shieldProf != null) + { + shieldProf = eq.shieldProf; + } + else + { + profName = eq.profName; + if (profName == null || profName.length() == 0) { + profName = eq.getName(); + } + } } } @@ -4186,9 +4218,10 @@ .getProficiency(), '.'); if (profTypeInfo.size() == 2) { - final StringBuffer proficiencyName = new StringBuffer(profName); + String curprof = rawProfName(); + final StringBuffer proficiencyName = new StringBuffer(curprof); - if (profName.endsWith(")")) { + if (curprof.endsWith(")")) { proficiencyName.setLength(proficiencyName.length() - 1); proficiencyName.append('/'); } else { @@ -4204,7 +4237,7 @@ } proficiencyName.append(')'); - profName = proficiencyName.toString(); + String newprof = proficiencyName.toString(); // // Strip out the [Hands] variable as, according @@ -4213,23 +4246,31 @@ // they can always wield it 2 handed" // so we'll just force them to take the // 1-handed variety. - final int iOffs = profName.indexOf("[Hands]"); + final int iOffs = newprof.indexOf("[Hands]"); if (iOffs >= 0) { - profName = profName.substring(0, iOffs) - + profName.substring(iOffs + 7); + newprof = newprof.substring(0, iOffs) + + newprof.substring(iOffs + 7); } - WeaponProf wp = Globals.getWeaponProfKeyed(profName); + WeaponProf wp = Globals.getWeaponProfKeyed(newprof); if (wp == null) { wp = new WeaponProf(); - wp.setName(profName); - wp.setKeyName(profName); + wp.setName(newprof); + wp.setKeyName(newprof); wp.setTypeInfo(profTypeInfo.get(0)); setDefaultCrit(aPC); Globals.addWeaponProf(wp); } + if (weaponProf == null) + { + profName = newprof; + } + else + { + weaponProf = newprof; + } } } @@ -5920,7 +5961,15 @@ * @return The WeaponProf required to use the weapon. */ public WeaponProf getExpandedWeaponProf(final PlayerCharacter aPC) { - String aWProf = profName; + String aWProf; + if (weaponProf != null) + { + aWProf = weaponProf; + } + else + { + aWProf = profName; + } if (aWProf.length() == 0) { aWProf = getName(); @@ -6711,4 +6760,19 @@ return acceptsChildren(); } + public void setWeaponProf(String prof) + { + weaponProf = prof; + } + + public void setArmorProf(String prof) + { + armorProf = prof; + } + + public void setShieldProf(String prof) + { + shieldProf = prof; + } + } Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-01-05 15:55:30 UTC (rev 4830) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-01-05 20:49:02 UTC (rev 4831) @@ -3985,10 +3985,14 @@ // // Insert all types at the head of the list // - if (aProf.startsWith("TYPE=") || aProf.startsWith("TYPE.")) + if (aProf.startsWith("ARMORTYPE=") || aProf.startsWith("ARMORTYPE.")) { armorProfList.add(0, aProf); } + else if (aProf.startsWith("TYPE=") || aProf.startsWith("TYPE.")) + { + armorProfList.add(0, aProf); + } else { armorProfList.add(aProf); @@ -11906,31 +11910,35 @@ { final String aString = aList.get(i); - if ((aString.startsWith("TYPE=") || aString.startsWith("TYPE."))) + StringTokenizer tok; + if (aString.startsWith("TYPE=") || aString.startsWith("TYPE.")) { - int matches = 0; - final StringTokenizer tok = new StringTokenizer(aString - .substring(5), "."); - final int minMatches = tok.countTokens(); - while (tok.hasMoreTokens()) - { - final String aType = tok.nextToken(); - if (eq.isType(aType)) - { - matches++; - } - } - // We have to match all the tokens. - if (matches == minMatches) - { - return true; - } + tok = new StringTokenizer(aString.substring(5), "."); } + else if (aString.startsWith("ARMORTYPE=") || aString.startsWith("ARMORTYPE.")) + { + tok = new StringTokenizer(aString.substring(10), "."); + } else { // All TYPE profs are at the beginning of the list break; } + int matches = 0; + final int minMatches = tok.countTokens(); + while (tok.hasMoreTokens()) + { + final String aType = tok.nextToken(); + if (eq.isType(aType)) + { + matches++; + } + } + // We have to match all the tokens. + if (matches == minMatches) + { + return true; + } } return aList.contains(eq.profKey(this)); Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/ArmorTypeChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/ArmorTypeChoiceManager.java 2008-01-05 15:55:30 UTC (rev 4830) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/ArmorTypeChoiceManager.java 2008-01-05 20:49:02 UTC (rev 4831) @@ -75,6 +75,10 @@ { profKey = profKey.substring(5); } + if (profKey.startsWith("ARMORTYPE")) + { + profKey = profKey.substring(10); + } availableList.add(profKey); } Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/auto/ArmorProfToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/auto/ArmorProfToken.java 2008-01-05 15:55:30 UTC (rev 4830) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/auto/ArmorProfToken.java 2008-01-05 20:49:02 UTC (rev 4831) @@ -34,9 +34,14 @@ if (level > 1) { Logging.errorPrint("AUTO:" + getTokenName() - + " is not supported on class level lines"); + + " is not supported on class level lines"); return false; } + if (value.startsWith("TYPE")) + { + Logging.deprecationPrint("TYPE= in AUTO:ARMORPROF is deprecated. " + + "Use ARMORTYPE="); + } target.addAutoArray(getTokenName(), value); return true; } Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/equipment/ProficiencyToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/equipment/ProficiencyToken.java 2008-01-05 15:55:30 UTC (rev 4830) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/equipment/ProficiencyToken.java 2008-01-05 20:49:02 UTC (rev 4831) @@ -1,10 +1,12 @@ package plugin.lsttokens.equipment; +import pcgen.core.Constants; import pcgen.core.Equipment; import pcgen.persistence.lst.EquipmentLstToken; +import pcgen.util.Logging; /** - * Deals with PROFICIENCY token + * Deals with PROFICIENCY token */ public class ProficiencyToken implements EquipmentLstToken { @@ -16,7 +18,73 @@ public boolean parse(Equipment eq, String value) { - eq.setProfName(value); + int pipeLoc = value.indexOf(Constants.PIPE); + if (pipeLoc == -1) + { + Logging.deprecationPrint("Equipment Token PROFICIENCY syntax " + + "without a Subtoken is deprecated: " + value); + Logging.deprecationPrint("Please use: " + + "PROFICIENCY:<subtoken>|<prof>"); + eq.setProfName(value); + } + else + { + String subtoken = value.substring(0, pipeLoc); + String prof = value.substring(pipeLoc + 1); + if (prof == null || prof.length() == 0) + { + Logging.errorPrint("PROFICIENCY cannot have " + + "empty second argument: " + value); + return false; + } + if (prof.indexOf(Constants.PIPE) != -1) + { + Logging.errorPrint("PROFICIENCY cannot have two | characters: " + + value); + return false; + } + if (subtoken.equals("WEAPON")) + { + if (prof.startsWith("TYPE=")) + { + eq.setArmorProf("Weapon (" + prof.substring(5) + ")"); + } + else + { + eq.setWeaponProf(prof); + } + } + else if (subtoken.equals("ARMOR")) + { + if (prof.startsWith("TYPE=")) + { + eq.setArmorProf("Armor (" + prof.substring(5) + ")"); + } + else + { + eq.setArmorProf(prof); + } + } + else if (subtoken.equals("SHIELD")) + { + if (prof.startsWith("TYPE=")) + { + eq.setShieldProf("Shield (" + prof.substring(5) + ")"); + } + else + { + eq.setShieldProf(prof); + } + } + else + { + Logging.errorPrint("Unknown Subtoken for PROFICIENCY: " + + subtoken); + Logging.errorPrint(" Subtoken must be " + + "WEAPON, ARMOR or SHIELD"); + return false; + } + } return true; } } Modified: Trunk/pcgen/code/src/java/plugin/pretokens/test/PreArmorProfTester.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/pretokens/test/PreArmorProfTester.java 2008-01-05 15:55:30 UTC (rev 4830) +++ Trunk/pcgen/code/src/java/plugin/pretokens/test/PreArmorProfTester.java 2008-01-05 20:49:02 UTC (rev 4831) @@ -58,6 +58,17 @@ // TYPE=Light equals TYPE.Light runningTotal++; } + else if (profName.startsWith("ARMORTYPE")) + { + if (profName.substring(5).equalsIgnoreCase(prereq.getKey())) + { + runningTotal++; + } + else if (profName.substring(10).equalsIgnoreCase(prereq.getKey())) + { + runningTotal++; + } + } } return countedTotal(prereq, runningTotal); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-01-13 19:38:33
|
Revision: 4872 http://pcgen.svn.sourceforge.net/pcgen/?rev=4872&view=rev Author: thpr Date: 2008-01-13 11:38:37 -0800 (Sun, 13 Jan 2008) Log Message: ----------- [ 1856120 ] Please Implement - Equipment Prof Token Issue#: 1856120 Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/ArmorProf.java Trunk/pcgen/code/src/java/pcgen/core/Campaign.java Trunk/pcgen/code/src/java/pcgen/core/Globals.java Trunk/pcgen/code/src/java/pcgen/core/PObject.java Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java Trunk/pcgen/code/src/java/pcgen/core/utils/ListKey.java Trunk/pcgen/code/src/java/pcgen/persistence/lst/LstSystemLoader.java Trunk/pcgen/code/src/java/plugin/lsttokens/auto/ShieldProfToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/auto/WeaponProfToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/equipment/ProficiencyToken.java Trunk/pcgen/code/src/java/plugin/pretokens/test/PreShieldProfTester.java Added Paths: ----------- Trunk/pcgen/code/src/java/pcgen/core/ShieldProf.java Trunk/pcgen/code/src/java/pcgen/persistence/lst/ArmorProfLoader.java Trunk/pcgen/code/src/java/pcgen/persistence/lst/ArmorProfLstToken.java Trunk/pcgen/code/src/java/pcgen/persistence/lst/ShieldProfLoader.java Trunk/pcgen/code/src/java/pcgen/persistence/lst/ShieldProfLstToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/campaign/ArmorprofToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/campaign/ShieldprofToken.java Modified: Trunk/pcgen/code/src/java/pcgen/core/ArmorProf.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/ArmorProf.java 2008-01-13 02:05:00 UTC (rev 4871) +++ Trunk/pcgen/code/src/java/pcgen/core/ArmorProf.java 2008-01-13 19:38:37 UTC (rev 4872) @@ -28,13 +28,8 @@ * @version $Revision$ * DO NOT DELETE (waiting for use) */ -final class ArmorProf extends PObject implements Comparable<Object> +public final class ArmorProf extends PObject implements Comparable<Object> { - ArmorProf(final String aString) - { - setName(aString); - } - /** * Compares keyName only * Modified: Trunk/pcgen/code/src/java/pcgen/core/Campaign.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Campaign.java 2008-01-13 02:05:00 UTC (rev 4871) +++ Trunk/pcgen/code/src/java/pcgen/core/Campaign.java 2008-01-13 19:38:37 UTC (rev 4872) @@ -79,6 +79,8 @@ listChar.initializeListFor(ListKey.FILE_SPELL); listChar.initializeListFor(ListKey.FILE_TEMPLATE); listChar.initializeListFor(ListKey.FILE_WEAPON_PROF); + listChar.initializeListFor(ListKey.FILE_ARMOR_PROF); + listChar.initializeListFor(ListKey.FILE_SHIELD_PROF); } /** @@ -556,6 +558,24 @@ * * @param file */ + public void addArmorProfFile(final CampaignSourceEntry file) + { + listChar.addToListFor(ListKey.FILE_ARMOR_PROF, file); + } + + /** + * + * @param file + */ + public void addShieldProfFile(final CampaignSourceEntry file) + { + listChar.addToListFor(ListKey.FILE_SHIELD_PROF, file); + } + + /** + * + * @param file + */ public void addWeaponProfFile(final CampaignSourceEntry file) { listChar.addToListFor(ListKey.FILE_WEAPON_PROF, file); @@ -958,6 +978,24 @@ } /** + * Returns the armorProfFileList. + * @return List + */ + public List<CampaignSourceEntry> getArmorProfFiles() + { + return getListFor(ListKey.FILE_ARMOR_PROF); + } + + /** + * Returns the shieldProfFileList. + * @return List + */ + public List<CampaignSourceEntry> getShieldProfFiles() + { + return getListFor(ListKey.FILE_SHIELD_PROF); + } + + /** * Returns the weaponProfFileList. * @return List */ Modified: Trunk/pcgen/code/src/java/pcgen/core/Globals.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Globals.java 2008-01-13 02:05:00 UTC (rev 4871) +++ Trunk/pcgen/code/src/java/pcgen/core/Globals.java 2008-01-13 19:38:37 UTC (rev 4872) @@ -127,6 +127,8 @@ /** Weapon proficiency Data storage */ private static final PObjectDataStore<WeaponProf> weaponProfs = new PObjectDataStore<WeaponProf>("WeaponProf"); + private static final PObjectDataStore<ArmorProf> armorProfs = new PObjectDataStore<ArmorProf>("ArmorProf"); + private static final PObjectDataStore<ShieldProf> shieldProfs = new PObjectDataStore<ShieldProf>("ShieldProf"); /** this is used by the random selection tools */ private static final Random random = new Random(System.currentTimeMillis()); @@ -2028,6 +2030,28 @@ } /** + * Searches for an exact key match. + * + * @param aKey + * @return an exact match or null + */ + public static ArmorProf getArmorProfKeyed(final String aKey) + { + return armorProfs.getKeyed(aKey); + } + + /** + * Searches for an exact key match. + * + * @param aKey + * @return an exact match or null + */ + public static ShieldProf getShieldProfKeyed(final String aKey) + { + return shieldProfs.getKeyed(aKey); + } + + /** * Get weapon prof names * @param delim * @param addArrayMarkers @@ -2199,6 +2223,24 @@ } /** + * Add a armor proficiency + * @param wp + */ + public static void addArmorProf(final ArmorProf wp) + { + armorProfs.add(wp); + } + + /** + * Add a shield proficiency + * @param wp + */ + public static void addShieldProf(final ShieldProf wp) + { + shieldProfs.add(wp); + } + + /** * Adjust damage * @param aDamage * @param baseSize @@ -2580,6 +2622,24 @@ } /** + * Remove a armor prof by key + * @param aKey + */ + public static void removeArmorProfKeyed(final String aKey) + { + armorProfs.removeNamed(aKey); + } + + /** + * Remove a shield prof by key + * @param aKey + */ + public static void removeShieldProfKeyed(final String aKey) + { + shieldProfs.removeNamed(aKey); + } + + /** * roll HP * @param min * @param max Modified: Trunk/pcgen/code/src/java/pcgen/core/PObject.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-01-13 02:05:00 UTC (rev 4871) +++ Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-01-13 19:38:37 UTC (rev 4872) @@ -3309,12 +3309,19 @@ String tok = aTok.nextToken(); if ((tok.startsWith("TYPE=") || tok.startsWith("TYPE.")) - && tag.startsWith("WEAPON") && expandWeaponTypes) - { - List<String> xList = processWeaponAutoTags(aPC, tok); + && tag.startsWith("WEAPON") && expandWeaponTypes) + { + List<String> xList = processWeaponAutoTags(aPC, tok.substring(5)); - aList.addAll(xList); - } + aList.addAll(xList); + } + else if ((tok.startsWith("WEAPONTYPE=") || tok.startsWith("WEAPONTYPE.")) + && tag.startsWith("WEAPON") && expandWeaponTypes) + { + List<String> xList = processWeaponAutoTags(aPC, tok.substring(11)); + + aList.addAll(xList); + } else if ((tok.startsWith("TYPE=") || tok.startsWith("TYPE.")) && tag.startsWith("ARMOR")) { @@ -3384,7 +3391,7 @@ */ private List<String> processWeaponAutoTags(final PlayerCharacter aPC, String tok) { - final StringTokenizer bTok = new StringTokenizer(tok.substring(5), "."); + final StringTokenizer bTok = new StringTokenizer(tok, "."); List<String> xList = null; while (bTok.hasMoreTokens()) Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-01-13 02:05:00 UTC (rev 4871) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-01-13 19:38:37 UTC (rev 4872) @@ -7683,8 +7683,12 @@ // // Insert all types at the head of the list // - if (aProf.startsWith("TYPE=") || aProf.startsWith("TYPE.")) + if (aProf.startsWith("SHIELDTYPE=") || aProf.startsWith("SHIELDTYPE.")) { + armorProfList.add(0, aProf); + } + else if (aProf.startsWith("TYPE=") || aProf.startsWith("TYPE.")) + { shieldProfList.add(0, aProf); } else @@ -11940,6 +11944,10 @@ { tok = new StringTokenizer(aString.substring(10), "."); } + else if (aString.startsWith("SHIELDTYPE=") || aString.startsWith("SHIELDTYPE.")) + { + tok = new StringTokenizer(aString.substring(11), "."); + } else { // All TYPE profs are at the beginning of the list Added: Trunk/pcgen/code/src/java/pcgen/core/ShieldProf.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/ShieldProf.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/core/ShieldProf.java 2008-01-13 19:38:37 UTC (rev 4872) @@ -0,0 +1,68 @@ +/* + * ArmorProf.java + * Copyright 2001 (C) Bryan McRoberts <mer...@ya...> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Created on April 21, 2001, 2:15 PM + */ +package pcgen.core; + + +/** + * <code>ArmorProf</code>. + * + * @author Thomas Clegg <ark...@sw...> + * @version $Revision: 1957 $ + * DO NOT DELETE (waiting for use) + */ +public final class ShieldProf extends PObject implements Comparable<Object> +{ + /** + * Compares keyName only + * + * @param o1 Object + * @return int + * @see Comparable#compareTo(Object) + */ + @Override + public int compareTo(final Object o1) + { + return keyName.compareToIgnoreCase(((ShieldProf) o1).keyName); + } + + /** + * Compares keyName only + * + * @param o1 Object + * @return boolean + */ + @Override + public boolean equals(final Object o1) + { + return o1 instanceof ShieldProf && keyName.equals(((ShieldProf) o1).keyName); + } + + /** + * Hashcode of the keyName + * + * @return int + */ + @Override + public int hashCode() + { + return keyName.hashCode(); + } +} Modified: Trunk/pcgen/code/src/java/pcgen/core/utils/ListKey.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/utils/ListKey.java 2008-01-13 02:05:00 UTC (rev 4871) +++ Trunk/pcgen/code/src/java/pcgen/core/utils/ListKey.java 2008-01-13 19:38:37 UTC (rev 4872) @@ -139,6 +139,8 @@ public static final ListKey<Ability> VIRTUAL_FEATS = new ListKey<Ability>(); // /** Key for a list of weapon proficiencies */ // public static final ListKey<String> WEAPON_PROF = new ListKey<String>(); + public static final ListKey<CampaignSourceEntry> FILE_ARMOR_PROF = new ListKey<CampaignSourceEntry>(); + public static final ListKey<CampaignSourceEntry> FILE_SHIELD_PROF = new ListKey<CampaignSourceEntry>(); /** Private constructor to prevent instantiation of this class */ private ListKey() { Added: Trunk/pcgen/code/src/java/pcgen/persistence/lst/ArmorProfLoader.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/persistence/lst/ArmorProfLoader.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/persistence/lst/ArmorProfLoader.java 2008-01-13 19:38:37 UTC (rev 4872) @@ -0,0 +1,149 @@ +/* + * WeaponProfLoader.java + * Copyright 2001 (C) Bryan McRoberts <mer...@ya...> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Created on February 22, 2002, 10:29 PM + * + * $Id: WeaponProfLoader.java 3827 2007-08-20 21:42:58Z thpr $ + */ +package pcgen.persistence.lst; + +import java.util.Map; +import java.util.StringTokenizer; + +import pcgen.core.ArmorProf; +import pcgen.core.Globals; +import pcgen.core.PObject; +import pcgen.persistence.PersistenceLayerException; +import pcgen.persistence.SystemLoader; +import pcgen.util.Logging; + +public final class ArmorProfLoader extends LstObjectFileLoader<ArmorProf> +{ + /** Creates a new instance of ArmorProfLoader */ + public ArmorProfLoader() + { + super(); + } + + /** + * @see pcgen.persistence.lst.LstObjectFileLoader#parseLine(pcgen.core.PObject, java.lang.String, pcgen.persistence.lst.CampaignSourceEntry) + */ + @Override + public ArmorProf parseLine(ArmorProf aWP, String lstLine, + CampaignSourceEntry source) throws PersistenceLayerException + { + ArmorProf prof = aWP; + + // Make sure we have a weapon prof to load + if (prof == null) + { + prof = new ArmorProf(); + } + + final StringTokenizer colToken = + new StringTokenizer(lstLine, SystemLoader.TAB_DELIM); + int col = 0; + + Map<String, LstToken> tokenMap = + TokenStore.inst().getTokenMap(ArmorProfLstToken.class); + while (colToken.hasMoreTokens()) + { + final String colString = colToken.nextToken().trim(); + final int idxColon = colString.indexOf(':'); + String key = ""; + try + { + key = colString.substring(0, idxColon); + } + catch (Exception e) + { + // TODO Handle Exception + } + ArmorProfLstToken token = (ArmorProfLstToken) tokenMap.get(key); + + if (col == 0) // First column is name, without a tag + { + prof.setName(colString); + prof.setSourceCampaign(source.getCampaign()); + prof.setSourceURI(source.getURI()); + } + else if (token != null) + { + final String value = colString.substring(idxColon + 1).trim(); + LstUtils.deprecationCheck(token, prof, value); + if (!token.parse(prof, value)) + { + Logging.errorPrint("Error parsing skill " + + prof.getDisplayName() + ':' + source.getURI() + ':' + + colString + "\""); + } + } + else if (PObjectLoader.parseTag(prof, colString)) + { + continue; + } + else + { + Logging.errorPrint("Illegal armor proficiency info '" + + lstLine + "' in " + source.toString()); + } + + ++col; + } + + // WeaponProfs are one line each; + // finish the object and return null + completeObject(source, prof); + + return null; + } + + /** + * Get the weapon prof object with key aKey + * + * @param aKey + * @return PObject + * @see pcgen.persistence.lst.LstObjectFileLoader#getObjectKeyed(java.lang.String) + */ + @Override + protected ArmorProf getObjectKeyed(String aKey) + { + return Globals.getArmorProfKeyed(aKey); + } + + /** + * @see pcgen.persistence.lst.LstObjectFileLoader#performForget(pcgen.core.PObject) + */ + @Override + protected void performForget(final ArmorProf objToForget) + { + Globals.removeArmorProfKeyed(objToForget.getKeyName()); + } + + /** + * @see pcgen.persistence.lst.LstObjectFileLoader#addGlobalObject(pcgen.core.PObject) + */ + @Override + protected void addGlobalObject(final PObject pObj) + { + Globals.addArmorProf((ArmorProf) pObj); + // TODO - What exactly is this doing? Why would we set that it is not + // a new item when we just added it? + pObj.setNewItem(false); + } +} Added: Trunk/pcgen/code/src/java/pcgen/persistence/lst/ArmorProfLstToken.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/persistence/lst/ArmorProfLstToken.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/persistence/lst/ArmorProfLstToken.java 2008-01-13 19:38:37 UTC (rev 4872) @@ -0,0 +1,43 @@ +/* + * WeaponProfToken + * Copyright 2008 + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Created on September 2, 2002, 8:16 AM + * + * Current Ver: $Revision: 197 $ + * Last Editor: $Author: nuance $ + * Last Edited: $Date: 2006-03-14 18:59:43 -0400 (Tue, 14 Mar 2006) $ + * + */ +package pcgen.persistence.lst; + +import pcgen.core.ArmorProf; + +/** + * <code>ArmorProfToken</code> + */ +public interface ArmorProfLstToken extends LstToken +{ + /** + * Parses an ArmorProf object + * + * @param prof + * @param value + * @return true if parse OK + */ + public abstract boolean parse(ArmorProf prof, String value); +} Modified: Trunk/pcgen/code/src/java/pcgen/persistence/lst/LstSystemLoader.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/persistence/lst/LstSystemLoader.java 2008-01-13 02:05:00 UTC (rev 4871) +++ Trunk/pcgen/code/src/java/pcgen/persistence/lst/LstSystemLoader.java 2008-01-13 19:38:37 UTC (rev 4872) @@ -205,7 +205,11 @@ private final List<CampaignSourceEntry> templateFileList = new ArrayList<CampaignSourceEntry>(); private final List<CampaignSourceEntry> weaponProfFileList = - new ArrayList<CampaignSourceEntry>(); + new ArrayList<CampaignSourceEntry>(); + private final List<CampaignSourceEntry> armorProfFileList = + new ArrayList<CampaignSourceEntry>(); + private final List<CampaignSourceEntry> shieldProfFileList = + new ArrayList<CampaignSourceEntry>(); private LocationLoader locationLoader = new LocationLoader(); private final Set<URI> loadedFiles = new HashSet<URI>(); private PCClassLoader classLoader = new PCClassLoader(); @@ -232,6 +236,8 @@ private StringBuffer matureCampaigns = new StringBuffer(); private TraitLoader traitLoader = new TraitLoader(); private WeaponProfLoader wProfLoader = new WeaponProfLoader(); + private ArmorProfLoader aProfLoader = new ArmorProfLoader(); + private ShieldProfLoader sProfLoader = new ShieldProfLoader(); private boolean customItemsLoaded = false; private boolean showD20 = false; private boolean showLicensed = true; @@ -274,6 +280,8 @@ templateLoader.addObserver(this); traitLoader.addObserver(this); wProfLoader.addObserver(this); + aProfLoader.addObserver(this); + sProfLoader.addObserver(this); try { globalCampaign = new CampaignSourceEntry(new Campaign(), @@ -435,6 +443,8 @@ // load weapon profs first wProfLoader.loadLstFiles(weaponProfFileList); + aProfLoader.loadLstFiles(armorProfFileList); + sProfLoader.loadLstFiles(shieldProfFileList); // load skills before classes to handle class skills skillLoader.loadLstFiles(skillFileList); @@ -562,6 +572,8 @@ count += spellFileList.size(); count += templateFileList.size(); count += weaponProfFileList.size(); + count += armorProfFileList.size(); + count += shieldProfFileList.size(); return count; } @@ -1191,6 +1203,8 @@ deityFileList.addAll(aCamp.getDeityFiles()); domainFileList.addAll(aCamp.getDomainFiles()); weaponProfFileList.addAll(aCamp.getWeaponProfFiles()); + armorProfFileList.addAll(aCamp.getArmorProfFiles()); + shieldProfFileList.addAll(aCamp.getShieldProfFiles()); equipmentFileList.addAll(aCamp.getEquipFiles()); classSkillFileList.addAll(aCamp.getClassSkillFiles()); classSpellFileList.addAll(aCamp.getClassSpellFiles()); @@ -2000,6 +2014,8 @@ deityFileList.removeAll(lstExcludeFiles); domainFileList.removeAll(lstExcludeFiles); weaponProfFileList.removeAll(lstExcludeFiles); + armorProfFileList.removeAll(lstExcludeFiles); + shieldProfFileList.removeAll(lstExcludeFiles); equipmentFileList.removeAll(lstExcludeFiles); classSkillFileList.removeAll(lstExcludeFiles); classSpellFileList.removeAll(lstExcludeFiles); @@ -2030,6 +2046,8 @@ domainFileList.clear(); templateFileList.clear(); weaponProfFileList.clear(); + armorProfFileList.clear(); + shieldProfFileList.clear(); equipmentFileList.clear(); classSkillFileList.clear(); classSpellFileList.clear(); Added: Trunk/pcgen/code/src/java/pcgen/persistence/lst/ShieldProfLoader.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/persistence/lst/ShieldProfLoader.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/persistence/lst/ShieldProfLoader.java 2008-01-13 19:38:37 UTC (rev 4872) @@ -0,0 +1,149 @@ +/* + * WeaponProfLoader.java + * Copyright 2001 (C) Bryan McRoberts <mer...@ya...> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Created on February 22, 2002, 10:29 PM + * + * $Id: WeaponProfLoader.java 3827 2007-08-20 21:42:58Z thpr $ + */ +package pcgen.persistence.lst; + +import java.util.Map; +import java.util.StringTokenizer; + +import pcgen.core.Globals; +import pcgen.core.PObject; +import pcgen.core.ShieldProf; +import pcgen.persistence.PersistenceLayerException; +import pcgen.persistence.SystemLoader; +import pcgen.util.Logging; + +public final class ShieldProfLoader extends LstObjectFileLoader<ShieldProf> +{ + /** Creates a new instance of ShieldProfLoader */ + public ShieldProfLoader() + { + super(); + } + + /** + * @see pcgen.persistence.lst.LstObjectFileLoader#parseLine(pcgen.core.PObject, java.lang.String, pcgen.persistence.lst.CampaignSourceEntry) + */ + @Override + public ShieldProf parseLine(ShieldProf aWP, String lstLine, + CampaignSourceEntry source) throws PersistenceLayerException + { + ShieldProf prof = aWP; + + // Make sure we have a weapon prof to load + if (prof == null) + { + prof = new ShieldProf(); + } + + final StringTokenizer colToken = + new StringTokenizer(lstLine, SystemLoader.TAB_DELIM); + int col = 0; + + Map<String, LstToken> tokenMap = + TokenStore.inst().getTokenMap(ShieldProfLstToken.class); + while (colToken.hasMoreTokens()) + { + final String colString = colToken.nextToken().trim(); + final int idxColon = colString.indexOf(':'); + String key = ""; + try + { + key = colString.substring(0, idxColon); + } + catch (Exception e) + { + // TODO Handle Exception + } + ShieldProfLstToken token = (ShieldProfLstToken) tokenMap.get(key); + + if (col == 0) // First column is name, without a tag + { + prof.setName(colString); + prof.setSourceCampaign(source.getCampaign()); + prof.setSourceURI(source.getURI()); + } + else if (token != null) + { + final String value = colString.substring(idxColon + 1).trim(); + LstUtils.deprecationCheck(token, prof, value); + if (!token.parse(prof, value)) + { + Logging.errorPrint("Error parsing skill " + + prof.getDisplayName() + ':' + source.getURI() + ':' + + colString + "\""); + } + } + else if (PObjectLoader.parseTag(prof, colString)) + { + continue; + } + else + { + Logging.errorPrint("Illegal armor proficiency info '" + + lstLine + "' in " + source.toString()); + } + + ++col; + } + + // WeaponProfs are one line each; + // finish the object and return null + completeObject(source, prof); + + return null; + } + + /** + * Get the weapon prof object with key aKey + * + * @param aKey + * @return PObject + * @see pcgen.persistence.lst.LstObjectFileLoader#getObjectKeyed(java.lang.String) + */ + @Override + protected ShieldProf getObjectKeyed(String aKey) + { + return Globals.getShieldProfKeyed(aKey); + } + + /** + * @see pcgen.persistence.lst.LstObjectFileLoader#performForget(pcgen.core.PObject) + */ + @Override + protected void performForget(final ShieldProf objToForget) + { + Globals.removeShieldProfKeyed(objToForget.getKeyName()); + } + + /** + * @see pcgen.persistence.lst.LstObjectFileLoader#addGlobalObject(pcgen.core.PObject) + */ + @Override + protected void addGlobalObject(final PObject pObj) + { + Globals.addShieldProf((ShieldProf) pObj); + // TODO - What exactly is this doing? Why would we set that it is not + // a new item when we just added it? + pObj.setNewItem(false); + } +} Added: Trunk/pcgen/code/src/java/pcgen/persistence/lst/ShieldProfLstToken.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/persistence/lst/ShieldProfLstToken.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/persistence/lst/ShieldProfLstToken.java 2008-01-13 19:38:37 UTC (rev 4872) @@ -0,0 +1,43 @@ +/* + * WeaponProfToken + * Copyright 2008 + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Created on September 2, 2002, 8:16 AM + * + * Current Ver: $Revision: 197 $ + * Last Editor: $Author: nuance $ + * Last Edited: $Date: 2006-03-14 18:59:43 -0400 (Tue, 14 Mar 2006) $ + * + */ +package pcgen.persistence.lst; + +import pcgen.core.ShieldProf; + +/** + * <code>ShieldProfToken</code> + */ +public interface ShieldProfLstToken extends LstToken +{ + /** + * Parses an ShieldProf object + * + * @param prof + * @param value + * @return true if parse OK + */ + public abstract boolean parse(ShieldProf prof, String value); +} Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/auto/ShieldProfToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/auto/ShieldProfToken.java 2008-01-13 02:05:00 UTC (rev 4871) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/auto/ShieldProfToken.java 2008-01-13 19:38:37 UTC (rev 4872) @@ -37,6 +37,11 @@ + " is not supported on class level lines"); return false; } + if (value.startsWith("TYPE")) + { + Logging.deprecationPrint("TYPE= in AUTO:" + getTokenName() + + " is deprecated. " + "Use SHIELDTYPE="); + } target.addAutoArray(getTokenName(), value); return true; } Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/auto/WeaponProfToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/auto/WeaponProfToken.java 2008-01-13 02:05:00 UTC (rev 4871) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/auto/WeaponProfToken.java 2008-01-13 19:38:37 UTC (rev 4872) @@ -37,6 +37,13 @@ + " is not supported on class level lines"); return false; } + if (value.startsWith("TYPE")) + { + Logging.deprecationPrint("TYPE= in AUTO:" + getTokenName() + + " Must refer to the Weapon Proficiency LST File. " + + "Consider WEAPONTYPE= " + + "if you are trying to match an Equipment TYPE"); + } target.addAutoArray(getTokenName(), value); return true; } Added: Trunk/pcgen/code/src/java/plugin/lsttokens/campaign/ArmorprofToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/campaign/ArmorprofToken.java (rev 0) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/campaign/ArmorprofToken.java 2008-01-13 19:38:37 UTC (rev 4872) @@ -0,0 +1,27 @@ +package plugin.lsttokens.campaign; + +import java.net.URI; + +import pcgen.core.Campaign; +import pcgen.persistence.lst.CampaignLstToken; +import pcgen.persistence.lst.CampaignSourceEntry; + +/** + * Class deals with WEAPONPROF Token + */ +public class ArmorprofToken implements CampaignLstToken +{ + + public String getTokenName() + { + return "ARMORPROF"; + } + + public boolean parse(Campaign campaign, String value, URI sourceUri) + { + campaign.addLine("ARMORPROF:" + value); + campaign.addArmorProfFile(CampaignSourceEntry.getNewCSE(campaign, + sourceUri, value)); + return true; + } +} Added: Trunk/pcgen/code/src/java/plugin/lsttokens/campaign/ShieldprofToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/campaign/ShieldprofToken.java (rev 0) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/campaign/ShieldprofToken.java 2008-01-13 19:38:37 UTC (rev 4872) @@ -0,0 +1,27 @@ +package plugin.lsttokens.campaign; + +import java.net.URI; + +import pcgen.core.Campaign; +import pcgen.persistence.lst.CampaignLstToken; +import pcgen.persistence.lst.CampaignSourceEntry; + +/** + * Class deals with WEAPONPROF Token + */ +public class ShieldprofToken implements CampaignLstToken +{ + + public String getTokenName() + { + return "ArmorprofToken.java"; + } + + public boolean parse(Campaign campaign, String value, URI sourceUri) + { + campaign.addLine("SHIELDPROF:" + value); + campaign.addShieldProfFile(CampaignSourceEntry.getNewCSE(campaign, + sourceUri, value)); + return true; + } +} Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/equipment/ProficiencyToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/equipment/ProficiencyToken.java 2008-01-13 02:05:00 UTC (rev 4871) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/equipment/ProficiencyToken.java 2008-01-13 19:38:37 UTC (rev 4872) @@ -45,36 +45,15 @@ } if (subtoken.equals("WEAPON")) { - if (prof.startsWith("TYPE=")) - { - eq.setArmorProf("Weapon (" + prof.substring(5) + ")"); - } - else - { - eq.setWeaponProf(prof); - } + eq.setWeaponProf(prof); } else if (subtoken.equals("ARMOR")) { - if (prof.startsWith("TYPE=")) - { - eq.setArmorProf("Armor (" + prof.substring(5) + ")"); - } - else - { - eq.setArmorProf(prof); - } + eq.setArmorProf(prof); } else if (subtoken.equals("SHIELD")) { - if (prof.startsWith("TYPE=")) - { - eq.setShieldProf("Shield (" + prof.substring(5) + ")"); - } - else - { - eq.setShieldProf(prof); - } + eq.setShieldProf(prof); } else { Modified: Trunk/pcgen/code/src/java/plugin/pretokens/test/PreShieldProfTester.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/pretokens/test/PreShieldProfTester.java 2008-01-13 02:05:00 UTC (rev 4871) +++ Trunk/pcgen/code/src/java/plugin/pretokens/test/PreShieldProfTester.java 2008-01-13 19:38:37 UTC (rev 4872) @@ -60,6 +60,18 @@ { runningTotal++; } + else if (profName.startsWith("SHIELDTYPE")) + { + if (profName.substring(6).equalsIgnoreCase(prereq.getKey())) + { + runningTotal++; + } + else if (profName.substring(11).equalsIgnoreCase( + prereq.getKey())) + { + runningTotal++; + } + } } runningTotal = This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-01-14 01:43:20
|
Revision: 4875 http://pcgen.svn.sourceforge.net/pcgen/?rev=4875&view=rev Author: thpr Date: 2008-01-13 17:43:11 -0800 (Sun, 13 Jan 2008) Log Message: ----------- [ 1809933 ] Please Implement - CHOOSE tag revision EqMod & Non-EqMod Issue#: 1809933 Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/EquipmentChoice.java Trunk/pcgen/code/src/java/pcgen/persistence/lst/ChooseLoader.java Trunk/pcgen/code/src/java/pcgen/persistence/lst/EquipmentModifierLoader.java Trunk/pcgen/code/src/java/pcgen/persistence/lst/TokenStore.java Trunk/pcgen/code/src/java/plugin/lsttokens/ChooseLst.java Trunk/pcgen/code/src/java/plugin/lsttokens/choose/NumberToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/choose/StringToken.java Added Paths: ----------- Trunk/pcgen/code/src/java/pcgen/persistence/lst/EqModChooseLstToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/ChooseToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/choose/ Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/choose/EqBuilderEqTypeToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/choose/EqBuilderSpellToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/choose/NoChoiceToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/choose/NumberToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/choose/SkillBonusToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/choose/StatBonusToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/choose/StringToken.java Removed Paths: ------------- Trunk/pcgen/code/src/java/plugin/lsttokens/choose/EqBuilderEqTypeToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/choose/EqBuilderSpellToken.java Modified: Trunk/pcgen/code/src/java/pcgen/core/EquipmentChoice.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/EquipmentChoice.java 2008-01-13 19:40:50 UTC (rev 4874) +++ Trunk/pcgen/code/src/java/pcgen/core/EquipmentChoice.java 2008-01-14 01:43:11 UTC (rev 4875) @@ -539,20 +539,25 @@ final int numSelected, final boolean forEqBuilder) { - final StringTokenizer aTok = new StringTokenizer(choiceString, "|", false); - String choiceType = aTok.nextToken(); - String category = "FEAT"; - - if (choiceType.startsWith("COUNT=")) + final StringTokenizer titleTok = new StringTokenizer(choiceString, "|", false); + while (!forEqBuilder && titleTok.hasMoreTokens()) { - this.setMaxSelectFromString(choiceType); - choiceType = aTok.nextToken(); + String workingkind = titleTok.nextToken(); + if (workingkind.startsWith("TITLE=")) + { + this.setTitle(workingkind.substring(6)); + } + else if (workingkind.startsWith("COUNT=")) + { + this.setMaxSelectFromString(workingkind); + } } - if (choiceType.equals("ABILITY")) - { - category = aTok.nextToken(); - } + String originalkind = null; + final StringTokenizer aTok = new StringTokenizer(choiceString, "|", false); + boolean needStats = false; + boolean needSkills = false; + while (!forEqBuilder && aTok.hasMoreTokens()) { String kind = aTok.nextToken(); @@ -561,59 +566,94 @@ if (kind.startsWith("TITLE=")) { - this.setTitle(kind.substring(6)); + //Do nothing, handled above } - else if (kind.startsWith("TYPE=") || - kind.startsWith("TYPE.")) + else if (kind.startsWith("COUNT=")) { - this.addChoicesByType( - parent, - available, - numSelected, - kind, - choiceType, - category); + // Do nothing, handled above } - else if ("STAT".equals(kind)) - { - this.addStats(); - } - else if ("SKILL".equals(kind)) - { - this.addSkills(); - } - else if ("MULTIPLE".equals(kind)) - { - this.setAllowDuplicates(true); - } - else if ("NOSIGN".equals(kind)) - { - this.setNoSign(true); - } - else if (kind.startsWith("MIN=")) - { - this.setMinValueFromString(kind); - } - else if (kind.startsWith("MAX=")) - { - this.setMaxValueFromString(kind); - } - else if (kind.startsWith("INCREMENT=")) - { - this.setIncrementValueFromString(kind); - } else { - if (!this.getAvailableList().contains(kind)) + if (originalkind == null) { - this.getAvailableList().add(kind); + originalkind = kind; + if (originalkind.equals("STATBONUS")) + { + needStats = true; + } + else if (originalkind.equals("SKILLBONUS")) + { + needSkills = true; + } + } + else if (kind.startsWith("TYPE=") || kind.startsWith("TYPE.")) + { + if (originalkind.equals("SKILLBONUS")) + { + //New Style + this.addChoicesByType(parent, available, numSelected, kind, + "SKILL", "FEAT"); + } + else + { + //Old Style + this.addChoicesByType(parent, available, numSelected, kind, + getTitle(), "FEAT"); + } + } + else if ("STAT".equals(kind)) + { + this.addStats(); + } + else if ("SKILL".equals(kind)) + { + this.addSkills(); + } + else if ("MULTIPLE".equals(kind)) + { + this.setAllowDuplicates(true); + } + else if ("NOSIGN".equals(kind)) + { + this.setNoSign(true); + } + else if (kind.startsWith("MIN=")) + { + this.setMinValueFromString(kind); + } + else if (kind.startsWith("MAX=")) + { + this.setMaxValueFromString(kind); + } + else if (kind.startsWith("INCREMENT=")) + { + this.setIncrementValueFromString(kind); + } + else + { + needStats = false; + needSkills = false; + if (!this.getAvailableList().contains(kind)) + { + this.getAvailableList().add(kind); + } + } } } + if (needStats) + { + this.addStats(); + } + else if (needSkills) + { + this.addSkills(); + } + if (this.getTitle() == null) { - this.setTitle(choiceType); + this.setTitle(originalkind); } if (this.getMaxSelect() == Integer.MAX_VALUE) Modified: Trunk/pcgen/code/src/java/pcgen/persistence/lst/ChooseLoader.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/persistence/lst/ChooseLoader.java 2008-01-13 19:40:50 UTC (rev 4874) +++ Trunk/pcgen/code/src/java/pcgen/persistence/lst/ChooseLoader.java 2008-01-14 01:43:11 UTC (rev 4875) @@ -24,6 +24,7 @@ import java.util.Map; +import pcgen.core.EquipmentModifier; import pcgen.core.PObject; import pcgen.persistence.PersistenceLayerException; import pcgen.util.Logging; @@ -35,6 +36,42 @@ // Utility Class, no construction needed } + public static boolean isEqModChooseToken(String key) + { + return TokenStore.inst().getTokenMap(EqModChooseLstToken.class) + .get(key) != null; + //|| isGlobalChooseToken(key); + } + + public static boolean isGlobalChooseToken(String key) + { + return TokenStore.inst().getTokenMap(ChooseLstToken.class).get(key) != null; + } + + public static boolean parseEqModToken(EquipmentModifier mod, String prefix, + String key, String value) + { + Map<String, LstToken> tokenMap = TokenStore.inst().getTokenMap( + EqModChooseLstToken.class); + EqModChooseLstToken token = (EqModChooseLstToken) tokenMap.get(key); + if (token != null) + { + LstUtils.deprecationCheck(token, mod, value); + if (!token.parse(mod, prefix, value)) + { + Logging.deprecationPrint("Error parsing CHOOSE: " + key + ":" + + value + " in " + mod.getDisplayName() + " of " + + mod.getSourceURI()); + return false; + } + return true; + } + //in case global use is needed: + //parseToken(mod, prefix, key, value, -9); + //Always have to return true to maintain old format as ok, but deprecated + return true; + } + /** * This method is static so it can be used by the ADD Token. * Added: Trunk/pcgen/code/src/java/pcgen/persistence/lst/EqModChooseLstToken.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/persistence/lst/EqModChooseLstToken.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/persistence/lst/EqModChooseLstToken.java 2008-01-14 01:43:11 UTC (rev 4875) @@ -0,0 +1,38 @@ +/* + * ChooseLstToken + * Copyright 2007 (C) Thomas Parker <th...@us...> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Created on February 23, 2007 + * + * Current Ver: $Revision: 197 $ + * Last Editor: $Author: nuance $ + * Last Edited: $Date: 2006-03-14 17:59:43 -0500 (Tue, 14 Mar 2006) $ + * + */ +package pcgen.persistence.lst; + +import pcgen.core.EquipmentModifier; + +/** + * <code>ChooseLstToken</code> + * + * @author Thomas Parker <th...@us...> + */ +public interface EqModChooseLstToken extends LstToken +{ + public abstract boolean parse(EquipmentModifier mod, String prefix, String value); +} Modified: Trunk/pcgen/code/src/java/pcgen/persistence/lst/EquipmentModifierLoader.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/persistence/lst/EquipmentModifierLoader.java 2008-01-13 19:40:50 UTC (rev 4874) +++ Trunk/pcgen/code/src/java/pcgen/persistence/lst/EquipmentModifierLoader.java 2008-01-14 01:43:11 UTC (rev 4875) @@ -96,7 +96,7 @@ final String value = colString.substring(idxColon + 1); LstUtils.deprecationCheck(token, eqMod, value); if (!token.parse(eqMod, value)) { - Logging.errorPrint("Error parsing ability " + Logging.errorPrint("Error parsing EqMod " + eqMod.getDisplayName() + ':' + source.getURI() + ':' + colString + "\""); } Modified: Trunk/pcgen/code/src/java/pcgen/persistence/lst/TokenStore.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/persistence/lst/TokenStore.java 2008-01-13 19:40:50 UTC (rev 4874) +++ Trunk/pcgen/code/src/java/pcgen/persistence/lst/TokenStore.java 2008-01-14 01:43:11 UTC (rev 4875) @@ -117,6 +117,7 @@ tokenTypeList.add(SponsorLstToken.class); //subtokens + tokenTypeList.add(EqModChooseLstToken.class); tokenTypeList.add(ChooseLstToken.class); tokenTypeList.add(AutoLstToken.class); tokenTypeList.add(AddLstToken.class); Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/ChooseLst.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/ChooseLst.java 2008-01-13 19:40:50 UTC (rev 4874) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/ChooseLst.java 2008-01-14 01:43:11 UTC (rev 4875) @@ -8,6 +8,7 @@ import java.util.List; import pcgen.core.Constants; +import pcgen.core.EquipmentModifier; import pcgen.core.PObject; import pcgen.core.utils.CoreUtility; import pcgen.persistence.lst.ChooseLoader; @@ -28,6 +29,10 @@ public boolean parse(PObject obj, String value, int anInt) { + if (obj instanceof EquipmentModifier) + { + return false; + } if (!value.startsWith("CHOOSE:LANGAUTO")) { String key; Deleted: Trunk/pcgen/code/src/java/plugin/lsttokens/choose/EqBuilderEqTypeToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/choose/EqBuilderEqTypeToken.java 2008-01-13 19:40:50 UTC (rev 4874) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/choose/EqBuilderEqTypeToken.java 2008-01-14 01:43:11 UTC (rev 4875) @@ -1,129 +0,0 @@ -/* - * EqBuilderEqTypeToken.java - * Copyright 2007 (C) James Dempsey <jde...@us...> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Created on 12/01/2008 - * - * $Id$ - */ -package plugin.lsttokens.choose; - -import java.util.StringTokenizer; - -import pcgen.core.Constants; -import pcgen.core.PObject; -import pcgen.persistence.lst.ChooseLstToken; -import pcgen.util.Logging; - -/** - * <code>EqBuilderEqTypeToken</code> parses the EQ Builder specific choose - * string to allow the selection of equipent types. - * - * Last Editor: $Author$ - * Last Edited: $Date$ - * - * @author James Dempsey <jde...@us...> - * @version $Revision$ - */ -public class EqBuilderEqTypeToken implements ChooseLstToken -{ - - /* (non-Javadoc) - * @see pcgen.persistence.lst.ChooseLstToken#parse(pcgen.core.PObject, java.lang.String, java.lang.String) - */ - public boolean parse(PObject po, String prefix, String value) - { - if (value == null) - { - po.setChoiceString(getTokenName()); - return true; - } - if (value.indexOf(',') != -1) - { - Logging.errorPrint("CHOOSE:" + getTokenName() - + " arguments may not contain , : " + value); - return false; - } - if (value.indexOf('[') != -1) - { - Logging.errorPrint("CHOOSE:" + getTokenName() - + " arguments may not contain [] : " + value); - return false; - } - if (value.charAt(0) == '|') - { - Logging.errorPrint("CHOOSE:" + getTokenName() - + " arguments may not start with | : " + value); - return false; - } - if (value.charAt(value.length() - 1) == '|') - { - Logging.errorPrint("CHOOSE:" + getTokenName() - + " arguments may not end with | : " + value); - return false; - } - if (value.indexOf("||") != -1) - { - Logging.errorPrint("CHOOSE:" + getTokenName() - + " arguments uses double separator || : " + value); - return false; - } - int pipeLoc = value.indexOf("|"); - if (pipeLoc == -1) - { - Logging.errorPrint("CHOOSE:" + getTokenName() - + " must have two or more | delimited arguments : " + value); - return false; - } - StringTokenizer tok = new StringTokenizer(value, Constants.PIPE); - if (tok.countTokens() != 2) - { - Logging.errorPrint("COUNT:" + getTokenName() - + " requires two arguments: " + value); - return false; - } - //New format: CHOOSE:EQBUILDER.EQTYPE|COUNT=ALL|TITLE=desired TYPE(s) - String first = tok.nextToken(); - if (!first.startsWith("COUNT=")) - { - Logging.errorPrint("CHOOSE:" + getTokenName() - + " must have COUNT= as its first argument : " + value); - return false; - } - String second = tok.nextToken(); - if (!second.startsWith("TITLE=")) - { - Logging.errorPrint("CHOOSE:" + getTokenName() - + " must have TITLE= as its second argument : " + value); - return false; - } - StringBuilder sb = new StringBuilder(); - sb.append(first).append('|').append(second.substring(6)); - sb.append("|TYPE=EQTYPES"); - //Old format: CHOOSE:COUNT=ALL|desired TYPE(s)|TYPE=EQTYPES - po.setChoiceString(sb.toString()); - return true; - } - - /* (non-Javadoc) - * @see pcgen.persistence.lst.LstToken#getTokenName() - */ - public String getTokenName() - { - return "EQBUILDER.EQTYPE"; - } -} Deleted: Trunk/pcgen/code/src/java/plugin/lsttokens/choose/EqBuilderSpellToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/choose/EqBuilderSpellToken.java 2008-01-13 19:40:50 UTC (rev 4874) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/choose/EqBuilderSpellToken.java 2008-01-14 01:43:11 UTC (rev 4875) @@ -1,122 +0,0 @@ -/* - * Copyright 2007 (C) Thomas Parker <th...@us...> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package plugin.lsttokens.choose; - -import java.util.StringTokenizer; - -import pcgen.core.Constants; -import pcgen.core.PObject; -import pcgen.persistence.lst.ChooseLstToken; -import pcgen.util.Logging; - -public class EqBuilderSpellToken implements ChooseLstToken -{ - - public boolean parse(PObject po, String prefix, String value) - { - if (value == null) - { - po.setChoiceString(getTokenName()); - return true; - } - if (value.indexOf(',') != -1) - { - Logging.errorPrint("CHOOSE:" + getTokenName() - + " arguments may not contain , : " + value); - return false; - } - if (value.indexOf('[') != -1) - { - Logging.errorPrint("CHOOSE:" + getTokenName() - + " arguments may not contain [] : " + value); - return false; - } - if (value.charAt(0) == '|') - { - Logging.errorPrint("CHOOSE:" + getTokenName() - + " arguments may not start with | : " + value); - return false; - } - if (value.charAt(value.length() - 1) == '|') - { - Logging.errorPrint("CHOOSE:" + getTokenName() - + " arguments may not end with | : " + value); - return false; - } - if (value.indexOf("||") != -1) - { - Logging.errorPrint("CHOOSE:" + getTokenName() - + " arguments uses double separator || : " + value); - return false; - } - int pipeLoc = value.indexOf("|"); - if (pipeLoc == -1) - { - Logging.errorPrint("CHOOSE:" + getTokenName() - + " must have two or more | delimited arguments : " + value); - return false; - } - StringTokenizer tok = new StringTokenizer(value, Constants.PIPE); - if (tok.countTokens() != 3) - { - Logging.errorPrint("COUNT:" + getTokenName() - + " requires three arguments: " + value); - return false; - } - tok.nextToken(); - String second = tok.nextToken(); - try - { - Integer.parseInt(second); - } - catch (NumberFormatException nfe) - { - Logging.errorPrint("CHOOSE:" + getTokenName() - + " second argument must be an Integer : " + value); - return false; - } - String third = tok.nextToken(); - if (!third.equals("MAXLEVEL")) - { - try - { - Integer.parseInt(third); - } - catch (NumberFormatException nfe) - { - Logging.errorPrint("CHOOSE:" + getTokenName() - + " third argument must be an Integer or 'MAXLEVEL': " - + value); - return false; - } - } - StringBuilder sb = new StringBuilder(); - if (prefix.length() > 0) - { - sb.append(prefix).append('|'); - } - sb.append(getTokenName()).append('|').append(value); - po.setChoiceString(sb.toString()); - return true; - } - - public String getTokenName() - { - return "EQBUILDER.SPELL"; - } -} Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/choose/NumberToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/choose/NumberToken.java 2008-01-13 19:40:50 UTC (rev 4874) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/choose/NumberToken.java 2008-01-14 01:43:11 UTC (rev 4875) @@ -20,6 +20,7 @@ import java.util.StringTokenizer; import pcgen.core.Constants; +import pcgen.core.EquipmentModifier; import pcgen.core.PObject; import pcgen.persistence.lst.ChooseLstToken; import pcgen.util.Logging; Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/choose/StringToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/choose/StringToken.java 2008-01-13 19:40:50 UTC (rev 4874) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/choose/StringToken.java 2008-01-14 01:43:11 UTC (rev 4875) @@ -27,12 +27,6 @@ public boolean parse(PObject po, String prefix, String value) { - if (po instanceof EquipmentModifier) - { - Logging.errorPrint("CHOOSE:" + getTokenName() - + " may not be used in EquipmentModifier"); - return false; - } if (value.indexOf(',') != -1) { Logging.errorPrint("CHOOSE:" + getTokenName() Added: Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/ChooseToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/ChooseToken.java (rev 0) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/ChooseToken.java 2008-01-14 01:43:11 UTC (rev 4875) @@ -0,0 +1,115 @@ +/* + * Created on Sep 2, 2005 + * + */ +package plugin.lsttokens.equipmentmodifier; + +import java.util.ArrayList; +import java.util.List; + +import pcgen.core.Constants; +import pcgen.core.EquipmentModifier; +import pcgen.core.utils.CoreUtility; +import pcgen.persistence.lst.ChooseLoader; +import pcgen.persistence.lst.EquipmentModifierLstToken; +import pcgen.util.Logging; + +/** + * @author djones4 + * + */ +public class ChooseToken implements EquipmentModifierLstToken +{ + + public String getTokenName() + { + return "CHOOSE"; + } + + public boolean parse(EquipmentModifier mod, String value) + { + String key; + String val = value; + int activeLoc = 0; + String count = null; + String maxCount = null; + List<String> prefixList = new ArrayList<String>(2); + while (true) + { + int pipeLoc = val.indexOf(Constants.PIPE, activeLoc); + if (pipeLoc == -1) + { + key = val; + val = null; + } + else + { + key = val.substring(activeLoc, pipeLoc); + val = val.substring(pipeLoc + 1); + } + if (key.startsWith("COUNT=")) + { + if (count != null) + { + Logging + .errorPrint("Cannot use COUNT more than once in CHOOSE: " + + value); + return false; + } + prefixList.add(key); + count = key.substring(6); + if (count == null) + { + Logging.errorPrint("COUNT in CHOOSE must be a formula: " + + value); + return false; + } + activeLoc += key.length() + 1; + } + else if (key.startsWith("NUMCHOICES=")) + { + if (maxCount != null) + { + Logging + .errorPrint("Cannot use NUMCHOICES more than once in CHOOSE: " + + value); + return false; + } + prefixList.add(key); + maxCount = key.substring(11); + if (maxCount == null || maxCount.length() == 0) + { + Logging + .errorPrint("NUMCHOICES in CHOOSE must be a formula: " + + value); + return false; + } + activeLoc += key.length() + 1; + } + else + { + break; + } + } + String prefixString = CoreUtility.join(prefixList, "|"); + if (ChooseLoader.isEqModChooseToken(key)) + { + if (ChooseLoader.parseEqModToken(mod, prefixString, key, val)) + { + return true; + } + } + Logging.deprecationPrint("CHOOSE: in EqMod with Title as first argument is deprecated"); + Logging.deprecationPrint(" Please use CHOOSE:<subtoken>|<args>|TITLE=<title>"); + Logging.deprecationPrint(" Offending CHOOSE was: " + value); + if (value.indexOf("TITLE=") != -1) + { + Logging.errorPrint("Unexpected Condition: Deprecated Syntax EqMod with Chooser Type and TITLE= " + value); + Logging.errorPrint("Please check error messages above for syntax errors or contact the PCGen team on the PCGenListFileHelp Yahoo Group for support"); + return false; + } + mod.setChoiceString(value); + return true; + } + +} Copied: Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/choose/EqBuilderEqTypeToken.java (from rev 4871, Trunk/pcgen/code/src/java/plugin/lsttokens/choose/EqBuilderEqTypeToken.java) =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/choose/EqBuilderEqTypeToken.java (rev 0) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/choose/EqBuilderEqTypeToken.java 2008-01-14 01:43:11 UTC (rev 4875) @@ -0,0 +1,126 @@ +/* + * EqBuilderEqTypeToken.java + * Copyright 2007 (C) James Dempsey <jde...@us...> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Created on 12/01/2008 + * + * $Id$ + */ +package plugin.lsttokens.equipmentmodifier.choose; + +import java.util.StringTokenizer; + +import pcgen.core.Constants; +import pcgen.core.EquipmentModifier; +import pcgen.persistence.lst.EqModChooseLstToken; +import pcgen.util.Logging; + +/** + * <code>EqBuilderEqTypeToken</code> parses the EQ Builder specific choose + * string to allow the selection of equipent types. + * + * Last Editor: $Author$ + * Last Edited: $Date$ + * + * @author James Dempsey <jde...@us...> + * @version $Revision$ + */ +public class EqBuilderEqTypeToken implements EqModChooseLstToken +{ + + public boolean parse(EquipmentModifier po, String prefix, String value) + { + if (value == null) + { + po.setChoiceString(getTokenName()); + return true; + } + if (value.indexOf(',') != -1) + { + Logging.errorPrint("CHOOSE:" + getTokenName() + + " arguments may not contain , : " + value); + return false; + } + if (value.indexOf('[') != -1) + { + Logging.errorPrint("CHOOSE:" + getTokenName() + + " arguments may not contain [] : " + value); + return false; + } + if (value.charAt(0) == '|') + { + Logging.errorPrint("CHOOSE:" + getTokenName() + + " arguments may not start with | : " + value); + return false; + } + if (value.charAt(value.length() - 1) == '|') + { + Logging.errorPrint("CHOOSE:" + getTokenName() + + " arguments may not end with | : " + value); + return false; + } + if (value.indexOf("||") != -1) + { + Logging.errorPrint("CHOOSE:" + getTokenName() + + " arguments uses double separator || : " + value); + return false; + } + int pipeLoc = value.indexOf("|"); + if (pipeLoc == -1) + { + Logging.errorPrint("CHOOSE:" + getTokenName() + + " must have two or more | delimited arguments : " + value); + return false; + } + StringTokenizer tok = new StringTokenizer(value, Constants.PIPE); + if (tok.countTokens() != 2) + { + Logging.errorPrint("COUNT:" + getTokenName() + + " requires two arguments: " + value); + return false; + } + //New format: CHOOSE:EQBUILDER.EQTYPE|COUNT=ALL|TITLE=desired TYPE(s) + String first = tok.nextToken(); + if (!first.startsWith("COUNT=")) + { + Logging.errorPrint("CHOOSE:" + getTokenName() + + " must have COUNT= as its first argument : " + value); + return false; + } + String second = tok.nextToken(); + if (!second.startsWith("TITLE=")) + { + Logging.errorPrint("CHOOSE:" + getTokenName() + + " must have TITLE= as its second argument : " + value); + return false; + } + StringBuilder sb = new StringBuilder(); + sb.append(first).append('|').append(second.substring(6)); + sb.append("|TYPE=EQTYPES"); + //Old format: CHOOSE:COUNT=ALL|desired TYPE(s)|TYPE=EQTYPES + po.setChoiceString(sb.toString()); + return true; + } + + /* (non-Javadoc) + * @see pcgen.persistence.lst.LstToken#getTokenName() + */ + public String getTokenName() + { + return "EQBUILDER.EQTYPE"; + } +} Copied: Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/choose/EqBuilderSpellToken.java (from rev 4871, Trunk/pcgen/code/src/java/plugin/lsttokens/choose/EqBuilderSpellToken.java) =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/choose/EqBuilderSpellToken.java (rev 0) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/choose/EqBuilderSpellToken.java 2008-01-14 01:43:11 UTC (rev 4875) @@ -0,0 +1,122 @@ +/* + * Copyright 2007 (C) Thomas Parker <th...@us...> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +package plugin.lsttokens.equipmentmodifier.choose; + +import java.util.StringTokenizer; + +import pcgen.core.Constants; +import pcgen.core.EquipmentModifier; +import pcgen.persistence.lst.EqModChooseLstToken; +import pcgen.util.Logging; + +public class EqBuilderSpellToken implements EqModChooseLstToken +{ + + public boolean parse(EquipmentModifier po, String prefix, String value) + { + if (value == null) + { + po.setChoiceString(getTokenName()); + return true; + } + if (value.indexOf(',') != -1) + { + Logging.errorPrint("CHOOSE:" + getTokenName() + + " arguments may not contain , : " + value); + return false; + } + if (value.indexOf('[') != -1) + { + Logging.errorPrint("CHOOSE:" + getTokenName() + + " arguments may not contain [] : " + value); + return false; + } + if (value.charAt(0) == '|') + { + Logging.errorPrint("CHOOSE:" + getTokenName() + + " arguments may not start with | : " + value); + return false; + } + if (value.charAt(value.length() - 1) == '|') + { + Logging.errorPrint("CHOOSE:" + getTokenName() + + " arguments may not end with | : " + value); + return false; + } + if (value.indexOf("||") != -1) + { + Logging.errorPrint("CHOOSE:" + getTokenName() + + " arguments uses double separator || : " + value); + return false; + } + int pipeLoc = value.indexOf("|"); + if (pipeLoc == -1) + { + Logging.errorPrint("CHOOSE:" + getTokenName() + + " must have two or more | delimited arguments : " + value); + return false; + } + StringTokenizer tok = new StringTokenizer(value, Constants.PIPE); + if (tok.countTokens() != 3) + { + Logging.errorPrint("COUNT:" + getTokenName() + + " requires three arguments: " + value); + return false; + } + tok.nextToken(); + String second = tok.nextToken(); + try + { + Integer.parseInt(second); + } + catch (NumberFormatException nfe) + { + Logging.errorPrint("CHOOSE:" + getTokenName() + + " second argument must be an Integer : " + value); + return false; + } + String third = tok.nextToken(); + if (!third.equals("MAXLEVEL")) + { + try + { + Integer.parseInt(third); + } + catch (NumberFormatException nfe) + { + Logging.errorPrint("CHOOSE:" + getTokenName() + + " third argument must be an Integer or 'MAXLEVEL': " + + value); + return false; + } + } + StringBuilder sb = new StringBuilder(); + if (prefix.length() > 0) + { + sb.append(prefix).append('|'); + } + sb.append(getTokenName()).append('|').append(value); + po.setChoiceString(sb.toString()); + return true; + } + + public String getTokenName() + { + return "EQBUILDER.SPELL"; + } +} Added: Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/choose/NoChoiceToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/choose/NoChoiceToken.java (rev 0) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/choose/NoChoiceToken.java 2008-01-14 01:43:11 UTC (rev 4875) @@ -0,0 +1,50 @@ +/* + * Copyright 2007 (C) Thomas Parker <th...@us...> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +package plugin.lsttokens.equipmentmodifier.choose; + +import pcgen.core.EquipmentModifier; +import pcgen.persistence.lst.EqModChooseLstToken; +import pcgen.util.Logging; + +public class NoChoiceToken implements EqModChooseLstToken +{ + + public boolean parse(EquipmentModifier po, String prefix, String value) + { + if (value == null) + { + // No args - legal + StringBuilder sb = new StringBuilder(); + if (prefix.length() > 0) + { + sb.append(prefix).append('|'); + } + sb.append(getTokenName()); + po.setChoiceString(sb.toString()); + return true; + } + Logging.deprecationPrint("CHOOSE:" + getTokenName() + + " will ignore arguments: " + value); + return false; + } + + public String getTokenName() + { + return "NOCHOICE"; + } +} Added: Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/choose/NumberToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/choose/NumberToken.java (rev 0) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/choose/NumberToken.java 2008-01-14 01:43:11 UTC (rev 4875) @@ -0,0 +1,148 @@ +/* + * Copyright 2007 (C) Thomas Parker <th...@us...> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +package plugin.lsttokens.equipmentmodifier.choose; + +import java.util.StringTokenizer; + +import pcgen.core.Constants; +import pcgen.core.EquipmentModifier; +import pcgen.persistence.lst.EqModChooseLstToken; +import pcgen.util.Logging; + +public class NumberToken implements EqModChooseLstToken +{ + + public String getTokenName() + { + return "NUMBER"; + } + + public boolean parse(EquipmentModifier mod, String prefix, String value) + { + if (value == null) + { + Logging.errorPrint("CHOOSE:" + getTokenName() + + " requires additional arguments"); + return false; + } + if (value.indexOf('[') != -1) + { + Logging.errorPrint("CHOOSE:" + getTokenName() + + " arguments may not contain [] : " + value); + return false; + } + if (value.charAt(0) == '|') + { + Logging.errorPrint("CHOOSE:" + getTokenName() + + " arguments may not start with | : " + value); + return false; + } + if (value.charAt(value.length() - 1) == '|') + { + Logging.errorPrint("CHOOSE:" + getTokenName() + + " arguments may not end with | : " + value); + return false; + } + if (value.indexOf("||") != -1) + { + Logging.errorPrint("CHOOSE:" + getTokenName() + + " arguments uses double separator || : " + value); + return false; + } + int pipeLoc = value.indexOf("|"); + if (pipeLoc == -1) + { + Logging.errorPrint("CHOOSE:" + getTokenName() + + " must have two or more | delimited arguments : " + value); + return false; + } + StringTokenizer tok = new StringTokenizer(value, Constants.PIPE); + 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 if (tokString.startsWith("NOSIGN")) + { + //OK + } + else if (tokString.startsWith("MULTIPLE")) + { + //OK + } + else + { + Integer.parseInt(tokString); + } + } + if (max == null) + { + if (min != null) + { + Logging + .errorPrint("Cannot have MIN=n without MAX=m in CHOOSE:NUMBER: " + + value); + return false; + } + } + else + { + if (min == null) + { + Logging + .errorPrint("Cannot have MAX=n without MIN=m in CHOOSE:NUMBER: " + + value); + return false; + } + if (max < min) + { + Logging + .errorPrint("Cannot have MAX= less than MIN= in CHOOSE:NUMBER: " + + value); + return false; + } + } + StringBuilder sb = new StringBuilder(); + if (prefix.length() > 0) + { + sb.append(prefix).append('|'); + } + sb.append(getTokenName()).append('|').append(value); + mod.setChoiceString(sb.toString()); + return true; + } +} Added: Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/choose/SkillBonusToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/choose/SkillBonusToken.java (rev 0) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/choose/SkillBonusToken.java 2008-01-14 01:43:11 UTC (rev 4875) @@ -0,0 +1,140 @@ +/* + * Copyright 2007 (C) Thomas Parker <th...@us...> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +package plugin.lsttokens.equipmentmodifier.choose; + +import java.util.StringTokenizer; + +import pcgen.core.Constants; +import pcgen.core.EquipmentModifier; +import pcgen.persistence.lst.EqModChooseLstToken; +import pcgen.util.Logging; + +public class SkillBonusToken implements EqModChooseLstToken +{ + + public String getTokenName() + { + return "SKILLBONUS"; + } + + public boolean parse(EquipmentModifier mod, String prefix, String value) + { + if (value == null) + { + Logging.errorPrint("CHOOSE:" + getTokenName() + + " requires additional arguments"); + return false; + } + if (value.indexOf('[') != -1) + { + Logging.errorPrint("CHOOSE:" + getTokenName() + + " arguments may not contain [] : " + value); + return false; + } + if (value.charAt(0) == '|') + { + Logging.errorPrint("CHOOSE:" + getTokenName() + + " arguments may not start with | : " + value); + return false; + } + if (value.charAt(value.length() - 1) == '|') + { + Logging.errorPrint("CHOOSE:" + getTokenName() + + " arguments may not end with | : " + value); + return false; + } + if (value.indexOf("||") != -1) + { + Logging.errorPrint("CHOOSE:" + getTokenName() + + " arguments uses double separator || : " + value); + return false; + } + int pipeLoc = value.indexOf("|"); + if (pipeLoc == -1) + { + Logging.errorPrint("CHOOSE:" + getTokenName() + + " must have two or more | delimited arguments : " + value); + return false; + } + StringTokenizer tok = new StringTokenizer(value, Constants.PIPE); + 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 + { + //Assume it's a primitive skill?? + } + } + if (max == null) + { + if (min != null) + { + Logging + .errorPrint("Cannot have MIN=n without MAX=m in CHOOSE:STATBONUS: " + + value); + return false; + } + } + else + { + if (min == null) + { + Logging + .errorPrint("Cannot have MAX=n without MIN=m in CHOOSE:STATBONUS: " + + value); + return false; + } + if (max < min) + { + Logging + .errorPrint("Cannot have MAX= less than MIN= in CHOOSE:STATBONUS: " + + value); + return false; + } + } + StringBuilder sb = new StringBuilder(); + if (prefix.length() > 0) + { + sb.append(prefix).append('|'); + } + sb.append(getTokenName()).append('|').append(value); + mod.setChoiceString(sb.toString()); + return true; + } +} Added: Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/choose/StatBonusToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/choose/StatBonusToken.java (rev 0) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/choose/StatBonusToken.java 2008-01-14 01:43:11 UTC (rev 4875) @@ -0,0 +1,158 @@ +/* + * Copyright 2007 (C) Thomas Parker <th...@us...> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +package plugin.lsttokens.equipmentmodifier.choose; + +import java.util.List; +import java.util.StringTokenizer; + +import pcgen.core.Constants; +import pcgen.core.EquipmentModifier; +import pcgen.core.PCStat; +import pcgen.core.SettingsHandler; +import pcgen.persistence.lst.EqModChooseLstToken; +import pcgen.util.Logging; + +public class StatBonusToken implements EqModChooseLstToken +{ + + public String getTokenName() + { + return "STATBONUS"; + } + + public boolean parse(EquipmentModifier mod, String prefix, String value) + { + if (value == null) + { + Logging.errorPrint("CHOOSE:" + getTokenName() + + " requires additional arguments"); + return false; + } + if (value.indexOf('[') != -1) + { + Logging.errorPrint("CHOOSE:" + getTokenName() + + " arguments may not contain [] : " + value); + return false; + } + if (value.charAt(0) == '|') + { + Logging.errorPrint("CHOOSE:" + getTokenName() + + " arguments may not start with | : " + value); + return false; + } + if (value.charAt(value.length() - 1) == '|') + { + Logging.errorPrint("CHOOSE:" + getTokenName() + + " arguments may not end with | : " + value); + return false; + } + if (value.indexOf("||") != -1) + { + Logging.errorPrint("CHOOSE:" + getTokenName() + + " arguments uses double separator || : " + value); + return false; + } + int pipeLoc = value.indexOf("|"); + if (pipeLoc == -1) + { + Logging.errorPrint("CHOOSE:" + getTokenName() + + " must have two or more | delimited arguments : " + value); + return false; + } + StringTokenizer tok = new StringTokenizer(value, Constants.PIPE); + List<PCStat> list = SettingsHandler.getGame().getUnmodifiableStatList(); + 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.getAbb())) + { + found = true; + break; + } + } + if (!found) + { + Logging.errorPrint("Did not find STAT: " + tokString + + " used in CHOOSE:STATBONUS " + value); + } + } + } + if (max == null) + { + if (min != null) + { + Logging + .errorPrint("Cannot have MIN=n without MAX=m in CHOOSE:STATBONUS: " + + value); + return false; + } + } + else + { + if (min == null) + { + Logging + .errorPrint("Cannot have MAX=n without MIN=m in CHOOSE:STATBONUS: " + + value); + return false; + } + if (max < min) + { + Logging + .errorPrint("Cannot have MAX= less than MIN= in CHOOSE:STATBONUS: " + + value); + return false; + } + } + StringBuilder sb = new StringBuilder(); + if (prefix.length() > 0) + { + sb.append(prefix).append('|'); + } + sb.append(getTokenName()).append('|').append(value); + mod.setChoiceString(sb.toString()); + return true; + } +} Added: Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/choose/StringToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/choose/StringToken.java (rev 0) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/choose/StringToken.java 2008-01-14 01:43:11 UTC (rev 4875) @@ -0,0 +1,73 @@ +/* + * Copyright 2007 (C) Thomas Parker <th...@us...> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +package plugin.lsttokens.equipmentmodifier.choose; + +import pcgen.core.EquipmentModifier; +import pcgen.persistence.lst.EqModChooseLstToken; +import pcgen.util.Logging; + +public class StringToken implements EqModChooseLstToken +{ + + public boolean parse(EquipmentModifier po, String prefix, String value) + { + if (value.indexOf(',') != -1) + { + Logging.errorPrint("CHOOSE:" + getTokenName() + + " arguments may not contain , : " + value); + return false; + } + if (value.indexOf('[') != -1) + { + Logging.errorPrint("CHOOSE:" + getTokenName() + + " arguments may not contain [] : " + value); + return false; + } + if (value.charAt(0) == '|') + { + Logging.errorPrint("CHOOSE:" + getTokenName() + + " arguments may not start with | : " + value); + return false; + } + if (value.charAt(value.length() - 1) == '|') + { + Logging.errorPrint("CHOOSE:" + getTokenName() + + " arguments may not end with | : " + value); + return false; + } + if (value.indexOf("||") != -1) + { + Logging.errorPrint("CHOOSE:" + getTokenName() + + " arguments uses double separator || : " + value); + return false; + } + StringBuilder sb = new StringBuilder(); + if (prefix.length() > 0) + { + sb.append(prefix).append('|'); + } + sb.append(value); + po.setChoiceString(sb.toString()); + return true; + } + + public String getTokenName() + { + return "STRING"; + } +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-01-14 21:51:01
|
Revision: 4898 http://pcgen.svn.sourceforge.net/pcgen/?rev=4898&view=rev Author: thpr Date: 2008-01-14 13:51:05 -0800 (Mon, 14 Jan 2008) Log Message: ----------- Improve Error Messaging Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/PCTemplate.java Trunk/pcgen/code/src/java/plugin/lsttokens/template/RegionToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/template/SubraceToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/template/SubregionToken.java Modified: Trunk/pcgen/code/src/java/pcgen/core/PCTemplate.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PCTemplate.java 2008-01-14 21:47:09 UTC (rev 4897) +++ Trunk/pcgen/code/src/java/pcgen/core/PCTemplate.java 2008-01-14 21:51:05 UTC (rev 4898) @@ -41,6 +41,7 @@ import pcgen.persistence.PersistenceLayerException; import pcgen.persistence.lst.prereq.PreParserFactory; import pcgen.util.DoubleKeyMap; +import pcgen.util.Logging; import pcgen.util.PropertyFactory; import pcgen.util.chooser.ChooserFactory; import pcgen.util.chooser.ChooserInterface; @@ -318,6 +319,11 @@ { gender = PropertyFactory.getString("in_genderNeuter"); } + else + { + Logging.errorPrint("Unsure what to do with GENDERLOCK: " + + genderString + " should be FEMALE, MALE, or NEUTER"); + } } /** Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/template/RegionToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/template/RegionToken.java 2008-01-14 21:47:09 UTC (rev 4897) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/template/RegionToken.java 2008-01-14 21:51:05 UTC (rev 4898) @@ -33,6 +33,12 @@ + getTokenName()); Logging .deprecationPrint("Abbreviations will fail after PCGen 5.14"); + Logging + .deprecationPrint("If your " + + getTokenName() + + " starts with a 'Y' then please ignore this message, " + + "it is alerting those taking advantage of an " + + "abbreviation system that is being removed from PCGen"); } } Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/template/SubraceToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/template/SubraceToken.java 2008-01-14 21:47:09 UTC (rev 4897) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/template/SubraceToken.java 2008-01-14 21:51:05 UTC (rev 4898) @@ -31,6 +31,12 @@ + getTokenName()); Logging .deprecationPrint("Abbreviations will fail after PCGen 5.14"); + Logging + .deprecationPrint("If your " + + getTokenName() + + " starts with a 'Y' then please ignore this message, " + + "it is alerting those taking advantage of an " + + "abbreviation system that is being removed from PCGen"); } } Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/template/SubregionToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/template/SubregionToken.java 2008-01-14 21:47:09 UTC (rev 4897) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/template/SubregionToken.java 2008-01-14 21:51:05 UTC (rev 4898) @@ -31,6 +31,12 @@ + getTokenName()); Logging .deprecationPrint("Abbreviations will fail after PCGen 5.14"); + Logging + .deprecationPrint("If your " + + getTokenName() + + " starts with a 'Y' then please ignore this message, " + + "it is alerting those taking advantage of an " + + "abbreviation system that is being removed from PCGen"); } } template.setSubRegion(subregion); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-01-14 22:06:11
|
Revision: 4900 http://pcgen.svn.sourceforge.net/pcgen/?rev=4900&view=rev Author: thpr Date: 2008-01-14 14:06:17 -0800 (Mon, 14 Jan 2008) Log Message: ----------- Add SKIPZERO to CHOOSE:NUMBER in EqMods, in case any homebrew requires the old behavior Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/EquipmentChoice.java Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/choose/NumberToken.java Modified: Trunk/pcgen/code/src/java/pcgen/core/EquipmentChoice.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/EquipmentChoice.java 2008-01-14 22:02:02 UTC (rev 4899) +++ Trunk/pcgen/code/src/java/pcgen/core/EquipmentChoice.java 2008-01-14 22:06:17 UTC (rev 4900) @@ -49,6 +49,7 @@ private boolean allowDuplicates = false; private boolean noSign = false; private boolean bAdd = false; + private boolean skipZero = false; private int minValue = 0; private int maxValue = 0; @@ -102,7 +103,7 @@ { for (int j = getMinValue(); j <= getMaxValue(); j += getIncValue()) { - if (j != 0) + if (!skipZero || j != 0) { finalList.add(choice + '|' + Delta.toString(j)); } @@ -610,6 +611,10 @@ { this.addSkills(); } + else if ("SKIPZERO".equals(kind)) + { + skipZero = originalkind.equals("NUMBER"); + } else if ("MULTIPLE".equals(kind)) { this.setAllowDuplicates(true); @@ -671,9 +676,9 @@ j <= this.getMaxValue(); j += this.getIncValue()) { - if (j != 0) + if (!skipZero || j != 0) { - if (this.isNoSign() && (j > 0)) + if (this.isNoSign() && (j >= 0)) { this.getAvailableList().add(Integer.toString(j)); } Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/choose/NumberToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/choose/NumberToken.java 2008-01-14 22:02:02 UTC (rev 4899) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/choose/NumberToken.java 2008-01-14 22:06:17 UTC (rev 4900) @@ -100,6 +100,10 @@ { //OK } + else if (tokString.startsWith("SKIPZERO")) + { + //OK + } else if (tokString.startsWith("MULTIPLE")) { //OK This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-01-30 00:41:45
|
Revision: 5048 http://pcgen.svn.sourceforge.net/pcgen/?rev=5048&view=rev Author: thpr Date: 2008-01-29 16:41:50 -0800 (Tue, 29 Jan 2008) Log Message: ----------- [ 1882119 ] AUTO:SHIELDPROF not working as designed Issue#: 1882119 Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java Trunk/pcgen/code/src/java/plugin/lsttokens/AutoLst.java Trunk/pcgen/code/src/java/plugin/lsttokens/auto/ArmorProfToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/auto/FeatToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/auto/ShieldProfToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/auto/WeaponProfToken.java Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-01-30 00:40:29 UTC (rev 5047) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-01-30 00:41:50 UTC (rev 5048) @@ -7685,7 +7685,7 @@ // if (aProf.startsWith("SHIELDTYPE=") || aProf.startsWith("SHIELDTYPE.")) { - armorProfList.add(0, aProf); + shieldProfList.add(0, aProf); } else if (aProf.startsWith("TYPE=") || aProf.startsWith("TYPE.")) { Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/AutoLst.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/AutoLst.java 2008-01-30 00:40:29 UTC (rev 5047) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/AutoLst.java 2008-01-30 00:41:50 UTC (rev 5048) @@ -31,6 +31,7 @@ return false; } String subKey = value.substring(0, barLoc); - return AutoLoader.parseLine(obj, subKey, value, anInt); + return AutoLoader.parseLine(obj, subKey, value.substring(barLoc + 1), + anInt); } } Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/auto/ArmorProfToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/auto/ArmorProfToken.java 2008-01-30 00:40:29 UTC (rev 5047) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/auto/ArmorProfToken.java 2008-01-30 00:41:50 UTC (rev 5048) @@ -17,6 +17,9 @@ */ package plugin.lsttokens.auto; +import java.util.StringTokenizer; + +import pcgen.core.Constants; import pcgen.core.PObject; import pcgen.persistence.lst.AutoLstToken; import pcgen.util.Logging; @@ -37,10 +40,15 @@ + " is not supported on class level lines"); return false; } - if (value.startsWith("TYPE")) + StringTokenizer st = new StringTokenizer(value, Constants.PIPE); + while (st.hasMoreTokens()) { - Logging.deprecationPrint("TYPE= in AUTO:ARMORPROF is deprecated. " - + "Use ARMORTYPE="); + if (st.nextToken().startsWith("TYPE")) + { + Logging.deprecationPrint("TYPE= in AUTO:ARMORPROF is " + + "deprecated. Use ARMORTYPE="); + break; + } } target.addAutoArray(getTokenName(), value); return true; Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/auto/FeatToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/auto/FeatToken.java 2008-01-30 00:40:29 UTC (rev 5047) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/auto/FeatToken.java 2008-01-30 00:41:50 UTC (rev 5048) @@ -43,9 +43,6 @@ public boolean parse(PObject target, String value, int level) { final StringTokenizer tok = new StringTokenizer(value, Constants.PIPE); - - tok.nextToken(); // Throw away FEAT - ArrayList<Prerequisite> preReqs = new ArrayList<Prerequisite>(); if (level > -9) { Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/auto/ShieldProfToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/auto/ShieldProfToken.java 2008-01-30 00:40:29 UTC (rev 5047) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/auto/ShieldProfToken.java 2008-01-30 00:41:50 UTC (rev 5048) @@ -17,6 +17,9 @@ */ package plugin.lsttokens.auto; +import java.util.StringTokenizer; + +import pcgen.core.Constants; import pcgen.core.PObject; import pcgen.persistence.lst.AutoLstToken; import pcgen.util.Logging; @@ -37,10 +40,15 @@ + " is not supported on class level lines"); return false; } - if (value.startsWith("TYPE")) + StringTokenizer st = new StringTokenizer(value, Constants.PIPE); + while (st.hasMoreTokens()) { - Logging.deprecationPrint("TYPE= in AUTO:" + getTokenName() - + " is deprecated. " + "Use SHIELDTYPE="); + if (st.nextToken().startsWith("TYPE")) + { + Logging.deprecationPrint("TYPE= in AUTO:SHIELDPROF is " + + "deprecated. Use SHIELDTYPE="); + break; + } } target.addAutoArray(getTokenName(), value); return true; Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/auto/WeaponProfToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/auto/WeaponProfToken.java 2008-01-30 00:40:29 UTC (rev 5047) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/auto/WeaponProfToken.java 2008-01-30 00:41:50 UTC (rev 5048) @@ -17,6 +17,9 @@ */ package plugin.lsttokens.auto; +import java.util.StringTokenizer; + +import pcgen.core.Constants; import pcgen.core.PObject; import pcgen.persistence.lst.AutoLstToken; import pcgen.util.Logging; @@ -37,12 +40,17 @@ + " is not supported on class level lines"); return false; } - if (value.startsWith("TYPE")) + StringTokenizer st = new StringTokenizer(value, Constants.PIPE); + while (st.hasMoreTokens()) { - Logging.deprecationPrint("TYPE= in AUTO:" + getTokenName() - + " Must refer to the Weapon Proficiency LST File. " - + "Consider WEAPONTYPE= " - + "if you are trying to match an Equipment TYPE"); + if (st.nextToken().startsWith("TYPE")) + { +// Logging.deprecationPrint("TYPE= in AUTO:" + getTokenName() +// + " Must refer to the Weapon Proficiency LST File. " +// + "Consider WEAPONTYPE= " +// + "if you are trying to match an Equipment TYPE"); + break; + } } target.addAutoArray(getTokenName(), value); return true; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-02-07 04:40:35
|
Revision: 5107 http://pcgen.svn.sourceforge.net/pcgen/?rev=5107&view=rev Author: thpr Date: 2008-02-06 20:40:41 -0800 (Wed, 06 Feb 2008) Log Message: ----------- SELECT was supposed to be a Formula, not an integer (oops!) Docs are correct, code wasn't :P Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/PObject.java Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java Trunk/pcgen/code/src/java/pcgen/core/chooser/AbstractBasicChoiceManager.java Trunk/pcgen/code/src/java/plugin/lsttokens/SelectLst.java Trunk/pcgen/code/src/java/plugin/lsttokens/choose/UserInputToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/choose/WeaponProfToken.java Modified: Trunk/pcgen/code/src/java/pcgen/core/PObject.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-02-07 04:27:59 UTC (rev 5106) +++ Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-02-07 04:40:41 UTC (rev 5107) @@ -167,7 +167,7 @@ private Set<String> types = new LinkedHashSet<String>(); - private int chooseSelectCount = 1; + private String chooseSelectCount = "1"; /* ************ * Methods @@ -5153,12 +5153,12 @@ levelAbilityList.clear(); } - public void setSelect(int select) + public void setSelect(String value) { - chooseSelectCount = select; + chooseSelectCount = value; } - public int getSelectCount() + public String getSelectCount() { return chooseSelectCount; } Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-02-07 04:27:59 UTC (rev 5106) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-02-07 04:40:41 UTC (rev 5107) @@ -16640,7 +16640,8 @@ { final int subfeatCount = ability.getAssociatedCount(); double cost = ability.getCost(this); - int select = ability.getSelectCount(); + int select = getVariableValue(ability.getSelectCount(), "") + .intValue(); double relativeCost = cost / select; if (ability.getChoiceString() != null && ability.getChoiceString().length() > 0) Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/AbstractBasicChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/AbstractBasicChoiceManager.java 2008-02-07 04:27:59 UTC (rev 5106) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/AbstractBasicChoiceManager.java 2008-02-07 04:40:41 UTC (rev 5107) @@ -70,7 +70,7 @@ pc = aPC; StringTokenizer st = new StringTokenizer(theChoices, Constants.PIPE); String chooserName = st.nextToken(); - int selectionsPerUnitCost = pobject.getSelectCount(); + String selectionsPerUnitCost = pobject.getSelectCount(); int totalChoices = -1; /* @@ -116,7 +116,8 @@ choices.trimToSize(); chooserHandled = chooserName; numberOfChoices = totalChoices; - choicesPerUnitCost = selectionsPerUnitCost; + choicesPerUnitCost = aPC.getVariableValue(selectionsPerUnitCost, "") + .intValue(); } /** Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/SelectLst.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/SelectLst.java 2008-02-07 04:27:59 UTC (rev 5106) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/SelectLst.java 2008-02-07 04:40:41 UTC (rev 5107) @@ -2,7 +2,6 @@ import pcgen.core.PObject; import pcgen.persistence.lst.GlobalLstToken; -import pcgen.util.Logging; /** * Class deals with SELECT Token @@ -17,21 +16,7 @@ public boolean parse(PObject obj, String value, int anInt) { - try - { - int select = Integer.parseInt(value); - if (select <= 0) - { - Logging.errorPrint(getTokenName() - + "must be a positive integer: " + value); - return false; - } - obj.setSelect(select); - return true; - } - catch (NumberFormatException nfe) - { - return false; - } + obj.setSelect(value); + return true; } } Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/choose/UserInputToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/choose/UserInputToken.java 2008-02-07 04:27:59 UTC (rev 5106) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/choose/UserInputToken.java 2008-02-07 04:40:41 UTC (rev 5107) @@ -121,7 +121,7 @@ po.setChoiceString(sb.toString()); if (firstarg != null) { - po.setSelect(firstarg.intValue()); + po.setSelect(firstarg.toString()); } return true; } Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/choose/WeaponProfToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/choose/WeaponProfToken.java 2008-02-07 04:27:59 UTC (rev 5106) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/choose/WeaponProfToken.java 2008-02-07 04:40:41 UTC (rev 5107) @@ -138,7 +138,7 @@ } sb.append(getTokenName()).append('|').append(profs).append(suffix); po.setChoiceString(sb.toString()); - po.setSelect(firstarg); + po.setSelect(start); /* * TODO Error catching here for SELECT/CHOOSE? */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jde...@us...> - 2008-02-17 11:40:14
|
Revision: 5221 http://pcgen.svn.sourceforge.net/pcgen/?rev=5221&view=rev Author: jdempsey Date: 2008-02-17 03:40:17 -0800 (Sun, 17 Feb 2008) Log Message: ----------- Complete freq: Add SHIELDPROF and ARMORPROF LST files Issue#: 1883202 Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/Campaign.java Trunk/pcgen/code/src/java/pcgen/core/Globals.java Trunk/pcgen/code/src/java/pcgen/core/ShieldProf.java Trunk/pcgen/code/src/java/pcgen/persistence/lst/CampaignLoader.java Trunk/pcgen/code/src/java/pcgen/persistence/lst/ShieldProfLstToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/campaign/ShieldprofToken.java Modified: Trunk/pcgen/code/src/java/pcgen/core/Campaign.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Campaign.java 2008-02-17 11:36:07 UTC (rev 5220) +++ Trunk/pcgen/code/src/java/pcgen/core/Campaign.java 2008-02-17 11:40:17 UTC (rev 5221) @@ -294,6 +294,26 @@ } /** + * Adds the list of armor proficiency files to this campaign. + * + * @param files the files + */ + public void addAllArmorProfFiles(List<CampaignSourceEntry> files) + { + listChar.addAllToListFor(ListKey.FILE_ARMOR_PROF, files); + } + + /** + * Adds the list of shield proficiency files to this campaign. + * + * @param files the files + */ + public void addAllShieldProfFiles(List<CampaignSourceEntry> files) + { + listChar.addAllToListFor(ListKey.FILE_SHIELD_PROF, files); + } + + /** * * @param files */ Modified: Trunk/pcgen/code/src/java/pcgen/core/Globals.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Globals.java 2008-02-17 11:36:07 UTC (rev 5220) +++ Trunk/pcgen/code/src/java/pcgen/core/Globals.java 2008-02-17 11:40:17 UTC (rev 5221) @@ -48,6 +48,7 @@ import java.net.URI; import java.text.Collator; import java.util.*; +import java.util.logging.Level; import java.util.regex.Pattern; /** @@ -2041,6 +2042,15 @@ } /** + * Get the number of armor proficiencies defined. + * @return number of armor proficiencies + */ + public static int getArmorProfSize() + { + return armorProfs.size(); + } + + /** * Searches for an exact key match. * * @param aKey @@ -2052,6 +2062,15 @@ } /** + * Get the number of shield proficiencies defined. + * @return number of shield proficiencies + */ + public static int getShieldProfSize() + { + return shieldProfs.size(); + } + + /** * Get weapon prof names * @param delim * @param addArrayMarkers @@ -2368,32 +2387,38 @@ } /** - * Dsiplay happy message that lsts are loaded + * Check if enough data has been loaded to support character creation. + * Will also report to the log the number of items of each of the + * necessary types that are currently loaded. * @return true or false */ public static boolean displayListsHappy() { - Logging.debugPrint("Number of objects loaded. The following should all be greater than 0:"); - Logging.debugPrint("Races=" + raceMap.size()); - Logging.debugPrint("Classes=" + getClassList().size()); - Logging.debugPrint("Skills=" + getSkillList().size()); - Logging.debugPrint("Feats=" + getUnmodifiableAbilityList("FEAT").size()); - Logging.debugPrint("Equipment=" + EquipmentList.size()); - Logging.debugPrint("WeaponProfs=" + getWeaponProfSize()); - Logging.debugPrint("Kits=" + kitMap.size()); - Logging.debugPrint("Templates=" + templateList.size()); + // NOTE: If you add something here be sure to update the log output below + //TODO: JD Reinstate armor and shield proficiency checks once data has been created. + boolean listsHappy = + !((raceMap.size() == 0) || (getClassList().size() == 0) + || (getSkillList().size() == 0) + || (getUnmodifiableAbilityList("FEAT").size() == 0) + || (EquipmentList.size() == 0) || /*(getArmorProfSize() == 0) + || (getShieldProfSize() == 0) ||*/ (getWeaponProfSize() == 0)); - // - // NOTE: If you add something here be sure to update the debug output in pcgen.gui.MainSource in loadCampaigns_actionPerformed - // - if ((raceMap.size() == 0) || (getClassList().size() == 0) || (getSkillList().size() == 0) - || (getUnmodifiableAbilityList("FEAT").size() == 0) || (EquipmentList.size() == 0) - || (getWeaponProfSize() == 0)) - { - return false; - } + Level logLevel = listsHappy ? Logging.DEBUG : Logging.WARNING; + Logging.log(logLevel, "Number of objects loaded. The following should " + + "all be greater than 0:"); + Logging.log(logLevel, "Races=" + raceMap.size()); + Logging.log(logLevel, "Classes=" + getClassList().size()); + Logging.log(logLevel, "Skills=" + getSkillList().size()); + Logging.log(logLevel, "Feats=" + + getUnmodifiableAbilityList("FEAT").size()); + Logging.log(logLevel, "Equipment=" + EquipmentList.size()); + Logging.log(logLevel, "ArmorProfs=" + getArmorProfSize()); + Logging.log(logLevel, "ShieldProfs=" + getShieldProfSize()); + Logging.log(logLevel, "WeaponProfs=" + getWeaponProfSize()); + Logging.log(logLevel, "Kits=" + kitMap.size()); + Logging.log(logLevel, "Templates=" + templateList.size()); - return true; + return listsHappy; } /** @@ -2444,6 +2469,7 @@ saSet = new TreeSet<SpecialAbility>(); clearWeaponProfs(); + shieldProfs.clear(); // Clear Maps (not strictly necessary, but done for consistency) // bonusSpellMap = new HashMap(); Modified: Trunk/pcgen/code/src/java/pcgen/core/ShieldProf.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/ShieldProf.java 2008-02-17 11:36:07 UTC (rev 5220) +++ Trunk/pcgen/code/src/java/pcgen/core/ShieldProf.java 2008-02-17 11:40:17 UTC (rev 5221) @@ -1,5 +1,5 @@ /* - * ArmorProf.java + * ShieldProf.java * Copyright 2001 (C) Bryan McRoberts <mer...@ya...> * * This library is free software; you can redistribute it and/or @@ -16,15 +16,15 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * Created on April 21, 2001, 2:15 PM + * Created on January 14, 2008 */ package pcgen.core; /** - * <code>ArmorProf</code>. + * <code>ShieldProf</code>. * - * @author Thomas Clegg <ark...@sw...> + * @author Tom Parker <th...@us...> * @version $Revision: 1957 $ * DO NOT DELETE (waiting for use) */ Modified: Trunk/pcgen/code/src/java/pcgen/persistence/lst/CampaignLoader.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/persistence/lst/CampaignLoader.java 2008-02-17 11:36:07 UTC (rev 5220) +++ Trunk/pcgen/code/src/java/pcgen/persistence/lst/CampaignLoader.java 2008-02-17 11:40:17 UTC (rev 5221) @@ -178,6 +178,8 @@ baseCampaign.addAllFeatFiles(subCampaign.getFeatFiles()); baseCampaign.addAllDeityFiles(subCampaign.getDeityFiles()); baseCampaign.addAllDomainFiles(subCampaign.getDomainFiles()); + baseCampaign.addAllArmorProfFiles(subCampaign.getArmorProfFiles()); + baseCampaign.addAllShieldProfFiles(subCampaign.getShieldProfFiles()); baseCampaign.addAllWeaponProfFiles(subCampaign.getWeaponProfFiles()); baseCampaign.addAllEquipFiles(subCampaign.getEquipFiles()); baseCampaign.addAllClassSkillFiles(subCampaign.getClassSkillFiles()); Modified: Trunk/pcgen/code/src/java/pcgen/persistence/lst/ShieldProfLstToken.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/persistence/lst/ShieldProfLstToken.java 2008-02-17 11:36:07 UTC (rev 5220) +++ Trunk/pcgen/code/src/java/pcgen/persistence/lst/ShieldProfLstToken.java 2008-02-17 11:40:17 UTC (rev 5221) @@ -1,5 +1,5 @@ /* - * WeaponProfToken + * ShieldProfLstToken * Copyright 2008 * * This library is free software; you can redistribute it and/or Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/campaign/ShieldprofToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/campaign/ShieldprofToken.java 2008-02-17 11:36:07 UTC (rev 5220) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/campaign/ShieldprofToken.java 2008-02-17 11:40:17 UTC (rev 5221) @@ -7,14 +7,14 @@ import pcgen.persistence.lst.CampaignSourceEntry; /** - * Class deals with WEAPONPROF Token + * Class deals with SHIELDPROF Token */ public class ShieldprofToken implements CampaignLstToken { public String getTokenName() { - return "ArmorprofToken.java"; + return "SHIELDPROF"; } public boolean parse(Campaign campaign, String value, URI sourceUri) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <nu...@us...> - 2008-02-25 03:32:05
|
Revision: 5329 http://pcgen.svn.sourceforge.net/pcgen/?rev=5329&view=rev Author: nuance Date: 2008-02-24 19:32:11 -0800 (Sun, 24 Feb 2008) Log Message: ----------- Code tidy up of ExportHandler, moved some methods to more appropriate classes. Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java Trunk/pcgen/code/src/java/pcgen/io/ExportHandler.java Trunk/pcgen/code/src/java/plugin/exporttokens/SpellMemToken.java Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-02-25 01:11:44 UTC (rev 5328) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-02-25 03:32:11 UTC (rev 5329) @@ -14689,6 +14689,42 @@ this.descriptionLst = descriptionLst; } + /* + * Prepares this PC object for output by ensuring that all its + * info is up to date. + */ + public void preparePCForOutput() + { + // Get the EquipSet used for output and calculations + // possibly include equipment from temporary bonuses + setCalcEquipmentList(getUseTempMods()); + + // Make sure spell lists are setup + getSpellList(); + + getAllSkillList(true); //force refresh of skills + + int includeSkills = SettingsHandler.getIncludeSkills(); + + // TODO Reference a constant + if (includeSkills == SettingsHandler.INCLUDE_SKILLS_SKILLS_TAB) + { + includeSkills = SettingsHandler.getSkillsTab_IncludeSkills(); + } + + populateSkills(includeSkills); + + for (PObject pcClass : getClassList()) + { + pcClass.getSpellSupport().sortCharacterSpellList(); + } + + determinePrimaryOffWeapon(); + modFromArmorOnWeaponRolls(); + adjustMoveRates(); + calcActiveBonuses(); + } + private class CasterLevelSpellBonus { private int bonus; Modified: Trunk/pcgen/code/src/java/pcgen/io/ExportHandler.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/ExportHandler.java 2008-02-25 01:11:44 UTC (rev 5328) +++ Trunk/pcgen/code/src/java/pcgen/io/ExportHandler.java 2008-02-25 03:32:11 UTC (rev 5329) @@ -25,20 +25,68 @@ */ package pcgen.io; -import pcgen.core.*; +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.StringWriter; +import java.text.NumberFormat; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.StringTokenizer; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import pcgen.core.Constants; +import pcgen.core.Equipment; +import pcgen.core.Globals; +import pcgen.core.PCClass; +import pcgen.core.PCTemplate; +import pcgen.core.PObject; +import pcgen.core.PlayerCharacter; +import pcgen.core.SettingsHandler; +import pcgen.core.Skill; import pcgen.core.character.CharacterSpell; import pcgen.core.character.Follower; import pcgen.core.utils.CoreUtility; -import pcgen.io.exporttoken.*; +import pcgen.io.exporttoken.ACCheckToken; +import pcgen.io.exporttoken.AbilityListToken; +import pcgen.io.exporttoken.AbilityToken; +import pcgen.io.exporttoken.AlignmentToken; +import pcgen.io.exporttoken.AttackToken; +import pcgen.io.exporttoken.BonusToken; +import pcgen.io.exporttoken.CheckToken; +import pcgen.io.exporttoken.DRToken; +import pcgen.io.exporttoken.DomainToken; +import pcgen.io.exporttoken.EqToken; +import pcgen.io.exporttoken.EqTypeToken; +import pcgen.io.exporttoken.GameModeToken; +import pcgen.io.exporttoken.HPToken; +import pcgen.io.exporttoken.HeightToken; +import pcgen.io.exporttoken.InitiativeMiscToken; +import pcgen.io.exporttoken.MovementToken; +import pcgen.io.exporttoken.ReachToken; +import pcgen.io.exporttoken.SRToken; +import pcgen.io.exporttoken.SizeLongToken; +import pcgen.io.exporttoken.SkillToken; +import pcgen.io.exporttoken.SkillpointsToken; +import pcgen.io.exporttoken.SpellFailureToken; +import pcgen.io.exporttoken.StatToken; +import pcgen.io.exporttoken.Token; +import pcgen.io.exporttoken.TotalToken; +import pcgen.io.exporttoken.VarToken; +import pcgen.io.exporttoken.WeaponToken; +import pcgen.io.exporttoken.WeaponhToken; +import pcgen.io.exporttoken.WeightToken; import pcgen.util.Delta; import pcgen.util.Logging; import pcgen.util.enumeration.Visibility; -import java.io.*; -import java.text.NumberFormat; -import java.util.*; -import java.util.regex.Pattern; - /** * <code>ExportHandler</code>. * @@ -47,28 +95,27 @@ */ public final class ExportHandler { - private static final Float JEP_TRUE = new Float(1.0); - private static final NumberFormat NUM_FMT = NumberFormat.getInstance(); - private static HashMap<String, Token> tokenMap = - new HashMap<String, Token>(); - private static boolean tokenMapPopulated = false; + private static final Float JEP_TRUE = new Float(1.0); + private static final NumberFormat NUM_FMT = NumberFormat.getInstance(); + private static Map<String, Token> tokenMap = new HashMap<String, Token>(); + private static boolean tokenMapPopulated = false; // Processing state variables - private boolean existsOnly = false; - private boolean noMoreItems = false; + private boolean existsOnly = false; + private boolean noMoreItems = false; private boolean manualWhitespace = false; private File templateFile; // This is pretty ugly. No idea what sort of junk could be in here. - private final Map<Object, Object> loopVariables = + private final Map<Object, Object> loopVariables = new HashMap<Object, Object>(); - private String csheetTag2 = "\\"; - private boolean skipMath = false; - private boolean canWrite = true; + private String csheetTag2 = "\\"; + private boolean skipMath = false; + private boolean canWrite = true; private boolean checkBefore = false; - private boolean inLabel = false; + private boolean inLabel = false; /** * Constructor. @@ -86,12 +133,14 @@ /** * Replace the token, but skip the math * - * @param aPC - * @param aString - * @param output + * @param aPC The PC being exported + * @param aString the string which will have its tokens replaced + * @param output the object that collects the output */ - public void replaceTokenSkipMath(PlayerCharacter aPC, String aString, - BufferedWriter output) + public void replaceTokenSkipMath( + PlayerCharacter aPC, + String aString, + BufferedWriter output) { final boolean oldSkipMath = skipMath; skipMath = true; @@ -106,82 +155,47 @@ * <br>author: Thomas Behr 12-04-02 * * @param aPC the PlayerCharacter to write - * @param out the Writer to be written to + * @param out the Writer to be written to */ - public void write(PlayerCharacter aPC, BufferedWriter out) + public void write( + PlayerCharacter aPC, + BufferedWriter out) { - // Get the EquipSet used for output and calculations - // possibly include equipment from temporary bonuses - aPC.setCalcEquipmentList(aPC.getUseTempMods()); + aPC.preparePCForOutput(); - // Make sure spell lists are setup - aPC.getSpellList(); - FileAccess.setCurrentOutputFilter(templateFile.getName()); - aPC.getAllSkillList(true); //force refresh of skills - - int includeSkills = SettingsHandler.getIncludeSkills(); - - // TODO Reference a constant - if (includeSkills == SettingsHandler.INCLUDE_SKILLS_SKILLS_TAB) - { - includeSkills = SettingsHandler.getSkillsTab_IncludeSkills(); - } - - aPC.populateSkills(includeSkills); - - for (PCClass pcClass : aPC.getClassList()) - { - pcClass.getSpellSupport().sortCharacterSpellList(); - } - - aPC.determinePrimaryOffWeapon(); - aPC.modFromArmorOnWeaponRolls(); - aPC.adjustMoveRates(); - aPC.calcActiveBonuses(); - BufferedReader br = null; try { - br = - new BufferedReader(new InputStreamReader( - new FileInputStream(templateFile), "UTF-8")); + br = new BufferedReader( + new InputStreamReader( + new FileInputStream(templateFile), + "UTF-8")); - String aString; + Pattern pat = Pattern.compile(Pattern.quote("||")); + String rep = Matcher.quoteReplacement("| |"); + String aString = br.readLine(); + final StringBuffer inputLine = new StringBuffer(); - while ((aString = br.readLine()) != null) + while (aString != null) { if (aString.length() == 0) { - inputLine.append(' ').append(Constants.s_LINE_SEP); + inputLine.append(' '); } - else if (aString.indexOf("||") < 0) - { - inputLine.append(aString).append(Constants.s_LINE_SEP); - } else { - // Adjacent separators get merged by StringTokenizer, so we break them up here - int dblBarPos = aString.indexOf("||"); - - while (dblBarPos >= 0) - { - inputLine.append(aString.substring(0, dblBarPos)) - .append("| |"); - aString = aString.substring(dblBarPos + 2); - dblBarPos = aString.indexOf("||"); - } - - if (aString.length() > 0) - { - inputLine.append(aString); - } - - inputLine.append(Constants.s_LINE_SEP); + // Adjacent separators get merged by StringTokenizer, + // so we break them up here + Matcher mat = pat.matcher(aString); + inputLine.append(mat.replaceAll(rep)); } + + inputLine.append(Constants.s_LINE_SEP); + aString = br.readLine(); } aString = inputLine.toString(); @@ -260,95 +274,6 @@ } /** - * Discovers if a string is a attack routine. It must begin with a sign (+-), - * it must have only digits, and must have a delimiter - * May be optimized via Stringtokenizer, instead of a for - * @param aString - * @return true if it is an attack routine - */ - private static boolean isAttackRoutine(String aString) - { - final String signs = "+-"; - final String delimiter = "/"; - int typeBefore = 0; // 0=delimiter, 1=sign, 2=digit - - for (int i = 0; i < aString.length(); ++i) - { - if (signs.indexOf(aString.charAt(i)) > -1) - { - if (typeBefore != 0) - { - return false; - } - - typeBefore = 1; - } - else if (delimiter.indexOf(aString.charAt(i)) > -1) - { - if (typeBefore != 2) - { - return false; - } - - typeBefore = 0; - } - else if ((aString.charAt(i) >= '0') && (aString.charAt(i) <= '9')) - { - if ((typeBefore != 1) && (typeBefore != 2)) - { - return false; - } - - typeBefore = 2; - } - else - { - return false; - } - } - - return true; - } - - /** - * Get the item description - * @param sType - * @param sKey - * @param sAlt - * @param aPC - * @return item description - */ - public static String getItemDescription(String sType, String sKey, - String sAlt, PlayerCharacter aPC) - { - if (SettingsHandler.isROG()) - { - if ("EMPTY".equals(aPC.getDescriptionLst())) - { - aPC.loadDescriptionFilesInDirectory("descriptions"); - } - - String aDescription = sAlt; - final String aSearch = - sType.toUpperCase() + ":" + sKey + Constants.s_LINE_SEP; - final int pos = aPC.getDescriptionLst().indexOf(aSearch); - - if (pos >= 0) - { - aDescription = - aPC.getDescriptionLst().substring( - pos + aSearch.length()); - aDescription = - aDescription.substring(0, - aDescription.indexOf("####") - 1).trim(); - } - - return aDescription; - } - return sAlt; - } - - /** * Sets the template to use for export<br> * Use this method to reset this handler, if it should be used * to export to different/multiple templates @@ -369,59 +294,42 @@ return templateFile; } - private int getVarValue(String var, PlayerCharacter aPC) + private int getVarValue(String varString, PlayerCharacter aPC) { - char chC; - for (int idx = -1;;) + String vString = varString; + int countIndex = vString.indexOf("COUNT[EQ", 0); + + while (countIndex >= 0) { - idx = var.indexOf("COUNT[EQ", idx + 1); - if (idx < 0) - { - break; - } + char chC = vString.charAt(countIndex + 8); - chC = var.charAt(idx + 8); - if ((chC == '.') || ((chC >= '0') && (chC <= '9'))) { - final int i = var.indexOf(']', idx + 8); + final int i = vString.indexOf(']', countIndex + 8); if (i >= 0) { - String aString = var.substring(idx + 6, i); - if (aString.indexOf("EQTYPE") > -1) - { - EqTypeToken token = new EqTypeToken(); - aString = token.getToken(aString, aPC, this); - } - else - { - EqToken token = new EqToken(); - aString = token.getToken(aString, aPC, this); - } - var = - var.substring(0, idx) + aString - + var.substring(i + 1); + String aString = vString.substring(countIndex + 6, i); + EqToken token = (aString.indexOf("EQTYPE") > -1) ? new EqTypeToken() : new EqToken(); + String baString = token.getToken(aString, aPC, this); + vString = vString.substring(0, countIndex) + baString + vString.substring(i + 1); } } + countIndex = vString.indexOf("COUNT[EQ", countIndex + 1); } - for (int idx = -1;;) + int strlenIndex = vString.indexOf("STRLEN[", 0); + + while (strlenIndex >= 0) { - idx = var.indexOf("STRLEN[", idx + 1); - if (idx < 0) - { - break; - } + final int i = vString.indexOf(']', strlenIndex + 7); - final int i = var.indexOf(']', idx + 7); - if (i >= 0) { - String aString = var.substring(idx + 7, i); + String aString = vString.substring(strlenIndex + 7, i); StringWriter sWriter = new StringWriter(); BufferedWriter aWriter = new BufferedWriter(sWriter); replaceToken(aString, aWriter, aPC); @@ -436,14 +344,14 @@ //TODO: If this should be ignored, add a comment here describing why. XXX } - aString = sWriter.toString(); - var = - var.substring(0, idx) + aString.length() - + var.substring(i + 1); + String result = sWriter.toString(); + vString = vString.substring(0, strlenIndex) + result.length() + + vString.substring(i + 1); } + strlenIndex = vString.indexOf("STRLEN[", strlenIndex + 1); } - return aPC.getVariableValue(var, "").intValue(); + return aPC.getVariableValue(vString, "").intValue(); } /** @@ -874,20 +782,18 @@ private boolean processLoop(FORNode node, BufferedWriter output, FileAccess fa, PlayerCharacter aPC, int index) { - loopVariables.put(node.var(), Integer.valueOf(index)); + loopVariables.put(node.var(), index); for (int y = 0; y < node.children().size(); ++y) { if (node.children().get(y) instanceof FORNode) { FORNode nextFor = (FORNode) node.children().get(y); - loopVariables.put(nextFor.var(), Integer.valueOf(0)); + loopVariables.put(nextFor.var(), 0); existsOnly = nextFor.exists(); String minString = nextFor.min(); String maxString = nextFor.max(); String stepString = nextFor.step(); - String fString; - String rString; for (Object anObject : loopVariables.keySet()) { @@ -896,8 +802,8 @@ continue; } - fString = anObject.toString(); - rString = loopVariables.get(fString).toString(); + String fString = anObject.toString(); + String rString = loopVariables.get(fString).toString(); minString = minString.replaceAll(Pattern.quote(fString), rString); maxString = maxString.replaceAll(Pattern.quote(fString), rString); stepString = stepString.replaceAll(Pattern.quote(fString), rString); @@ -953,17 +859,17 @@ * Math Mode - Most of the code logic was copied from PlayerCharacter.getVariableValue * included a treatment for math with attack routines (for example +6/+1 - 2 = +4/-1) * - * @param aString - * @param aPC + * @param aString The string to be converted + * @param aPC the pc being exported * @return String */ private String mathMode(String aString, PlayerCharacter aPC) { - Float total = new Float(0.0); - while (aString.lastIndexOf('(') >= 0) + String str = aString; + while (str.lastIndexOf('(') >= 0) { - int x = CoreUtility.innerMostStringStart(aString); - int y = CoreUtility.innerMostStringEnd(aString); + int x = CoreUtility.innerMostStringStart(str); + int y = CoreUtility.innerMostStringEnd(str); if (y < x) { @@ -973,28 +879,27 @@ break; } - String bString = aString.substring(x + 1, y); + String bString = str.substring(x + 1, y); // This will treat Knowledge (xx) kind of token if ((x > 0) - && (aString.charAt(x - 1) == ' ') - && ((aString.charAt(y + 1) == '.') || (y == (aString.length() - 1)))) + && (str.charAt(x - 1) == ' ') + && ((str.charAt(y + 1) == '.') || (y == (str.length() - 1)))) { - aString = - aString.substring(0, x) + "[" + bString + "]" - + aString.substring(y + 1); + str = + str.substring(0, x) + "[" + bString + "]" + + str.substring(y + 1); } else { - aString = - aString.substring(0, x) + mathMode(bString, aPC) - + aString.substring(y + 1); + str = + str.substring(0, x) + mathMode(bString, aPC) + + str.substring(y + 1); } } - - aString = aString.replaceAll(Pattern.quote("["), "("); - aString = aString.replaceAll(Pattern.quote("]"), ")"); + str = str.replaceAll(Pattern.quote("["), "("); + str = str.replaceAll(Pattern.quote("]"), ")"); final String delimiter = "+-/*"; String valString = ""; @@ -1012,20 +917,22 @@ boolean attackRoutine = false; String attackData = ""; - for (int i = 0; i < aString.length(); ++i) + Float total = new Float(0.0); + for (int i = 0; i < str.length(); ++i) { - valString += aString.substring(i, i + 1); + valString += str.substring(i, i + 1); - if ((i == (aString.length() - 1)) - || ((delimiter.lastIndexOf(aString.charAt(i)) > -1) && (i > 0) && (aString + if ((i == (str.length() - 1)) + || ((delimiter.lastIndexOf(str.charAt(i)) > -1) && (i > 0) && ( + str .charAt(i - 1) != '.'))) { - if (delimiter.lastIndexOf(aString.charAt(i)) > -1) + if (delimiter.lastIndexOf(str.charAt(i)) > -1) { valString = valString.substring(0, valString.length() - 1); } - if (i < aString.length()) + if (i < str.length()) { if (valString.endsWith(".TRUNC")) { @@ -1077,22 +984,22 @@ endMode = NO_ZERO_MODE; } - if ((aString.length() > 0) && (aString.charAt(i) == '+')) + if ((str.length() > 0) && (str.charAt(i) == '+')) { nextMode = ADDITION_MODE; } - else if ((aString.length() > 0) - && (aString.charAt(i) == '-')) + else if ((str.length() > 0) + && (str.charAt(i) == '-')) { nextMode = SUBTRACTION_MODE; } - else if ((aString.length() > 0) - && (aString.charAt(i) == '*')) + else if ((str.length() > 0) + && (str.charAt(i) == '*')) { nextMode = MULTIPLICATION_MODE; } - else if ((aString.length() > 0) - && (aString.charAt(i) == '/')) + else if ((str.length() > 0) + && (str.charAt(i) == '/')) { nextMode = DIVISION_MODE; } @@ -1138,7 +1045,7 @@ valString = bString; } - if ((!attackRoutine) && isAttackRoutine(valString)) + if ((!attackRoutine) && Pattern.matches("^([-+]\\d+/)*[-+]\\d+$", valString)) { attackRoutine = true; attackData = valString; @@ -1272,7 +1179,7 @@ //GuiFacade.showMessageDialog(null, "Math error determining value for " + aString + " " + attackData + "(" + valString + ")", Constants.s_APPNAME, GuiFacade.ERROR_MESSAGE); StringWriter sWriter = new StringWriter(); BufferedWriter aWriter = new BufferedWriter(sWriter); - replaceTokenSkipMath(aPC, aString, aWriter); + replaceTokenSkipMath(aPC, str, aWriter); sWriter.flush(); try @@ -1321,32 +1228,25 @@ return total.toString(); } - private void outputNonToken(String aString, BufferedWriter output) + private void outputNonToken(String nonToken, java.io.Writer output) { - //If something shouldn't be output, return. - if (!canWrite) + // Do nothing if something shouldn't be output. + if (canWrite && nonToken.length() != 0) { - return; + String finalToken = manualWhitespace ? + nonToken.replaceAll("[ \\t]", "") : + nonToken; + FileAccess.write(output, finalToken); } - - if (aString.length() > 0) - { - if (manualWhitespace) - { - aString = aString.replaceAll("[ \\t]", ""); - } - FileAccess.write(output, aString); - } } private FORNode parseFORs(StringTokenizer tokens) { final FORNode root = new FORNode(null, "0", "0", "1", false); - String line; while (tokens.hasMoreTokens()) { - line = tokens.nextToken(); + final String line = tokens.nextToken(); if (line.startsWith("|FOR")) { @@ -1386,7 +1286,7 @@ private FORNode parseFORs(String forLine, StringTokenizer tokens) { - final List<String> forVars = ExportHandler.getParameters(forLine); + final List<String> forVars = getParameters(forLine); final String var = forVars.get(1); final String min = forVars.get(2); final String max = forVars.get(3); @@ -1401,11 +1301,10 @@ } final FORNode node = new FORNode(var, min, max, step, exists); - String line; while (tokens.hasMoreTokens()) { - line = tokens.nextToken(); + final String line = tokens.nextToken(); if (line.startsWith("|FOR")) { @@ -1485,12 +1384,11 @@ private IIFNode parseIIFs(String expr, StringTokenizer tokens) { final IIFNode node = new IIFNode(expr); - String line; boolean childrenType = true; while (tokens.hasMoreTokens()) { - line = tokens.nextToken(); + final String line = tokens.nextToken(); if (line.startsWith("|FOR")) { @@ -1598,87 +1496,78 @@ * Various helper methods * #################################################################### */ - private void replaceLine(String aLine, BufferedWriter output, - PlayerCharacter aPC) + private void replaceLine( + String aLine, + BufferedWriter output, + PlayerCharacter aPC) { - boolean inPipe = false; - boolean flag; - StringBuffer tokString = new StringBuffer(""); + int lastIndex = aLine.lastIndexOf('|'); - if (!inPipe && (aLine.lastIndexOf('|') < 0)) + // No pipes and non empty string so just output the fixed text + if (lastIndex < 0 && aLine.length() > 0) { - if (aLine.length() > 0) - { - outputNonToken(aLine, output); - } + outputNonToken(aLine, output); } - else if ((inPipe && (aLine.lastIndexOf('|') < 0)) - || (!inPipe && (aLine.lastIndexOf('|') == 0))) + + /* + When the line starts with a pipe and that pipe is the only + one on the line, this operation ignores the line. This is + because the token is malformed. Malformed because it shoud be + between pipes. + */ + + if (lastIndex >= 1) { - tokString.append(aLine.substring(aLine.lastIndexOf('|') + 1)); - inPipe = true; - } - else - { - if (!inPipe && (aLine.charAt(0) == '|')) - { - inPipe = true; - } + final StringTokenizer aTok = new StringTokenizer(aLine, "|", false); - final StringTokenizer bTok = new StringTokenizer(aLine, "|", false); - flag = bTok.countTokens() == 1; + boolean inPipe = aLine.charAt(0) == '|'; + boolean lastIsPipe = aLine.charAt(aLine.length() - 1) == '|'; - while (bTok.hasMoreTokens()) + while (aTok.hasMoreTokens()) { - String bString = bTok.nextToken(); + String tok = aTok.nextToken(); - if (!inPipe) + if (inPipe) { - outputNonToken(bString, output); + if (aTok.hasMoreTokens() || lastIsPipe) + { + replaceToken(tok, output, aPC); + } + /* + no else condition because we should be between + pipes at this point i.e. this should be a token but + it appears to be malformed. Malformed because there + are no more tokens and the last character of the string + is not a pipe + */ } else { - if (bTok.hasMoreTokens() - || flag - || (inPipe && !bTok.hasMoreTokens() && (aLine - .charAt(aLine.length() - 1) == '|'))) - { - replaceToken(tokString.toString() + bString, output, - aPC); - tokString = new StringBuffer(""); - } - else - { - tokString.append(bString); - } + outputNonToken(tok, output); } - if (bTok.hasMoreTokens() || flag) + if (aTok.hasMoreTokens()) { inPipe = !inPipe; } } - - if (inPipe && (aLine.charAt(aLine.length() - 1) == '|')) - { - inPipe = false; - } } } /** * Replace the token with the value it represents - * @param aString - * @param output - * @param aPC + * @param aString The string containing the token to be replaced + * @param output The object that will capture the output + * @param aPC The PC currently being exported * @return value */ - public int replaceToken(String aString, BufferedWriter output, - PlayerCharacter aPC) + public int replaceToken( + String aString, + BufferedWriter output, + PlayerCharacter aPC) { try { - int len = 1; if (!canWrite && (aString.length() > 0) && (aString.charAt(0) != '%')) @@ -1703,7 +1592,6 @@ && (aString.length() > 1) && (aString.lastIndexOf('<') < 0) && (aString.lastIndexOf('>') < 0)) { - boolean found = false; canWrite = true; // check to see how we are merging equipment @@ -2083,9 +1971,9 @@ { StringTokenizer aTok = new StringTokenizer(aString.substring(1), "."); - int index = -1; aTok.nextToken(); // discard first one + int index = -1; if (aTok.hasMoreTokens()) { index = Integer.parseInt(aTok.nextToken()); @@ -2114,8 +2002,7 @@ aTok.nextToken(); // ARMOR String fString = aTok.nextToken(); - final int count; - final List<Equipment> aArrayList = + final Collection<Equipment> aArrayList = new ArrayList<Equipment>(); for (Equipment eq : aPC.getEquipmentListInOutputOrder()) @@ -2128,6 +2015,7 @@ } // When removing old syntax, remove the else and leave the if + final int count; if (aTok.hasMoreTokens()) { count = Integer.parseInt(aTok.nextToken()); @@ -2137,8 +2025,7 @@ Logging .errorPrint("Old syntax %ARMOR.ITEMx will be replaced for %ARMOR.ITEM.x"); - count = - Integer.parseInt(fString.substring(fString + count = Integer.parseInt(fString.substring(fString .length() - 1)); } @@ -2191,7 +2078,6 @@ final StringTokenizer aTok = new StringTokenizer(aString.substring(1), "."); String fString = aTok.nextToken(); - final int count; List<Equipment> aArrayList = aPC.getEquipmentOfTypeInOutputOrder("ARMOR", 3); @@ -2199,12 +2085,16 @@ //Since shields are included in the armor list they will appear twice and they really shouldn't be in the list of armor List<Equipment> shieldList = aPC.getEquipmentOfTypeInOutputOrder("SHIELD", 3); - for (int z = 0; z < shieldList.size(); z++) + + int z = 0; + while (z < shieldList.size()) { aArrayList.remove(shieldList.get(z)); + z++; } // When removing old syntax, remove the else and leave the if + final int count; if (aTok.hasMoreTokens()) { count = Integer.parseInt(aTok.nextToken()); @@ -2243,10 +2133,11 @@ final StringTokenizer aTok = new StringTokenizer(aString.substring(1), "."); String fString = aTok.nextToken(); - int count = 0; final List<Equipment> aArrayList = aPC.getExpandedWeapons(merge); + int count; + // When removing old syntax, remove the else and leave the if if (aTok.hasMoreTokens()) { @@ -2257,9 +2148,8 @@ Logging .errorPrint("Old syntax %WEAPONx will be replaced for %WEAPON.x"); - count = - Integer.parseInt(fString.substring(fString - .length() - 1)); + count = Integer.parseInt( + fString.substring(fString.length() - 1)); } if (count >= aArrayList.size()) @@ -2301,17 +2191,12 @@ if (SettingsHandler.getPrintSpellsWithPC()) { // New token syntax |%SPELLLISTBOOK.x| instead of |%SPELLLISTBOOKx| - // To remove old syntax, keep the if and remove the else - if (aString.charAt(14) == '.') - { - aString = aString.substring(15); - } - else - { - aString = aString.substring(14); - } + // To remove old syntax, rteplace i with 15 + int i = (aString.charAt(14) == '.') ? 15 : 14; - return replaceTokenSpellListBook(aString, aPC); + return replaceTokenSpellListBook( + aString.substring(i), + aPC); } canWrite = false; @@ -2341,7 +2226,8 @@ // finaly, check for classes final StringTokenizer aTok = new StringTokenizer(aString.substring(1), ",", false); - + + boolean found = false; while (aTok.hasMoreTokens()) { String cString = aTok.nextToken(); @@ -2400,28 +2286,31 @@ return 0; } + + String tokenString = aString; + // done with |%blah| tokens // now check for max length tokens // eg: |SUB10.ARMOR.AC| - if ((aString.indexOf("SUB") == 0) && (aString.indexOf(".") > 3)) + if ((tokenString.indexOf("SUB") == 0) && (tokenString.indexOf(".") > 3)) { - int iEnd = aString.indexOf("."); - int maxLength = -1; + int iEnd = tokenString.indexOf("."); + int maxLength; try { - maxLength = Integer.parseInt(aString.substring(3, iEnd)); + maxLength = Integer.parseInt(tokenString.substring(3, iEnd)); } catch (NumberFormatException ex) { // Hmm, no number? - Logging.errorPrint("Number format error: " + aString); + Logging.errorPrint("Number format error: " + tokenString); maxLength = -1; } if (maxLength > 0) { - aString = aString.substring(iEnd + 1); + tokenString = tokenString.substring(iEnd + 1); FileAccess.maxLength(maxLength); } } @@ -2433,12 +2322,12 @@ // Correct old format tags such as SPELLLIST // so that they get processed correctly - aString = correctOldFormatTag(aString); + tokenString = correctOldFormatTag(tokenString); - StringTokenizer tok = new StringTokenizer(aString, ".,", false); + StringTokenizer tok = new StringTokenizer(tokenString, ".,", false); String firstToken = tok.nextToken(); - String testString = aString; + String testString = tokenString; if (testString.indexOf(',') > -1) { testString = testString.substring(0, testString.indexOf(',')); @@ -2448,8 +2337,10 @@ testString = testString.substring(0, testString.indexOf('~')); } + int len = 1; + //Leave - if (aString.startsWith("FOR.") || aString.startsWith("DFOR.")) + if (tokenString.startsWith("FOR.") || tokenString.startsWith("DFOR.")) { FileAccess.maxLength(-1); @@ -2458,7 +2349,7 @@ checkBefore = false; //skipMath = true; - replaceTokenForDfor(aString, output, aPC); + replaceTokenForDfor(tokenString, output, aPC); //skipMath = false; existsOnly = false; @@ -2468,9 +2359,9 @@ } //Leave - else if (aString.startsWith("OIF(")) + else if (tokenString.startsWith("OIF(")) { - replaceTokenOIF(aString, output, aPC); + replaceTokenOIF(tokenString, output, aPC); } //Leave @@ -2487,15 +2378,15 @@ && (!skipMath)) { FileAccess.maxLength(-1); - FileAccess.write(output, mathMode(aString, aPC)); + FileAccess.write(output, mathMode(tokenString, aPC)); return 0; } //Leave - else if (aString.startsWith("CSHEETTAG2.")) + else if (tokenString.startsWith("CSHEETTAG2.")) { - csheetTag2 = aString.substring(11, 12); + csheetTag2 = tokenString.substring(11, 12); FileAccess.maxLength(-1); return 0; @@ -2507,31 +2398,31 @@ Token token = tokenMap.get(firstToken); if (token.isEncoded()) { - FileAccess.encodeWrite(output, token.getToken(aString, aPC, + FileAccess.encodeWrite(output, token.getToken(tokenString, aPC, this)); } else { FileAccess - .write(output, token.getToken(aString, aPC, this)); + .write(output, token.getToken(tokenString, aPC, this)); } } else { - len = aString.trim().length(); + len = tokenString.trim().length(); if (manualWhitespace) { - aString = aString.replaceAll("[ \\t]", ""); + tokenString = tokenString.replaceAll("[ \\t]", ""); if (len > 0) { - FileAccess.write(output, aString); + FileAccess.write(output, tokenString); } } else { - FileAccess.write(output, aString); + FileAccess.write(output, tokenString); } } @@ -2665,8 +2556,6 @@ private void replaceTokenForDfor(String aString, BufferedWriter output, PlayerCharacter aPC) { - int x = 0; - int i = 0; StringTokenizer aTok; if (aString.startsWith("DFOR.")) @@ -2683,61 +2572,59 @@ int cStep = 1; int cStepLine = 1; int cStepLineMax = 0; - String bString; String cString = ""; String cStartLineString = ""; String cEndLineString = ""; boolean isDFor = false; + int i = 0; while (aTok.hasMoreTokens()) { - bString = aTok.nextToken(); + String tokA = aTok.nextToken(); - switch (i++) + switch (i) { case 0: - cMin = getVarValue(bString, aPC); + cMin = getVarValue(tokA, aPC); break; case 1: - cMax = getVarValue(bString, aPC); + cMax = getVarValue(tokA, aPC); break; case 2: - cStep = getVarValue(bString, aPC); + cStep = getVarValue(tokA, aPC); if (aString.startsWith("DFOR.")) { - isDFor = true; - bString = aTok.nextToken(); - cStepLineMax = getVarValue(bString, aPC); - bString = aTok.nextToken(); - cStepLine = getVarValue(bString, aPC); + isDFor = true; + cStepLineMax = getVarValue(aTok.nextToken(), aPC); + cStepLine = getVarValue(aTok.nextToken(), aPC); } break; case 3: - cString = bString; + cString = tokA; break; case 4: - cStartLineString = bString; + cStartLineString = tokA; break; case 5: - cEndLineString = bString; + cEndLineString = tokA; break; case 6: - existsOnly = (!"0".equals(bString)); + existsOnly = (!"0".equals(tokA)); - if ("2".equals(bString)) + if ("2".equals(tokA)) { checkBefore = true; } @@ -2751,6 +2638,7 @@ break; } + i++; } if ("COMMA".equals(cStartLineString)) @@ -2784,16 +2672,17 @@ } int iStart = cMin; - int iNow; + int x = 0; while (iStart < cMax) { - if (x++ == 0) + if (x == 0) { FileAccess.write(output, cStartLineString); } + x++; - iNow = iStart; + int iNow = iStart; if (!isDFor) { @@ -2821,7 +2710,6 @@ while (aTok.hasMoreTokens()) { String eString = aTok.nextToken(); - String fString; String gString = ""; String hString = eString; int index = 0; @@ -2843,7 +2731,7 @@ continue; } - fString = hString.substring(0, index); + String fString = hString.substring(0, index); if ((index + 1) < eString.length()) { @@ -2915,18 +2803,19 @@ } } - private void replaceTokenOIF(String aString, BufferedWriter output, - PlayerCharacter aPC) + private void replaceTokenOIF( + String aString, + java.io.Writer output, + PlayerCharacter aPC) { int iParenCount = 0; final String[] aT = new String[3]; - int i; int iParamCount = 0; int iStart = 4; // OIF(expr,truepart,falsepart) // {|OIF(HASFEAT:Armor Prof (Light), <b>Yes</b>, <b>No</b>)|} - for (i = iStart; i < aString.length(); ++i) + for (int i = iStart; i < aString.length(); ++i) { if (iParamCount == 3) { @@ -2947,8 +2836,9 @@ { if (iParamCount == 2) { - aT[iParamCount++] = + aT[iParamCount] = aString.substring(iStart, i).trim(); + iParamCount++; iStart = i + 1; } else @@ -2990,27 +2880,25 @@ } } + String remainder = ""; + if (iParamCount != 3) { Logging.errorPrint("OIF: invalid parameter count: " + iParamCount); } else { - aString = aString.substring(iStart); - iStart = 2; + remainder = aString.substring(iStart); - if (evaluateExpression(aT[0], aPC)) - { - iStart = 1; - } + int i = evaluateExpression(aT[0], aPC) ? 1 : 2; - FileAccess.write(output, aT[iStart]); + FileAccess.write(output, aT[i]); } - - if (aString.length() > 0) + + if (remainder.length() > 0) { - Logging.errorPrint("OIF: extra characters on line: " + aString); - FileAccess.write(output, aString); + Logging.errorPrint("OIF: extra characters on line: " + remainder); + FileAccess.write(output, remainder); } } @@ -3118,320 +3006,224 @@ try { - br = - new BufferedReader(new InputStreamReader( + br = new BufferedReader( + new InputStreamReader( new FileInputStream(templateFile), "UTF-8")); - boolean flag; - boolean inPipe = false; - StringBuffer tokString = new StringBuffer(); - int charNum; + boolean betweenPipes = false; + StringBuffer textBetweenPipes = new StringBuffer(); - String aLine; + Pattern pat1 = Pattern.compile("^\\Q|"); + Pattern pat2 = Pattern.compile("\\Q|\\E$"); + + String aLine = br.readLine(); - while ((aLine = br.readLine()) != null) + while (aLine != null) { - if (!inPipe && (aLine.lastIndexOf('|') < 0)) + int lastIndex = aLine.lastIndexOf('|'); + + // not inside a piped enclosed section and no pipe on the + // line + if (!betweenPipes && lastIndex < 0) { + // Allow the output sheet author to control new lines. if (manualWhitespace) { aLine = aLine.replaceAll("[ \\t]", ""); + FileAccess.write(out, aLine); } - FileAccess.write(out, aLine); - // Allow the output sheet author to control new lines. - if (!manualWhitespace) + else { + FileAccess.write(out, aLine); FileAccess.newLine(out); } } - else if ((inPipe && (aLine.lastIndexOf('|') < 0)) - || (!inPipe && (aLine.lastIndexOf('|') == 0))) + + // inside a pipe enclosed section and no pipes on the line + // or not in a pipe enclosed section and the only pipe is + // at char zero. Collect this text (without the pipe) + // to be passed for replacement later. + else if (betweenPipes && lastIndex < 0 || !betweenPipes && lastIndex == 0) { - tokString.append(aLine - .substring(aLine.lastIndexOf('|') + 1)); - inPipe = true; + textBetweenPipes.append(aLine.substring(lastIndex + 1)); + betweenPipes = true; } + + else { - if (!inPipe && (aLine.charAt(0) == '|')) + Matcher mat1 = pat1.matcher(textBetweenPipes); + Matcher mat2 = pat2.matcher(textBetweenPipes); + boolean startsWithPipe = mat1.find(); + boolean endsWithPipe = mat2.find(); + + // not currently in a pipe enclosed section, but first + // char starts one. + if (!betweenPipes && startsWithPipe) { - inPipe = true; + betweenPipes = true; } - final StringTokenizer bTok = - new StringTokenizer(aLine, "|", false); - flag = bTok.countTokens() == 1; + betweenPipes = processPipedLine( + PCs, aLine, textBetweenPipes, out, betweenPipes); - String bString; - - while (bTok.hasMoreTokens()) + if (betweenPipes && endsWithPipe) { - bString = bTok.nextToken(); + betweenPipes = false; + } + } - if (!inPipe) - { - if (manualWhitespace) - { - bString = bString.replaceAll("[ \\t]", ""); - } - FileAccess.write(out, bString); - } - else - { - if (bTok.hasMoreTokens() || flag) - { - int i; + aLine = br.readLine(); + } + } + catch (IOException exc) + { + // TODO: If this should be ignored, add a comment here + // describing why. XXX + } + finally + { + if (br != null) + { + try + { + br.close(); + } + catch (IOException ignore) + { + // nothing to do about it + } + } + } + } - String aString = tokString.toString() + bString; + private boolean processPipedLine( + PlayerCharacter[] PCs, String aLine, StringBuffer buf, + BufferedWriter out, boolean between) + { + final StringTokenizer aTok = new StringTokenizer(aLine, "|", false); + + boolean noPipes = aTok.countTokens() == 1; + boolean betweenPipes = between; - if (aString.startsWith("FOR.")) - { - int x = 0; - int j = 0; - final PStringTokenizer pTok = - new PStringTokenizer(aString - .substring(4), ",", "\\\\", - "\\\\"); - Integer cMin = Integer.valueOf(0); - Integer cMax = Integer.valueOf(100); - Integer cStep = Integer.valueOf(1); - String cString = ""; - String cStartLineString = ""; - String cEndLineString = ""; - bString = null; + while (aTok.hasMoreTokens()) + { + String tok = aTok.nextToken(); - boolean _existsOnly = false; - boolean _noMoreItems = false; + if (!betweenPipes) + { + if (manualWhitespace) + { + tok = tok.replaceAll("[ \\t]", ""); + } + FileAccess.write(out, tok); + } - while (pTok.hasMoreTokens()) - { - bString = pTok.nextToken(); + // Guaranteed to be between pipes here + else if (!noPipes && !aTok.hasMoreTokens()) + { + buf.append(tok); + } - switch (j++) - { - case 0: - cMin = Delta.decode(bString); + else + { + buf.append(tok); + String aString = buf.toString(); - break; + // We have finished dealing with section + // between the pipe charcters so clear out the + // StringBuffer + int l = buf.length(); + buf.delete(0, l); - case 1: - cMax = Delta.decode(bString); + if (aString.startsWith("FOR.")) + { + doPartyForToken(PCs, out, aString); + } + else + { - break; + Matcher mat = Pattern.compile("^(\\d+)").matcher(aString); + int charNum = + mat.matches() ? Integer.parseInt(mat.group()) : -1; - case 2: - cStep = Delta.decode(bString); + // This seems bizarre since we haven't stripped the + // integer from the front of this string which means + // that it will not be recognised as a token and will + // just be written to the output verbatim + if ((charNum >= 0) && (charNum < Globals.getPCList() + .size())) + { + PlayerCharacter currPC = PCs[charNum]; + replaceToken(aString, out, currPC); + } + else if (aString.startsWith("EXPORT")) + { + // We can safely do EXPORT tags with no PC + replaceToken(aString, out, null); + } + } + } - break; + if (aTok.hasMoreTokens() || noPipes) + { + betweenPipes = !betweenPipes; + } + } + return betweenPipes; + } - case 3: - cString = bString; + private void doPartyForToken( + PlayerCharacter[] PCs, + BufferedWriter out, + String tokenString) + { + PartyForParser forParser = new PartyForParser(tokenString, PCs.length); - break; + int x = 0; + for (int i = forParser.min(); i < forParser.max(); i++) + { + if (x == 0) + { + FileAccess.write(out, forParser.startOfLine()); + } - case 4: - cStartLineString = bString; + PlayerCharacter currPC = (0 <= i && i < PCs.length) ? PCs[i] : null; + // Globals.setCurrentPC(currPC); - break; + String[] tokens = forParser.tokenString().split("\\\\"); - case 5: - cEndLineString = bString; - - break; - - case 6: - _existsOnly = - !("0".equals(bString)); - - break; - - default: - Logging - .errorPrint("In Party.print there is an unhandled case in a switch (the value is " - + j + "."); - - break; - } - } - - if ((cMax.intValue() >= PCs.length) - && _existsOnly) - { - cMax = Integer.valueOf(PCs.length); - } - - for (int k = cMin.intValue(); k < cMax - .intValue(); k++) - { - if (x++ == 0) - { - Logging.errorPrint("Outputing A '" - + bString + "'."); - FileAccess.write(out, - cStartLineString); - } - - String dString = cString; - String eString; - - while (dString.length() > 0) - { - eString = ""; - - for (int l = 0; l < (dString - .length() - 1); l++) - { - if ((dString.charAt(l) == '\\') - && (dString.charAt(l + 1) == '\\')) - { - eString = - dString.substring( - 0, l); - dString = - dString - .substring(l + 2); - - break; - } - } - - if ("".equals(eString)) - { - eString = dString; - dString = ""; - } - - if (eString.startsWith("%.")) - { - charNum = k; - - if ((charNum >= 0) - && (charNum < PCs.length)) - { - PlayerCharacter currPC = - PCs[charNum]; - Globals - .setCurrentPC(currPC); - - if (currPC != null) - { - replaceToken(eString - .substring(2), out, - currPC); - } - else - { - _noMoreItems = true; - } - } - else - { - _noMoreItems = true; - } - } - else - { - Logging - .errorPrint("Outputing B '" - + eString + "'."); - FileAccess.write(out, eString); - } - } - - if ((x == cStep.intValue()) - || (_existsOnly == _noMoreItems)) - { - Logging.errorPrint("Outputing C '" - + cEndLineString + "'."); - FileAccess.write(out, - cEndLineString); - // FileAccess.newLine(out); - x = 0; - - if (_existsOnly == _noMoreItems) - { - break; - } - } - } - } - else - { - charNum = -1; - - for (i = 0; i < aString.length(); i++) - { - if ((aString.charAt(i) < '0') - || (aString.charAt(i) > '9')) - { - break; - } - } - - if (i > 0) - { - charNum = - Delta.parseInt(aString - .substring(0, i)); - } - - if ((charNum >= 0) - && (charNum < Globals.getPCList() - .size())) - { - PlayerCharacter currPC = PCs[charNum]; - Globals.setCurrentPC(currPC); - replaceToken(aString, out, currPC); - } - else if (aString.startsWith("EXPORT")) - { - // We can safely do EXPORT tags with no PC - replaceToken(aString, out, null); - } - } - - tokString = new StringBuffer(""); - } - else - { - tokString.append(bString); - } - } - - if (bTok.hasMoreTokens() || flag) - { - inPipe = !inPipe; - } - } - - if (inPipe && (aLine.charAt(aLine.length() - 1) == '|')) + for (String tok : tokens) + { + if (tok.startsWith("%.")) + { + if (currPC != null) { - inPipe = false; + replaceToken(tok.substring(2), out, currPC); } } - - // if (!inPipe) - // { - // FileAccess.newLine(out); - // } + else + { + FileAccess.write(out, tok); + } } - } - catch (IOException exc) - { - //TODO: If this should be ignored, add a comment here describing why. XXX - } - finally - { - if (br != null) + + + // note: I changed this from == to && since I can't see how + // == could possibly be correct behaviour. If we were not + // just printing characters that exist the loop would + // terminate after printing one character. + boolean breakloop = (forParser.existsOnly() && (currPC == null)); + + if (++x == forParser.step() || breakloop) { - try + x = 0; + FileAccess.write(out, forParser.endOfLine()); + + if (breakloop) { - br.close(); + break; } - catch (IOException ignore) - { - // nothing to do about it - } } } } @@ -3500,12 +3292,13 @@ /** * Get the token string - * @param aPC - * @param aString + * @param aPC the PC being exported + * @param aString The token string to convert * @return token string */ - public static final String getTokenString(final PlayerCharacter aPC, - final String aString) + public static String getTokenString( + final PlayerCharacter aPC, + final String aString) { final StringTokenizer tok = new StringTokenizer(aString, ".,", false); final String firstToken = tok.nextToken(); @@ -3542,13 +3335,16 @@ private String _forThisString = ""; private String _ignoreBetweenThis = ""; - PStringTokenizer(String forThisString, String delimiter, - String ignoreBetweenThis, String andThat) + PStringTokenizer( + String forThisString, + String delimiter, + String ignoreBetweenThis, + String andThat) { - _forThisString = forThisString; - _delimiter = delimiter; - _ignoreBetweenThis = ignoreBetweenThis; - _andThat = andThat; + _forThisString = forThisString; + _delimiter = delimiter; + _ignoreBetweenThis = ignoreBetweenThis; + _andThat = andThat; } /** @@ -3567,7 +3363,6 @@ public String nextToken() { String aString; - int ignores = 0; if (_forThisString.lastIndexOf(_delimiter) == -1) { @@ -3579,6 +3374,7 @@ int i; final StringBuffer b = new StringBuffer(); + int ignores = 0; for (i = 0; i < _forThisString.length(); i++) { if (_forThisString.substring(i).startsWith(_delimiter) @@ -3608,4 +3404,110 @@ return aString; } } + + + private static final class PartyForParser + { + + final PStringTokenizer pTok; + + private final Integer cMin; + private final Integer cMax; + private final Integer cStep; + + private final String tokenString; + private final String stringForStartOfLine; + private final String stringForEndOfLine; + + private final boolean existsOnly; + + PartyForParser(String aString, final Integer numOfPCs) + { + pTok = + new PStringTokenizer(aString.substring(4), ",", "\\\\", "\\\\"); + + cMin = + pTok.hasMoreTokens() ? + Delta.decode(pTok.nextToken()) : + 0; + + Integer max = + pTok.hasMoreTokens() ? + Delta.decode(pTok.nextToken()) : + 100; + + cStep = + pTok.hasMoreTokens() ? + Delta.decode(pTok.nextToken()) : + 1; + + tokenString = + pTok.hasMoreTokens() ? + pTok.nextToken() : + ""; + + stringForStartOfLine = + pTok.hasMoreTokens() ? + pTok.nextToken() : + ""; + + stringForEndOfLine = + pTok.hasMoreTokens() ? + pTok.nextToken() : + ""; + + existsOnly = + pTok.hasMoreTokens() + && !("0".equals(pTok.nextToken())); + + cMax = (max >= numOfPCs) && existsOnly ? numOfPCs : max; + + + if (pTok.hasMoreTokens()) + { + StringBuffer sBuf = new StringBuffer(); + sBuf.append("In Party.print there is an unhandled case in a "); + sBuf.append("switch (the value is ").append(pTok.nextToken()); + sBuf.append("."); + String log = sBuf.toString(); + Logging.errorPrint(log); + } + } + + public Integer min() + { + return cMin; + } + + public Integer max() + { + return cMax; + } + + public Integer step() + { + return cStep; + } + + public String tokenString() + { + return tokenString; + } + + public String startOfLine() + { + return stringForStartOfLine; + } + + public String endOfLine() + { + return stringForEndOfLine; + } + + public boolean existsOnly() + { + return existsOnly; + } + } + } Modified: Trunk/pcgen/code/src/java/plugin/exporttokens/SpellMemToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/exporttokens/SpellMemToken.java 2008-02-25 01:11:44 UTC (rev 5328) +++ Trunk/pcgen/code/src/java/plugin/exporttokens/SpellMemToken.java 2008-02-25 03:32:11 UTC (rev 5329) @@ -372,7 +372,7 @@ else if (aLabel.startsWith("DESCRIPTION")) { final String sString = - ExportHandler.getItemDescription("SPELL", + getItemDescription("SPELL", aSpell.getKeyName(), aSpell .getDescription(aPC), aPC); @@ -533,4 +533,44 @@ return tempSource.toString(); } + /** + * Get the item description + * @param sType + * @param sKey + * @param sAlt + * @param aPC + * @return item description + */ + public static String getItemDescription( + String sType, + String sKey, + String sAlt, + PlayerCharacter aPC) + { + if (SettingsHandler.isROG()) + { + if ("EMPTY".equals(aPC.getDescriptionLst())) + { + aPC.loadDescriptionFilesInDirectory("descriptions"); + } + + String aDescription = sAlt; + final String aSearch = + sType.toUpperCase() + ":" + sKey + Constants.s_LINE_SEP; + final int pos = aPC.getDescriptionLst().indexOf(aSearch); + + if (pos >= 0) + { + aDescription = + aPC.getDescriptionLst().substring( + pos + aSearch.length()); + aDescription = + aDescription.substring(0, + aDescription.indexOf("####") - 1).trim(); + } + + return aDescription; + } + return sAlt; + } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-02-28 04:21:42
|
Revision: 5369 http://pcgen.svn.sourceforge.net/pcgen/?rev=5369&view=rev Author: thpr Date: 2008-02-27 20:18:10 -0800 (Wed, 27 Feb 2008) Log Message: ----------- Implements all of: [ 1886721 ] Spell Chooser [Discussed on _exp] EXCEPT the MAXCASTABLE variable Issue#: 1886721 Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java Trunk/pcgen/code/src/java/pcgen/core/chooser/SpellsChoiceManager.java Trunk/pcgen/code/src/java/plugin/lsttokens/choose/SpellsToken.java Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-02-27 21:48:42 UTC (rev 5368) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-02-28 04:18:10 UTC (rev 5369) @@ -17837,6 +17837,21 @@ return feats; } + public boolean hasSpellInSpellbook(Spell spell, String spellbookname) + { + for (PObject po : getPObjectList()) + { + SpellSupport ss = po.getSpellSupport(); + List<CharacterSpell> csl = ss.getCharacterSpell(spell, + spellbookname, -1); + if (csl != null && !csl.isEmpty()) + { + return true; + } + } + return false; + } + // public double getBonusValue(final String aBonusType, final String // aBonusName ) // { Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/SpellsChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/SpellsChoiceManager.java 2008-02-27 21:48:42 UTC (rev 5368) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/SpellsChoiceManager.java 2008-02-28 04:18:10 UTC (rev 5369) @@ -24,27 +24,35 @@ package pcgen.core.chooser; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.StringTokenizer; + import pcgen.core.Globals; +import pcgen.core.PCClass; import pcgen.core.PObject; import pcgen.core.PlayerCharacter; +import pcgen.core.SpellSupport; +import pcgen.core.character.CharacterSpell; import pcgen.core.spell.Spell; +import pcgen.util.Logging; /** * This is the chooser that deals with choosing a spell. */ -public class SpellsChoiceManager extends AbstractBasicPObjectChoiceManager<Spell> { - +public class SpellsChoiceManager extends + AbstractBasicPObjectChoiceManager<Spell> +{ /** * Make a new spell chooser. - * + * * @param aPObject * @param choiceString * @param aPC */ - public SpellsChoiceManager( - PObject aPObject, - String choiceString, + public SpellsChoiceManager(PObject aPObject, String choiceString, PlayerCharacter aPC) { super(aPObject, choiceString, aPC); @@ -53,47 +61,444 @@ /** * Parse the Choice string and build a list of available choices. - * + * * @param aPc * @param availableList * @param selectedList */ @Override - public void getChoices( - final PlayerCharacter aPc, - final List<Spell> availableList, - final List<Spell> selectedList) + public void getChoices(final PlayerCharacter aPc, + final List<Spell> availableList, final List<Spell> selectedList) { - for ( String token : getChoiceList() ) + Map<String, ?> spellMap = Globals.getSpellMap(); + Set<Spell> masterSet = new HashSet<Spell>(); + for (String item : getChoiceList()) { - String domainName = ""; - String className = ""; + List<Spell> masterList = null; + StringTokenizer st = new StringTokenizer(item, ","); + while (st.hasMoreTokens()) + { + String token = st.nextToken(); + List<Spell> localList = new ArrayList<Spell>(); + if (token.startsWith("DOMAIN=") || token.startsWith("DOMAIN.")) + { + appendSpells(new TypeKeyFilter("DOMAIN", + token.substring(7), null), aPc, localList); + } + else if (token.startsWith("CLASS=") + || token.startsWith("CLASS.")) + { + appendSpells(new TypeKeyFilter("CLASS", token.substring(6), + null), aPc, localList); + } + else if (token.startsWith("DOMAINLIST=")) + { + int bracketLoc = token.indexOf('['); + String domainName; + Restriction r = null; + if (bracketLoc == -1) + { + domainName = token.substring(11); + } + else + { + if (!token.endsWith("]")) + { + Logging.errorPrint("Invalid entry in " + + "CHOOSE:SPELLS: " + token + + " did not have matching brackets"); + } + domainName = token.substring(11, bracketLoc); + r = getRestriction("DOMAIN|" + domainName, token + .substring(bracketLoc + 1, token.length() - 1), + aPc); + } + appendSpells(new TypeKeyFilter("DOMAIN", domainName, r), + aPc, localList); + } + else if (token.startsWith("CLASSLIST=")) + { + int bracketLoc = token.indexOf('['); + String className; + Restriction r = null; + if (bracketLoc == -1) + { + className = token.substring(10); + } + else + { + if (!token.endsWith("]")) + { + Logging.errorPrint("Invalid entry in " + + "CHOOSE:SPELLS: " + token + + " did not have matching brackets"); + } + className = token.substring(10, bracketLoc); + r = getRestriction("CLASS|" + className, token + .substring(bracketLoc + 1, token.length() - 1), + aPc); + } + appendSpells(new TypeKeyFilter("CLASS", className, r), aPc, + localList); + } + else if (token.startsWith("SCHOOL=")) + { + appendSpells(new SchoolFilter(token.substring(7)), aPc, + localList); + } + else if (token.startsWith("SUBSCHOOL=")) + { + appendSpells(new SubSchoolFilter(token.substring(10)), aPc, + localList); + } + else if (token.startsWith("DESCRIPTOR=")) + { + appendSpells(new DescriptorFilter(token.substring(11)), + aPc, localList); + } + else if (token.startsWith("SPELLBOOK=")) + { + appendSpells(new SpellBookFilter(token.substring(10)), aPc, + localList); + } + else if (token.startsWith("PROHIBITED=")) + { + String prohibited = token.substring(11); + boolean pro; + if ("YES".equals(prohibited)) + { + pro = true; + } + else if ("NO".equals(prohibited)) + { + pro = false; + } + else + { + continue; + } + appendSpells(new ProhibitedFilter(pro), aPc, localList); + } + else if (token.startsWith("TYPE=") || token.startsWith("TYPE.")) + { + appendSpells(new TypeFilter(token.substring(5)), aPc, + localList); + } + else + { + for (String aKey : spellMap.keySet()) + { + Object obj = spellMap.get(aKey); + if (obj instanceof ArrayList) + { + localList.addAll((ArrayList) obj); + } + else if (obj instanceof Spell) + { + localList.add((Spell) obj); + } + } + } + if (masterList == null) + { + masterList = localList; + } + else + { + masterList.retainAll(localList); + } + } + masterSet.addAll(masterList); + } + availableList.addAll(masterSet); - if (token.startsWith("DOMAIN=") || token.startsWith("DOMAIN.")) + List<String> associatedChoices = new ArrayList<String>(); + pobject.addAssociatedTo(associatedChoices); + for (String choice : associatedChoices) + { + Spell spell = Globals.getSpellKeyed(choice); + selectedList.add(spell); + } + setPreChooserChoices(selectedList.size()); + } + + private Restriction getRestriction(String item, String restrString, + PlayerCharacter pc) + { + StringTokenizer restr = new StringTokenizer(restrString, ";"); + int levelMax = Integer.MAX_VALUE; + int levelMin = Integer.MIN_VALUE; + Boolean known = null; + while (restr.hasMoreTokens()) + { + String tok = restr.nextToken(); + if (tok.startsWith("LEVELMAX=")) { - domainName = token.substring(7); + /* + * TODO MAXCASTABLE needs to be available here, but I'm not sure + * if it's implemented elsewhere (doesn't look like it based on + * searching the source code for that string) + */ + levelMax = pc.getVariableValue(tok.substring(9), item) + .intValue(); } - else if (token.startsWith("CLASS=") || token.startsWith("CLASS.")) + else if (tok.startsWith("LEVELMIN=")) { - className = token.substring(6); + /* + * TODO MAXCASTABLE needs to be available here, but I'm not sure + * if it's implemented elsewhere (doesn't look like it based on + * searching the source code for that string) + */ + levelMin = pc.getVariableValue(tok.substring(9), item) + .intValue(); } + else if ("KNOWN=YES".equals(tok)) + { + known = Boolean.TRUE; + } + else if ("KNOWN=NO".equals(tok)) + { + known = Boolean.FALSE; + } + else + { + Logging.errorPrint("Unknown restriction: " + tok + " on item: " + + item + " in CHOOSE:SPELLS"); + continue; + } + } + return new Restriction(levelMin, levelMax, known); + } - // 20 level cap XXX - for (int lvl = 0; lvl < 20; ++lvl) + private void appendSpells(SpellFilter sf, PlayerCharacter pc, + List<Spell> availableList) + { + Map<String, ?> spellMap = Globals.getSpellMap(); + for (String aKey : spellMap.keySet()) + { + final Object obj = spellMap.get(aKey); + + if (obj instanceof ArrayList) { - final List<Spell> aList = Globals.getSpellsIn(lvl, className, domainName); - availableList.addAll(aList); + for (Spell aSpell : (ArrayList<Spell>) obj) + { + sf.conditionallyAdd(aSpell, pc, availableList); + } } + else if (obj instanceof Spell) + { + final Spell aSpell = (Spell) obj; + sf.conditionallyAdd(aSpell, pc, availableList); + } } + } - List<String> associatedChoices = new ArrayList<String>(); - pobject.addAssociatedTo( associatedChoices ); - for ( String choice : associatedChoices ) + private interface SpellFilter + { + void conditionallyAdd(Spell spell, PlayerCharacter pc, + List<Spell> availableList); + } + + private class TypeKeyFilter implements SpellFilter + { + + private final String listtype; + private final String listname; + private final Restriction res; + private final String defaultbook; + + public TypeKeyFilter(String ltype, String listkey, Restriction r) { - Spell spell = Globals.getSpellKeyed( choice ); - selectedList.add( spell ); + defaultbook = Globals.getDefaultSpellBook(); + listtype = ltype; + listname = listkey; + res = r; } - setPreChooserChoices(selectedList.size()); + + public void conditionallyAdd(Spell spell, PlayerCharacter pc, + List<Spell> availableList) + { + String listkey = listtype + "|" + listname; + LEVEL: for (int level : spell.levelForKey(listkey, pc)) + { + if (level < 0) + { + continue; + } + if (res != null) + { + if (level > res.maxLevel || level < res.minLevel) + { + continue; + } + if (res.knownRequired) + { + boolean found = false; + for (PCClass cl : pc.getClassList()) + { + SpellSupport ss = cl.getSpellSupport(); + List<CharacterSpell> csl = ss.getCharacterSpell( + spell, defaultbook, -1); + if (csl != null && !csl.isEmpty()) + { + /* + * Going to assume here that the level doesn't + * need to be rechecked... ?? - thpr Feb 26, 08 + */ + found = true; + } + } + if (!found) + { + continue; + } + } + } + availableList.add(spell); + break LEVEL; + } + } } + private class TypeFilter implements SpellFilter + { + private final String type; + + public TypeFilter(String spelltype) + { + type = spelltype; + } + + public void conditionallyAdd(Spell spell, PlayerCharacter pc, + List<Spell> availableList) + { + if (spell.isType(type)) + { + availableList.add(spell); + } + } + } + + private class SchoolFilter implements SpellFilter + { + private final String school; + + public SchoolFilter(String sch) + { + school = sch; + } + + public void conditionallyAdd(Spell spell, PlayerCharacter pc, + List<Spell> availableList) + { + if (spell.getSchools().contains(school)) + { + availableList.add(spell); + } + } + } + + private class SubSchoolFilter implements SpellFilter + { + private final String subschool; + + public SubSchoolFilter(String subsch) + { + subschool = subsch; + } + + public void conditionallyAdd(Spell spell, PlayerCharacter pc, + List<Spell> availableList) + { + if (spell.getSubschools().contains(subschool)) + { + availableList.add(spell); + } + } + } + + private class DescriptorFilter implements SpellFilter + { + private final String descriptor; + + public DescriptorFilter(String des) + { + descriptor = des; + } + + public void conditionallyAdd(Spell spell, PlayerCharacter pc, + List<Spell> availableList) + { + if (spell.descriptorContains(descriptor)) + { + availableList.add(spell); + } + } + } + + private class SpellBookFilter implements SpellFilter + { + private final String spellbookname; + + public SpellBookFilter(String sb) + { + spellbookname = sb; + } + + public void conditionallyAdd(Spell spell, PlayerCharacter pc, + List<Spell> availableList) + { + if (pc.hasSpellInSpellbook(spell, spellbookname)) + { + availableList.add(spell); + } + } + } + + private class ProhibitedFilter implements SpellFilter + { + private final boolean prohibited; + + public ProhibitedFilter(boolean pro) + { + prohibited = pro; + } + + public void conditionallyAdd(Spell spell, PlayerCharacter pc, + List<Spell> availableList) + { + for (PCClass cl : pc.getClassList()) + { + if (prohibited == cl.isProhibited(spell, pc)) + { + availableList.add(spell); + } + } + } + } + + private class Restriction + { + public final int minLevel; + public final int maxLevel; + public final boolean knownRequired; + public final boolean isKnown; + + public Restriction(int levelMin, int levelMax, Boolean known) + { + minLevel = levelMin; + maxLevel = levelMax; + if (known == null) + { + knownRequired = false; + isKnown = false; + } + else + { + knownRequired = true; + isKnown = known.booleanValue(); + } + } + + } } Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/choose/SpellsToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/choose/SpellsToken.java 2008-02-27 21:48:42 UTC (rev 5368) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/choose/SpellsToken.java 2008-02-28 04:18:10 UTC (rev 5369) @@ -32,59 +32,170 @@ if (value == null) { Logging.errorPrint("CHOOSE:" + getTokenName() - + " requires additional arguments"); + + " requires additional arguments"); return false; } - if (value.indexOf(',') != -1) - { - Logging.errorPrint("CHOOSE:" + getTokenName() - + " arguments may not contain , : " + value); - return false; - } - if (value.indexOf('[') != -1) - { - Logging.errorPrint("CHOOSE:" + getTokenName() - + " arguments may not contain [] : " + value); - return false; - } if (value.charAt(0) == '|') { Logging.errorPrint("CHOOSE:" + getTokenName() - + " arguments may not start with | : " + value); + + " arguments may not start with | : " + value); return false; } if (value.charAt(value.length() - 1) == '|') { Logging.errorPrint("CHOOSE:" + getTokenName() - + " arguments may not end with | : " + value); + + " arguments may not end with | : " + value); return false; } if (value.indexOf("||") != -1) { Logging.errorPrint("CHOOSE:" + getTokenName() - + " arguments uses double separator || : " + value); + + " arguments uses double separator || : " + value); return false; } StringTokenizer tok = new StringTokenizer(value, Constants.PIPE); while (tok.hasMoreTokens()) { - String tokText = tok.nextToken(); - int equalsLoc = tokText.indexOf("="); - if (equalsLoc == tokText.length() - 1) + String item = tok.nextToken(); + StringTokenizer st = new StringTokenizer(item, ","); + while (st.hasMoreTokens()) { - Logging.errorPrint("CHOOSE:" + getTokenName() - + " arguments must have value after = : " + tokText); - Logging.errorPrint(" entire token was: " + value); - return false; + String token = st.nextToken(); + if (token.startsWith("DOMAIN=") || token.startsWith("DOMAIN.")) + { + Logging.deprecationPrint("DOMAIN is deprecated in " + + "CHOOSE:SPELLS, please use DOMAINLIST=x"); + } + else if (token.startsWith("CLASS=") + || token.startsWith("CLASS.")) + { + Logging.deprecationPrint("CLASS is deprecated in " + + "CHOOSE:SPELLS, please use CLASSLIST=x"); + } + else if (token.startsWith("DOMAINLIST=")) + { + int bracketLoc = token.indexOf('['); + if (bracketLoc == -1) + { + if (token.length() < 12) + { + Logging.errorPrint("Invalid DOMAINLIST= entry for " + + "CHOOSE:SPELLS: requires a domain name"); + return false; + } + } + else + { + if (!token.endsWith("]")) + { + Logging.errorPrint("Invalid entry in " + + "CHOOSE:SPELLS: " + token + + " did not have matching brackets"); + return false; + } + String domainName = token.substring(11, bracketLoc); + if (domainName == null || domainName.length() == 0) + { + Logging.errorPrint("Invalid DOMAINLIST= entry for " + + "CHOOSE:SPELLS: requires a domain name"); + return false; + } + validateRestriction(token.substring(bracketLoc + 1, + token.length() - 1)); + } + } + else if (token.startsWith("CLASSLIST=")) + { + int bracketLoc = token.indexOf('['); + if (bracketLoc == -1) + { + if (token.length() < 10) + { + Logging.errorPrint("Invalid CLASSLIST= entry for " + + "CHOOSE:SPELLS: requires a class name"); + return false; + } + } + else + { + if (!token.endsWith("]")) + { + Logging.errorPrint("Invalid entry in " + + "CHOOSE:SPELLS: " + token + + " did not have matching brackets"); + return false; + } + String className = token.substring(10, bracketLoc); + if (className == null || className.length() == 0) + { + Logging.errorPrint("Invalid CLASSLIST= entry for " + + "CHOOSE:SPELLS: requires a class name"); + return false; + } + validateRestriction(token.substring(bracketLoc + 1, + token.length() - 1)); + } + } + else if (token.startsWith("SCHOOL=")) + { + if (token.length() < 8) + { + Logging.errorPrint("Invalid SCHOOL= entry for " + + "CHOOSE:SPELLS: requires a school name"); + return false; + } + } + else if (token.startsWith("SUBSCHOOL=")) + { + if (token.length() < 11) + { + Logging.errorPrint("Invalid SUBSCHOOL= entry for " + + "CHOOSE:SPELLS: requires a subschool name"); + return false; + } + } + else if (token.startsWith("DESCRIPTOR=")) + { + if (token.length() < 12) + { + Logging.errorPrint("Invalid DESCRIPTOR= entry for " + + "CHOOSE:SPELLS: requires a descriptor name"); + return false; + } + } + else if (token.startsWith("SPELLBOOK=")) + { + if (token.length() < 11) + { + Logging.errorPrint("Invalid SPELLBOOK= entry for " + + "CHOOSE:SPELLS: requires a spellbook name"); + return false; + } + } + else if (token.startsWith("PROHIBITED=")) + { + String prohibited = token.substring(11); + if (!"YES".equals(prohibited) && !"NO".equals(prohibited)) + { + Logging.errorPrint("Invalid PROHIBITED= entry for " + + "CHOOSE:SPELLS: must be YES or NO"); + return false; + } + } + else if (token.startsWith("TYPE=") || token.startsWith("TYPE.")) + { + if (token.length() < 6) + { + Logging.errorPrint("Invalid TYPE= entry for " + + "CHOOSE:SPELLS: requires a type name"); + return false; + } + } + else + { + // Just a spell name + } } - if (!tokText.startsWith("CLASS=") && !tokText.startsWith("DOMAIN=")) - { - Logging.errorPrint("CHOOSE:" + getTokenName() - + " argument must start with CLASS= or DOMAIN= : " - + tokText); - Logging.errorPrint(" Entire Token was: " + value); - return false; - } } StringBuilder sb = new StringBuilder(); if (prefix.length() > 0) @@ -96,6 +207,33 @@ return true; } + private void validateRestriction(String restrString) + { + StringTokenizer restr = new StringTokenizer(restrString, ";"); + while (restr.hasMoreTokens()) + { + String tok = restr.nextToken(); + if (tok.startsWith("LEVELMAX=")) + { + } + else if (tok.startsWith("LEVELMIN=")) + { + } + else if ("KNOWN=YES".equals(tok)) + { + } + else if ("KNOWN=NO".equals(tok)) + { + } + else + { + Logging.errorPrint("Unknown restriction: " + tok + + " in CHOOSE:SPELLS"); + continue; + } + } + } + public String getTokenName() { return "SPELLS"; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-03-02 23:59:55
|
Revision: 5429 http://pcgen.svn.sourceforge.net/pcgen/?rev=5429&view=rev Author: thpr Date: 2008-03-02 15:59:48 -0800 (Sun, 02 Mar 2008) Log Message: ----------- 1) Corrects ABILITY: token .CLEAR and .CLEAR. behavior, which misfunctioned (BUG) in the case of trailing PRExxx tokens 2) Allows AUTO:FEAT to improve .CLEAR performance by leveraging the infrastructure from (1) above 3) Allows the SubstitutionLevel code Joe is developing to leverage the infrastructure from (1) above and brings the SubstitutionLevel code into the cross-token, non-cross-level behavior specification agreed upon earlier: http://tech.groups.yahoo.com/group/pcgen_experimental/message/9275 Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/PCClass.java Trunk/pcgen/code/src/java/pcgen/core/QualifiedObject.java Trunk/pcgen/code/src/java/plugin/lsttokens/AbilityLst.java Trunk/pcgen/code/src/java/plugin/lsttokens/auto/FeatToken.java Modified: Trunk/pcgen/code/src/java/pcgen/core/PCClass.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-03-02 23:10:35 UTC (rev 5428) +++ Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-03-02 23:59:48 UTC (rev 5429) @@ -34,6 +34,7 @@ import java.util.StringTokenizer; import pcgen.core.Ability.Nature; +import pcgen.core.QualifiedObject.LevelAwareQualifiedObject; import pcgen.core.bonus.Bonus; import pcgen.core.bonus.BonusObj; import pcgen.core.character.CharacterSpell; @@ -6940,43 +6941,21 @@ public void removeAllAutoAbilites(final int alevel) { - DoubleKeyMap<AbilityCategory, Nature, QualifiedObject<String>> abilityCategories = new DoubleKeyMap<AbilityCategory, Nature, QualifiedObject<String>>(); - final List<AbilityCategory> theCategories = getAbilityCategories(); - final Map<QualifiedObject<String>,AbilityCategory> QOs = new HashMap<QualifiedObject<String>,AbilityCategory>(); - - for (AbilityCategory category: theCategories) + for (AbilityCategory category: getAbilityCategories()) { - final List<QualifiedObject<String>> theQOs = getRawAbilityObjects(category, Nature.AUTOMATIC); - for (QualifiedObject<String> qo: theQOs) + for (QualifiedObject<String> qo : new ArrayList<QualifiedObject<String>>( + getRawAbilityObjects(category, Nature.AUTOMATIC))) { - List<Prerequisite> thePreReqs = qo.getPrereqs(); -PREREQS: for (Prerequisite pre : thePreReqs) + if (qo instanceof QualifiedObject.LevelAwareQualifiedObject) { - int prelevel; - try + QualifiedObject.LevelAwareQualifiedObject<String> aqo = (LevelAwareQualifiedObject<String>) qo; + if (aqo.level == level) { - prelevel = Integer.parseInt(pre.getOperand()); + removeAbility(category, Nature.AUTOMATIC, qo); } - catch (NumberFormatException e) - { - continue PREREQS; - } - - if ( pre.getKey().equalsIgnoreCase(this.getDisplayName()) - && pre.getKind().equalsIgnoreCase("class") - && pre.getOperator().toString().startsWith("gt") - && prelevel == alevel ) - { - QOs.put(qo, category); - } } } } - for (QualifiedObject<String> qo : QOs.keySet()) - { - AbilityCategory cat = QOs.get(qo); - removeAbility(cat, Nature.AUTOMATIC, qo); - } } Modified: Trunk/pcgen/code/src/java/pcgen/core/QualifiedObject.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/QualifiedObject.java 2008-03-02 23:10:35 UTC (rev 5428) +++ Trunk/pcgen/code/src/java/pcgen/core/QualifiedObject.java 2008-03-02 23:59:48 UTC (rev 5429) @@ -219,23 +219,26 @@ return new QualifiedObject<String>( obj, prereqs ); } - public static class AutoQualifiedObject<AT> extends QualifiedObject<AT> + public static class LevelAwareQualifiedObject<AT> extends QualifiedObject<AT> { - //Just an identifier for 5.14 + public final int level; - public AutoQualifiedObject() + public LevelAwareQualifiedObject(int lvl) { super(); + level = lvl; } - public AutoQualifiedObject(AT anObj, List<Prerequisite> aPrereqList) + public LevelAwareQualifiedObject(int lvl, AT anObj, List<Prerequisite> aPrereqList) { super(anObj, aPrereqList); + level = lvl; } - public AutoQualifiedObject(AT anObj) + public LevelAwareQualifiedObject(int lvl, AT anObj) { super(anObj); + level = lvl; } } } Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/AbilityLst.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/AbilityLst.java 2008-03-02 23:10:35 UTC (rev 5428) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/AbilityLst.java 2008-03-02 23:59:48 UTC (rev 5429) @@ -33,6 +33,7 @@ import pcgen.core.PObject; import pcgen.core.QualifiedObject; import pcgen.core.SettingsHandler; +import pcgen.core.QualifiedObject.LevelAwareQualifiedObject; import pcgen.core.prereq.Prerequisite; import pcgen.persistence.PersistenceLayerException; import pcgen.persistence.lst.GlobalLstToken; @@ -169,8 +170,8 @@ for (QualifiedObject<String> ab : new ArrayList<QualifiedObject<String>>( anObj.getRawAbilityObjects(category, nature))) { - if (ab.getPrereqs().toString().equals( - preReqs.toString())) + QualifiedObject.LevelAwareQualifiedObject<String> aqo = (LevelAwareQualifiedObject<String>) ab; + if (aqo.level == anInt) { anObj.removeAbility(category, nature, ab); } @@ -189,9 +190,9 @@ for (QualifiedObject<String> ab : new ArrayList<QualifiedObject<String>>( anObj.getRawAbilityObjects(category, nature))) { - if (abil.equals(ab.getObject(null)) - && ab.getPrereqs().toString().equals( - preReqs.toString())) + QualifiedObject.LevelAwareQualifiedObject<String> aqo = (LevelAwareQualifiedObject<String>) ab; + if (abil.equalsIgnoreCase(ab.getObject(null)) + && aqo.level == anInt) { anObj.removeAbility(category, nature, ab); } @@ -207,7 +208,8 @@ for (final String ability : abilityList) { anObj.addAbility(category, nature, - new QualifiedObject<String>(ability, preReqs)); + new QualifiedObject.LevelAwareQualifiedObject<String>(anInt, + ability, preReqs)); } return true; } Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/auto/FeatToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/auto/FeatToken.java 2008-03-02 23:10:35 UTC (rev 5428) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/auto/FeatToken.java 2008-03-02 23:59:48 UTC (rev 5429) @@ -27,6 +27,7 @@ import pcgen.core.PCClass; import pcgen.core.PObject; import pcgen.core.QualifiedObject; +import pcgen.core.QualifiedObject.LevelAwareQualifiedObject; import pcgen.core.prereq.Prerequisite; import pcgen.persistence.PersistenceLayerException; import pcgen.persistence.lst.AutoLstToken; @@ -82,7 +83,7 @@ Ability.Nature.AUTOMATIC); for (QualifiedObject<String> qo : ao) { - if (qo instanceof QualifiedObject.AutoQualifiedObject) + if (qo instanceof QualifiedObject.LevelAwareQualifiedObject) { target.removeAbility(AbilityCategory.FEAT, Ability.Nature.AUTOMATIC, qo); @@ -99,16 +100,12 @@ */ for (QualifiedObject<String> qo : new ArrayList<QualifiedObject<String>>(ao)) { - if (qo instanceof QualifiedObject.AutoQualifiedObject) + if (qo instanceof QualifiedObject.LevelAwareQualifiedObject) { String name = feat.substring(7); - /* - * Note the .toString on the preReqs lists here - - * painful, but necessary since the 5.x Prerequisite - * doesn't implement .equals() - */ + QualifiedObject.LevelAwareQualifiedObject<String> aqo = (LevelAwareQualifiedObject<String>) qo; if (name.equalsIgnoreCase(qo.getObject(null)) - && preReqs.toString().equals(qo.getPrereqs().toString())) + && aqo.level == level) { target.removeAbility(AbilityCategory.FEAT, Ability.Nature.AUTOMATIC, qo); @@ -120,8 +117,8 @@ { target.addAbility(AbilityCategory.FEAT, Ability.Nature.AUTOMATIC, - new QualifiedObject.AutoQualifiedObject<String>(feat, - preReqs)); + new QualifiedObject.LevelAwareQualifiedObject<String>(level, + feat, preReqs)); } first = false; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jfr...@us...> - 2008-03-10 02:13:45
|
Revision: 5539 http://pcgen.svn.sourceforge.net/pcgen/?rev=5539&view=rev Author: jfrazierjr Date: 2008-03-09 19:13:50 -0700 (Sun, 09 Mar 2008) Log Message: ----------- Spell point proposal Added two output Tokens. More to come. Issue#: 1834759 Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/spell/Spell.java Trunk/pcgen/code/src/java/plugin/exporttokens/SpellMemToken.java Modified: Trunk/pcgen/code/src/java/pcgen/core/spell/Spell.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/spell/Spell.java 2008-03-10 01:49:47 UTC (rev 5538) +++ Trunk/pcgen/code/src/java/pcgen/core/spell/Spell.java 2008-03-10 02:13:50 UTC (rev 5539) @@ -1299,7 +1299,7 @@ public String getSPCostStrings() { Map<String,Integer> spCost = getSpellPointCostActualParts(); - int totalSpellPoints = getSPCostActual(spCost); + int totalSpellPoints = getSpellPointCostActual(); StringBuffer sb = new StringBuffer(); sb.append(totalSpellPoints); if(spCost.size()==1 && spCost.containsKey("TOTAL")) @@ -1318,9 +1318,10 @@ sb.append("]"); return sb.toString(); } - public int getSPCostActual(final Map<String,Integer> spCost) + public int getSpellPointCostActual() { int runnintTotal = 0; + Map<String,Integer> spCost = getSpellPointCostActualParts(); for (String aComponent: spCost.keySet()) { runnintTotal += spCost.get(aComponent); @@ -1328,4 +1329,9 @@ return runnintTotal; } + public int getSpellPointCostElementTotal() + { + return getSpellPointCostActualParts().size(); + } + } Modified: Trunk/pcgen/code/src/java/plugin/exporttokens/SpellMemToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/exporttokens/SpellMemToken.java 2008-03-10 01:49:47 UTC (rev 5538) +++ Trunk/pcgen/code/src/java/plugin/exporttokens/SpellMemToken.java 2008-03-10 02:13:50 UTC (rev 5539) @@ -402,6 +402,18 @@ { retValue.append(aSpell.getXPCost()); } + else if ("SPELLPOINTCOST".equals(aLabel)) + { + if("NUMELEMENTS".equals(altLabel)) + { + retValue.append(aSpell.getSpellPointCostElementTotal()); + } + else if("TOTAL".equals(altLabel)) + { + retValue.append(aSpell.getSpellPointCostActual()); + } + } + } } else if (eh != null && eh.getExistsOnly()) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jfr...@us...> - 2008-03-12 19:49:48
|
Revision: 5577 http://pcgen.svn.sourceforge.net/pcgen/?rev=5577&view=rev Author: jfrazierjr Date: 2008-03-12 12:49:54 -0700 (Wed, 12 Mar 2008) Log Message: ----------- Spell Point Proposal Added additional Output Tokens. Issue#: 1834759 Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/spell/Spell.java Trunk/pcgen/code/src/java/pcgen/gui/tabs/spells/SpellModel.java Trunk/pcgen/code/src/java/plugin/exporttokens/SpellMemToken.java Modified: Trunk/pcgen/code/src/java/pcgen/core/spell/Spell.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/spell/Spell.java 2008-03-12 19:42:17 UTC (rev 5576) +++ Trunk/pcgen/code/src/java/pcgen/core/spell/Spell.java 2008-03-12 19:49:54 UTC (rev 5577) @@ -25,6 +25,7 @@ import java.math.BigDecimal; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; @@ -1282,7 +1283,7 @@ HashMap<SpellPointType, Integer> costs = new HashMap<SpellPointType, Integer>(); costs.put(SpellPointType.ACTUALCOST, value); costs.put(SpellPointType.EFFECTIVECOST, value); - spellPointCost.put(component.toUpperCase(), costs); + spellPointCost.put(component, costs); } public static boolean hasSpellPointCost() { @@ -1307,20 +1308,65 @@ Map<String,Integer> spCost = getSpellPointCostActualParts(); int totalSpellPoints = getSpellPointCostActual(); StringBuffer sb = new StringBuffer(); + StringBuffer sb2 = new StringBuffer(); + + sb2.append(""); sb.append(totalSpellPoints); + if (spCost.size() ==0) + { + return sb.toString(); + } if(spCost.size()==1 && spCost.containsKey("TOTAL")) { return sb.toString(); } sb.append(" ["); - for (String aComponent: spCost.keySet()) + + // Using a TreeSet so they are sorted no matter what order the data is input + // by the lst coder + TreeSet<String> fields = new TreeSet<String>(); + fields.addAll(spCost.keySet()); + + + for (String aComponent: fields) { - sb.append(aComponent); - sb.append(" "); - sb.append(spCost.get(aComponent)); - sb.append("/"); + if (aComponent.equalsIgnoreCase("Range")) + { + sb2.append(aComponent); + sb2.append(" "); + sb2.append(spCost.get(aComponent)); + sb2.append("/"); + } + else if(aComponent.equalsIgnoreCase("Area of Effect")) + { + sb2.append(aComponent); + sb2.append(" "); + sb2.append(spCost.get(aComponent)); + sb2.append("/"); + } + else if (aComponent.equalsIgnoreCase("Duration")) + { + sb2.append(aComponent); + sb2.append(" "); + sb2.append(spCost.get(aComponent)); + sb2.append("/"); + } + else + { + sb.append(aComponent); + sb.append(" "); + sb.append(spCost.get(aComponent)); + sb.append("/"); + } + } - sb.replace(sb.length()-1, sb.length(), ""); + if(sb2.length() < 1) + { + sb.replace(sb.length()-1, sb.length(), ""); + } + sb2.replace(sb2.length()-1, sb2.length(), ""); + + sb.append(sb2.toString()); sb.append("]"); return sb.toString(); } @@ -1339,5 +1385,33 @@ { return getSpellPointCostActualParts().size(); } + public String getSpellPointCostPartName(final int elementNumber ) + { + Map<String,Integer> spCosts = getSpellPointCostActualParts(); + Set<String> spKeys = new TreeSet<String>(); + spKeys.addAll(spCosts.keySet()); + String [] theKeys = (String[]) spKeys.toArray(); + int size = spKeys.size(); + if (elementNumber < size) + { + return theKeys[elementNumber]; + } + + return ""; + } + public String getSpellPointCostPartValue(final int elementNumber ) + { + Map<String,Integer> spCosts =getSpellPointCostActualParts(); + Set<String> spKeys = new TreeSet<String>(); + spKeys.addAll(spCosts.keySet()); + String [] theKeys = (String[]) spKeys.toArray(); + int size = spKeys.size(); + if (elementNumber < size) + { + return spCosts.get( theKeys[elementNumber]).toString(); + } + + return ""; + } } Modified: Trunk/pcgen/code/src/java/pcgen/gui/tabs/spells/SpellModel.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/tabs/spells/SpellModel.java 2008-03-12 19:42:17 UTC (rev 5576) +++ Trunk/pcgen/code/src/java/pcgen/gui/tabs/spells/SpellModel.java 2008-03-12 19:49:54 UTC (rev 5577) @@ -496,12 +496,10 @@ : null; case COL_SPCOST: - return (spellA != null) ? Integer.valueOf(((SpellInfo) fn - .getItem()).getActualSpellPointCost()) : null; + return (spellA != null) ? aSpell.getSpellPointCostActual(): null; case COL_PPCOST: - return (spellA != null) ? Integer.valueOf(((SpellInfo) fn - .getItem()).getActualPPCost()) : null; + return (spellA != null) ? aSpell.getPPCost(): null; default: return fn.getItem(); Modified: Trunk/pcgen/code/src/java/plugin/exporttokens/SpellMemToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/exporttokens/SpellMemToken.java 2008-03-12 19:42:17 UTC (rev 5576) +++ Trunk/pcgen/code/src/java/plugin/exporttokens/SpellMemToken.java 2008-03-12 19:49:54 UTC (rev 5577) @@ -412,6 +412,37 @@ { retValue.append(aSpell.getSpellPointCostActual()); } + else if ("".equals(altLabel)) + { + retValue.append(aSpell.getSPCostStrings()); + } + if (aTok.hasMoreTokens()) + { + String element = aTok.nextToken(); + try + { + int partNumber = Integer.parseInt(element); + if (aTok.hasMoreTokens()) + { + String elementValue = aTok.nextToken(); + if ("NAME".equals(elementValue)) + { + retValue.append(aSpell.getSpellPointCostPartName(partNumber)); + } + else if("VALUE".equals(elementValue)) + { + retValue.append(aSpell.getSpellPointCostPartValue(partNumber)); + } + } + + + } + catch (NumberFormatException e) + { + + } + + } } } @@ -585,4 +616,5 @@ } return sAlt; } + } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <kar...@us...> - 2008-03-14 16:36:24
|
Revision: 5590 http://pcgen.svn.sourceforge.net/pcgen/?rev=5590&view=rev Author: karianna Date: 2008-03-14 09:36:31 -0700 (Fri, 14 Mar 2008) Log Message: ----------- Fix for 1565846 ] GMGen - Unable to change inititative for PC Modified Paths: -------------- Trunk/pcgen/code/src/java/gmgen/plugin/SystemInitiative.java Trunk/pcgen/code/src/java/plugin/initiative/gui/Initiative.java Modified: Trunk/pcgen/code/src/java/gmgen/plugin/SystemInitiative.java =================================================================== --- Trunk/pcgen/code/src/java/gmgen/plugin/SystemInitiative.java 2008-03-14 04:06:30 UTC (rev 5589) +++ Trunk/pcgen/code/src/java/gmgen/plugin/SystemInitiative.java 2008-03-14 16:36:31 UTC (rev 5590) @@ -4,7 +4,7 @@ package gmgen.plugin; /** - * Deals with the iniative part of the GMGen plugin + * Deals with the initiative part of the GMGen plugin */ public class SystemInitiative { @@ -78,7 +78,8 @@ public void setBonus(int bonus) { this.bonus = bonus - attribute.getModifier(); - if(getCurrentInitiative() > 0) { + if (getCurrentInitiative() > 0) + { setCurrentInitiative(roll + getModifier() + mod); } } @@ -99,7 +100,7 @@ { currentInitiative = 0; } - + /** * Set the current initiative * @param currentInitiative Modified: Trunk/pcgen/code/src/java/plugin/initiative/gui/Initiative.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/initiative/gui/Initiative.java 2008-03-14 04:06:30 UTC (rev 5589) +++ Trunk/pcgen/code/src/java/plugin/initiative/gui/Initiative.java 2008-03-14 16:36:31 UTC (rev 5590) @@ -27,14 +27,54 @@ import gmgen.GMGenSystem; import gmgen.io.SimpleFileFilter; -import gmgen.plugin.*; +import gmgen.plugin.Combatant; +import gmgen.plugin.Dice; +import gmgen.plugin.Event; +import gmgen.plugin.InfoCharacterDetails; +import gmgen.plugin.InitHolder; +import gmgen.plugin.InitHolderList; +import gmgen.plugin.PcgCombatant; +import gmgen.plugin.Spell; +import gmgen.plugin.SystemHP; +import gmgen.plugin.SystemInitiative; import gmgen.pluginmgr.GMBComponent; import gmgen.pluginmgr.GMBus; import gmgen.pluginmgr.messages.CombatantUpdatedMessage; import gmgen.util.LogUtilities; + +import java.awt.Component; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; +import java.io.FileWriter; +import java.util.ArrayList; +import java.util.List; +import java.util.Vector; + +import javax.swing.DefaultCellEditor; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JFileChooser; +import javax.swing.JFormattedTextField; +import javax.swing.JOptionPane; +import javax.swing.JTable; +import javax.swing.event.HyperlinkEvent; +import javax.swing.event.HyperlinkListener; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; +import javax.swing.table.DefaultTableModel; +import javax.swing.table.JTableHeader; +import javax.swing.table.TableCellRenderer; +import javax.swing.table.TableColumn; +import javax.swing.table.TableColumnModel; +import javax.swing.text.DefaultFormatter; +import javax.swing.text.NumberFormatter; + import org.jdom.Document; import org.jdom.Element; import org.jdom.input.SAXBuilder; + import pcgen.core.Globals; import pcgen.core.PlayerCharacter; import pcgen.core.SettingsHandler; @@ -42,23 +82,16 @@ import pcgen.gui.PCGen_Frame1; import pcgen.gui.panes.FlippingSplitPane; import pcgen.util.Logging; -import plugin.initiative.*; +import plugin.initiative.AttackModel; +import plugin.initiative.CheckModel; +import plugin.initiative.DiceRollModel; +import plugin.initiative.InitOutputter; +import plugin.initiative.InitiativePlugin; +import plugin.initiative.PObjectModel; +import plugin.initiative.SaveModel; +import plugin.initiative.SpellModel; +import plugin.initiative.XMLCombatant; -import javax.swing.*; -import javax.swing.event.HyperlinkEvent; -import javax.swing.event.HyperlinkListener; -import javax.swing.event.ListSelectionEvent; -import javax.swing.event.ListSelectionListener; -import javax.swing.table.*; -import javax.swing.text.DefaultFormatter; -import javax.swing.text.NumberFormatter; -import java.awt.Component; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.File; -import java.io.FileWriter; -import java.util.*; - /** *@author Devon Jones *@since March 20, 2003 @@ -141,9 +174,9 @@ } /** - * Sets the active Initiative to be the passed in value + * Sets the active Initiative to be the passed in value * - *@param init The new Active Initiative value + * @param init - The new Active Initiative value */ public void setCurrentInit(int init) { @@ -2445,18 +2478,26 @@ private void editTable(int row, int column) { + // Figure out which row is the active row + // Karianna - Commented out this section to fix bug + /* int activeRow = 0; for (int i = 0; i < initList.size(); i++) { InitHolder c = initList.get(i); + // IF the InitHolder status is not Dead or showDead is selected (e.g. InitHolder is alive or we're showeing the dead) + // AND InitHolder is not an Event or we're shoeing events + // THEN update the active row if ((!c.getStatus().equals("Dead") || showDead.isSelected()) && (!(c instanceof Event) || showEvents.isSelected())) { activeRow++; } } + */ // Look up the active row (-1 as arrays are indexed starting at 0) - InitHolder iH = initList.get(activeRow - 1); + //InitHolder iH = initList.get(activeRow - 1); + InitHolder iH = initList.get(row); Object data = combatantTable.getValueAt(row, column); boolean atTop = (currentInit == initList.getMaxInit()); iH.editRow(columnList, column, data); @@ -2736,11 +2777,13 @@ jSplitPane1.setPreferredSize(new java.awt.Dimension(800, 405)); combatantTable.addMouseListener(new java.awt.event.MouseAdapter() { + @Override public void mousePressed(java.awt.event.MouseEvent evt) { combatantTableMousePressed(evt); } + @Override public void mouseReleased(java.awt.event.MouseEvent evt) { combatantTableMouseReleased(evt); @@ -2967,11 +3010,13 @@ JTableHeader header = combatantTable.getTableHeader(); header.addMouseListener(new java.awt.event.MouseAdapter() { + @Override public void mousePressed(java.awt.event.MouseEvent evt) { combatantTableMousePressed(evt); } + @Override public void mouseReleased(java.awt.event.MouseEvent evt) { combatantTableMouseReleased(evt); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jfr...@us...> - 2008-03-15 05:05:19
|
Revision: 5599 http://pcgen.svn.sourceforge.net/pcgen/?rev=5599&view=rev Author: jfrazierjr Date: 2008-03-14 22:05:25 -0700 (Fri, 14 Mar 2008) Log Message: ----------- Add BONUS:SPELLPOINTCOST Issue#: 1914692 Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/spell/Spell.java Trunk/pcgen/code/src/java/plugin/exporttokens/SpellMemToken.java Modified: Trunk/pcgen/code/src/java/pcgen/core/spell/Spell.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/spell/Spell.java 2008-03-15 04:25:28 UTC (rev 5598) +++ Trunk/pcgen/code/src/java/pcgen/core/spell/Spell.java 2008-03-15 05:05:25 UTC (rev 5599) @@ -27,6 +27,7 @@ import java.util.Collection; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -43,6 +44,7 @@ import pcgen.core.PCClass; import pcgen.core.PlayerCharacter; import pcgen.core.PObject; +import pcgen.core.bonus.BonusObj; import pcgen.core.character.CharacterSpell; import pcgen.core.character.SpellInfo; import pcgen.core.prereq.PrereqHandler; @@ -51,6 +53,7 @@ import pcgen.core.utils.MessageType; import pcgen.core.utils.ShowMessageDelegate; import pcgen.util.Logging; +import plugin.bonustokens.SpellPointCosts; /** * <code>Spell</code> creates a new tabbed panel. @@ -1370,6 +1373,160 @@ sb.append("]"); return sb.toString(); } + public String getSPCostStrings(PlayerCharacter aPC) + { + Map<String,Integer> spCost = getSpellPointCostActualParts(); + int totalSpellPoints = getSpellPointCostActual(); + StringBuffer sb = new StringBuffer(); + StringBuffer sb2 = new StringBuffer(); + List<BonusObj> allBonuses = aPC.getActiveBonusList(); + boolean isMatchingSpell = false; + + String key =""; + String value = ""; + + for (BonusObj bonus: allBonuses) + { + if (!(bonus.getBonusName().equals("SPELLPOINTCOST"))) + { + continue; + } + String bonusInfo = bonus.getBonusInfo(); + StringTokenizer aTok = new StringTokenizer(bonusInfo, ";"); + + while (aTok.hasMoreTokens()) + { + String token = aTok.nextToken(); + String tokenPart = ""; + if (token.startsWith("SCHOOL.")) + { + tokenPart = token.substring(token.indexOf(".")+1); + for(String theString: this.getSchools()) + { + isMatchingSpell = theString.equalsIgnoreCase(tokenPart); + if (isMatchingSpell) + { + break; + } + } + } + else if (token.startsWith("SUBSCHOOL.")) + { + tokenPart = token.substring(token.indexOf(".")+1); + for(String theString: this.getSubschools()) + { + isMatchingSpell = theString.equalsIgnoreCase(tokenPart); + if (isMatchingSpell) + { + break; + } + } + } + else if (token.startsWith("SPELL.")) + { + tokenPart = token.substring(token.indexOf(".")+1); + if (this.getKeyName().equalsIgnoreCase(tokenPart)) + { + isMatchingSpell = true; + } + } + else + { + if (isMatchingSpell) + { + key = token.substring(0,token.indexOf("=")); + value = token.substring(token.indexOf("=")+1); + } + } + } + } + System.out.println("Key:" + key); + System.out.println("Val:" + value); + + sb2.append(""); + sb.append(totalSpellPoints); + if (spCost.size() ==0) + { + return sb.toString(); + } + if(spCost.size()==1 && spCost.containsKey("TOTAL")) + { + return sb.toString(); + } + sb.append(" ["); + + // Using a TreeSet so they are sorted no matter what order the data is input + // by the lst coder + TreeSet<String> fields = new TreeSet<String>(); + fields.addAll(spCost.keySet()); + + + for (String aComponent: fields) + { + if (aComponent.equalsIgnoreCase("Range")) + { + sb2.append(aComponent); + sb2.append(" "); + sb2.append(spCost.get(aComponent)); + if (key.equalsIgnoreCase(aComponent)) + { + sb2.append("("); + sb2.append(value); + sb2.append(")"); + } + sb2.append("/"); + } + else if(aComponent.equalsIgnoreCase("Area of Effect")) + { + sb2.append(aComponent); + sb2.append(" "); + sb2.append(spCost.get(aComponent)); + if (key.equalsIgnoreCase(aComponent)) + { + sb2.append("("); + sb2.append(value); + sb2.append(")"); + } + sb2.append("/"); + } + else if (aComponent.equalsIgnoreCase("Duration")) + { + sb2.append(aComponent); + sb2.append(" "); + sb2.append(spCost.get(aComponent)); + if (key.equalsIgnoreCase(aComponent)) + { + sb2.append("("); + sb2.append(value); + sb2.append(")"); + } + sb2.append("/"); + } + else + { + sb.append(aComponent); + sb.append(" "); + sb.append(spCost.get(aComponent)); + if (key.equalsIgnoreCase(aComponent)) + { + sb2.append("("); + sb2.append(value); + sb2.append(")"); + } + sb.append("/"); + } + + } + if(sb2.length() < 1) + { + sb.replace(sb.length()-1, sb.length(), ""); + } + sb2.replace(sb2.length()-1, sb2.length(), ""); + + sb.append(sb2.toString()); + sb.append("]"); + return sb.toString(); + } public int getSpellPointCostActual() { int runnintTotal = 0; @@ -1412,6 +1569,5 @@ } return ""; - } - + } } Modified: Trunk/pcgen/code/src/java/plugin/exporttokens/SpellMemToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/exporttokens/SpellMemToken.java 2008-03-15 04:25:28 UTC (rev 5598) +++ Trunk/pcgen/code/src/java/plugin/exporttokens/SpellMemToken.java 2008-03-15 05:05:25 UTC (rev 5599) @@ -414,7 +414,7 @@ } else if ("".equals(altLabel)) { - retValue.append(aSpell.getSPCostStrings()); + retValue.append(aSpell.getSPCostStrings(aPC)); } if (aTok.hasMoreTokens()) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-04-12 00:03:25
|
Revision: 5904 http://pcgen.svn.sourceforge.net/pcgen/?rev=5904&view=rev Author: thpr Date: 2008-04-11 17:03:32 -0700 (Fri, 11 Apr 2008) Log Message: ----------- [ 1926308 ] CHOOSE:SPELLS|SPELLTYPE not filtering Issue#: 1926308 Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorPC.java Trunk/pcgen/code/src/java/pcgen/core/chooser/SpellsChoiceManager.java Trunk/pcgen/code/src/java/plugin/lsttokens/choose/SpellsToken.java Modified: Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorPC.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorPC.java 2008-04-11 23:35:01 UTC (rev 5903) +++ Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorPC.java 2008-04-12 00:03:32 UTC (rev 5904) @@ -20,6 +20,11 @@ */ package pcgen.core; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.StringTokenizer; + import pcgen.core.character.Follower; import pcgen.core.spell.Spell; import pcgen.core.utils.CoreUtility; @@ -27,12 +32,6 @@ import pcgen.util.Logging; import pcgen.util.enumeration.Visibility; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; -import java.util.StringTokenizer; - /** * <code>VariableProcessorPC</code> is a processor for variables * associated with a character. This class converts formulas or @@ -479,6 +478,25 @@ { valString = Integer.toString(getPc().baseAttackBonus()); } + else if ("MAXCASTABLE".equals(valString) && src.startsWith("SPELLTYPE:")) + { + String typeKey = src.substring(10); + int max = 0; + for (PCClass spClass : getPc().getClassList()) + { + if (typeKey.equalsIgnoreCase(spClass.getSpellType())) + { + int cutoff = spClass.getHighestLevelSpell(); + for (int i = 0; i < cutoff; i++) { + if (spClass.getKnownForLevel(i, getPc()) != 0) + { + max = Math.max(max,i); + } + } + } + } + valString = Integer.toString(max); + } else if ("MAXCASTABLE".equals(valString) && src.startsWith("CLASS:")) { String classKey = src.substring(6); Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/SpellsChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/SpellsChoiceManager.java 2008-04-11 23:35:01 UTC (rev 5903) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/SpellsChoiceManager.java 2008-04-12 00:03:32 UTC (rev 5904) @@ -78,6 +78,7 @@ StringTokenizer st = new StringTokenizer(item, ","); while (st.hasMoreTokens()) { + boolean fail = false; String token = st.nextToken(); List<Spell> localList = new ArrayList<Spell>(); if (token.startsWith("DOMAIN=") || token.startsWith("DOMAIN.")) @@ -91,6 +92,31 @@ appendSpells(new TypeKeyFilter("CLASS", token.substring(6), null), aPc, localList); } + else if (token.startsWith("SPELLTYPE=")) + { + int bracketLoc = token.indexOf('['); + String spellType; + Restriction r = null; + if (bracketLoc == -1) + { + spellType = token.substring(10); + } + else + { + if (!token.endsWith("]")) + { + Logging.errorPrint("Invalid entry in " + + "CHOOSE:SPELLS: " + token + + " did not have matching brackets"); + } + spellType = token.substring(10, bracketLoc); + r = getRestriction("SPELLTYPE:" + spellType, token + .substring(bracketLoc + 1, token.length() - 1), + aPc); + } + appendSpells(new SpellTypeFilter(spellType, r), aPc, + localList); + } else if (token.startsWith("DOMAINLIST=")) { int bracketLoc = token.indexOf('['); @@ -197,10 +223,18 @@ { localList.add((Spell) obj); } + else + { + fail = true; + } } } - if (masterList == null) + if (fail) { + continue; + } + else if (masterList == null) + { masterList = localList; } else @@ -350,6 +384,90 @@ } } + private class SpellTypeFilter implements SpellFilter + { + private final String listname; + private final Restriction res; + private final String defaultbook; + + public SpellTypeFilter(String listkey, Restriction r) + { + defaultbook = Globals.getDefaultSpellBook(); + listname = listkey; + res = r; + } + + public void conditionallyAdd(Spell spell, PlayerCharacter pc, + List<Spell> availableList) + { + if (!spell.isType(listname)) + { + return; + } + Map<String, Integer> levelInfo = spell.getLevelInfo(pc); + boolean useDomain = "DIVINE".equalsIgnoreCase(listname); + for (Map.Entry<String, Integer> me : levelInfo.entrySet()) + { + if (useDomain && me.getKey().startsWith("DOMAIN|")) + { + if (passesRestriction(spell, pc, me.getValue())) + { + availableList.add(spell); + return; + } + } + else if (me.getKey().startsWith("CLASS|")) + { + PCClass cl = pc.getClassKeyed(me.getKey().substring(6)); + if (cl != null && !listname.equalsIgnoreCase(cl.getSpellType())) + { + continue; + } + else if (passesRestriction(spell, pc, me.getValue())) + { + availableList.add(spell); + return; + } + } + } + } + + private boolean passesRestriction(Spell spell, PlayerCharacter pc, + int level) + { + if (res != null) + { + if (level > res.maxLevel || level < res.minLevel) + { + return false; + } + if (res.knownRequired) + { + boolean found = false; + for (PCClass cl : pc.getClassList()) + { + SpellSupport ss = cl.getSpellSupport(); + List<CharacterSpell> csl = ss.getCharacterSpell(spell, + defaultbook, -1); + if (csl != null && !csl.isEmpty()) + { + /* + * Going to assume here that the level doesn't need + * to be rechecked... ?? - thpr Feb 26, 08 + */ + found = true; + } + } + if (!found) + { + return false; + } + } + } + return true; + } + } + private class TypeFilter implements SpellFilter { private final String type; Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/choose/SpellsToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/choose/SpellsToken.java 2008-04-11 23:35:01 UTC (rev 5903) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/choose/SpellsToken.java 2008-04-12 00:03:32 UTC (rev 5904) @@ -136,6 +136,38 @@ token.length() - 1)); } } + else if (token.startsWith("SPELLTYPE=")) + { + int bracketLoc = token.indexOf('['); + if (bracketLoc == -1) + { + if (token.length() < 10) + { + Logging.errorPrint("Invalid SPELLTYPE= entry for " + + "CHOOSE:SPELLS: requires a spell type"); + return false; + } + } + else + { + if (!token.endsWith("]")) + { + Logging.errorPrint("Invalid entry in " + + "CHOOSE:SPELLS: " + token + + " did not have matching brackets"); + return false; + } + String className = token.substring(10, bracketLoc); + if (className == null || className.length() == 0) + { + Logging.errorPrint("Invalid SPELLTYPE= entry for " + + "CHOOSE:SPELLS: requires a spell type"); + return false; + } + validateRestriction(token.substring(bracketLoc + 1, + token.length() - 1)); + } + } else if (token.startsWith("SCHOOL=")) { if (token.length() < 8) @@ -193,6 +225,12 @@ } else { + if (token.indexOf('[') != -1 || token.indexOf('=') != -1) + { + Logging.errorPrint("Invalid (unknown) entry: " + token + + " for " + "CHOOSE:SPELLS:"); + return false; + } // Just a spell name } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-04-12 22:05:58
|
Revision: 5916 http://pcgen.svn.sourceforge.net/pcgen/?rev=5916&view=rev Author: thpr Date: 2008-04-12 15:06:01 -0700 (Sat, 12 Apr 2008) Log Message: ----------- [ 1791283 ] UDAM does not respect level identifier Issue#: 1791283 Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/PCClass.java Trunk/pcgen/code/src/java/pcgen/core/PObject.java Trunk/pcgen/code/src/java/pcgen/core/utils/ListKeyMapToList.java Trunk/pcgen/code/src/java/pcgen/gui/editor/EditorMainForm.java Trunk/pcgen/code/src/java/pcgen/util/HashMapToList.java Trunk/pcgen/code/src/java/plugin/lsttokens/UdamLst.java Modified: Trunk/pcgen/code/src/java/pcgen/core/PCClass.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-04-12 21:04:58 UTC (rev 5915) +++ Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-04-12 22:06:01 UTC (rev 5916) @@ -4044,8 +4044,12 @@ { for (int x = 0; x < udamList.size(); ++x) { - pccTxt.append(lineSep).append(String.valueOf(x + 1)).append( + String udamItem = udamList.get(x); + if (udamItem != null) + { + pccTxt.append(lineSep).append(String.valueOf(x)).append( "\tUDAM:").append(udamList.get(x)); + } } } @@ -5453,7 +5457,6 @@ aLevel += (int) aPC.getTotalBonusTo("UDAM", "CLASS." + keyName); - int iLevel = aLevel; final Equipment eq = EquipmentList.getEquipmentKeyed("KEY_Unarmed Strike"); @@ -5509,15 +5512,9 @@ } } - if (aLevel > udamList.size()) - { - iLevel = udamList.size(); - } + final StringTokenizer aTok = new StringTokenizer(udamList.get(Math + .min(Math.max(aLevel, 0), udamList.size() - 1)), ",", false); - final StringTokenizer aTok = - new StringTokenizer(udamList.get(Math.max(iLevel - 1, 0)), - ",", false); - while ((iSize > -1) && aTok.hasMoreTokens()) { aDamage = aTok.nextToken(); Modified: Trunk/pcgen/code/src/java/pcgen/core/PObject.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-04-12 21:04:58 UTC (rev 5915) +++ Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-04-12 22:06:01 UTC (rev 5916) @@ -980,19 +980,21 @@ * Add to the unarmed damage list (or clear the whole list) * @param addString */ - public final void addUdamList(final String addString) + public final void clearUdamList() { - if (".CLEAR".equals(addString)) - { - listChar.removeListFor(ListKey.UDAM); - } - else - { - listChar.addToListFor(ListKey.UDAM, addString); - } + listChar.removeListFor(ListKey.UDAM); } /** + * Add to the unarmed damage list (or clear the whole list) + * @param addString + */ + public final void setUdamItem(String addString, int loc) + { + listChar.addToListAt(ListKey.UDAM, addString, loc); + } + + /** * Add the U multiplier * @param mult */ Modified: Trunk/pcgen/code/src/java/pcgen/core/utils/ListKeyMapToList.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/utils/ListKeyMapToList.java 2008-04-12 21:04:58 UTC (rev 5915) +++ Trunk/pcgen/code/src/java/pcgen/core/utils/ListKeyMapToList.java 2008-04-12 22:06:01 UTC (rev 5916) @@ -139,6 +139,32 @@ } /** + * Adds the given value to the List at the given position, for the given + * ListKey. The null value cannot be used as a key in a ListKeyMapToList. + * This method will automatically initialize the list for the given key if + * there is not already a List for that key. Any necessary null values will + * be inserted if the given value is larger than the current length of the + * list. + * + * This method is reference-semantic and this ListKeyMapToList will maintain + * a strong reference to both the key object and the value object given as + * arguments to this method. + * + * @param key + * The ListKey indicating which List the given object should be + * added to. + * @param value + * The value to be added to the List for the given key. + * @param loc + * The position at which the value will be added to the list. + * @return The value previously at the given position, otherwise null. + */ + public <T> T addToListAt(ListKey<T> key, T value, int loc) + { + return (T) map.addToListAt(key, value, loc); + } + + /** * Returns true if this ListKeyMapToList contains a List for the given * ListKey. This method returns false if the given key is not in this * ListKeyMapToList. Modified: Trunk/pcgen/code/src/java/pcgen/gui/editor/EditorMainForm.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/editor/EditorMainForm.java 2008-04-12 21:04:58 UTC (rev 5915) +++ Trunk/pcgen/code/src/java/pcgen/gui/editor/EditorMainForm.java 2008-04-12 22:06:01 UTC (rev 5916) @@ -1051,7 +1051,7 @@ thisPCClass.clearTemplates(); thisPCClass.addUmult(".CLEAR"); thisPCClass.clearFeatAutos(); - thisPCClass.addUdamList(".CLEAR"); + thisPCClass.clearUdamList(); break; default: Modified: Trunk/pcgen/code/src/java/pcgen/util/HashMapToList.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/util/HashMapToList.java 2008-04-12 21:04:58 UTC (rev 5915) +++ Trunk/pcgen/code/src/java/pcgen/util/HashMapToList.java 2008-04-12 22:06:01 UTC (rev 5916) @@ -149,6 +149,45 @@ } /** + * Adds the given value to the List at the given position, for the given + * key. The null value cannot be used as a key in a HashMapToList. This + * method will automatically initialize the list for the given key if there + * is not already a List for that key. Any necessary null values will be + * inserted if the given value is larger than the current length of the + * list. + * + * This method is reference-semantic and this HashMapToList will maintain a + * strong reference to both the key object and the value object given as + * arguments to this method. + * + * @param key + * The key indicating which List the given object should be added + * to. + * @param value + * The value to be added to the List for the given key. + * @param loc + * The position at which the value will be added to the list. + * @return The value previously at the given position, otherwise null. + */ + public V addToListAt(K key, V value, int loc) + { + /* + * Note there is no requirement that a Key is added before this method + * is called + */ + if (!containsListFor(key)) + { + initializeListFor(key); + } + List<V> list = mapToList.get(key); + while (list.size() <= loc) + { + list.add(null); + } + return list.set(loc, value); + } + + /** * Adds all of the Objects in the given list to the (internal) List for the * given key. The null value cannot be used as a key in a MapToList. This * method will automatically initialize the list for the given key if there Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/UdamLst.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/UdamLst.java 2008-04-12 21:04:58 UTC (rev 5915) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/UdamLst.java 2008-04-12 22:06:01 UTC (rev 5916) @@ -9,7 +9,7 @@ /** * @author djones4 - * + * */ public class UdamLst implements GlobalLstToken { @@ -21,7 +21,18 @@ public boolean parse(PObject obj, String value, int anInt) { - obj.addUdamList(value); + if (".CLEAR".equals(value)) + { + obj.clearUdamList(); + } + else if (anInt <= 0) + { + obj.setUdamItem(value, 0); + } + else + { + obj.setUdamItem(value, anInt); + } return true; } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jfr...@us...> - 2008-04-22 00:22:41
|
Revision: 6073 http://pcgen.svn.sourceforge.net/pcgen/?rev=6073&view=rev Author: jfrazierjr Date: 2008-04-21 17:22:45 -0700 (Mon, 21 Apr 2008) Log Message: ----------- Add BONUS:SPELLPOINTCOST. Ok, I think this is good and done. Issue#: 1914692 Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/spell/Spell.java Trunk/pcgen/code/src/java/plugin/bonustokens/SpellPointCosts.java Modified: Trunk/pcgen/code/src/java/pcgen/core/spell/Spell.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/spell/Spell.java 2008-04-21 13:27:00 UTC (rev 6072) +++ Trunk/pcgen/code/src/java/pcgen/core/spell/Spell.java 2008-04-22 00:22:45 UTC (rev 6073) @@ -1283,7 +1283,15 @@ public void setParsedSpellPointCost(String component, final int value) { hasSpellPointCost = true; - spellPointCost.put(component, value); + if (spellPointCost.containsKey(component)) + { + int val = spellPointCost.get(component); + spellPointCost.put(component, value + val); + } + else + { + spellPointCost.put(component, value); + } } public static boolean hasSpellPointCost() { @@ -1375,111 +1383,79 @@ int totalSpellPoints = getSpellPointCostActual(aPC); StringBuffer sb = new StringBuffer(); StringBuffer sb2 = new StringBuffer(); + StringBuffer sb3 = new StringBuffer(); - int bonus =0; - sb2.append(""); - - if (spCost.size() ==0) + int bonus =0; + int tempbonus =0; + tempbonus = getBonusForSpellPointCostComponent(aPC, "TOTAL"); + if (spCost.size()==0) { - sb.append(totalSpellPoints); + sb.append(totalSpellPoints + bonus); return sb.toString(); } else if(spCost.size()==1 && spCost.containsKey("TOTAL")) { - sb.append(totalSpellPoints); + sb.append(totalSpellPoints + bonus); return sb.toString(); } - sb.append(totalSpellPoints); - sb.append(" ["); + //sb.append(totalSpellPoints); // Using a TreeSet so they are sorted no matter what order the data is input // by the lst coder TreeSet<String> fields = new TreeSet<String>(); fields.addAll(spCost.keySet()); - for (String aComponent: fields) { - bonus = 0; if (aComponent.equalsIgnoreCase("Range")) { - sb2.append(aComponent); - sb2.append(" "); - sb2.append(spCost.get(aComponent)); - bonus = getBonusForSpellPointCostComponent(aPC, aComponent); - if (bonus != 0) - { - sb2.append(" ("); - String sign = (bonus >0)? "+": "-"; - sb2.append(sign); - sb2.append(bonus); - sb2.append(")"); - } + sb2.append(aComponent); + sb2.append(" "); + sb2.append(spCost.get(aComponent)+ bonus); sb2.append("/"); } else if(aComponent.equalsIgnoreCase("Area of Effect")) { - sb2.append(aComponent); - sb2.append(" "); - sb2.append(spCost.get(aComponent)); - bonus = getBonusForSpellPointCostComponent(aPC, aComponent); - if (bonus != 0) - { - sb2.append(" ("); - String sign = (bonus >0)? "+": "-"; - sb2.append(sign); - sb2.append(bonus); - sb2.append(")"); - } + sb2.append(aComponent); + sb2.append(" "); + sb2.append(spCost.get(aComponent)+ bonus); sb2.append("/"); } else if (aComponent.equalsIgnoreCase("Duration")) { - sb2.append(aComponent); - sb2.append(" "); - sb2.append(spCost.get(aComponent)); - bonus = getBonusForSpellPointCostComponent(aPC, aComponent); - if (bonus != 0) - { - sb2.append(" ("); - String sign = (bonus >0)? "+": "-"; - sb2.append(sign); - sb2.append(bonus); - sb2.append(")"); - } + sb2.append(aComponent); + sb2.append(" "); + sb2.append(spCost.get(aComponent)+ bonus); sb2.append("/"); } else { bonus = getBonusForSpellPointCostComponent(aPC, aComponent); - sb.append(aComponent); - sb.append(" "); - sb.append(spCost.get(aComponent)); - sb.append("/"); - if (bonus != 0) - { - sb.append(" ("); - String sign = (bonus >0)? "+": "-"; - sb.append(sign); - sb.append(bonus); - sb.append(")"); - } - } + sb3.append(aComponent); + sb3.append(" "); + sb3.append(spCost.get(aComponent) + bonus); + sb3.append("/"); + } + bonus = 0; } + int total = totalSpellPoints + tempbonus; + if(sb2.length() < 1) { sb.replace(sb.length()-1, sb.length(), ""); } sb2.replace(sb2.length()-1, sb2.length(), ""); - + sb.append(total); + sb.append(" ["); + sb.append(sb3.toString()); sb.append(sb2.toString()); sb.append("]"); return sb.toString(); @@ -1503,7 +1479,7 @@ } for (String subSchool: getSubschools()) { - aBonus += (int)aPC.getTotalBonusTo("SPELLPOINTCOST", "SCHOOL." + subSchool.toUpperCase() +";"+ aComponent.toUpperCase()); + aBonus += (int)aPC.getTotalBonusTo("SPELLPOINTCOST", "SUBSCHOOL." + subSchool.toUpperCase() +";"+ aComponent.toUpperCase()); } aBonus += (int)aPC.getTotalBonusTo("SPELLPOINTCOST", "SPELL." + this.getKeyName() +";"+ aComponent.toUpperCase()); return aBonus; Modified: Trunk/pcgen/code/src/java/plugin/bonustokens/SpellPointCosts.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/bonustokens/SpellPointCosts.java 2008-04-21 13:27:00 UTC (rev 6072) +++ Trunk/pcgen/code/src/java/plugin/bonustokens/SpellPointCosts.java 2008-04-22 00:22:45 UTC (rev 6073) @@ -95,11 +95,9 @@ sb.append("."); sb.append(spInfo.getSpellPointPartFilterValue()); - if(!spInfo.getSpellPointPart().equals("TOTAL")) - { - sb.append(";"); - sb.append(spInfo.getSpellPointPart()); - } + sb.append(";"); + sb.append(spInfo.getSpellPointPart()); + return sb.toString(); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jde...@us...> - 2008-05-01 10:57:13
|
Revision: 6159 http://pcgen.svn.sourceforge.net/pcgen/?rev=6159&view=rev Author: jdempsey Date: 2008-05-01 03:57:12 -0700 (Thu, 01 May 2008) Log Message: ----------- Fix bug: Preview Tab showing incorrect turn/rebuke Issue#: 1954060 Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java Trunk/pcgen/code/src/java/plugin/charactersheet/gui/TurnPane.java Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-05-01 05:13:51 UTC (rev 6158) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-05-01 10:57:12 UTC (rev 6159) @@ -17164,6 +17164,36 @@ return null; } + /** + * Get an ability of any ctageory tat matches the key. + * @param aKey The key to search for + * @return An ability with the key, or null if none. + */ + public Ability getAbilityKeyed(final String aKey) + { + final List<Ability> abilities = getFullAbilityList(); + for (final Ability ability : abilities) + { + if (ability.getKeyName().equals(aKey)) + { + return ability; + } + } + + return null; + } + + /** + * Identify if the character has an ability, of any category, that + * matches the key. + * @param aKey The key to search for + * @return True if an ability is found, false otherwise. + */ + public boolean hasAbilityKeyed(final String aKey) + { + return getAbilityKeyed(aKey) != null; + } + public List<Ability> aggregateFeatList() { final List<Ability> aggregate = getStableAggregateFeatList(); Modified: Trunk/pcgen/code/src/java/plugin/charactersheet/gui/TurnPane.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/charactersheet/gui/TurnPane.java 2008-05-01 05:13:51 UTC (rev 6158) +++ Trunk/pcgen/code/src/java/plugin/charactersheet/gui/TurnPane.java 2008-05-01 10:57:12 UTC (rev 6159) @@ -6,6 +6,7 @@ package plugin.charactersheet.gui; +import pcgen.core.Ability; import pcgen.core.PlayerCharacter; import pcgen.io.exporttoken.StatToken; import pcgen.io.exporttoken.VarToken; @@ -591,13 +592,11 @@ */ private String getEffectType(PlayerCharacter aPc, String aTurnType) { - if (aPc.hasRealFeatNamed("Turn " + aTurnType) - || aPc.hasFeatVirtual("Turn " + aTurnType)) + if (aPc.hasAbilityKeyed("Turn " + aTurnType)) { return "Turn"; } - else if (aPc.hasRealFeatNamed("Rebuke " + aTurnType) - || aPc.hasFeatVirtual("Rebuke " + aTurnType)) + else if (aPc.hasAbilityKeyed("Rebuke " + aTurnType)) { return "Rebuke"; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |