From: <jde...@us...> - 2014-12-06 05:56:50
|
Revision: 25718 http://sourceforge.net/p/pcgen/code/25718 Author: jdempsey Date: 2014-12-06 05:56:41 +0000 (Sat, 06 Dec 2014) Log Message: ----------- Fix bug: CLASSLIST= and DOMAINLIST= should not be PC dependent Issue#: CODE-2647 Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/cdom/facet/MasterAvailableSpellFacet.java Trunk/pcgen/code/src/java/pcgen/core/analysis/SpellLevel.java Trunk/pcgen/code/src/java/plugin/primitive/spell/ClassListToken.java Trunk/pcgen/code/src/java/plugin/primitive/spell/DomainListToken.java Trunk/pcgen/code/src/test/pcgen/gui2/facade/CharacterAbilitiesTest.java Modified: Trunk/pcgen/code/src/java/pcgen/cdom/facet/MasterAvailableSpellFacet.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/facet/MasterAvailableSpellFacet.java 2014-12-06 02:17:19 UTC (rev 25717) +++ Trunk/pcgen/code/src/java/pcgen/cdom/facet/MasterAvailableSpellFacet.java 2014-12-06 05:56:41 UTC (rev 25718) @@ -116,7 +116,31 @@ return spellsInList; } + + /** + * Retrieve a list of any occurrence of a specific spell in the particular spell list. + * @param spellList The list to be queried + * @param dsID The owning data set + * @param spell The spell to be found. + * @return The list of available spells. + */ + public List<AvailableSpell> getMatchingSpellsInList( + CDOMList<Spell> spellList, DataSetID dsID, Spell spell) + { + List<AvailableSpell> spellsInList = new ArrayList<AvailableSpell>(); + Collection<AvailableSpell> spells = getSet(dsID); + for (AvailableSpell as : spells) + { + if (as.getSpelllist().equals(spellList) + && as.getSpell().equals(spell)) + { + spellsInList.add(as); + } + } + return spellsInList; + } + public void setDataSetInitializationFacet( DataSetInitializationFacet datasetInitializationFacet) { Modified: Trunk/pcgen/code/src/java/pcgen/core/analysis/SpellLevel.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/analysis/SpellLevel.java 2014-12-06 02:17:19 UTC (rev 25717) +++ Trunk/pcgen/code/src/java/pcgen/core/analysis/SpellLevel.java 2014-12-06 05:56:41 UTC (rev 25718) @@ -62,6 +62,15 @@ return list.toArray(new Integer[list.size()]); } + /** + * Retrieve the first level that the pc receives the spell from the specified list. Note that this only returns + * spells that the pc has available. + * + * @param sp The spell to be found. + * @param list The spell list (e.g. a class spell list) + * @param aPC The character who must already have the spell. + * @return The level of the spell, or -1 if not found. + */ public static int getFirstLvlForKey(Spell sp, CDOMList<Spell> list, PlayerCharacter aPC) { Modified: Trunk/pcgen/code/src/java/plugin/primitive/spell/ClassListToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/primitive/spell/ClassListToken.java 2014-12-06 02:17:19 UTC (rev 25717) +++ Trunk/pcgen/code/src/java/plugin/primitive/spell/ClassListToken.java 2014-12-06 05:56:41 UTC (rev 25718) @@ -17,13 +17,14 @@ */ package plugin.primitive.spell; -import java.util.Collections; - +import pcgen.cdom.enumeration.DataSetID; import pcgen.cdom.enumeration.GroupingState; +import pcgen.cdom.facet.FacetLibrary; +import pcgen.cdom.facet.MasterAvailableSpellFacet; +import pcgen.cdom.helper.AvailableSpell; import pcgen.cdom.list.ClassSpellList; import pcgen.cdom.reference.CDOMSingleRef; import pcgen.core.PlayerCharacter; -import pcgen.core.analysis.SpellLevel; import pcgen.core.spell.Spell; import pcgen.rules.context.LoadContext; import pcgen.rules.persistence.token.AbstractRestrictedSpellPrimitive; @@ -31,6 +32,7 @@ public class ClassListToken extends AbstractRestrictedSpellPrimitive { private CDOMSingleRef<ClassSpellList> spelllist; + private MasterAvailableSpellFacet masterAvailableSpellFacet; @Override public boolean initialize(LoadContext context, Class<Spell> cl, @@ -41,6 +43,7 @@ return false; } spelllist = context.getReferenceContext().getCDOMReference(ClassSpellList.class, value); + masterAvailableSpellFacet = FacetLibrary.getFacet(MasterAvailableSpellFacet.class); return initialize(context, args); } @@ -54,9 +57,11 @@ public boolean allow(PlayerCharacter pc, Spell spell) { ClassSpellList list = spelllist.resolvesTo(); - for (int level : SpellLevel.levelForKey(spell, Collections - .singletonList(list), pc)) + DataSetID datasetID = pc.getCharID().getDatasetID(); + + for (AvailableSpell availSpell : masterAvailableSpellFacet.getMatchingSpellsInList(list, datasetID, spell)) { + int level = availSpell.getLevel(); if ((level >= 0) && allow(pc, level, "", spell, list)) { return true; Modified: Trunk/pcgen/code/src/java/plugin/primitive/spell/DomainListToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/primitive/spell/DomainListToken.java 2014-12-06 02:17:19 UTC (rev 25717) +++ Trunk/pcgen/code/src/java/plugin/primitive/spell/DomainListToken.java 2014-12-06 05:56:41 UTC (rev 25718) @@ -17,13 +17,14 @@ */ package plugin.primitive.spell; -import java.util.Collections; - +import pcgen.cdom.enumeration.DataSetID; import pcgen.cdom.enumeration.GroupingState; +import pcgen.cdom.facet.FacetLibrary; +import pcgen.cdom.facet.MasterAvailableSpellFacet; +import pcgen.cdom.helper.AvailableSpell; import pcgen.cdom.list.DomainSpellList; import pcgen.cdom.reference.CDOMSingleRef; import pcgen.core.PlayerCharacter; -import pcgen.core.analysis.SpellLevel; import pcgen.core.spell.Spell; import pcgen.rules.context.LoadContext; import pcgen.rules.persistence.token.AbstractRestrictedSpellPrimitive; @@ -31,6 +32,7 @@ public class DomainListToken extends AbstractRestrictedSpellPrimitive { private CDOMSingleRef<DomainSpellList> spelllist; + private MasterAvailableSpellFacet masterAvailableSpellFacet; @Override public boolean initialize(LoadContext context, Class<Spell> cl, @@ -41,6 +43,7 @@ return false; } spelllist = context.getReferenceContext().getCDOMReference(DomainSpellList.class, value); + masterAvailableSpellFacet = FacetLibrary.getFacet(MasterAvailableSpellFacet.class); return initialize(context, args); } @@ -54,9 +57,11 @@ public boolean allow(PlayerCharacter pc, Spell spell) { DomainSpellList list = spelllist.resolvesTo(); - for (int level : SpellLevel.levelForKey(spell, Collections - .singletonList(list), pc)) + DataSetID datasetID = pc.getCharID().getDatasetID(); + + for (AvailableSpell availSpell : masterAvailableSpellFacet.getMatchingSpellsInList(list, datasetID, spell)) { + int level = availSpell.getLevel(); if ((level >= 0) && allow(pc, level, "", spell, list)) { return true; Modified: Trunk/pcgen/code/src/test/pcgen/gui2/facade/CharacterAbilitiesTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/gui2/facade/CharacterAbilitiesTest.java 2014-12-06 02:17:19 UTC (rev 25717) +++ Trunk/pcgen/code/src/test/pcgen/gui2/facade/CharacterAbilitiesTest.java 2014-12-06 05:56:41 UTC (rev 25718) @@ -106,9 +106,10 @@ Globals.getContext().commit(); applyAbility(pc, AbilityCategory.FEAT, reading, "Books"); abilities = ca.getAbilities(AbilityCategory.FEAT); - assertEquals("Feat list should have one entry", 1, abilities.getSize()); + assertFalse("Feat list should not be empty", abilities.isEmpty()); Ability abilityFromList = (Ability) abilities.getElementAt(0); assertEquals("Should have found reading", reading, abilityFromList); + assertEquals("Feat list should have one entry", 1, abilities.getSize()); // Now add the choice finalize(abilityFromList, "Magazines", pc, AbilityCategory.FEAT); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jde...@us...> - 2014-12-08 20:21:38
|
Revision: 25739 http://sourceforge.net/p/pcgen/code/25739 Author: jdempsey Date: 2014-12-08 20:21:34 +0000 (Mon, 08 Dec 2014) Log Message: ----------- Fix bug: PCC INCLUDE operation reports errors for ignored .COPY objects Issue#: CODE-2773 Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/persistence/lst/LstObjectFileLoader.java Trunk/pcgen/code/src/java/pcgen/persistence/lst/PCClassLoader.java Trunk/pcgen/code/src/test/pcgen/core/prereq/PreVarTest.java Modified: Trunk/pcgen/code/src/java/pcgen/persistence/lst/LstObjectFileLoader.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/persistence/lst/LstObjectFileLoader.java 2014-12-08 20:06:37 UTC (rev 25738) +++ Trunk/pcgen/code/src/java/pcgen/persistence/lst/LstObjectFileLoader.java 2014-12-08 20:21:34 UTC (rev 25739) @@ -541,7 +541,7 @@ final int nameEnd = name.indexOf(COPY_SUFFIX); final String baseName = name.substring(0, nameEnd); final String copyName = name.substring(nameEnd + 6); - T copy = getCopy(context, baseName, copyName.intern()); + T copy = getCopy(context, baseName, copyName.intern(), me.source); if (copy != null) { if (sepLoc != -1) @@ -553,13 +553,35 @@ } } + /** + * Create a copy of an object with a new name. If the base object cannot be found, an error will be reported unless + * the copy has been excluded by include/exclude rules for the source. + * + * @param context The current load context in whihc the new object is to be created. + * @param baseName The name of the object to be copied. + * @param copyName The name of the new object. + * @param source The source containing the copy. + * @return The new object, or null if the base object could not be found. + * @throws PersistenceLayerException If an unexpected error occurs. + */ protected T getCopy(LoadContext context, final String baseName, - final String copyName) throws PersistenceLayerException + final String copyName, CampaignSourceEntry source) throws PersistenceLayerException { T object = getObjectKeyed(context, baseName); if (object == null) { + List<String> includeItems = source.getIncludeItems(); + if (!includeItems.isEmpty() && !includeItems.contains(copyName)) + { + return null; + } + List<String> excludeItems = source.getExcludeItems(); + if (excludeItems.contains(copyName)) + { + return null; + } + String message = LanguageBundle.getFormattedString( "Errors.LstFileLoader.CopyObjectNotFound", //$NON-NLS-1$ baseName); Modified: Trunk/pcgen/code/src/java/pcgen/persistence/lst/PCClassLoader.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/persistence/lst/PCClassLoader.java 2014-12-08 20:06:37 UTC (rev 25738) +++ Trunk/pcgen/code/src/java/pcgen/persistence/lst/PCClassLoader.java 2014-12-08 20:21:34 UTC (rev 25739) @@ -564,9 +564,9 @@ @Override public PCClass getCopy(LoadContext context, String baseName, - String copyName) throws PersistenceLayerException + String copyName, CampaignSourceEntry source) throws PersistenceLayerException { - PCClass copy = super.getCopy(context, baseName, copyName); + PCClass copy = super.getCopy(context, baseName, copyName, source); PCClassKeyChange.changeReferences(baseName, copy); return copy; } Modified: Trunk/pcgen/code/src/test/pcgen/core/prereq/PreVarTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/prereq/PreVarTest.java 2014-12-08 20:06:37 UTC (rev 25738) +++ Trunk/pcgen/code/src/test/pcgen/core/prereq/PreVarTest.java 2014-12-08 20:21:34 UTC (rev 25739) @@ -368,10 +368,10 @@ PCClassLoader loader = new PCClassLoader(); try { - SourceEntry se = new CampaignSourceEntry(new Campaign(), new URI( + CampaignSourceEntry se = new CampaignSourceEntry(new Campaign(), new URI( "file://test")); loader.completeObject(context, se, warrior); - PCClass notawarrior = loader.getCopy(context, "Warrior", "NotAWarrior"); + PCClass notawarrior = loader.getCopy(context, "Warrior", "NotAWarrior", se); List<SpecialAbility> sabList = notawarrior.getListFor(ListKey.SAB); assertNotNull(sabList); assertEquals(1, sabList.size()); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2010-07-18 01:17:31
|
Revision: 12612 http://pcgen.svn.sourceforge.net/pcgen/?rev=12612&view=rev Author: thpr Date: 2010-07-18 01:13:57 +0000 (Sun, 18 Jul 2010) Log Message: ----------- BioSet cleanup Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/BioSet.java Trunk/pcgen/code/src/java/pcgen/core/SettingsHandler.java Trunk/pcgen/code/src/java/pcgen/gui/editor/AgePanel.java Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoDescription.java Trunk/pcgen/code/src/java/pcgen/io/PCGIOHandler.java Trunk/pcgen/code/src/java/pcgen/persistence/lst/BioSetLoader.java Trunk/pcgen/code/src/test/pcgen/core/BioSetTest.java Added Paths: ----------- Trunk/pcgen/code/src/java/pcgen/core/AgeSet.java Added: Trunk/pcgen/code/src/java/pcgen/core/AgeSet.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/AgeSet.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/core/AgeSet.java 2010-07-18 01:13:57 UTC (rev 12612) @@ -0,0 +1,97 @@ +package pcgen.core; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import pcgen.cdom.base.Constants; +import pcgen.cdom.base.TransitionChoice; +import pcgen.core.bonus.BonusObj; + +public class AgeSet +{ + + private List<BonusObj> bonuses = null; + private List<TransitionChoice<Kit>> kits = null; + private final String name; + private final int index; + + public AgeSet(String ageName, int currentAgeSetIndex) + { + name = ageName; + index = currentAgeSetIndex; + } + + public void addBonuses(List<BonusObj> list) + { + if (bonuses == null) + { + bonuses = new ArrayList<BonusObj>(list); + } + } + + public boolean hasBonuses() + { + return bonuses != null && !bonuses.isEmpty(); + } + + public int getIndex() + { + return index; + } + + public String getName() + { + return name; + } + + public List<BonusObj> getBonuses() + { + if (bonuses == null) + { + return Collections.emptyList(); + } + return Collections.unmodifiableList(bonuses); + } + + public void addKits(List<TransitionChoice<Kit>> list) + { + if (kits == null) + { + kits = new ArrayList<TransitionChoice<Kit>>(list); + } + } + + public List<TransitionChoice<Kit>> getKits() + { + if (kits == null) + { + return Collections.emptyList(); + } + return Collections.unmodifiableList(kits); + } + + public String getLSTformat() + { + StringBuilder sb = new StringBuilder(); + sb.append(index).append('|').append(name); + if (bonuses != null) + { + for (BonusObj bo : bonuses) + { + sb.append('\t').append(bo.getLSTformat()); + } + } + if (kits != null) + { + for (TransitionChoice<Kit> tc : kits) + { + sb.append('\t').append(tc.getCount()).append(Constants.PIPE); + sb.append(tc.getChoices().getLSTformat().replaceAll( + Constants.COMMA, Constants.PIPE)); + } + } + return sb.toString(); + } + +} Modified: Trunk/pcgen/code/src/java/pcgen/core/BioSet.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/BioSet.java 2010-07-17 23:40:25 UTC (rev 12611) +++ Trunk/pcgen/code/src/java/pcgen/core/BioSet.java 2010-07-18 01:13:57 UTC (rev 12612) @@ -25,15 +25,25 @@ */ package pcgen.core; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.SortedMap; +import java.util.StringTokenizer; +import java.util.TreeMap; +import java.util.TreeSet; + +import pcgen.base.util.CaseInsensitiveMap; +import pcgen.base.util.DoubleKeyMap; +import pcgen.base.util.TripleKeyMapToList; import pcgen.cdom.base.Constants; import pcgen.cdom.base.TransitionChoice; -import pcgen.cdom.enumeration.ListKey; -import pcgen.core.bonus.Bonus; +import pcgen.cdom.enumeration.Region; import pcgen.core.bonus.BonusObj; import pcgen.util.Logging; -import java.util.*; - /** * <code>BioSet</code>. * @@ -42,50 +52,33 @@ */ public final class BioSet extends PObject { - /** key = region.age, value = bonus adjustments. */ - private Map<String, String> ageMap = new HashMap<String, String>(); + private DoubleKeyMap<Region, Integer, AgeSet> ageMap = new DoubleKeyMap<Region, Integer, AgeSet>(); - /** key = Dwarf.BASEAGE or Dwarf%.BASEAGE, value = tagged value. */ - private Map<String, List<String>> raceMap = new HashMap<String, List<String>>(); + private CaseInsensitiveMap<Integer> ageNames = new CaseInsensitiveMap<Integer>(); - /** for user overrides/additions, check this before raceMap. */ - private Map<String, List<String>> userMap = new HashMap<String, List<String>>(); + private TripleKeyMapToList<Region, String, String, String> userMap = new TripleKeyMapToList<Region, String, String, String>(); - /** - * Get the age Map - * @return ageMap - */ - public Map<String, String> getAgeMap() + public AgeSet getAgeMapIndex(Region region, int index) { - return ageMap; - } + AgeSet ageSet = ageMap.get(region, index); - /** - * @param region - * @param index - * @return String - */ - public String getAgeMapIndex(final String region, final int index) - { - String retVal = ageMap.get(region + "." + String.valueOf(index)); - - if ((retVal == null) || (retVal.indexOf("BONUS:") < 0)) + if ((ageSet == null) || !ageSet.hasBonuses()) { - retVal = ageMap.get("None." + String.valueOf(index)); + ageSet = ageMap.get(Region.getConstant("None"), index); } - return retVal; + return ageSet; } /** - * Get the Age Set line + * Get the Age Set * @param pc - * @return age set line + * @return age set */ - public String getAgeSetLine(final PlayerCharacter pc) + public AgeSet getAgeSetLine(final PlayerCharacter pc) { - final int ageSet = getPCAgeSet(pc); - return getAgeMapIndex(pc.getRegion(), ageSet); + return getAgeMapIndex(Region.getConstant(pc.getRegion()), + getPCAgeSet(pc)); } /** @@ -95,27 +88,8 @@ */ public int getAgeSetNamed(final String ageCategory) { - String aString; - String ageCategory_lower = ageCategory.toLowerCase(); - - for (Map.Entry<String, String> entry : ageMap.entrySet()) - { - aString = entry.getValue().toLowerCase(); - - if (aString.equals(ageCategory_lower) || aString.startsWith(ageCategory_lower + "\t")) - { - aString = entry.getKey(); - - final int idx = aString.indexOf('.'); - - if (idx >= 0) - { - return Integer.parseInt(aString.substring(idx + 1)); - } - } - } - - return -1; + Integer cat = ageNames.get(ageCategory); + return (cat == null) ? -1 : cat; } /** @@ -125,7 +99,7 @@ */ public int getPCAgeSet(final PlayerCharacter pc) { - final List<String> values = getValueInMaps(pc.getRegion() + ".", pc.getRace().getKeyName().trim(), ".BASEAGE"); + final List<String> values = getValueInMaps(pc.getRegion(), pc.getRace().getKeyName().trim(), "BASEAGE"); if (values == null) { @@ -172,9 +146,10 @@ final StringBuffer sb = new StringBuffer(1000); sb.append("REGION:").append(region).append("\n\n"); - final SortedMap<Integer, SortedMap<String, String>> ageSets = getRaceTagsByAge(region, race, false); + Region r = Region.getConstant(region); + final SortedMap<Integer, SortedMap<String, SortedMap<String, String>>> ageSets = getRaceTagsByAge(r, race); - return appendAgesetInfo(ageSets, sb); + return appendAgesetInfo(r, ageSets, sb); } /** @@ -186,38 +161,10 @@ */ public List<String> getTagForRace(final String region, final String race, final String tag) { - return getValueInMaps(region, race, "." + tag); + return getValueInMaps(region, race, tag); } /** - * Add the supplied line to the age map. The age map is split by age - * brackets (Adulthood, Middle Age etc) and all data loaded must go - * into one of these age brackets. When an age line is encountered, - * the current age set will be updated and returned. - * - * @param region = region (e.g. None) - * @param line = 0|Adult\tBONUS:STAT|MUS|-1 - * @param currentAgeSetIndex The age set index to add any data. - * @return The new age set index, to be used for later calls to this method. - */ - public int addToAgeMap(final String region, final String line, int currentAgeSetIndex) - { - final int x = line.indexOf('|'); - - if (x >= 0) - { - currentAgeSetIndex = Integer.parseInt(line.substring(0, x)); - ageMap.put(region + "." + currentAgeSetIndex, line.substring(x + 1)); - } - else - { - ageMap.put(region + "." + line, null); - } - - return currentAgeSetIndex; - } - - /** * Add the supplied line to the user map. The user map contains an array with * an entry for each age set. The supplied index is used to ensure that the * value is placed in the correct age bracket. @@ -227,33 +174,25 @@ * @param tag The tag to be entered. Must be in the form key:value * @param ageSetIndex The age set to be updated. */ - public void addToUserMap(final String region, final String race, final String tag, final int ageSetIndex) + public void addToUserMap(String regionString, final String race, final String tag, final int ageSetIndex) { final int x = tag.indexOf(':'); if (x < 0) { - Logging.errorPrint("Invalid value sent to map: " + tag + " (for " + race + ")"); + Logging.errorPrint("Invalid value sent to map: " + tag + " (for Race " + race + ")"); return; // invalid tag } - final String key = region + "." + race + "." + tag.substring(0, x); - final String value = tag.substring(x + 1); - List<String> r = userMap.get(key); - - if (r == null) + Region region = Region.getConstant(regionString); + String key = tag.substring(0, x); + List<String> r = userMap.getListFor(region, race, key); + for (int i = (r == null) ? 0 : r.size(); i < ageSetIndex; i++) { - r = new ArrayList<String>(); + userMap.addToListFor(region, race, key, "0"); } - - while (r.size() < (ageSetIndex + 1)) - { - r.add("0"); - } - - r.set(ageSetIndex, value); - userMap.put(key, r); + userMap.addToListFor(region, race, key, tag.substring(x + 1)); } /** @@ -274,33 +213,26 @@ */ public void copyRaceTags(final String origRegion, final String origRace, final String copyRegion, final String copyRace) { - // Retreive the original race's info - final SortedMap ageSets = getRaceTagsByAge(origRegion, origRace, true); - - // Iterate through ages, adding the info for the new race - for (Iterator it = ageSets.keySet().iterator(); it.hasNext();) + Region oldr = Region.getConstant(origRegion); + Region newr = Region.getConstant(copyRegion); + for (String key : userMap.getTertiaryKeySet(oldr, origRace)) { - final Integer key = (Integer) it.next(); - final SortedMap races = (SortedMap) ageSets.get(key); - - for (Iterator raceIt = races.keySet().iterator(); raceIt.hasNext();) - { - final String aRaceName = (String) raceIt.next(); - final int currentAgeSetIndex = key.intValue(); - - if (!"AGESET".equals(aRaceName)) - { - final SortedMap tags = (SortedMap) races.get(aRaceName); - - for (Iterator tagIt = tags.keySet().iterator(); tagIt.hasNext();) - { - final String tagName = (String) tagIt.next(); - final String value = (String) tags.get(tagName); - addToUserMap(copyRegion, copyRace, tagName + ":" + value, currentAgeSetIndex); - } - } - } + userMap.addAllToListFor(newr, copyRace, key, userMap.getListFor(oldr, origRace, key)); } + final int idx = origRace.indexOf('('); + String otherRace; + if (idx >= 0) + { + otherRace = origRace.substring(0, idx).trim() + '%'; + } + else + { + otherRace = origRace + '%'; + } + for (String key : userMap.getTertiaryKeySet(oldr, otherRace)) + { + userMap.addAllToListFor(newr, copyRace, key, userMap.getListFor(oldr, otherRace, key)); + } } /** @@ -316,31 +248,15 @@ return; } - final String ageSetLine = getAgeMapIndex(pc.getRegion(), ageSet); + AgeSet ageSetObj = getAgeMapIndex(Region.getConstant(pc.getRegion()), ageSet); - if (ageSetLine == null) + if (ageSetObj == null) { return; } - final StringTokenizer tok = new StringTokenizer(ageSetLine, "\t", false); - tok.nextToken(); // name of ageSet e.g. Middle Aged - - final PObject temporaryPObject = new PObject(); - - while (tok.hasMoreTokens()) - { - final String aString = tok.nextToken(); - - if (aString.startsWith("KIT:")) - { - Globals.getContext().unconditionallyProcess(temporaryPObject, - "KIT", aString.substring(4)); - } - } - pc.setDirty(true); - for (TransitionChoice<Kit> kit : temporaryPObject.getSafeListFor(ListKey.KIT_CHOICE)) + for (TransitionChoice<Kit> kit : ageSetObj.getKits()) { kit.act(kit.driveChoice(pc), this, pc); } @@ -389,17 +305,17 @@ if (ranList.contains("EYES")) { - pc.setEyeColor(generateBioValue(".EYES", pc)); + pc.setEyeColor(generateBioValue("EYES", pc)); } if (ranList.contains("HAIR")) { - pc.setHairColor(generateBioValue(".HAIR", pc)); + pc.setHairColor(generateBioValue("HAIR", pc)); } if (ranList.contains("SKIN")) { - pc.setSkinColor(generateBioValue(".SKINTONE", pc)); + pc.setSkinColor(generateBioValue("SKINTONE", pc)); } } @@ -416,14 +332,14 @@ if (x < 0) { - key = region + "." + race + "." + tag; + key = tag; } else { - key = region + "." + race + "." + tag.substring(0, x); + key = tag.substring(0, x); } - userMap.remove(key); + userMap.removeListFor(Region.getConstant(region), race, key); } @Override @@ -431,7 +347,6 @@ { final StringBuffer sb = new StringBuffer(100); sb.append("AgeMap: ").append(ageMap.toString()).append("\n"); - sb.append("RaceMap: ").append(raceMap.toString()).append("\n"); sb.append("UserMap: ").append(userMap.toString()).append("\n"); return sb.toString(); @@ -463,45 +378,14 @@ * sorted map of the races (one only) and wihtin this is the tags for that * race and age. */ - private SortedMap<Integer, SortedMap<String, String>> getRaceTagsByAge(final String region, final String race, final boolean includeGenericMatches) + private SortedMap<Integer, SortedMap<String, SortedMap<String, String>>> getRaceTagsByAge(Region region, String race) { - String otherRace = ""; - - if (includeGenericMatches) - { - final int idx = race.indexOf('('); - - if (idx >= 0) - { - otherRace = race.substring(0, idx).trim() + '%'; - } - else - { - otherRace = race + '%'; - } - } - - // Read in ages, setup a mapped structure for them - final SortedMap<Integer, SortedMap<String, String>> ageSets = setupAgeSet(region); - - // Read in the base race settings, split where necessary and add to the appropriate age bracket - for (String key : raceMap.keySet()) - { - if (key.startsWith(region + "." + race + ".") || key.startsWith(region + "." + otherRace + ".")) - { - final Object value = raceMap.get(key); - addTagToAgeSet(ageSets, key, value); - } - } - + // setup a mapped structure + final SortedMap<Integer, SortedMap<String, SortedMap<String, String>>> ageSets = new TreeMap<Integer, SortedMap<String, SortedMap<String, String>>>(); // Read in the user settings, split where necessary and add to the appropriate age bracket - for (String key : userMap.keySet()) + for (String key : userMap.getTertiaryKeySet(region, race)) { - if (key.startsWith(region + "." + race + ".") || key.startsWith(region + "." + otherRace + ".")) - { - final Object value = userMap.get(key); - addTagToAgeSet(ageSets, key, value); - } + addTagToAgeSet(ageSets, race, key, userMap.getListFor(region, race, key)); } return ageSets; @@ -536,109 +420,84 @@ { anotherRaceName = argRaceName + '%'; } - - final List<String> r = mapFind(userMap, argRegionName, argRaceName, addKey, anotherRaceName); - - if (r != null) - { - return r; - } - - return mapFind(raceMap, argRegionName, argRaceName, addKey, anotherRaceName); + return mapFind(userMap, argRegionName, argRaceName, addKey, anotherRaceName); } /** * Adds the tag (key & value) to the supplied ageSets collection. It is * assumed that the ageSet already has an entry for each age bracket and * that this entry will be a SortedMap of races. Each race will contain a - * SortedMap of tags and their values.<br/> - * The key is assumed to be of the form region.race.tag - * eg "Custom.Human%.MAXAGE" - * The value is assumed to be either a list of values or a - * single value, depending on the tag. eg "[34,52,69,110]" or "Blond|Brown" - * If a single value, it will be added to the first age set. Multiple values - * are split amongst the age sets in order, with any values not matching an - * age set being ignored. - * - * TODO: Change to always be a List<whatever type, String I suppose> (it is possible said list only has one member, but that's ok.) - * - * @param ageSets The collection of age brackets. - * @param key The region.race.tag specifier. - * @param value The value of the tag. + * SortedMap of tags and their values.<br/> The key is assumed to be of the + * form region.race.tag eg "Custom.Human%.MAXAGE" The value is assumed to be + * either a list of values or a single value, depending on the tag. eg + * "[34,52,69,110]" or "Blond|Brown" If a single value, it will be added to + * the first age set. Multiple values are split amongst the age sets in + * order, with any values not matching an age set being ignored. + * + * @param ageSets + * The collection of age brackets. + * @param key + * The region.race.tag specifier. + * @param value + * The value of the tag. */ - private void addTagToAgeSet(final SortedMap ageSets, final String key, final Object value) + private void addTagToAgeSet( + final SortedMap<Integer, SortedMap<String, SortedMap<String, String>>> ageSets, + String race, String key, final List<String> value) { - final StringTokenizer tok = new StringTokenizer(key, "."); - - if (tok.countTokens() >= 3) + final Iterator<String> iter = value.iterator(); + for (int ageBracket : ageNames.values()) { - tok.nextToken(); // ignore region name - - final String aRaceName = tok.nextToken(); - final String tagName = tok.nextToken(); - - if (value instanceof List) + if (!iter.hasNext()) { - // Need to split these amoungst the agesets - // NB: There may be more values than age sets. It seems that there are - // normally double currently. These extras are not used by this class, - // so they will not be output, just ignored by this code. - final List valueList = (List) value; - final Iterator iter = valueList.iterator(); - - for (int ageBracket = 0; (ageBracket < ageSets.size()) && iter.hasNext(); ageBracket++) - { - final String tagValue = (String) iter.next(); - final SortedMap races = (SortedMap) ageSets.get(Integer.valueOf(ageBracket)); - SortedMap tags = (SortedMap) races.get(aRaceName); - - if (tags == null) - { - tags = new TreeMap(); - races.put(aRaceName, tags); - } - - tags.put(tagName, tagValue); - } + break; } - else + final String tagValue = iter.next(); + SortedMap<String, SortedMap<String, String>> races = ageSets + .get(Integer.valueOf(ageBracket)); + if (races == null) { - final SortedMap races = (SortedMap) ageSets.get(Integer.valueOf(0)); - SortedMap tags = (SortedMap) races.get(aRaceName); + races = new TreeMap<String, SortedMap<String, String>>(); + ageSets.put(ageBracket, races); + } + SortedMap<String, String> tags = races.get(race); - if (tags == null) - { - tags = new TreeMap(); - races.put(aRaceName, tags); - } - - tags.put(tagName, value); + if (tags == null) + { + tags = new TreeMap<String, String>(); + races.put(race, tags); } + + tags.put(key, tagValue); } } - private String appendAgesetInfo(final SortedMap ageSets, final StringBuffer sb) + private String appendAgesetInfo(Region region, + final SortedMap<Integer, SortedMap<String, SortedMap<String, String>>> ageSets, + final StringBuffer sb) { + Set<Integer> ageIndices = new TreeSet<Integer>(); + ageIndices.addAll(ageSets.keySet()); + ageIndices.addAll(ageNames.values()); // Iterate through ages, outputing the info - for (Iterator it = ageSets.keySet().iterator(); it.hasNext();) + for (Integer key : ageIndices) { - final Integer key = (Integer) it.next(); - final SortedMap races = (SortedMap) ageSets.get(key); + final SortedMap<String, SortedMap<String, String>> races = ageSets.get(key); sb.append("AGESET:").append(key).append("|"); - sb.append(races.get("AGESET")).append("\n"); + sb.append(ageMap.get(region, key).getLSTformat()).append("\n"); - for (Iterator raceIt = races.keySet().iterator(); raceIt.hasNext();) + for (Iterator<String> raceIt = races.keySet().iterator(); raceIt.hasNext();) { - final String aRaceName = (String) raceIt.next(); + final String aRaceName = raceIt.next(); if (!"AGESET".equals(aRaceName)) { - final SortedMap tags = (SortedMap) races.get(aRaceName); + final SortedMap<String, String> tags = races.get(aRaceName); - for (Iterator tagIt = tags.keySet().iterator(); tagIt.hasNext();) + for (Iterator<String> tagIt = tags.keySet().iterator(); tagIt.hasNext();) { - final String tagName = (String) tagIt.next(); + final String tagName = tagIt.next(); sb.append("RACENAME:").append(aRaceName).append("\t\t"); sb.append(tagName).append(':').append(tags.get(tagName)).append("\n"); } @@ -655,7 +514,7 @@ { // Can't find a base age for the category, // then there's nothing to do - final String age = getTokenNumberInMaps(".BASEAGE", ageCategory, pc + final String age = getTokenNumberInMaps("BASEAGE", ageCategory, pc .getRegion(), pc.getRace().getKeyName().trim()); if (age == null) @@ -667,7 +526,7 @@ final int baseAge = Integer.parseInt(age); int ageAdd = -1; - String aClass = getTokenNumberInMaps(".CLASS", ageCategory, pc + String aClass = getTokenNumberInMaps("CLASS", ageCategory, pc .getRegion(), pc.getRace().getKeyName().trim()); if (aClass != null && !aClass.equals("0")) @@ -715,7 +574,7 @@ // then generate a number based on the .LST if ((ageAdd < 0) && !useClassOnly) { - aClass = getTokenNumberInMaps(".AGEDIEROLL", ageCategory, pc + aClass = getTokenNumberInMaps("AGEDIEROLL", ageCategory, pc .getRegion(), pc.getRace().getKeyName().trim()); if (aClass != null) @@ -726,7 +585,7 @@ if ((ageAdd >= 0) && (baseAge > 0)) { - final String maxage = getTokenNumberInMaps(".MAXAGE", ageCategory, pc + final String maxage = getTokenNumberInMaps("MAXAGE", ageCategory, pc .getRegion(), pc.getRace().getKeyName().trim()); if (maxage != null) { @@ -774,7 +633,7 @@ int htAdd = 0; int wtAdd = 0; String totalWeight = null; - final String htwt = getTokenNumberInMaps(".SEX", 0, pc.getRegion(), pc + final String htwt = getTokenNumberInMaps("SEX", 0, pc.getRegion(), pc .getRace().getKeyName().trim()); if (htwt == null) @@ -836,23 +695,18 @@ } } - private List<String> mapFind(final Map<String, List<String>> argMap, final String argRegionName, final String argRaceName, final String addKey, - final String altRaceName) + private List<String> mapFind( + final TripleKeyMapToList<Region, String, String, String> argMap, + final String argRegionName, final String argRaceName, + final String addKey, final String altRaceName) { // First check for region.racename.key - String regionName = argRegionName; - if (!regionName.endsWith(".")) + Region region = Region.getConstant(argRegionName); + List<String> r = argMap.getListFor(region, argRaceName, addKey); + if (r != null && !r.isEmpty()) { - regionName += "."; - } - - List<String> r = argMap.get(regionName + argRaceName + addKey); - - if (r != null) - { return r; } - // // If not found, try the race name without any parenthesis // @@ -860,60 +714,34 @@ if (altRaceLength != 0) { - r = argMap.get(regionName + altRaceName + addKey); - + r = argMap.getListFor(region, altRaceName, addKey); + if (r != null) { return r; } } - // // If still not found, try the same two searches again without a region // if (!argRegionName.equals(Constants.s_NONE)) { - r = argMap.get(Constants.s_NONE + "." + argRaceName + addKey); + region = Region.getConstant("None"); + r = argMap.getListFor(region, argRaceName, addKey); if (r != null) { return r; } - if (altRaceLength != 0) { - r = argMap.get(Constants.s_NONE + "." + altRaceName + addKey); + r = argMap.getListFor(region, altRaceName, addKey); } } - return r; } /** - * Read in ages, setup a mapped structure for them. - * @param region - * @return SortedMap - */ - private SortedMap<Integer, SortedMap<String, String>> setupAgeSet(final String region) - { - final SortedMap<Integer, SortedMap<String, String>> ageSets = new TreeMap<Integer, SortedMap<String, String>>(); - - for (String key : ageMap.keySet()) - { - if (key.startsWith(region + ".")) - { - final Integer setNum = Integer.valueOf(key.substring(region.length() + 1)); - final String value = ageMap.get(key); - final SortedMap<String, String> races = new TreeMap<String, String>(); - races.put("AGESET", value); - ageSets.put(setNum, races); - } - } - - return ageSets; - } - - /** * This overrides the PObject method since the bonuses are not stored in * the normal fashion. * @@ -927,32 +755,43 @@ ret.addAll(super.getActiveBonuses(aPC)); - final String ageSetLine = Globals.getBioSet().getAgeSetLine(aPC); - if (ageSetLine == null) + AgeSet ageSet = Globals.getBioSet().getAgeSetLine(aPC); + if (ageSet == null) { return ret; } - - final StringTokenizer aTok = new StringTokenizer(ageSetLine, "\t"); - aTok.nextToken(); // name of ageSet, e.g.: Middle Aged - - while (aTok.hasMoreTokens()) + List<BonusObj> bonuses = ageSet.getBonuses(); + for (BonusObj bo : bonuses) { - final String b = aTok.nextToken(); + aPC.setApplied(bo, true); + ret.add(bo); + } + return ret; + } - // TODO - Could these bonuses have a PRE? - if (b.startsWith("BONUS:")) //$NON-NLS-1$ - { - final BonusObj aBonus = Bonus.newBonus(b.substring(6)); + public AgeSet addToAgeMap(String regionName, AgeSet ageSet) + { + return ageMap.put(Region.getConstant(regionName), ageSet.getIndex(), + ageSet); + } - if (aBonus != null) - { - aPC.setApplied(aBonus, true); - ret.add(aBonus); - } - } + public Integer addToNameMap(AgeSet ageSet) + { + return ageNames.put(ageSet.getName(), ageSet.getIndex()); + } + + public Set<String> getAgeCategories() + { + Set<String> set = new TreeSet<String>(); + for (Object o : ageNames.keySet()) + { + set.add(o.toString()); } + return set; + } - return ret; + public Map<Integer, AgeSet> getAgeSets(String regionName) + { + return new TreeMap<Integer, AgeSet>(ageMap.getMapFor(Region.getConstant(regionName))); } } Modified: Trunk/pcgen/code/src/java/pcgen/core/SettingsHandler.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/SettingsHandler.java 2010-07-17 23:40:25 UTC (rev 12611) +++ Trunk/pcgen/code/src/java/pcgen/core/SettingsHandler.java 2010-07-18 01:13:57 UTC (rev 12612) @@ -1231,6 +1231,7 @@ setLastTipShown(getPCGenOption("lastTipOfTheDayTipShown", -1)); //$NON-NLS-1$ setLoadCampaignsAtStart(getPCGenOption("loadCampaignsAtStart", false)); //$NON-NLS-1$ setLoadCampaignsWithPC(getPCGenOption("loadCampaignsWithPC", false)); //$NON-NLS-1$ +System.err.println(getPCGenOption("loadCampaignsWithPC", false)); setLookAndFeel(getPCGenOption("looknFeel", 1)); //$NON-NLS-1$ setMaxPotionSpellLevel(getPCGenOption("maxPotionSpellLevel", 3)); //$NON-NLS-1$ setMaxWandSpellLevel(getPCGenOption("maxWandSpellLevel", 4)); //$NON-NLS-1$ Modified: Trunk/pcgen/code/src/java/pcgen/gui/editor/AgePanel.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/editor/AgePanel.java 2010-07-17 23:40:25 UTC (rev 12611) +++ Trunk/pcgen/code/src/java/pcgen/gui/editor/AgePanel.java 2010-07-18 01:13:57 UTC (rev 12612) @@ -23,6 +23,7 @@ package pcgen.gui.editor; import pcgen.cdom.base.Constants; +import pcgen.core.AgeSet; import pcgen.core.Globals; import pcgen.core.PObject; import pcgen.core.Race; @@ -268,26 +269,15 @@ // Build the list of ages data = new ArrayList(); - Map ageMap = Globals.getBioSet().getAgeMap(); - SortedSet sortedAges = new TreeSet(ageMap.keySet()); - - for (Iterator e = sortedAges.iterator(); e.hasNext();) + for (AgeSet as : Globals.getBioSet().getAgeSets(region).values()) { - keyValue = (String) e.next(); - - if (keyValue.startsWith(region)) - { - dataValue = (String) ageMap.get(keyValue); - - StringTokenizer tok = new StringTokenizer(dataValue, "\t"); - ageSet = new Object[5]; - ageSet[0] = tok.nextToken(); - ageSet[1] = ""; - ageSet[2] = ""; - ageSet[3] = ""; - ageSet[4] = keyValue; - data.add(ageSet); - } + ageSet = new Object[5]; + ageSet[0] = as.getName(); + ageSet[1] = ""; + ageSet[2] = ""; + ageSet[3] = ""; + ageSet[4] = region + "." + as.getIndex(); + data.add(ageSet); } if (raceName != null) Modified: Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoDescription.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoDescription.java 2010-07-17 23:40:25 UTC (rev 12611) +++ Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoDescription.java 2010-07-18 01:13:57 UTC (rev 12612) @@ -72,7 +72,9 @@ import pcgen.cdom.base.Constants; import pcgen.cdom.enumeration.Gender; +import pcgen.cdom.enumeration.Region; import pcgen.cdom.enumeration.StringKey; +import pcgen.core.AgeSet; import pcgen.core.GameMode; import pcgen.core.Globals; import pcgen.core.NoteItem; @@ -678,15 +680,8 @@ List<String> cats = new ArrayList<String>(); - for (String aString : Globals.getBioSet().getAgeMap().values()) + for (String aString : Globals.getBioSet().getAgeCategories()) { - final int idx = aString.indexOf('\t'); - - if (idx >= 0) - { - aString = aString.substring(0, idx); - } - if (!cats.contains(aString)) { cats.add(aString); @@ -2026,25 +2021,17 @@ if ((pcRace != null) && !pcRace.equals(Globals.s_EMPTYRACE)) { int idx = Globals.getBioSet().getPCAgeSet(pc); - String aString = - Globals.getBioSet().getAgeMapIndex(pc.getRegion(), idx); + AgeSet ageSet = Globals.getBioSet().getAgeMapIndex(Region.getConstant(pc.getRegion()), idx); - if ((idx >= 0) && (aString != null)) + if ((idx >= 0) && (ageSet != null)) { - idx = aString.indexOf('\t'); - - if (idx > 0) - { - aString = aString.substring(0, idx); - } - // // setSelectedItem doesn't change selection if entry is // not found in list, so do this the hard way... // for (int i = 0; i < ageComboBox.getModel().getSize(); ++i) { - if (aString.equals(ageComboBox.getModel().getElementAt(i))) + if (ageSet.getName().equals(ageComboBox.getModel().getElementAt(i))) { selIdx = i; Modified: Trunk/pcgen/code/src/java/pcgen/io/PCGIOHandler.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/PCGIOHandler.java 2010-07-17 23:40:25 UTC (rev 12611) +++ Trunk/pcgen/code/src/java/pcgen/io/PCGIOHandler.java 2010-07-18 01:13:57 UTC (rev 12612) @@ -246,7 +246,6 @@ } final String[] pcgLines = lines.toArray(new String[lines.size()]); - if (isPCGVersion2) { final PCGParser parser = new PCGVer2Parser(pcToBeRead); Modified: Trunk/pcgen/code/src/java/pcgen/persistence/lst/BioSetLoader.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/persistence/lst/BioSetLoader.java 2010-07-17 23:40:25 UTC (rev 12611) +++ Trunk/pcgen/code/src/java/pcgen/persistence/lst/BioSetLoader.java 2010-07-18 01:13:57 UTC (rev 12612) @@ -22,20 +22,27 @@ */ package pcgen.persistence.lst; +import java.net.URI; +import java.util.ArrayList; +import java.util.List; +import java.util.StringTokenizer; + import pcgen.cdom.base.Constants; +import pcgen.cdom.base.TransitionChoice; +import pcgen.cdom.enumeration.ListKey; +import pcgen.core.AgeSet; import pcgen.core.BioSet; import pcgen.core.GameMode; +import pcgen.core.Kit; +import pcgen.core.PObject; import pcgen.core.SystemCollections; +import pcgen.core.bonus.BonusObj; import pcgen.persistence.PersistenceLayerException; import pcgen.persistence.SystemLoader; import pcgen.persistence.lst.prereq.PreParserFactory; import pcgen.rules.context.LoadContext; +import pcgen.util.Logging; -import java.net.URI; -import java.util.ArrayList; -import java.util.List; -import java.util.StringTokenizer; - /** * * @author Bryan McRoberts <mer...@ya...> @@ -46,8 +53,8 @@ private static String regionName = Constants.s_NONE; BioSet bioSet = new BioSet(); /** - * The age set (bracket) currently being processed. - * Used by the parseLine method to hold state between calls. + * The age set (bracket) currently being processed. Used by the parseLine + * method to hold state between calls. */ int currentAgeSetIndex = 0; @@ -69,7 +76,8 @@ * @see pcgen.persistence.lst.LstLineFileLoader#loadLstFile(String) */ @Override - public void loadLstFile(LoadContext context, URI fileName) throws PersistenceLayerException + public void loadLstFile(LoadContext context, URI fileName) + throws PersistenceLayerException { currentAgeSetIndex = 0; final GameMode game = SystemCollections.getGameModeNamed(gameMode); @@ -79,21 +87,62 @@ } /** - * @see pcgen.persistence.lst.LstLineFileLoader#parseLine(java.net.URL, java.lang.String) + * @see pcgen.persistence.lst.LstLineFileLoader#parseLine(java.net.URL, + * java.lang.String) */ @Override public void parseLine(LoadContext context, String lstLine, URI sourceURI) { if (lstLine.startsWith("AGESET:")) { - currentAgeSetIndex = - bioSet.addToAgeMap(regionName, lstLine.substring(7), + String line = lstLine.substring(7); + int pipeLoc = line.indexOf('|'); + if (pipeLoc == -1) + { + Logging.errorPrint("Found invalid AGESET " + + "in Bio Settings, was expecting a |: " + lstLine); + return; + } + String ageIndexString = line.substring(0, pipeLoc); + try + { + currentAgeSetIndex = Integer.parseInt(ageIndexString); + StringTokenizer colToken = new StringTokenizer(line + .substring(pipeLoc + 1), SystemLoader.TAB_DELIM); + AgeSet ageSet = new AgeSet(colToken.nextToken(), currentAgeSetIndex); + while (colToken.hasMoreTokens()) + { + parseTokens(context, ageSet, colToken); + } + + AgeSet old = bioSet.addToAgeMap(regionName, ageSet); + if (old != null) + { + Logging.errorPrint("Found second AGESET " + + "in Bio Settings for Region: " + regionName + + " Index: " + currentAgeSetIndex); + } + Integer oldIndex = bioSet.addToNameMap(ageSet); + if (oldIndex != null && oldIndex != currentAgeSetIndex) + { + Logging.errorPrint("Incompatible Index for AGESET " + + "in Bio Settings: " + oldIndex + " and " + + currentAgeSetIndex + " for " + ageSet.getName()); + } + + } + catch (NumberFormatException e) + { + Logging.errorPrint("Illegal Index for AGESET " + + "in Bio Settings: " + ageIndexString + + " was not an integer"); + } } else { - final StringTokenizer colToken = - new StringTokenizer(lstLine, SystemLoader.TAB_DELIM); + final StringTokenizer colToken = new StringTokenizer(lstLine, + SystemLoader.TAB_DELIM); String colString; String raceName = ""; List<String> preReqList = null; @@ -130,16 +179,71 @@ for (int i = 0, x = preReqList.size(); i < x; ++i) { sBuf.append('[').append(preReqList.get(i)).append( - ']'); + ']'); } aString = sBuf.toString(); } bioSet.addToUserMap(regionName, raceName, colString - + aString, currentAgeSetIndex); + + aString, currentAgeSetIndex); } } } } + + private void parseTokens(LoadContext context, AgeSet ageSet, StringTokenizer tok) + { + final PObject dummy = new PObject(); + try + { + while (tok.hasMoreTokens()) + { + String currentTok = tok.nextToken(); + if (currentTok.startsWith("BONUS:")) + { + if (context.processToken(dummy, "BONUS", currentTok.substring(6))) + { + context.commit(); + } + else + { + context.rollback(); + Logging.errorPrint("Error in BONUS parse: " + currentTok); + } + } + else if (currentTok.startsWith("KIT:")) + { + if (context.processToken(dummy, "KIT", currentTok.substring(4))) + { + context.commit(); + } + else + { + context.rollback(); + Logging.errorPrint("Error in KIT parse: " + currentTok); + } + } + else + { + Logging.errorPrint("Unexpected token in AGESET: " + currentTok); + } + } + List<BonusObj> bonuses = dummy.getListFor(ListKey.BONUS); + if (bonuses != null) + { + ageSet.addBonuses(bonuses); + } + List<TransitionChoice<Kit>> kits = dummy.getListFor(ListKey.KIT_CHOICE); + if (kits != null) + { + ageSet.addKits(kits); + } + } + catch (PersistenceLayerException e) + { + Logging.errorPrint("Error in token parse: " + + e.getLocalizedMessage()); + } + } } Modified: Trunk/pcgen/code/src/test/pcgen/core/BioSetTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/BioSetTest.java 2010-07-17 23:40:25 UTC (rev 12611) +++ Trunk/pcgen/code/src/test/pcgen/core/BioSetTest.java 2010-07-18 01:13:57 UTC (rev 12612) @@ -30,10 +30,12 @@ import java.util.Iterator; import java.util.List; + import junit.framework.Test; import junit.framework.TestSuite; import pcgen.AbstractCharacterTestCase; import pcgen.cdom.base.Constants; +import pcgen.cdom.enumeration.Region; import pcgen.cdom.enumeration.StringKey; import pcgen.persistence.lst.BioSetLoaderTest; @@ -135,14 +137,14 @@ newRaceTag = currBioSet.getTagForRace(Constants.s_NONE, NEW_RACE_NAME, testArg); - // System.out.println( - // "Got '" - // + testArg - // + "' base of " - // + baseRaceTag - // + " and new of " - // + newRaceTag - // + "."); + // System.out.println( + // "Got '" + // + testArg + // + "' base of " + // + baseRaceTag + // + " and new of " + // + newRaceTag + // + "."); for (Iterator<String> newIter = newRaceTag.iterator(), baseIter = baseRaceTag.iterator(); newIter.hasNext() && baseIter.hasNext();) @@ -208,7 +210,6 @@ final Race human = new Race(); human.setName("Human"); pc.setRace(human); - pc.setAge(12); int idx = Globals.getBioSet().getPCAgeSet(pc); assertEquals("Ageset for " + pc.getAge() + ".", 0, idx); @@ -229,7 +230,7 @@ idx = Globals.getBioSet().getPCAgeSet(pc); assertEquals("Ageset for " + pc.getAge() + ".", 3, idx); - Globals.getBioSet().getAgeMapIndex(pc.getRegion(), idx); + Globals.getBioSet().getAgeMapIndex(Region.getConstant(pc.getRegion()), idx); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2013-11-26 23:52:17
|
Revision: 22391 http://sourceforge.net/p/pcgen/code/22391 Author: thpr Date: 2013-11-26 23:52:12 +0000 (Tue, 26 Nov 2013) Log Message: ----------- Fix: plugin.bonustokens.SpellCast.java needs to support %LIST in parseToken. Issue#: CODE-2372 Modified Paths: -------------- Trunk/pcgen/code/src/java/plugin/bonustokens/SpellCast.java Trunk/pcgen/code/src/utest/plugin/lsttokens/bonus/SpellKnownTest.java Added Paths: ----------- Trunk/pcgen/code/src/utest/plugin/lsttokens/bonus/SpellCastTest.java Modified: Trunk/pcgen/code/src/java/plugin/bonustokens/SpellCast.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/bonustokens/SpellCast.java 2013-11-26 23:50:47 UTC (rev 22390) +++ Trunk/pcgen/code/src/java/plugin/bonustokens/SpellCast.java 2013-11-26 23:52:12 UTC (rev 22391) @@ -59,6 +59,11 @@ if (idx < 0) { + if (token.equals(Constants.LST_PERCENT_LIST)) + { + addBonusInfo(token); + return true; + } return false; } @@ -79,19 +84,29 @@ protected String unparseToken(final Object obj) { final StringBuilder sb = new StringBuilder(30); - final SpellCastInfo sci = (SpellCastInfo) obj; + if (obj instanceof SpellCastInfo) + { + final SpellCastInfo sci = (SpellCastInfo) obj; - if (sci.getType() != null) - { - sb.append(Constants.LST_TYPE_DOT).append(((SpellCastInfo) obj).getType()); + if (sci.getType() != null) + { + sb.append(Constants.LST_TYPE_DOT).append( + ((SpellCastInfo) obj).getType()); + } + else if (sci.getPcClassName() != null) + { + sb.append(Constants.LST_CLASS_DOT).append( + ((SpellCastInfo) obj).getPcClassName()); + } + + sb.append(Constants.LST_SEMI_LEVEL_DOT).append( + ((SpellCastInfo) obj).getLevel()); } - else if (sci.getPcClassName() != null) + else { - sb.append(Constants.LST_CLASS_DOT).append(((SpellCastInfo) obj).getPcClassName()); + sb.append(obj); } - sb.append(Constants.LST_SEMI_LEVEL_DOT).append(((SpellCastInfo) obj).getLevel()); - return sb.toString(); } Added: Trunk/pcgen/code/src/utest/plugin/lsttokens/bonus/SpellCastTest.java =================================================================== --- Trunk/pcgen/code/src/utest/plugin/lsttokens/bonus/SpellCastTest.java (rev 0) +++ Trunk/pcgen/code/src/utest/plugin/lsttokens/bonus/SpellCastTest.java 2013-11-26 23:52:12 UTC (rev 22391) @@ -0,0 +1,177 @@ +/* + * Copyright (c) 2013 Tom Parker <th...@us...> + * + * This program 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 program 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., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ +package plugin.lsttokens.bonus; + +import java.net.URISyntaxException; + +import org.junit.Before; +import org.junit.Test; + +import pcgen.cdom.base.CDOMObject; +import pcgen.core.PCTemplate; +import pcgen.persistence.PersistenceLayerException; +import pcgen.rules.persistence.CDOMLoader; +import pcgen.rules.persistence.token.CDOMPrimaryToken; +import plugin.bonustokens.SpellKnown; +import plugin.lsttokens.BonusLst; +import plugin.lsttokens.testsupport.AbstractGlobalTokenTestCase; +import plugin.lsttokens.testsupport.CDOMTokenLoader; +import plugin.lsttokens.testsupport.ConsolidationRule; + +public class SpellCastTest extends AbstractGlobalTokenTestCase +{ + static BonusLst token = new BonusLst(); + static CDOMTokenLoader<PCTemplate> loader = + new CDOMTokenLoader<PCTemplate>(PCTemplate.class); + + @Override + @Before + public void setUp() throws PersistenceLayerException, URISyntaxException + { + super.setUp(); + addBonus("SPELLCAST", SpellKnown.class); + } + + @Override + public Class<PCTemplate> getCDOMClass() + { + return PCTemplate.class; + } + + @Override + public CDOMLoader<PCTemplate> getLoader() + { + return loader; + } + + @Override + public CDOMPrimaryToken<CDOMObject> getToken() + { + return token; + } + + @Test + public void testInvalidInputOnlyType() throws PersistenceLayerException + { + assertFalse(parse("SpellCast")); + assertNoSideEffects(); + } + + @Test + public void testInvalidInputOnlyTypeBar() throws PersistenceLayerException + { + assertFalse(parse("SpellCast|")); + assertNoSideEffects(); + } + + @Test + public void testInvalidInputNoValue() throws PersistenceLayerException + { + assertFalse(parse("SpellCast|CLASS.Wizard;LEVEL.1")); + assertNoSideEffects(); + } + + @Test + public void testInvalidInputMissingValue() throws PersistenceLayerException + { + try + { + assertFalse(parse("SpellCast|CLASS.Wizard;LEVEL.1|")); + } + catch (IllegalArgumentException e) + { + //This is ok too + } + assertNoSideEffects(); + } + + @Test + public void testInvalidNoTarget() throws PersistenceLayerException + { + assertFalse(parse("SpellCast||2")); + assertNoSideEffects(); + } + + @Test + public void testInvalidDoubleFirstPipe() throws PersistenceLayerException + { + assertFalse(parse("SpellCast||CLASS.Wizard;LEVEL.1|1")); + assertNoSideEffects(); + } + + @Test + public void testInvalidDoubleSecondPipe() throws PersistenceLayerException + { + try + { + assertFalse(parse("SpellCast|CLASS.Wizard;LEVEL.1||1")); + } + catch (IllegalArgumentException e) + { + //This is ok too + } + assertNoSideEffects(); + } + + @Test + public void testValidInputs() throws PersistenceLayerException + { + assertTrue(parse(getLegalValue())); + assertCleanConstruction(); + assertTrue(parse(getAlternateLegalValue())); + assertCleanConstruction(); + } + + @Test + public void testRoundRobinWizardOneNumber() + throws PersistenceLayerException + { + runRoundRobin("SPELLKNOWN|CLASS.Wizard;LEVEL.1|1"); + } + + @Test + public void testRoundRobinWizardOneFormula() + throws PersistenceLayerException + { + runRoundRobin("SPELLCAST|CLASS.Wizard;LEVEL.1|FORMULA"); + } + + @Test + public void testRoundRobinListNumber() throws PersistenceLayerException + { + runRoundRobin("SPELLCAST|%LIST|1"); + } + + @Override + protected String getLegalValue() + { + return "SPELLCAST|CLASS.Cleric;LEVEL.3|1"; + } + + @Override + protected String getAlternateLegalValue() + { + return "SPELLCAST|CLASS.Wizard;LEVEL.1|1"; + } + + @Override + protected ConsolidationRule getConsolidationRule() + { + return ConsolidationRule.SEPARATE; + } +} Modified: Trunk/pcgen/code/src/utest/plugin/lsttokens/bonus/SpellKnownTest.java =================================================================== --- Trunk/pcgen/code/src/utest/plugin/lsttokens/bonus/SpellKnownTest.java 2013-11-26 23:50:47 UTC (rev 22390) +++ Trunk/pcgen/code/src/utest/plugin/lsttokens/bonus/SpellKnownTest.java 2013-11-26 23:52:12 UTC (rev 22391) @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007 Tom Parker <th...@us...> + * Copyright (c) 2013 Tom Parker <th...@us...> * * This program 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 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |