From: <jde...@us...> - 2008-08-03 02:38:23
|
Revision: 7310 http://pcgen.svn.sourceforge.net/pcgen/?rev=7310&view=rev Author: jdempsey Date: 2008-08-03 02:38:32 +0000 (Sun, 03 Aug 2008) Log Message: ----------- FReq: REFRESH Button Should Reload All PCCs Issue#: 1733856 Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/gui/MainSource.java Trunk/pcgen/code/src/java/pcgen/persistence/lst/LstSystemLoader.java Modified: Trunk/pcgen/code/src/java/pcgen/gui/MainSource.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/MainSource.java 2008-08-03 02:19:08 UTC (rev 7309) +++ Trunk/pcgen/code/src/java/pcgen/gui/MainSource.java 2008-08-03 02:38:32 UTC (rev 7310) @@ -319,6 +319,20 @@ public void refreshCampaigns() { PersistenceManager.getInstance().refreshCampaigns(); + + // After the refresh the selected campaigns list needs to be updated with the new campaigns + List<Campaign> refreshedCamps = new ArrayList<Campaign>(); + for (Campaign oldCamp : selectedCampaigns) + { + Campaign newCamp = Globals.getCampaignKeyed(oldCamp.getKeyName()); + if (newCamp != null) + { + refreshedCamps.add(newCamp); + } + } + selectedCampaigns.clear(); + selectedCampaigns.addAll(refreshedCamps); + updateModels(); } Modified: Trunk/pcgen/code/src/java/pcgen/persistence/lst/LstSystemLoader.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/persistence/lst/LstSystemLoader.java 2008-08-03 02:19:08 UTC (rev 7309) +++ Trunk/pcgen/code/src/java/pcgen/persistence/lst/LstSystemLoader.java 2008-08-03 02:38:32 UTC (rev 7310) @@ -630,6 +630,18 @@ .getAbsolutePath()); loadPCCFilesInDirectory(SettingsHandler.getPcgenVendorDataDir() .getAbsolutePath()); + + // Now that those are loaded, make sure to initialize the recursive campaigns + try + { + campaignLoader.initRecursivePccFiles(); + } + catch (PersistenceLayerException e) + { + Logging.errorPrint("Failed to refresh campaigns", e); + } + + Globals.sortPObjectListByName(Globals.getCampaignList()); } /** This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <za...@us...> - 2008-08-04 10:23:46
|
Revision: 7324 http://pcgen.svn.sourceforge.net/pcgen/?rev=7324&view=rev Author: zaister Date: 2008-08-04 10:23:50 +0000 (Mon, 04 Aug 2008) Log Message: ----------- This is a temporary hack to make favored class selection work for the Pathfinder gamemode until the new FAVCLASS mechanism can be implemented and the race object can call choosers. FAVCLASS:CHOOSE:ALL creates a chooser of all visible non-monster base classes Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java Trunk/pcgen/code/src/java/pcgen/persistence/lst/LstSystemLoader.java Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-08-04 08:18:50 UTC (rev 7323) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-08-04 10:23:50 UTC (rev 7324) @@ -12045,30 +12045,66 @@ if (rfc.startsWith("CHOOSE:")) { final List<PCClass> availableList = new ArrayList<PCClass>(); - final StringTokenizer tok = - new StringTokenizer(rfc.substring(7), "|"); - while (tok.hasMoreTokens()) + + // WARNING: This is a temporary hack to make favored class selection work for + // the Pathfinder gamemode until the new FAVCLASS mechanism can be implemented + // and the race object can call choosers. + // + // FAVCLASS:CHOOSE:ALL creates a chooser of all visible non-monster base classes + // + if (rfc.equalsIgnoreCase("CHOOSE:ALL")) { - String cl = tok.nextToken(); - int dotLoc = cl.indexOf("."); - if (dotLoc == -1) + for (PCClass pcClass : Globals.getContext().ref.getConstructedCDOMObjects(PCClass.class)) { - //Base Class - final PCClass pcClass = Globals.getContext().ref.silentlyGetConstructedCDOMObject(PCClass.class, cl); - if (pcClass != null) + if (pcClass.isType("Base") && !pcClass.isType("Monster") && + pcClass.getSafe(ObjectKey.VISIBILITY).equals(Visibility.DEFAULT)) { - availableList.add(pcClass); + if (pcClass.hasSubClass()) + { + if (pcClass.getSafe(ObjectKey.ALLOWBASECLASS)) + { + availableList.add(pcClass); + } + for (PCClass subClass : pcClass.getSubClassList()) + { + availableList.add(subClass); + } + } + else + { + availableList.add(pcClass); + } } } - else - { - //Sub Class - final PCClass pcClass = - Globals.getContext().ref.silentlyGetConstructedCDOMObject(PCClass.class, cl.substring(dotLoc + 1)); - if (pcClass != null) + } + else + { + final StringTokenizer tok = + new StringTokenizer(rfc.substring(7), "|"); + while (tok.hasMoreTokens()) + { + String cl = tok.nextToken(); + int dotLoc = cl.indexOf("."); + if (dotLoc == -1) { - availableList.add(pcClass); + //Base Class + final PCClass pcClass = + Globals.getContext().ref.silentlyGetConstructedCDOMObject(PCClass.class, cl); + if (pcClass != null) + { + availableList.add(pcClass); + } } + else + { + //Sub Class + final PCClass pcClass = + Globals.getContext().ref.silentlyGetConstructedCDOMObject(PCClass.class, cl.substring(dotLoc + 1)); + if (pcClass != null) + { + availableList.add(pcClass); + } + } } } final List<PCClass> selectedList = new ArrayList<PCClass>(1); Modified: Trunk/pcgen/code/src/java/pcgen/persistence/lst/LstSystemLoader.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/persistence/lst/LstSystemLoader.java 2008-08-04 08:18:50 UTC (rev 7323) +++ Trunk/pcgen/code/src/java/pcgen/persistence/lst/LstSystemLoader.java 2008-08-04 10:23:50 UTC (rev 7324) @@ -1544,7 +1544,7 @@ favored = fav.substring(7); } - if (favored.equalsIgnoreCase("ANY")) + if (favored.equalsIgnoreCase("ANY") || favored.equalsIgnoreCase("ALL")) { return; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <za...@us...> - 2008-08-04 20:55:17
|
Revision: 7331 http://pcgen.svn.sourceforge.net/pcgen/?rev=7331&view=rev Author: zaister Date: 2008-08-04 20:55:06 +0000 (Mon, 04 Aug 2008) Log Message: ----------- Fixing bug in previous commit regarding persisted favored classes Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Parser.java Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-08-04 20:16:09 UTC (rev 7330) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-08-04 20:55:06 UTC (rev 7331) @@ -11296,7 +11296,7 @@ return -1; } - boolean addFavoredClass(final String aString) + public boolean addFavoredClass(final String aString) { if (aString.length() == 0) { Modified: Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Parser.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Parser.java 2008-08-04 20:16:09 UTC (rev 7330) +++ Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Parser.java 2008-08-04 20:55:06 UTC (rev 7331) @@ -3242,9 +3242,16 @@ private void parseFavoredClassLine(final String line) { - String decode = EntityEncoder.decode(line.substring(TAG_FAVOREDCLASS.length() + 1)); - thePC.setStringFor(StringKey.RACIAL_FAVORED_CLASS, - decode); + String favClass = EntityEncoder.decode(line.substring(TAG_FAVOREDCLASS.length() + 1)); + if (thePC.addFavoredClass(favClass)) + { + thePC.setStringFor(StringKey.RACIAL_FAVORED_CLASS, favClass); + } + else + { + thePC.removeStringFor(StringKey.RACIAL_FAVORED_CLASS); + } + } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-08-04 22:38:45
|
Revision: 7336 http://pcgen.svn.sourceforge.net/pcgen/?rev=7336&view=rev Author: thpr Date: 2008-08-04 22:38:39 +0000 (Mon, 04 Aug 2008) Log Message: ----------- race cleanup Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/IntegerKey.java Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java Trunk/pcgen/code/src/java/pcgen/core/Race.java Trunk/pcgen/code/src/java/pcgen/core/analysis/SkillCostCalc.java Trunk/pcgen/code/src/java/pcgen/gui/editor/RaceBasePanel.java Modified: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/IntegerKey.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/IntegerKey.java 2008-08-04 21:52:33 UTC (rev 7335) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/IntegerKey.java 2008-08-04 22:38:39 UTC (rev 7336) @@ -104,7 +104,7 @@ public static final IntegerKey CAMPAIGN_RANK = getConstant("CAMPAIGN_RANK", 9); - public static final IntegerKey REACH = getConstant("REACH"); + public static final IntegerKey REACH = getConstant("REACH", 5); public static final IntegerKey REACH_MULT = getConstant("REACH_MULT", 1); Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-08-04 21:52:33 UTC (rev 7335) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-08-04 22:38:39 UTC (rev 7336) @@ -17544,7 +17544,7 @@ int reach = 0; if (aRace != null) { - reach = aRace.getReach(); + reach = aRace.getSafe(IntegerKey.REACH); } // Scan templates for any overrides Modified: Trunk/pcgen/code/src/java/pcgen/core/Race.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Race.java 2008-08-04 21:52:33 UTC (rev 7335) +++ Trunk/pcgen/code/src/java/pcgen/core/Race.java 2008-08-04 22:38:39 UTC (rev 7336) @@ -28,16 +28,11 @@ import java.util.List; import pcgen.base.lang.StringUtil; -import pcgen.cdom.base.AssociatedPrereqObject; import pcgen.cdom.base.CDOMReference; import pcgen.cdom.base.Constants; -import pcgen.cdom.enumeration.AssociationKey; import pcgen.cdom.enumeration.FormulaKey; -import pcgen.cdom.enumeration.IntegerKey; import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; -import pcgen.cdom.enumeration.SkillCost; -import pcgen.cdom.list.ClassSkillList; import pcgen.core.bonus.BonusObj; import pcgen.core.prereq.Prerequisite; import pcgen.core.utils.MessageType; @@ -331,12 +326,6 @@ return txt.toString(); } - public int getReach() - { - Integer reach = get(IntegerKey.REACH); - return reach == null ? 5 : reach; - } - @Override public Race clone() { @@ -408,56 +397,6 @@ return true; } - public boolean hasMonsterCCSkill(Skill s) - { - CDOMReference<ClassSkillList> mList = PCClass.MONSTER_SKILL_LIST; - Collection<CDOMReference<Skill>> mods = getListMods(mList); - if (mods == null) - { - return false; - } - for (CDOMReference<Skill> ref : mods) - { - for (AssociatedPrereqObject apo : getListAssociations(mList, ref)) - { - if (SkillCost.CROSS_CLASS.equals(apo - .getAssociation(AssociationKey.SKILL_COST))) - { - if (ref.contains(s)) - { - return true; - } - } - } - } - return false; - } - - public boolean hasMonsterCSkill(Skill s) - { - CDOMReference<ClassSkillList> mList = PCClass.MONSTER_SKILL_LIST; - Collection<CDOMReference<Skill>> mods = getListMods(mList); - if (mods == null) - { - return false; - } - for (CDOMReference<Skill> ref : mods) - { - for (AssociatedPrereqObject apo : getListAssociations(mList, ref)) - { - if (SkillCost.CLASS.equals(apo - .getAssociation(AssociationKey.SKILL_COST))) - { - if (ref.contains(s)) - { - return true; - } - } - } - } - return false; - } - int maxHitDiceAdvancement() { List<Integer> hda = getListFor(ListKey.HITDICE_ADVANCEMENT); Modified: Trunk/pcgen/code/src/java/pcgen/core/analysis/SkillCostCalc.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/analysis/SkillCostCalc.java 2008-08-04 21:52:33 UTC (rev 7335) +++ Trunk/pcgen/code/src/java/pcgen/core/analysis/SkillCostCalc.java 2008-08-04 22:38:39 UTC (rev 7336) @@ -21,9 +21,12 @@ package pcgen.core.analysis; import java.util.ArrayList; +import java.util.Collection; import java.util.List; +import pcgen.cdom.base.AssociatedPrereqObject; import pcgen.cdom.base.CDOMReference; +import pcgen.cdom.enumeration.AssociationKey; import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; import pcgen.cdom.enumeration.SkillCost; @@ -35,6 +38,7 @@ import pcgen.core.PCClass; import pcgen.core.PCTemplate; import pcgen.core.PlayerCharacter; +import pcgen.core.Race; import pcgen.core.Skill; public final class SkillCostCalc @@ -75,7 +79,7 @@ if (aClass.isMonster()) { - if (aPC.getRace().hasMonsterCSkill(sk)) + if (hasMonsterClassSkill(aPC.getRace(), sk)) { return true; } @@ -245,7 +249,7 @@ if (aClass.isMonster()) { - if (aPC.getRace().hasMonsterCCSkill(sk)) + if (hasMonsterCCSkill(aPC.getRace(), sk)) { return true; } @@ -306,4 +310,54 @@ return false; } + public static boolean hasMonsterCCSkill(Race r, Skill s) + { + CDOMReference<ClassSkillList> mList = PCClass.MONSTER_SKILL_LIST; + Collection<CDOMReference<Skill>> mods = r.getListMods(mList); + if (mods == null) + { + return false; + } + for (CDOMReference<Skill> ref : mods) + { + for (AssociatedPrereqObject apo : r.getListAssociations(mList, ref)) + { + if (SkillCost.CROSS_CLASS.equals(apo + .getAssociation(AssociationKey.SKILL_COST))) + { + if (ref.contains(s)) + { + return true; + } + } + } + } + return false; + } + + public static boolean hasMonsterClassSkill(Race r, Skill s) + { + CDOMReference<ClassSkillList> mList = PCClass.MONSTER_SKILL_LIST; + Collection<CDOMReference<Skill>> mods = r.getListMods(mList); + if (mods == null) + { + return false; + } + for (CDOMReference<Skill> ref : mods) + { + for (AssociatedPrereqObject apo : r.getListAssociations(mList, ref)) + { + if (SkillCost.CLASS.equals(apo + .getAssociation(AssociationKey.SKILL_COST))) + { + if (ref.contains(s)) + { + return true; + } + } + } + } + return false; + } + } Modified: Trunk/pcgen/code/src/java/pcgen/gui/editor/RaceBasePanel.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/editor/RaceBasePanel.java 2008-08-04 21:52:33 UTC (rev 7335) +++ Trunk/pcgen/code/src/java/pcgen/gui/editor/RaceBasePanel.java 2008-08-04 22:38:39 UTC (rev 7336) @@ -451,7 +451,7 @@ setMonsterClass(thisRace.getMonsterClass()); setMonsterLevel(thisRace.getMonsterClassLevels()); setRaceSize(thisRace.get(FormulaKey.SIZE)); - setReach(thisRace.getReach()); + setReach(thisRace.getSafe(IntegerKey.REACH)); setSkillMultiplier(thisRace.getSafe(IntegerKey.INITIAL_SKILL_MULT)); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jde...@us...> - 2008-09-06 23:24:12
|
Revision: 7659 http://pcgen.svn.sourceforge.net/pcgen/?rev=7659&view=rev Author: jdempsey Date: 2008-09-06 23:24:21 +0000 (Sat, 06 Sep 2008) Log Message: ----------- Fix bug: ABILITY lost capability to use SUBSET Ability Categories Issue#: 2059135 Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/cdom/reference/AbstractReferenceManufacturer.java Trunk/pcgen/code/src/java/pcgen/cdom/reference/CategorizedReferenceManufacturer.java Trunk/pcgen/code/src/java/pcgen/rules/context/ReferenceContext.java Modified: Trunk/pcgen/code/src/java/pcgen/cdom/reference/AbstractReferenceManufacturer.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/reference/AbstractReferenceManufacturer.java 2008-09-05 21:57:24 UTC (rev 7658) +++ Trunk/pcgen/code/src/java/pcgen/cdom/reference/AbstractReferenceManufacturer.java 2008-09-06 23:24:21 UTC (rev 7659) @@ -100,7 +100,7 @@ /** * Storage for individual references. This ensures that only one reference * is ever built for any identifier. (and allows those references to be - * reused if a refernce to an identifier is requested a second time). This + * reused if a reference to an identifier is requested a second time). This * also stores the reference so that it can be appropriately resolved when * resolveReferences() is called. */ Modified: Trunk/pcgen/code/src/java/pcgen/cdom/reference/CategorizedReferenceManufacturer.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/reference/CategorizedReferenceManufacturer.java 2008-09-05 21:57:24 UTC (rev 7658) +++ Trunk/pcgen/code/src/java/pcgen/cdom/reference/CategorizedReferenceManufacturer.java 2008-09-06 23:24:21 UTC (rev 7659) @@ -17,9 +17,12 @@ */ package pcgen.cdom.reference; +import java.util.Collection; + import pcgen.cdom.base.CDOMObject; import pcgen.cdom.base.CategorizedCDOMObject; import pcgen.cdom.base.Category; +import pcgen.util.Logging; /** * A CategorizedReferenceManufacturer is a ReferenceManufacturer that will @@ -45,6 +48,11 @@ private final Category<T> category; /** + * Stores the reference manager that is dealing with this category's parent category. + */ + private CategorizedReferenceManufacturer<T> parentCrm = null; + + /** * Constructs a new SimpleReferenceManufacturer that will construct or * reference non-categorized CDOMObjects of the given Class. * @@ -62,8 +70,46 @@ */ category = cat; } + + /** + * Sets the reference manager that is dealing with this category's parent category. + * + * @param parentCrm the reference manager for the parent category + */ + public void setParentCRM(CategorizedReferenceManufacturer<T> parentCrm) + { + this.parentCrm = parentCrm; + } /** + * This is a specialisation of the validate function to cope with + * categories that have parents (i.e Fighter feats being a child of feats). + * It checks for active matches in the parent before doing the normal + * validation. Any matches in the parent for unconstructed references in + * this class are registered as if they had been made in the child class. + * + * @see pcgen.cdom.reference.AbstractReferenceManufacturer#validate() + */ + @Override + public boolean validate() + { + if (parentCrm != null) + { + Collection<CDOMCategorizedSingleRef<T>> childRefs = getReferenced(); + for (CDOMCategorizedSingleRef<T> ref : childRefs) + { + String name = ref.getName(); + if (parentCrm.containsObject(name) && !containsObject(name)) + { + Logging.debugPrint("Found match in parent for " + category + " - " + name); + constructObject(name); + } + } + } + return super.validate(); + } + + /** * Returns a CDOMCategorizedSingleRef for the given identifier as defined by * the Class and Category provided when this * CategorizedReferenceManufacturer was constructed. This is designed to be @@ -147,5 +193,4 @@ { return this.getClass().getName() + " [" + getReferenceClass() + " " + category + "]"; } - } \ No newline at end of file Modified: Trunk/pcgen/code/src/java/pcgen/rules/context/ReferenceContext.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/rules/context/ReferenceContext.java 2008-09-05 21:57:24 UTC (rev 7658) +++ Trunk/pcgen/code/src/java/pcgen/rules/context/ReferenceContext.java 2008-09-06 23:24:21 UTC (rev 7659) @@ -20,6 +20,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; +import java.util.List; import java.util.Map; import pcgen.base.util.DoubleKeyMap; @@ -30,6 +31,9 @@ import pcgen.cdom.reference.CategorizedReferenceManufacturer; import pcgen.cdom.reference.ReferenceManufacturer; import pcgen.cdom.reference.SimpleReferenceManufacturer; +import pcgen.core.AbilityCategory; +import pcgen.core.AbilityUtilities; +import pcgen.util.Logging; public class ReferenceContext extends AbstractReferenceContext { @@ -73,6 +77,30 @@ { mfg = new CategorizedReferenceManufacturer<T>(cl, cat); catmap.put(cl, cat, mfg); + if (cat != null && cat.getClass().isAssignableFrom(AbilityCategory.class)) + { + Category foo = cat; + AbilityCategory child = (AbilityCategory) foo; + if (!child.getAbilityCategory().equals(child.getKeyName())) + { + AbilityCategory parent = + AbilityUtilities.getAbilityCategory(child + .getAbilityCategory()); + CategorizedReferenceManufacturer<T> parentMfg = + (CategorizedReferenceManufacturer<T>) catmap.get( + cl, parent); + if (parentMfg == null) + { + Category parentCat = (Category) parent; + parentMfg = + new CategorizedReferenceManufacturer<T>(cl, + (Category<T>) parentCat); + catmap.put(cl, cat, parentMfg); + } + mfg.setParentCRM(parentMfg); + } + } + } return mfg; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-09-26 00:32:08
|
Revision: 7790 http://pcgen.svn.sourceforge.net/pcgen/?rev=7790&view=rev Author: thpr Date: 2008-09-26 00:31:45 +0000 (Fri, 26 Sep 2008) Log Message: ----------- Additional Association Facade Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/EqModNameOpt.java Trunk/pcgen/code/src/java/pcgen/core/Ability.java Trunk/pcgen/code/src/java/pcgen/core/AbilityUtilities.java Trunk/pcgen/code/src/java/pcgen/core/AssociatedChoice.java Trunk/pcgen/code/src/java/pcgen/core/Equipment.java Trunk/pcgen/code/src/java/pcgen/core/EquipmentChoice.java Trunk/pcgen/code/src/java/pcgen/core/EquipmentModifier.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/Skill.java Trunk/pcgen/code/src/java/pcgen/core/analysis/SkillLanguage.java Trunk/pcgen/code/src/java/pcgen/core/chooser/AbstractBasicPObjectChoiceManager.java Trunk/pcgen/code/src/java/pcgen/core/chooser/AbstractBasicStringChoiceManager.java Trunk/pcgen/code/src/java/pcgen/core/chooser/AbstractEasyStringChoiceManager.java Trunk/pcgen/code/src/java/pcgen/core/chooser/ArmorTypeChoiceManager.java Trunk/pcgen/code/src/java/pcgen/core/chooser/ChooserUtilities.java Trunk/pcgen/code/src/java/pcgen/core/chooser/ClassChoiceManager.java Trunk/pcgen/code/src/java/pcgen/core/chooser/ClassSkillsChoiceManager.java Trunk/pcgen/code/src/java/pcgen/core/chooser/DomainChoiceManager.java Trunk/pcgen/code/src/java/pcgen/core/chooser/EquipmentTypeChoiceManager.java Trunk/pcgen/code/src/java/pcgen/core/chooser/FeatAddChoiceManager.java Trunk/pcgen/code/src/java/pcgen/core/chooser/FeatChoiceManager.java Trunk/pcgen/code/src/java/pcgen/core/chooser/FeatListChoiceManager.java Trunk/pcgen/code/src/java/pcgen/core/chooser/FeatSelectChoiceManager.java Trunk/pcgen/code/src/java/pcgen/core/chooser/MiscChoiceManager.java Trunk/pcgen/code/src/java/pcgen/core/chooser/NoChoiceChoiceManager.java Trunk/pcgen/code/src/java/pcgen/core/chooser/ProficiencyChoiceManager.java Trunk/pcgen/code/src/java/pcgen/core/chooser/RaceChoiceManager.java Trunk/pcgen/code/src/java/pcgen/core/chooser/SAListChoiceManager.java Trunk/pcgen/code/src/java/pcgen/core/chooser/SchoolsChoiceManager.java Trunk/pcgen/code/src/java/pcgen/core/chooser/SimpleArmorProfChoiceManager.java Trunk/pcgen/code/src/java/pcgen/core/chooser/SimpleShieldProfChoiceManager.java Trunk/pcgen/code/src/java/pcgen/core/chooser/SimpleWeaponProfChoiceManager.java Trunk/pcgen/code/src/java/pcgen/core/chooser/SkillListChoiceManager.java Trunk/pcgen/code/src/java/pcgen/core/chooser/SkillListNonClassChoiceManager.java Trunk/pcgen/code/src/java/pcgen/core/chooser/SkillsChoiceManager.java Trunk/pcgen/code/src/java/pcgen/core/chooser/SpellClassesChoiceManager.java Trunk/pcgen/code/src/java/pcgen/core/chooser/SpellLevelChoiceManager.java Trunk/pcgen/code/src/java/pcgen/core/chooser/SpellListChoiceManager.java Trunk/pcgen/code/src/java/pcgen/core/chooser/SpellsChoiceManager.java Trunk/pcgen/code/src/java/pcgen/core/chooser/StatChoiceManager.java Trunk/pcgen/code/src/java/pcgen/core/chooser/WeaponFocusChoiceManager.java Trunk/pcgen/code/src/java/pcgen/core/chooser/WeaponProfChoiceManager.java Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbility.java Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityAbility.java Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityClassSkills.java Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityFeat.java Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilitySpellCaster.java Trunk/pcgen/code/src/java/pcgen/core/prereq/PrerequisiteUtilities.java Trunk/pcgen/code/src/java/pcgen/gui/EqBuilder.java Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoSpecialAbilities.java Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoTempMod.java Trunk/pcgen/code/src/java/pcgen/io/PCGIOHandler.java Trunk/pcgen/code/src/java/pcgen/io/PCGVer0Parser.java Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Parser.java Modified: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/EqModNameOpt.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/EqModNameOpt.java 2008-09-25 20:40:47 UTC (rev 7789) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/EqModNameOpt.java 2008-09-26 00:31:45 UTC (rev 7790) @@ -26,6 +26,7 @@ import pcgen.base.util.CaseInsensitiveMap; import pcgen.cdom.base.Constants; import pcgen.core.AssociatedChoice; +import pcgen.core.Equipment; import pcgen.core.EquipmentModifier; import pcgen.core.Globals; import pcgen.core.SettingsHandler; @@ -59,7 +60,7 @@ NORMAL { @Override - public String returnName(EquipmentModifier mod) + public String returnName(Equipment parent, EquipmentModifier mod) { StringBuilder sb = new StringBuilder(100); sb.append(mod.getDisplayName()); @@ -72,7 +73,7 @@ NOLIST { @Override - public String returnName(EquipmentModifier mod) + public String returnName(Equipment parent, EquipmentModifier mod) { return mod.getDisplayName().trim().replace('|', ' '); } @@ -80,7 +81,7 @@ NONAME { @Override - public String returnName(EquipmentModifier mod) + public String returnName(Equipment parent, EquipmentModifier mod) { StringBuilder sb = new StringBuilder(100); sb.append(mod.getDisplayName()); @@ -91,7 +92,7 @@ NOTHING { @Override - public String returnName(EquipmentModifier mod) + public String returnName(Equipment parent, EquipmentModifier mod) { return Constants.EMPTY_STRING; } @@ -99,7 +100,7 @@ SPELL { @Override - public String returnName(EquipmentModifier mod) + public String returnName(Equipment parent, EquipmentModifier mod) { StringBuilder sb = new StringBuilder(100); boolean first = true; @@ -158,13 +159,13 @@ TEXT { @Override - public String returnName(EquipmentModifier mod) + public String returnName(Equipment parent, EquipmentModifier mod) { return mod.get(StringKey.NAME_TEXT); } }; - public abstract String returnName(EquipmentModifier mod); + public abstract String returnName(Equipment parent, EquipmentModifier mod); public static EqModNameOpt valueOfIgnoreCase(String s) { Modified: Trunk/pcgen/code/src/java/pcgen/core/Ability.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Ability.java 2008-09-25 20:40:47 UTC (rev 7789) +++ Trunk/pcgen/code/src/java/pcgen/core/Ability.java 2008-09-26 00:31:45 UTC (rev 7790) @@ -247,13 +247,14 @@ /** * Whether we can add newAssociation to the associated list of this * Ability + * @param pc TODO + * @param newAssociation The thing to be associated with this Ability * - * @param newAssociation The thing to be associated with this Ability * @return true if we can add the association */ - public boolean canAddAssociation(final String newAssociation) + public boolean canAddAssociation(PlayerCharacter pc, final String newAssociation) { - return this.getSafe(ObjectKey.STACKS) || (this.getSafe(ObjectKey.MULTIPLE_ALLOWED) && !this.containsAssociated(newAssociation)); + return this.getSafe(ObjectKey.STACKS) || (this.getSafe(ObjectKey.MULTIPLE_ALLOWED) && !pc.containsAssociated(this, newAssociation)); } /** @@ -662,7 +663,7 @@ // replace old selection(s) with new and update bonuses // - anAbility.clearAssociated(); + aPC.removeAllAssociations(anAbility); for (int i = 0; i < selectedSize; ++i) { Modified: Trunk/pcgen/code/src/java/pcgen/core/AbilityUtilities.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/AbilityUtilities.java 2008-09-25 20:40:47 UTC (rev 7789) +++ Trunk/pcgen/code/src/java/pcgen/core/AbilityUtilities.java 2008-09-26 00:31:45 UTC (rev 7790) @@ -59,7 +59,7 @@ { for ( final String choice : choices ) { - if (ability.canAddAssociation(choice)) + if (ability.canAddAssociation(pc, choice)) { pc.addAssociation(ability, choice); } @@ -384,14 +384,14 @@ } else if (addIt) { - if (ability.canAddAssociation(choice)) + if (ability.canAddAssociation(aPC, choice)) { aPC.addAssociation(ability, choice); } } else { - ability.removeAssociated(choice); + aPC.removeAssociation(ability, choice); } } @@ -829,7 +829,7 @@ } else { - anAbility.removeAssociated(wp.getKeyName()); + aPC.removeAssociation(anAbility, wp.getKeyName()); } } } @@ -843,7 +843,7 @@ } else { - anAbility.removeAssociated(aString); + aPC.removeAssociation(anAbility, aString); } } } Modified: Trunk/pcgen/code/src/java/pcgen/core/AssociatedChoice.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/AssociatedChoice.java 2008-09-25 20:40:47 UTC (rev 7789) +++ Trunk/pcgen/code/src/java/pcgen/core/AssociatedChoice.java 2008-09-26 00:31:45 UTC (rev 7790) @@ -191,4 +191,10 @@ } return 1; } + + @Override + public String toString() + { + return "AssociatedChoice: " + this.getDefaultChoice(); + } } Modified: Trunk/pcgen/code/src/java/pcgen/core/Equipment.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Equipment.java 2008-09-25 20:40:47 UTC (rev 7789) +++ Trunk/pcgen/code/src/java/pcgen/core/Equipment.java 2008-09-26 00:31:45 UTC (rev 7790) @@ -559,7 +559,7 @@ public List<BonusObj> getActiveBonuses(final PlayerCharacter aPC) { final List<BonusObj> aList = new ArrayList<BonusObj>(); - for (BonusObj bonus : getBonusList()) { + for (BonusObj bonus : getBonusList(aPC)) { if (bonus.isApplied()) { aList.add(bonus); } @@ -576,19 +576,21 @@ /** * get a list of BonusObj's of aType and aName - * + * @param pc TODO * @param aType * a TYPE of bonus (such as "COMBAT" or "SKILL") * @param aName * the NAME of the bonus (such as "ATTACKS" or "SPOT") * @param bPrimary * used for double weapons (head1 vs head2) + * * @return a list of bonusObj's of aType and aName */ - public List<BonusObj> getBonusListOfType(final String aType, - final String aName, final boolean bPrimary) { + public List<BonusObj> getBonusListOfType(PlayerCharacter pc, + final String aType, final String aName, final boolean bPrimary) { final List<BonusObj> aList = new ArrayList<BonusObj>(); + aList.addAll(getBonusListOfType(pc, aType, aName)); for (BonusObj bonus : getBonusList()) { if ((bonus.getTypeOfBonus().indexOf(aType) >= 0) && (bonus.getBonusInfo().indexOf(aName) >= 0)) { @@ -2257,7 +2259,7 @@ { // We clear the associated info to avoid a buildup of info // like number of charges. - eqMod.clearAssociated(); + removeAllAssociations(eqMod); } addAssociation(eqMod, x.replace('=', '|')); } @@ -3890,7 +3892,7 @@ * The list of modifiers * @return The nameFromModifiers value */ - private static String getNameFromModifiers( + private String getNameFromModifiers( final List<EquipmentModifier> eqModList) { // // Get a sorted list so that the description will always come @@ -3907,7 +3909,7 @@ sMod.append('/'); } - sMod.append(eqMod.getSafe(ObjectKey.NAME_OPT).returnName(eqMod)); + sMod.append(eqMod.getSafe(ObjectKey.NAME_OPT).returnName(this, eqMod)); } return sMod.toString(); @@ -4157,8 +4159,8 @@ 1.0); } - final List<BonusObj> baseEqBonusList = baseEq.getBonusList(); - final List<BonusObj> eqBonusList = getBonusList(); + final List<BonusObj> baseEqBonusList = baseEq.getBonusList(aPC); + final List<BonusObj> eqBonusList = getBonusList(aPC); // // Go through the bonus list looking for COMBAT|AC|x and resize @@ -4558,7 +4560,7 @@ final String aChoice = eqMod.getAssociated(i); if (aChoice.startsWith(x)) { - eqMod.removeAssociated(i); + removeAssociation(eqMod, aChoice); } } } @@ -6055,7 +6057,7 @@ public boolean containsAssociated(PObject obj, String o) { - return obj.containsAssociated(o); + return obj.tempContainsAssociated(o); } public int getAssociationCount(PObject obj) @@ -6093,16 +6095,13 @@ public List<String> removeAllAssociations(PObject obj) { List<String> list = getAssociationList(obj); - for (int i = obj.tempGetAssociatedCount() - 1; i > 0; i--) - { - obj.removeAssociated(i); - } + obj.tempClearAssociated(); return list; } public void removeAssociation(PObject obj, String o) { - obj.removeAssociated(o); + obj.tempRemoveAssociated(o); } public int getExpandedAssociationCount(PObject obj) Modified: Trunk/pcgen/code/src/java/pcgen/core/EquipmentChoice.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/EquipmentChoice.java 2008-09-25 20:40:47 UTC (rev 7789) +++ Trunk/pcgen/code/src/java/pcgen/core/EquipmentChoice.java 2008-09-26 00:31:45 UTC (rev 7790) @@ -403,7 +403,7 @@ !(sibling.equals(this)) && sibling.getChoiceString().startsWith(choiceType)) { - sibling.addAssociatedTo(this.getAvailableList()); + getAvailableList().addAll(parent.getAssociationList(sibling)); } } } Modified: Trunk/pcgen/code/src/java/pcgen/core/EquipmentModifier.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/EquipmentModifier.java 2008-09-25 20:40:47 UTC (rev 7789) +++ Trunk/pcgen/code/src/java/pcgen/core/EquipmentModifier.java 2008-09-26 00:31:45 UTC (rev 7790) @@ -349,7 +349,7 @@ @Override public String toString() { - return getSafe(ObjectKey.NAME_OPT).returnName(this); + return getKeyName(); } @Override @@ -404,12 +404,10 @@ return 1; } - List<String> selectedList = new ArrayList<String>(); // selected list of choices - final ChooserInterface chooser = ChooserFactory.getChooserInstance(); chooser.setPoolFlag(false); chooser.setVisible(false); - addAssociatedTo(selectedList); + List<String> selectedList = parent.getAssociationList(this); final EquipmentChoice equipChoice = buildEquipmentChoice( pool, @@ -451,7 +449,7 @@ void setChoice(Equipment parent, final List<String> selectedList, final EquipmentChoice equipChoice) { - clearAssociated(); + parent.removeAllAssociations(this); for (int i = 0; i < selectedList.size(); i++) { @@ -494,7 +492,7 @@ } } - if (equipChoice.isAllowDuplicates() || !containsAssociated(aString)) + if (equipChoice.isAllowDuplicates() || !parent.containsAssociated(this, aString)) { parent.addAssociation(this, aString); } @@ -797,9 +795,10 @@ { if (parent.getAssociationCount(this) > 0) { - String listEntry = getAssociated(0); + List<String> assoc = parent.removeAllAssociations(this); + String listEntry = assoc.get(0); String chargeInfo = getSpellInfoString(listEntry, s_CHARGES); - + if (chargeInfo.length() != 0) { chargeInfo = s_CHARGES + '[' + chargeInfo + ']'; @@ -808,8 +807,12 @@ listEntry = listEntry.substring(0, idx) + listEntry.substring(idx + chargeInfo.length()); listEntry += (s_CHARGES + '[' + Integer.toString(remainingCharges) + ']'); - setAssociated(0, listEntry); + assoc.set(0, listEntry); } + for (String s : assoc) + { + parent.addAssociation(this, s); + } } } Modified: Trunk/pcgen/code/src/java/pcgen/core/PObject.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-09-25 20:40:47 UTC (rev 7789) +++ Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-09-26 00:31:45 UTC (rev 7790) @@ -123,8 +123,6 @@ private boolean isNewItem = true; - private List<DamageReduction> drList = new ArrayList<DamageReduction>(); - private String chooseLanguageAutos = Constants.EMPTY_STRING; /** Number of followers of each type allowed */ @@ -149,16 +147,6 @@ * ************/ /** - * Set the associated list - * @param index - * @param aString - */ - public final void setAssociated(final int index, final String aString) - { - associatedList.set(index, new AssociatedChoice<String>(aString)); - } - - /** * Get the associated item, without expanding the list * @param idx * @return the associated item @@ -613,18 +601,6 @@ } /** - * Add the collection passed in to the associated list for this object - * @param collection - */ - public final void addAllToAssociated(final Collection<String> collection) - { - for ( String choice : collection ) - { - tempAddAssociated( choice ); - } - } - - /** * Add the item to the associated list for this object * @param aString the string to add to the associated list */ @@ -652,25 +628,6 @@ associatedList.add(aFeatChoices); } - public final void addAssociatedTo( final List<String> choices ) - { - if (associatedList != null) - { - for ( AssociatedChoice<String> choice : associatedList ) - { - final String choiceStr = choice.getDefaultChoice(); - if ( choiceStr.equals(Constants.EMPTY_STRING) ) - { - choices.add(null); - } - else - { - choices.add( choice.getDefaultChoice() ); - } - } - } - } - public String associatedList() { if (associatedList == null) @@ -847,7 +804,7 @@ * @param associated * @return true if the assocaited item is in the associated list for this object */ - public final boolean containsAssociated(final String associated) + public final boolean tempContainsAssociated(final String associated) { if (associatedList == null) { @@ -881,7 +838,7 @@ /** * Clear the associated list for this object */ - public final void clearAssociated() + public final void tempClearAssociated() { associatedList = null; } @@ -1543,7 +1500,7 @@ * @param associated * @return true if successful */ - public final boolean removeAssociated(final String associated) + public final boolean tempRemoveAssociated(final String associated) { boolean ret = false; if (associatedList == null) @@ -2656,10 +2613,9 @@ } else if ("%LIST".equals(tok)) { - for (Iterator<AssociatedChoice<String>> e = - getAssociatedList().iterator(); e.hasNext();) + for (String assoc : aPC.getAssociationList(this)) { - aList.add(e.next().getDefaultChoice()); + aList.add(assoc); } } else if ("DEITYWEAPONS".equals(tok)) Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-09-25 20:40:47 UTC (rev 7789) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-09-26 00:31:45 UTC (rev 7790) @@ -11642,11 +11642,11 @@ if (eq.isEquipped()) { final List<BonusObj> tempList = - eq.getBonusListOfType(aType, aName, true); + eq.getBonusListOfType(this, aType, aName, true); if (eq.isWeapon() && eq.isDouble()) { - tempList.addAll(eq.getBonusListOfType(aType, aName, false)); + tempList.addAll(eq.getBonusListOfType(this, aType, aName, false)); } bonus += calcBonusFromList(tempList); @@ -12249,11 +12249,10 @@ Ability anAbility = AbilityUtilities.getAbilityFromList(aFeatList, "FEAT", featKey, Ability.Nature.ANY); - if (anAbility != null) { if (anAbility.getSafe(ObjectKey.MULTIPLE_ALLOWED) - && !anAbility.containsAssociated(aString)) + && !containsAssociated(anAbility, aString)) { addAssociation(anAbility, aString); anAbility.sortAssociated(); @@ -16765,7 +16764,7 @@ final String aString = vFeat.getAssociated(e1); if (aggregateFeat.getSafe(ObjectKey.STACKS) - || !aggregateFeat.containsAssociated(aString)) + || !containsAssociated(aggregateFeat, aString)) { addAssociation(aggregateFeat, aString); } @@ -16794,7 +16793,7 @@ { final String aString = autoFeat.getAssociated(e1); if (aggregateFeat.getSafe(ObjectKey.STACKS) - || !aggregateFeat.containsAssociated(aString)) + || !containsAssociated(aggregateFeat, aString)) { addAssociation(aggregateFeat, aString); } @@ -17873,7 +17872,7 @@ public boolean containsAssociated(PObject obj, String o) { - return obj.containsAssociated(o); + return obj.tempContainsAssociated(o); } public int getAssociationCount(PObject obj) @@ -17911,22 +17910,20 @@ public List<String> removeAllAssociations(PObject obj) { List<String> list = getAssociationList(obj); - for (int i = obj.tempGetAssociatedCount() - 1; i > 0; i--) - { - obj.removeAssociated(i); - } + obj.tempClearAssociated(); return list; } public void removeAssociation(PObject obj, String o) { - obj.removeAssociated(o); + obj.tempRemoveAssociated(o); } public int getExpandedAssociationCount(PObject obj) { return obj.tempGetAssociatedCount(true); } + public void addAssoc(Object obj, Object o) { assocSupt.addAssoc(obj, o); Modified: Trunk/pcgen/code/src/java/pcgen/core/Skill.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Skill.java 2008-09-25 20:40:47 UTC (rev 7789) +++ Trunk/pcgen/code/src/java/pcgen/core/Skill.java 2008-09-26 00:31:45 UTC (rev 7790) @@ -450,7 +450,6 @@ if ((choiceString.length() > 0) && !CoreUtility.doublesEqual(g, 0) && !CoreUtility.doublesEqual(curRank, (int) newRank)) { - final List<String> aArrayList = new ArrayList<String>(); final double rankAdjustment = 0.0; String title = ""; final StringTokenizer aTok = new StringTokenizer(choiceString, "|"); @@ -495,11 +494,8 @@ c.setTotalChoicesAvail((int) (g + curRank + rankAdjustment)); c.setPoolFlag(false); - c.setAvailableList(aArrayList); - - final List<String> s = new ArrayList<String>(); - addAssociatedTo(s); - c.setSelectedList(s); + c.setAvailableList(new ArrayList<String>()); + c.setSelectedList(aPC.getAssociationList(this)); c.setVisible(true); final int selectedListSize = c.getSelectedList().size(); Modified: Trunk/pcgen/code/src/java/pcgen/core/analysis/SkillLanguage.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/analysis/SkillLanguage.java 2008-09-25 20:40:47 UTC (rev 7789) +++ Trunk/pcgen/code/src/java/pcgen/core/analysis/SkillLanguage.java 2008-09-26 00:31:45 UTC (rev 7790) @@ -89,7 +89,6 @@ } int numLanguages = languageSkill.getTotalRank(aPC).intValue(); - List<String> selectedLangNames = new ArrayList<String>(); List<Language> selected = new ArrayList<Language>(); List<Language> available = new ArrayList<Language>(); List<Language> excludedLangs = new ArrayList<Language>(); @@ -123,9 +122,7 @@ } } - languageSkill.addAssociatedTo(selectedLangNames); - - for (String aString : selectedLangNames) + for (String aString : aPC.getAssociationList(languageSkill)) { Language aLang = Globals.getContext().ref .silentlyGetConstructedCDOMObject(Language.class, @@ -217,7 +214,7 @@ // Add in all choice-excluded languages aPC.addLanguages(excludedLangs); - languageSkill.clearAssociated(); + aPC.removeAllAssociations(languageSkill); // TODO Fix this to allow Language objects. for (Iterator<?> i = lc.getSelectedList().iterator(); i.hasNext();) { Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/AbstractBasicPObjectChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/AbstractBasicPObjectChoiceManager.java 2008-09-25 20:40:47 UTC (rev 7789) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/AbstractBasicPObjectChoiceManager.java 2008-09-26 00:31:45 UTC (rev 7790) @@ -50,13 +50,13 @@ @Override public void applyChoices(PlayerCharacter aPC, List<T> selected) { - pobject.clearAssociated(); + aPC.removeAllAssociations(pobject); for (T obj : selected) { String st = obj.getKeyName(); if (isMultYes() && !isStackYes()) { - if (!pobject.containsAssociated(st)) + if (!aPC.containsAssociated(pobject, st)) { aPC.addAssociation(pobject, st); } Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/AbstractBasicStringChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/AbstractBasicStringChoiceManager.java 2008-09-25 20:40:47 UTC (rev 7789) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/AbstractBasicStringChoiceManager.java 2008-09-26 00:31:45 UTC (rev 7790) @@ -60,7 +60,7 @@ { if (isMultYes() && !isStackYes()) { - if (!pobject.containsAssociated(st)) + if (!aPC.containsAssociated(pobject, st)) { associateChoice(aPC, st); } @@ -75,7 +75,7 @@ protected void cleanUpAssociated(PlayerCharacter aPC) { - pobject.clearAssociated(); + aPC.removeAllAssociations(pobject); } protected void associateChoice(PlayerCharacter pc, String st) Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/AbstractEasyStringChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/AbstractEasyStringChoiceManager.java 2008-09-25 20:40:47 UTC (rev 7789) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/AbstractEasyStringChoiceManager.java 2008-09-26 00:31:45 UTC (rev 7790) @@ -25,7 +25,6 @@ import java.util.Collection; import java.util.List; -import pcgen.core.AssociatedChoice; import pcgen.core.PObject; import pcgen.core.PlayerCharacter; @@ -59,7 +58,7 @@ public void getChoices(PlayerCharacter aPc, List<String> availableList, List<String> selectedList) { - initializeSelected(selectedList); + initializeSelected(aPc, selectedList); setPreChooserChoices(selectedList.size()); for (String tempString : getChoiceList()) { @@ -104,11 +103,11 @@ } } - protected void initializeSelected(List<String> selectedList) + protected void initializeSelected(PlayerCharacter pc, List<String> selectedList) { - for (AssociatedChoice<String> choice : pobject.getAssociatedList()) + for (String choice : pc.getAssociationList(pobject)) { - selectedList.add(choice.getDefaultChoice()); + selectedList.add(choice); } } Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/ArmorTypeChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/ArmorTypeChoiceManager.java 2008-09-25 20:40:47 UTC (rev 7789) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/ArmorTypeChoiceManager.java 2008-09-26 00:31:45 UTC (rev 7790) @@ -77,7 +77,7 @@ availableList.add(profKey); } - pobject.addAssociatedTo(selectedList); + selectedList.addAll(aPc.getAssociationList(pobject)); setPreChooserChoices(selectedList.size()); } } Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/ChooserUtilities.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/ChooserUtilities.java 2008-09-25 20:40:47 UTC (rev 7789) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/ChooserUtilities.java 2008-09-26 00:31:45 UTC (rev 7790) @@ -264,7 +264,7 @@ { if (ab.getKeyName().equals(a.getKeyName())) { - reservedList.addAll(ab.getAssociatedList()); + reservedList.addAll(aPC.getAssociationList(ab)); } } } Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/ClassChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/ClassChoiceManager.java 2008-09-25 20:40:47 UTC (rev 7789) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/ClassChoiceManager.java 2008-09-26 00:31:45 UTC (rev 7790) @@ -27,6 +27,7 @@ import java.util.ArrayList; import java.util.List; import java.util.StringTokenizer; + import pcgen.core.Globals; import pcgen.core.PCClass; import pcgen.core.PObject; @@ -156,9 +157,7 @@ } } - List<String> classKeys = new ArrayList<String>(); - pobject.addAssociatedTo(classKeys); - for (String key : classKeys) + for (String key : aPc.getAssociationList(pobject)) { PCClass aClass = refContext.silentlyGetConstructedCDOMObject(PCClass.class, key); if(aClass != null) Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/ClassSkillsChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/ClassSkillsChoiceManager.java 2008-09-25 20:40:47 UTC (rev 7789) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/ClassSkillsChoiceManager.java 2008-09-26 00:31:45 UTC (rev 7790) @@ -23,7 +23,6 @@ */ package pcgen.core.chooser; -import java.util.ArrayList; import java.util.List; import pcgen.core.Globals; @@ -73,9 +72,7 @@ } } - List<String> associatedKeys = new ArrayList<String>(); - pobject.addAssociatedTo(associatedKeys); - for ( String key : associatedKeys ) + for (String key : aPc.getAssociationList(pobject)) { Skill skill = Globals.getContext().ref.silentlyGetConstructedCDOMObject(Skill.class, key); if ( skill != null ) Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/DomainChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/DomainChoiceManager.java 2008-09-25 20:40:47 UTC (rev 7789) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/DomainChoiceManager.java 2008-09-26 00:31:45 UTC (rev 7790) @@ -23,7 +23,6 @@ */ package pcgen.core.chooser; -import java.util.ArrayList; import java.util.List; import pcgen.cdom.base.CDOMReference; @@ -141,9 +140,7 @@ } } - List<String> domainKeys = new ArrayList<String>(); - pobject.addAssociatedTo( domainKeys ); - for ( String key : domainKeys ) + for (String key : aPc.getAssociationList(pobject)) { Domain domain = refContext.silentlyGetConstructedCDOMObject(Domain.class, key); if ( domain != null ) Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/EquipmentTypeChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/EquipmentTypeChoiceManager.java 2008-09-25 20:40:47 UTC (rev 7789) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/EquipmentTypeChoiceManager.java 2008-09-26 00:31:45 UTC (rev 7790) @@ -23,7 +23,6 @@ */ package pcgen.core.chooser; -import java.util.ArrayList; import java.util.List; import pcgen.core.Equipment; @@ -76,9 +75,7 @@ .get(0); availableList.addAll(EquipmentList.getEquipmentOfType(choiceSec, "")); - List<String> equipKeys = new ArrayList<String>(); - pobject.addAssociatedTo( equipKeys ); - for ( String key : equipKeys ) + for (String key : aPc.getAssociationList(pobject)) { Equipment equip = Globals.getContext().ref.silentlyGetConstructedCDOMObject( Equipment.class, key ); Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/FeatAddChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/FeatAddChoiceManager.java 2008-09-25 20:40:47 UTC (rev 7789) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/FeatAddChoiceManager.java 2008-09-26 00:31:45 UTC (rev 7790) @@ -104,7 +104,7 @@ } } } - pobject.addAssociatedTo(selectedList); + selectedList.addAll(aPc.getAssociationList(pobject)); setPreChooserChoices(selectedList.size()); } Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/FeatChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/FeatChoiceManager.java 2008-09-25 20:40:47 UTC (rev 7789) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/FeatChoiceManager.java 2008-09-26 00:31:45 UTC (rev 7790) @@ -26,7 +26,6 @@ import java.util.List; import pcgen.core.Ability; -import pcgen.core.AssociatedChoice; import pcgen.core.PObject; import pcgen.core.PlayerCharacter; @@ -75,15 +74,15 @@ List<Ability> theFeats = aPc.getFeatNamedAnyCat(getChoiceList().get(0)); for (Ability ability : theFeats) { - for (AssociatedChoice<String> choice : ability.getAssociatedList()) + for (String assoc : aPc.getAssociationList(ability)) { - availableList.add(choice.getDefaultChoice()); + availableList.add(assoc); } } - for (AssociatedChoice<String> choice : pobject.getAssociatedList()) + for (String choice : aPc.getAssociationList(pobject)) { - selectedList.add(choice.getDefaultChoice()); + selectedList.add(choice); } setPreChooserChoices(selectedList.size()); } Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/FeatListChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/FeatListChoiceManager.java 2008-09-25 20:40:47 UTC (rev 7789) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/FeatListChoiceManager.java 2008-09-26 00:31:45 UTC (rev 7790) @@ -23,9 +23,9 @@ */ package pcgen.core.chooser; -import java.util.ArrayList; import java.util.Iterator; import java.util.List; + import pcgen.core.Ability; import pcgen.core.Globals; import pcgen.core.PObject; @@ -97,9 +97,7 @@ } } - List<String> abilityKeys = new ArrayList<String>(); - pobject.addAssociatedTo( abilityKeys ); - for ( String key : abilityKeys ) + for (String key : aPc.getAssociationList(pobject)) { Ability ability = Globals.getAbilityKeyed( "FEAT", key ); if ( ability != null ) Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/FeatSelectChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/FeatSelectChoiceManager.java 2008-09-25 20:40:47 UTC (rev 7789) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/FeatSelectChoiceManager.java 2008-09-26 00:31:45 UTC (rev 7790) @@ -196,7 +196,7 @@ } } - pobject.addAssociatedTo(selectedList); + selectedList.addAll(aPc.getAssociationList(pobject)); setPreChooserChoices(selectedList.size()); } Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/MiscChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/MiscChoiceManager.java 2008-09-25 20:40:47 UTC (rev 7789) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/MiscChoiceManager.java 2008-09-26 00:31:45 UTC (rev 7790) @@ -76,7 +76,7 @@ availableList.add(aString); } } - pobject.addAssociatedTo(selectedList); + selectedList.addAll(aPc.getAssociationList(pobject)); setPreChooserChoices(selectedList.size()); } Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/NoChoiceChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/NoChoiceChoiceManager.java 2008-09-25 20:40:47 UTC (rev 7789) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/NoChoiceChoiceManager.java 2008-09-26 00:31:45 UTC (rev 7790) @@ -22,7 +22,7 @@ List<String> selectedList) { availableList.add("NOCHOICE"); - pobject.addAssociatedTo(selectedList); + selectedList.addAll(pc.getAssociationList(pobject)); setPreChooserChoices(selectedList.size()); } @@ -51,7 +51,7 @@ @Override public void applyChoices(PlayerCharacter apc, List<String> selected) { - pobject.clearAssociated(); + apc.removeAllAssociations(pobject); for (int i = 0; i < selected.size(); i++) { apc.addAssociation(pobject, Constants.EMPTY_STRING); Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/ProficiencyChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/ProficiencyChoiceManager.java 2008-09-25 20:40:47 UTC (rev 7789) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/ProficiencyChoiceManager.java 2008-09-26 00:31:45 UTC (rev 7790) @@ -33,7 +33,6 @@ import pcgen.core.PlayerCharacter; import pcgen.core.WeaponProf; import pcgen.util.Logging; -import java.util.ArrayList; /** * This is the chooser that deals with choosing a Weapon Proficiency @@ -278,9 +277,7 @@ { Logging.errorPrint("CHOOSE:PROFICIENCY - Unknown type " + typeOfProf); } - List<String> wpKeys = new ArrayList<String>(); - pobject.addAssociatedTo( wpKeys ); - for ( String key : wpKeys ) + for (String key : aPc.getAssociationList(pobject)) { WeaponProf wp = Globals.getContext().ref.silentlyGetConstructedCDOMObject(WeaponProf.class, key ); if ( wp != null ) Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/RaceChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/RaceChoiceManager.java 2008-09-25 20:40:47 UTC (rev 7789) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/RaceChoiceManager.java 2008-09-26 00:31:45 UTC (rev 7790) @@ -132,9 +132,7 @@ } } - List<String> raceKeys = new ArrayList<String>(); - pobject.addAssociatedTo(raceKeys); - for (String key : raceKeys) + for (String key : aPc.getAssociationList(pobject)) { Race race = Globals.getContext().ref.silentlyGetConstructedCDOMObject(Race.class, key); if (race != null) Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/SAListChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/SAListChoiceManager.java 2008-09-25 20:40:47 UTC (rev 7789) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/SAListChoiceManager.java 2008-09-26 00:31:45 UTC (rev 7790) @@ -71,7 +71,7 @@ PCGIOHandler.buildSALIST("SALIST:" + StringUtil.join(getChoiceList(), "|"), availableList, aBonusList, aPc); - pobject.addAssociatedTo(selectedList); + selectedList.addAll(aPc.getAssociationList(pobject)); setPreChooserChoices(selectedList.size()); } Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/SchoolsChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/SchoolsChoiceManager.java 2008-09-25 20:40:47 UTC (rev 7789) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/SchoolsChoiceManager.java 2008-09-26 00:31:45 UTC (rev 7790) @@ -63,7 +63,7 @@ final List<String> selectedList) { availableList.addAll(SettingsHandler.getGame().getUnmodifiableSchoolsList()); - pobject.addAssociatedTo(selectedList); + selectedList.addAll(aPc.getAssociationList(pobject)); setPreChooserChoices(selectedList.size()); } Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/SimpleArmorProfChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/SimpleArmorProfChoiceManager.java 2008-09-25 20:40:47 UTC (rev 7789) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/SimpleArmorProfChoiceManager.java 2008-09-26 00:31:45 UTC (rev 7790) @@ -24,7 +24,6 @@ import java.util.List; -import pcgen.core.AssociatedChoice; import pcgen.core.Equipment; import pcgen.core.Globals; import pcgen.core.PObject; @@ -60,9 +59,9 @@ public void getChoices(PlayerCharacter aPc, List<String> availableList, List<String> selectedList) { - for (AssociatedChoice<String> choice : pobject.getAssociatedList()) + for (String choice : aPc.getAssociationList(pobject)) { - selectedList.add(choice.getDefaultChoice()); + selectedList.add(choice); } setPreChooserChoices(selectedList.size()); for (String tempString : getChoiceList()) @@ -126,12 +125,12 @@ @Override public void applyChoices(PlayerCharacter aPC, List<String> selected) { - pobject.clearAssociated(); + aPC.removeAllAssociations(pobject); for (String st : selected) { if (isMultYes() && !isStackYes()) { - if (!pobject.containsAssociated(st)) + if (!aPC.containsAssociated(pobject, st)) { aPC.addAssociation(pobject, st); } Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/SimpleShieldProfChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/SimpleShieldProfChoiceManager.java 2008-09-25 20:40:47 UTC (rev 7789) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/SimpleShieldProfChoiceManager.java 2008-09-26 00:31:45 UTC (rev 7790) @@ -24,7 +24,6 @@ import java.util.List; -import pcgen.core.AssociatedChoice; import pcgen.core.Equipment; import pcgen.core.Globals; import pcgen.core.PObject; @@ -60,9 +59,9 @@ public void getChoices(PlayerCharacter aPc, List<String> availableList, List<String> selectedList) { - for (AssociatedChoice<String> choice : pobject.getAssociatedList()) + for (String choice : aPc.getAssociationList(pobject)) { - selectedList.add(choice.getDefaultChoice()); + selectedList.add(choice); } setPreChooserChoices(selectedList.size()); for (String tempString : getChoiceList()) @@ -126,12 +125,12 @@ @Override public void applyChoices(PlayerCharacter aPC, List<String> selected) { - pobject.clearAssociated(); + aPC.removeAllAssociations(pobject); for (String st : selected) { if (isMultYes() && !isStackYes()) { - if (!pobject.containsAssociated(st)) + if (!aPC.containsAssociated(pobject, st)) { aPC.addAssociation(pobject, st); } Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/SimpleWeaponProfChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/SimpleWeaponProfChoiceManager.java 2008-09-25 20:40:47 UTC (rev 7789) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/SimpleWeaponProfChoiceManager.java 2008-09-26 00:31:45 UTC (rev 7790) @@ -437,7 +437,7 @@ { if (pobject instanceof Domain) { - pobject.clearAssociated(); + aPC.removeAllAssociations(pobject); String key = featOrProf.substring(5); Ability anAbility = Globals.getAbilityKeyed("FEAT", key); @@ -467,7 +467,7 @@ } if ((anAbility != null) && - !anAbility.containsAssociated(aChoice)) + !aPC.containsAssociated(anAbility, aChoice)) { aPC.addAssociation(anAbility, aChoice); } Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/SkillListChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/SkillListChoiceManager.java 2008-09-25 20:40:47 UTC (rev 7789) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/SkillListChoiceManager.java 2008-09-26 00:31:45 UTC (rev 7790) @@ -94,7 +94,7 @@ } } - pobject.addAssociatedTo(selectedList); + selectedList.addAll(aPc.getAssociationList(pobject)); setPreChooserChoices(selectedList.size()); } Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/SkillListNonClassChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/SkillListNonClassChoiceManager.java 2008-09-25 20:40:47 UTC (rev 7789) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/SkillListNonClassChoiceManager.java 2008-09-26 00:31:45 UTC (rev 7790) @@ -93,7 +93,7 @@ } } - pobject.addAssociatedTo(selectedList); + selectedList.addAll(aPc.getAssociationList(pobject)); setPreChooserChoices(selectedList.size()); } Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/SkillsChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/SkillsChoiceManager.java 2008-09-25 20:40:47 UTC (rev 7789) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/SkillsChoiceManager.java 2008-09-26 00:31:45 UTC (rev 7790) @@ -68,7 +68,7 @@ availableList.add(aSkill.getKeyName()); } - pobject.addAssociatedTo(selectedList); + selectedList.addAll(aPC.getAssociationList(pobject)); setPreChooserChoices(selectedList.size()); } Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/SpellClassesChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/SpellClassesChoiceManager.java 2008-09-25 20:40:47 UTC (rev 7789) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/SpellClassesChoiceManager.java 2008-09-26 00:31:45 UTC (rev 7790) @@ -73,7 +73,7 @@ } } - pobject.addAssociatedTo(selectedList); + selectedList.addAll(aPc.getAssociationList(pobject)); setPreChooserChoices(selectedList.size()); } Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/SpellLevelChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/SpellLevelChoiceManager.java 2008-09-25 20:40:47 UTC (rev 7789) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/SpellLevelChoiceManager.java 2008-09-26 00:31:45 UTC (rev 7790) @@ -101,7 +101,7 @@ aPc, Collections.enumeration(getChoiceList())); - pobject.addAssociatedTo(selectedList); + selectedList.addAll(aPc.getAssociationList(pobject)); setPreChooserChoices(selectedList.size()); } @@ -131,7 +131,7 @@ pobject.removeBonus(bonus, assoc, aPc); } } - pobject.clearAssociated(); + aPc.removeAllAssociations(pobject); } Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/SpellListChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/SpellListChoiceManager.java 2008-09-25 20:40:47 UTC (rev 7789) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/SpellListChoiceManager.java 2008-09-26 00:31:45 UTC (rev 7790) @@ -316,7 +316,7 @@ { final Spell aSpell = cs.getSpell(); - if (!pobject.containsAssociated(aSpell.getKeyName())) + if (!aPC.containsAssociated(pobject, aSpell.getKeyName())) { if (!availableList.contains(aSpell.getKeyName())) { Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/SpellsChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/SpellsChoiceManager.java 2008-09-25 20:40:47 UTC (rev 7789) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/SpellsChoiceManager.java 2008-09-26 00:31:45 UTC (rev 7790) @@ -264,9 +264,7 @@ } availableList.addAll(masterSet); - List<String> associatedChoices = new ArrayList<String>(); - pobject.addAssociatedTo(associatedChoices); - for (String choice : associatedChoices) + for (String choice : aPc.getAssociationList(pobject)) { Spell spell = Globals.getSpellKeyed(choice); selectedList.add(spell); Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/StatChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/StatChoiceManager.java 2008-09-25 20:40:47 UTC (rev 7789) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/StatChoiceManager.java 2008-09-26 00:31:45 UTC (rev 7790) @@ -83,7 +83,7 @@ } } - pobject.addAssociatedTo(selectedList); + selectedList.addAll(aPc.getAssociationList(pobject)); setPreChooserChoices(selectedList.size()); } Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/WeaponFocusChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/WeaponFocusChoiceManager.java 2008-09-25 20:40:47 UTC (rev 7789) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/WeaponFocusChoiceManager.java 2008-09-26 00:31:45 UTC (rev 7790) @@ -24,8 +24,8 @@ package pcgen.core.chooser; import java.util.List; + import pcgen.core.Ability; -import pcgen.core.AssociatedChoice; import pcgen.core.Equipment; import pcgen.core.Globals; import pcgen.core.PObject; @@ -83,13 +83,11 @@ if (aString.startsWith("TYPE.")) { - final List<AssociatedChoice<String>> aList = wfFeat.getAssociatedList(); final String aType = aString.substring(5); - for ( AssociatedChoice<String> choice : aList ) + for ( String strChoice : aPc.getAssociationList(wfFeat) ) { final WeaponProf wp; - final String strChoice = choice.getDefaultChoice(); wp = Globals.getContext().ref.silentlyGetConstructedCDOMObject(WeaponProf.class, strChoice ); if (wp == null) @@ -115,10 +113,10 @@ } else { - wfFeat.addAssociatedTo(availableList); + availableList.addAll(aPc.getAssociationList(wfFeat)); } - pobject.addAssociatedTo(selectedList); + selectedList.addAll(aPc.getAssociationList(pobject)); setPreChooserChoices(selectedList.size()); } Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/WeaponProfChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/WeaponProfChoiceManager.java 2008-09-25 20:40:47 UTC (rev 7789) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/WeaponProfChoiceManager.java 2008-09-26 00:31:45 UTC (rev 7790) @@ -32,7 +32,6 @@ import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; import pcgen.cdom.reference.CDOMSingleRef; -import pcgen.core.AssociatedChoice; import pcgen.core.Equipment; import pcgen.core.Globals; import pcgen.core.PObject; @@ -326,12 +325,9 @@ } // Add the proficiencies already linked to the object to the selected list - for (AssociatedChoice<String> assocChoice : pobject.getAssociatedList()) + for (String choice : aPc.getAssociationList(pobject)) { - for (String choice : assocChoice.getChoices()) - { - selectedList.add(refContext.silentlyGetConstructedCDOMObject(WeaponProf.class, choice)); - } + selectedList.add(refContext.silentlyGetConstructedCDOMObject(WeaponProf.class, choice)); } setPreChooserChoices(selectedList.size()); } Modified: Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbility.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbility.java 2008-09-25 20:40:47 UTC (rev 7789) +++ Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbility.java 2008-09-26 00:31:45 UTC (rev 7790) @@ -527,7 +527,7 @@ } } - clearAssociated(); + aPC.removeAllAssociations(this); } /** Modified: Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityAbility.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityAbility.java 2008-09-25 20:40:47 UTC (rev 7789) +++ Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityAbility.java 2008-09-26 00:31:45 UTC (rev 7790) @@ -752,7 +752,10 @@ } } - addAllToAssociated(selectedList); + for (String choice : selectedList) + { + aPC.addAssociation(this, choice); + } return true; } Modified: Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityClassSkills.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityClassSkills.java 2008-09-25 20:40:47 UTC (rev 7789) +++ Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityClassSkills.java 2008-09-26 00:31:45 UTC (rev 7790) @@ -318,7 +318,10 @@ } } - addAllToAssociated(selectedList); + for (String choice : selectedList) + { + aPC.addAssociation(this, choice); + } return true; } } Modified: Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityFeat.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityFeat.java 2008-09-25 20:40:47 UTC (rev 7789) +++ Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityFeat.java 2008-09-26 00:31:45 UTC (rev 7790) @@ -110,7 +110,7 @@ AbilityUtilities.modFeat(aPC, null, featKey, false, false); } - clearAssociated(); + aPC.removeAllAssociations(this); } } Modified: Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilitySpellCaster.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilitySpellCaster.java 2008-09-25 20:40:47 UTC (rev 7789) +++ Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilitySpellCaster.java 2008-09-26 00:31:45 UTC (rev 7790) @@ -132,7 +132,10 @@ theClass.setLevel(theClass.getLevel(), aPC); - addAllToAssociated(selectedList); + for (String choice : selectedList) + { + aPC.addAssociation(this, choice); + } } return true; } Modified: Trunk/pcgen/code/src/java/pcgen/core/prereq/PrerequisiteUtilities.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/prereq/PrerequisiteUtilities.java 2008-09-25 20:40:47 UTC (rev 7789) +++ Trunk/pcgen/code/src/java/pcgen/core/prereq/PrerequisiteUtilities.java 2008-09-26 00:31:45 UTC (rev 7790) @@ -332,7 +332,7 @@ else { if (aFeat.getKeyName().equalsIgnoreCase(key) - && aFeat.containsAssociated(subKey)) + && character.containsAssociated(aFeat, subKey)) { runningTotal++; if (aFeat.getSafe(ObjectKey.MULTIPLE_ALLOWED) && countMults) Modified: Trunk/pcgen/code/src/java/pcgen/gui/EqBuilder.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/EqBuilder.java 2008-09-25 20:40:47 UTC (rev 7789) +++ Trunk/pcgen/code/src/java/pcgen/gui/EqBuilder.java 2008-09-26 00:31:45 UTC (rev 7790) @@ -1591,15 +1591,14 @@ { boolean bRebuild = false; final int idx = bPrimary ? 0 : 1; - ArrayList<String> newTypes = null; + List<String> newTypes = null; List<String> oldTypes = newTypeList[idx]; final EquipmentModifier aEqMod = aNewEq.getEqModifierKeyed("ADDTYPE", bPrimary); if (aEqMod != null) { - newTypes = new ArrayList<String>(); - aEqMod.addAssociatedTo(newTypes); + newTypes = aNewEq.getAssociationList(aEqMod); } if (((oldTypes == null) && (aEqMod != null)) || ((oldTypes != null) && (aEqMod == null))) @@ -1626,14 +1625,7 @@ } } - if (newTypes != null) - { - newTypeList[idx] = (ArrayList) newTypes.clone(); - } - else - { - newTypeList[idx] = null; - } + newTypeList[idx] = newTypes; return bRebuild; } @@ -1644,12 +1636,10 @@ if (eqMod != null) { - if (eqMod.removeAssociated(addedType)) + aNewEq.removeAssociation(eqMod, addedType); + if (!aNewEq.hasAssociations(eqMod)) { - if (!aNewEq.hasAssociations(eqMod)) - { - aNewEq.removeEqModifier(eqMod, true, aPC); - } + aNewEq.removeEqModifier(eqMod, true, aPC); } } } Modified: Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoSpecialAbilities.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoSpecialAbilities.java 2008-09-25 20:40:47 UTC (rev 7789) +++ Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoSpecialAbilities.java 2008-09-26 00:31:45 UTC (rev 7790) @@ -551,7 +551,7 @@ boolean addLang = false; if ((speakLanguage != null) - && speakLanguage.containsAssociated(aLang.getKeyName())) + && pc.containsAssociated(speakLanguage, aLang.getKeyName())) { addLang = false; } Modified: Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoTempMod.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoTempMod.java 2008-09-25 20:40:47 UTC (rev 7789) +++ Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoTempMod.java 2008-09-26 00:31:45 UTC (rev 7790) @@ -2534,7 +2534,7 @@ // iterate thru all PC's equipment objects for (Equipment aEq : pc.getEquipmentList()) { - for (BonusObj aBonus : aEq.getBonusList()) + for (BonusObj aBonus : aEq.getBonusList(pc)) { if (aBonus.isTempBonus()) { Modified: Trunk/pcgen/code/src/java/pcgen/io/PCGIOHandler.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/PCGIOHandler.java 2008-09-25 20:40:47 UTC (rev 7789) +++ Trunk/pcgen/code/src/java/pcgen/io/PCGIOHandler.java 2008-09-26 00:31:45 UTC (rev 7790) @@ -371,6 +371,7 @@ for (int i = 0; i < aPC.getAssociationCount(aFeat); i++) { String aString = aFeat.getAssociated(i); + String orig = aString; final String prefix = aString + "|"; boolean bLoop = true; @@ -448,7 +449,8 @@ } } - aFeat.setAssociated(i, aString); + aPC.removeAssociation(aFeat, orig); + aPC.addAssociation(aFeat, aString); } } } Modified: Trunk/pcgen/code/src/java/pcgen/io/PCGVer0Parser.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/PCGVer0Parser.java 2008-09-25 20:40:47 UTC (rev 7789) +++ Trunk/pcgen/code/src/java/pcgen/io/PCGVer0Parser.java 2008-09-26 00:31:45 UTC (rev 7790) @@ -703,8 +703,11 @@ if (sSource.startsWith("LIST|")) { - aDomain.addAllToAssociated(CoreUtility - .split(sSource.substring(5), '|')); + for (String choice : CoreUtility.split(sSource + .substring(5), '|')) + { + aPC.addAssociation(aDomain, choice); + } } else { @@ -1233,7 +1236,7 @@ aPC.addWeaponProf(aString); } else if ((anAbility.getSafe(ObjectKey.MULTIPLE_ALLOWED) && anAbility.getSafe(ObjectKey.STACKS)) - || !anAbility.containsAssociated(aString)) + || !aPC.containsAssociated(anAbility, aString)) { aPC.addAssociation(anAbility, aString); } Modified: Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Parser.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Parser.java 2008-09-25 20:40:47 UTC (rev 7789) +++ Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Parser.java 2008-09-26 00:31:45 UTC (rev 7790) @@ -2379,7 +2379,7 @@ } } else if ((ability.getSafe(ObjectKey.MULTIPLE_ALLOWED) && ability.getSafe(ObjectKey.STACKS)) - || !ability.containsAssociated(appliedToKey)) + || !thePC.containsAssociated(ability, appliedToKey)) { String[] assoc = appliedToKey.split(Constants.COMMA, -1); for (String string : assoc) @@ -2650,7 +2650,7 @@ } } else if ((aFeat.getSafe(ObjectKey.MULTIPLE_ALLOWED) && aFeat.getSafe(ObjectKey.STACKS)) - || !aFeat.containsAssociated(appliedToKey)) + || !thePC.containsAssociated(aFeat, appliedToKey)) { thePC.addAssociation(aFeat, appliedToKey); } @@ -5569,7 +5569,10 @@ } else { - la.addAllToAssociated(choiceList); + for (String choice : choiceList) + { + thePC.addAssociation(la, choice); + } } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jde...@us...> - 2008-09-27 12:23:22
|
Revision: 7804 http://pcgen.svn.sourceforge.net/pcgen/?rev=7804&view=rev Author: jdempsey Date: 2008-09-27 12:23:14 +0000 (Sat, 27 Sep 2008) Log Message: ----------- Fix bug: Duplicate objects loaded when PCC files used more than once Issue#: 2132120 Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/Campaign.java Trunk/pcgen/code/src/java/pcgen/persistence/lst/CampaignLoader.java Modified: Trunk/pcgen/code/src/java/pcgen/core/Campaign.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Campaign.java 2008-09-27 11:58:41 UTC (rev 7803) +++ Trunk/pcgen/code/src/java/pcgen/core/Campaign.java 2008-09-27 12:23:14 UTC (rev 7804) @@ -68,6 +68,7 @@ private boolean isOGL; private boolean isMature; private boolean showInMenu; + private boolean isInitted; /** * Constructor @@ -1192,6 +1193,23 @@ } /** + * @return Has the campaign been initialised? + */ + public boolean isInitted() + { + return isInitted; + } + + /** + * Set the campaign initialised flag. + * @param isInitted The new flag value + */ + public void setInitted(boolean isInitted) + { + this.isInitted = isInitted; + } + + /** * Sets whether this campaign is licensed. * @param isLicensed */ Modified: Trunk/pcgen/code/src/java/pcgen/persistence/lst/CampaignLoader.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/persistence/lst/CampaignLoader.java 2008-09-27 11:58:41 UTC (rev 7803) +++ Trunk/pcgen/code/src/java/pcgen/persistence/lst/CampaignLoader.java 2008-09-27 12:23:14 UTC (rev 7804) @@ -217,11 +217,13 @@ private void initRecursivePccFiles(Campaign baseCampaign) throws PersistenceLayerException { - if (baseCampaign == null) + if (baseCampaign == null || baseCampaign.isInitted()) { return; } + baseCampaign.setInitted(true); + // Add all sub-files to the main campaign, regardless of exclusions for (URI fName : baseCampaign.getPccFiles()) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-09-29 02:06:48
|
Revision: 7832 http://pcgen.svn.sourceforge.net/pcgen/?rev=7832&view=rev Author: thpr Date: 2008-09-29 02:06:41 +0000 (Mon, 29 Sep 2008) Log Message: ----------- cleanup & dead code removal Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/io/PCGIOHandler.java Trunk/pcgen/code/src/java/pcgen/io/PCGVer0Parser.java Trunk/pcgen/code/src/java/pcgen/persistence/lst/CampaignOutput.java Modified: Trunk/pcgen/code/src/java/pcgen/io/PCGIOHandler.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/PCGIOHandler.java 2008-09-29 02:03:52 UTC (rev 7831) +++ Trunk/pcgen/code/src/java/pcgen/io/PCGIOHandler.java 2008-09-29 02:06:41 UTC (rev 7832) @@ -25,22 +25,32 @@ */ package pcgen.io; +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.util.ArrayList; +import java.util.List; +import java.util.StringTokenizer; + import pcgen.cdom.base.Constants; import pcgen.cdom.enumeration.ObjectKey; -import pcgen.core.*; +import pcgen.core.Ability; +import pcgen.core.AbilityCategory; +import pcgen.core.Globals; +import pcgen.core.PCClass; +import pcgen.core.PlayerCharacter; +import pcgen.core.SettingsHandler; +import pcgen.core.SpecialAbility; import pcgen.core.utils.MessageType; import pcgen.core.utils.ShowMessageDelegate; -import pcgen.persistence.PersistenceLayerException; -import pcgen.persistence.lst.PObjectLoader; import pcgen.util.InputFactory; import pcgen.util.InputInterface; import pcgen.util.Logging; -import java.io.*; -import java.util.ArrayList; -import java.util.List; -import java.util.StringTokenizer; - /** * <code>PCGIOHandler</code><br> * Reading and Writing PlayerCharacters in PCGen's own format (PCG). @@ -460,14 +470,8 @@ // for (String skillString : currentPC.getAssociationList(aFeat)) { - try - { - PObjectLoader.parseTag(aFeat, "CSKILL:" + skillString); - } - catch (PersistenceLayerException e) - { - e.printStackTrace(); - } + Globals.getContext().unconditionallyProcess(aFeat, + "CSKILL", skillString); } } Modified: Trunk/pcgen/code/src/java/pcgen/io/PCGVer0Parser.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/PCGVer0Parser.java 2008-09-29 02:03:52 UTC (rev 7831) +++ Trunk/pcgen/code/src/java/pcgen/io/PCGVer0Parser.java 2008-09-29 02:06:41 UTC (rev 7832) @@ -1660,16 +1660,6 @@ aObject = aClass; } - if (aObject == null) - { - final String message = - "Bad spell info - no class or domain named " - + domainKey; - warnings.add(message); - - continue; - } - int sLevel = aSpell.getFirstLevelForKey(aObject.getSpellKey(), aPC); if (sLevel == -1) Modified: Trunk/pcgen/code/src/java/pcgen/persistence/lst/CampaignOutput.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/persistence/lst/CampaignOutput.java 2008-09-29 02:03:52 UTC (rev 7831) +++ Trunk/pcgen/code/src/java/pcgen/persistence/lst/CampaignOutput.java 2008-09-29 02:06:41 UTC (rev 7832) @@ -116,7 +116,7 @@ for (Iterator<String> i = campaign.getOptionsList().iterator(); i.hasNext();) { FileAccess.write(out, "OPTION:" - + campaign.getOptions().getProperty((String) i.next())); + + campaign.getOptions().getProperty(i.next())); FileAccess.newLine(out); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-09-29 04:23:35
|
Revision: 7834 http://pcgen.svn.sourceforge.net/pcgen/?rev=7834&view=rev Author: thpr Date: 2008-09-29 04:23:27 +0000 (Mon, 29 Sep 2008) Log Message: ----------- Skill refactoring Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java Trunk/pcgen/code/src/java/pcgen/core/Skill.java Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Creator.java Trunk/pcgen/code/src/java/pcgen/io/exporttoken/SkillpointsToken.java Added Paths: ----------- Trunk/pcgen/code/src/java/pcgen/base/util/NamedValue.java Added: Trunk/pcgen/code/src/java/pcgen/base/util/NamedValue.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/base/util/NamedValue.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/base/util/NamedValue.java 2008-09-29 04:23:27 UTC (rev 7834) @@ -0,0 +1,47 @@ +/* + * Copyright 2008 (C) Tom 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 pcgen.base.util; + +public final class NamedValue +{ + public final String name; + + private double weight; + + public NamedValue(String s) + { + name = s; + } + + public NamedValue(String s, double d) + { + this(s); + weight = d; + } + + public double getWeight() + { + return weight; + } + + public void addWeight(double d) + { + weight += d; + // CONSIDER what if less than zero? + } +} \ No newline at end of file Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-09-29 04:16:11 UTC (rev 7833) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-09-29 04:23:27 UTC (rev 7834) @@ -57,6 +57,7 @@ import pcgen.base.util.DoubleKeyMap; import pcgen.base.util.FixedStringList; import pcgen.base.util.HashMapToList; +import pcgen.base.util.NamedValue; import pcgen.cdom.base.AssociatedPrereqObject; import pcgen.cdom.base.CDOMObject; import pcgen.cdom.base.CDOMObjectUtilities; @@ -3070,15 +3071,12 @@ final List<Skill> skillList = new ArrayList<Skill>(getSkillList()); for (Skill aSkill : skillList) { - for (String bSkill : aSkill.getRankList()) + for (NamedValue sd : aSkill.getRankList()) { - final int iOffs = bSkill.indexOf(':'); - final double curRank = - Double.parseDouble(bSkill.substring(iOffs + 1)); - final PCClass pcClass = - getClassKeyed(bSkill.substring(0, iOffs)); + final PCClass pcClass = getClassKeyed(sd.name); if (pcClass != null) { + final double curRank = sd.getWeight(); // Only add the cost for skills associated with a class. // Skill ranks from feats etc are free. final int cost = this.getSkillCostForClass(aSkill, pcClass).getCost(); Modified: Trunk/pcgen/code/src/java/pcgen/core/Skill.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Skill.java 2008-09-29 04:16:11 UTC (rev 7833) +++ Trunk/pcgen/code/src/java/pcgen/core/Skill.java 2008-09-29 04:23:27 UTC (rev 7834) @@ -28,6 +28,7 @@ import java.util.StringTokenizer; import pcgen.base.lang.StringUtil; +import pcgen.base.util.NamedValue; import pcgen.cdom.base.Constants; import pcgen.cdom.base.TransitionChoice; import pcgen.cdom.enumeration.ListKey; @@ -42,8 +43,6 @@ import pcgen.core.utils.MessageType; import pcgen.core.utils.ShowMessageDelegate; import pcgen.util.Logging; -import pcgen.util.chooser.ChooserFactory; -import pcgen.util.chooser.ChooserInterface; /** * <code>Skill</code>. @@ -53,7 +52,7 @@ */ public final class Skill extends PObject { - private List<String> rankList = new ArrayList<String>(); + private List<NamedValue> ranks = new ArrayList<NamedValue>(); private int outputIndex = 0; @@ -98,15 +97,9 @@ { double rank = 0.0; - for (int i = 0; i < rankList.size(); i++) + for (NamedValue sd : ranks) { - final String bSkill = rankList.get(i); - final int iOffs = bSkill.indexOf(':'); - - // - // Ignore -1 return code (as -1 + 1 = 0 and that's the start of the string) - // - rank += Double.parseDouble(bSkill.substring(iOffs + 1)); + rank += sd.getWeight(); } return new Float(rank); @@ -116,9 +109,9 @@ * Get list of ranks * @return rankList */ - public List<String> getRankList() + public List<NamedValue> getRankList() { - return rankList; + return ranks; } /** @@ -199,37 +192,23 @@ } final String aCName = aClass.getKeyName(); - String bSkill = ""; - int idx; - - // - // Find the skill and class in question - // - final String aCNameString = aCName + ":"; - - for (idx = 0; idx < rankList.size(); idx++) + for (Iterator<NamedValue> i = ranks.iterator(); i.hasNext();) { - bSkill = rankList.get(idx); - - if (bSkill.startsWith(aCNameString)) + NamedValue sd = i.next(); + if (sd.name.equals(aCName)) { + i.remove(); + double curRankCost = sd.getWeight(); + final String aResp = modRanks(-curRankCost, aClass, false, aPC); + + if (aResp.length() != 0) + { + // error or debug? XXX + Logging.debugPrint(aResp); + } break; } } - - if (idx >= rankList.size()) - { - return; - } - - final double curRankCost = Double.parseDouble(bSkill.substring(aCName.length() + 1)); - final String aResp = modRanks(-curRankCost, aClass, false, aPC); - - if (aResp.length() != 0) - { - // error or debug? XXX - Logging.debugPrint(aResp); - } } @Override @@ -240,7 +219,9 @@ try { newSkill = (Skill) super.clone(); - newSkill.rankList = new ArrayList<String>(rankList); + /* + * TODO Deep clone ranks + */ newSkill.outputIndex = outputIndex; } catch (CloneNotSupportedException exc) @@ -331,64 +312,35 @@ classKey = aClass.getKeyName(); } - String bSkill = ""; - int idx; - - // - // Find the skill and class in question - // - final String classKeyString = classKey + ":"; - - for (idx = 0; idx < rankList.size(); idx++) + double currentRank = 0.0; + double noneRank = 0.0; + NamedValue active = null; + for (Iterator<NamedValue> it = ranks.iterator(); it.hasNext();) { - bSkill = rankList.get(idx); - - if (bSkill.startsWith(classKeyString)) + NamedValue sd = it.next(); + if (sd.name.equals(classKey)) { + currentRank = sd.getWeight(); + active = sd; break; } - } - - if (idx >= rankList.size()) - { - // - // If we are trying to lower a rank, and we happen to be using an older - // character we've loaded, check to see if there is a value for class "None" - // and allow the user to modify this. - // - if (rankMod < 0.0) + else if (sd.name.equals("None")) { - for (idx = 0; idx < rankList.size(); idx++) - { - bSkill = rankList.get(idx); - - if (bSkill.startsWith("None:")) - { - break; - } - } + noneRank = sd.getWeight(); } - - if (idx >= rankList.size()) - { - bSkill = classKey + ":0"; - } } - - final int iOffs = bSkill.indexOf(':'); - final double curRank = Double.parseDouble(bSkill.substring(iOffs + 1)); - - if (CoreUtility.doublesEqual(curRank, 0.0) && (rankMod < 0.0)) + + if (currentRank <= 0) { - return "No more ranks found for class: " + classKey + ". Try a different one."; + currentRank = noneRank; } - if (idx >= rankList.size()) + if (CoreUtility.doublesEqual(currentRank, 0.0) && (rankMod < 0.0)) { - rankList.add(idx, bSkill); + return "No more ranks found for class: " + classKey + ". Try a different one."; } - rankMod = modRanks2(rankMod, idx, bSkill, aPC); + rankMod = modRanks2(rankMod, currentRank, active, classKey, aPC); if (!ignorePrereqs) { @@ -425,23 +377,20 @@ void replaceClassRank(final String oldClass, final String newClass) { - final String oldClassString = oldClass + ":"; - - for (int i = 0; i < rankList.size(); i++) + for (Iterator<NamedValue> i = ranks.iterator(); i.hasNext();) { - final String bSkill = rankList.get(i); - - if (bSkill.startsWith(oldClassString)) + NamedValue sd = i.next(); + if (sd.name.equals(oldClass)) { - rankList.set(i, newClass + bSkill.substring(oldClass.length())); + i.remove(); + ranks.add(new NamedValue(newClass, sd.getWeight())); + break; } } } - private double modRanks2(double g, final int idx, String bSkill, final PlayerCharacter aPC) + private double modRanks2(double g, final double curRank, NamedValue active, String classKey, final PlayerCharacter aPC) { - final int iOffs = bSkill.indexOf(':'); - final double curRank = Double.parseDouble(bSkill.substring(iOffs + 1)); // current rank for currently selected class double newRank = curRank + g; if (!aPC.isImporting()) @@ -461,8 +410,7 @@ if (choiceString.startsWith("Language")) { - bSkill = bSkill.substring(0, iOffs + 1) + newRank; - rankList.set(idx, bSkill); + active.addWeight(g); if (!SkillLanguage.chooseLanguageForSkill(aPC, this)) { @@ -481,27 +429,6 @@ g = newRank - curRank; } - else - { - // TODO This code doesn't seem to do anything real. - // It passes empty lists as both available and selected. - final ChooserInterface c = ChooserFactory.getChooserInstance(); - - if (title.length() != 0) - { - c.setTitle(title); - } - - c.setTotalChoicesAvail((int) (g + curRank + rankAdjustment)); - c.setPoolFlag(false); - c.setAvailableList(new ArrayList<String>()); - c.setSelectedList(aPC.getAssociationList(this)); - c.setVisible(true); - - final int selectedListSize = c.getSelectedList().size(); - newRank = selectedListSize - rankAdjustment; - g = newRank - getRank().doubleValue(); // change in ranks - } } } @@ -510,12 +437,15 @@ // if (CoreUtility.doublesEqual(newRank, 0.0)) { - rankList.remove(idx); + ranks.remove(active); } + else if (active != null) + { + active.addWeight(g); + } else { - bSkill = bSkill.substring(0, iOffs + 1) + newRank; - rankList.set(idx, bSkill); + ranks.add(new NamedValue(classKey, g)); } aPC.calcActiveBonuses(); Modified: Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Creator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Creator.java 2008-09-29 04:16:11 UTC (rev 7833) +++ Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Creator.java 2008-09-29 04:23:27 UTC (rev 7834) @@ -37,6 +37,7 @@ import pcgen.base.lang.StringUtil; import pcgen.base.util.FixedStringList; +import pcgen.base.util.NamedValue; import pcgen.cdom.base.CDOMListObject; import pcgen.cdom.base.CDOMObject; import pcgen.cdom.base.CDOMReference; @@ -1958,21 +1959,17 @@ buffer.append(skill.getOutputIndex()); buffer.append('|'); - for (String classRanks : skill.getRankList()) + for (NamedValue sd: skill.getRankList()) { - int index = classRanks.indexOf(':'); - final String className = classRanks.substring(0, index); - final String ranks = classRanks.substring(index + 1); + final PCClass pcClass = thePC.getClassKeyed(sd.name); - final PCClass pcClass = thePC.getClassKeyed(className); - buffer.append(TAG_CLASSBOUGHT).append(':'); buffer.append('['); buffer.append(TAG_CLASS).append(':'); - buffer.append(EntityEncoder.encode(className)); + buffer.append(EntityEncoder.encode(sd.name)); buffer.append('|'); buffer.append(TAG_RANKS).append(':'); - buffer.append(ranks); + buffer.append(sd.getWeight()); buffer.append('|'); buffer.append(TAG_COST).append(':'); buffer.append(Integer.toString(thePC.getSkillCostForClass(skill, pcClass).getCost())); Modified: Trunk/pcgen/code/src/java/pcgen/io/exporttoken/SkillpointsToken.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/exporttoken/SkillpointsToken.java 2008-09-29 04:16:11 UTC (rev 7833) +++ Trunk/pcgen/code/src/java/pcgen/io/exporttoken/SkillpointsToken.java 2008-09-29 04:23:27 UTC (rev 7834) @@ -25,6 +25,12 @@ */ package pcgen.io.exporttoken; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; +import java.util.StringTokenizer; + +import pcgen.base.util.NamedValue; import pcgen.core.PCClass; import pcgen.core.PlayerCharacter; import pcgen.core.Skill; @@ -32,11 +38,6 @@ import pcgen.util.BigDecimalHelper; import pcgen.util.Logging; -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.List; -import java.util.StringTokenizer; - /** * Deal with the Tokens: * @@ -181,16 +182,10 @@ if ((aSkill.getRank().doubleValue() > 0) || (aSkill.getOutputIndex() != 0)) { - for (String classRanks : aSkill.getRankList()) + for (NamedValue sd : aSkill.getRankList()) { - int index = classRanks.indexOf(':'); - String className = classRanks.substring(0, index); - float ranks = - Float.valueOf(classRanks.substring(index + 1)) - .floatValue(); - PCClass pcClass = pc.getClassKeyed(className); - - usedPoints += (ranks * pc.getSkillCostForClass(aSkill, pcClass).getCost()); + PCClass pcClass = pc.getClassKeyed(sd.name); + usedPoints += (sd.getWeight() * pc.getSkillCostForClass(aSkill, pcClass).getCost()); } } } @@ -217,17 +212,12 @@ if ((aSkill.getRank().doubleValue() > 0) || (aSkill.getOutputIndex() != 0)) { - for (String classRanks : aSkill.getRankList()) + for (NamedValue sd : aSkill.getRankList()) { - int index = classRanks.indexOf(':'); - String className = classRanks.substring(0, index); - float ranks = - Float.valueOf(classRanks.substring(index + 1)) - .floatValue(); - PCClass pcClass = pc.getClassKeyed(className); + PCClass pcClass = pc.getClassKeyed(sd.name); if (targetClass == pcClass) { - usedPoints += (ranks * pc.getSkillCostForClass(aSkill, pcClass).getCost()); + usedPoints += (sd.getWeight() * pc.getSkillCostForClass(aSkill, pcClass).getCost()); } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-10-01 23:29:42
|
Revision: 7863 http://pcgen.svn.sourceforge.net/pcgen/?rev=7863&view=rev Author: thpr Date: 2008-10-01 23:29:39 +0000 (Wed, 01 Oct 2008) Log Message: ----------- EQMod refactoring Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/EqModNameOpt.java Trunk/pcgen/code/src/java/pcgen/core/Equipment.java Trunk/pcgen/code/src/java/pcgen/core/EquipmentChoice.java Trunk/pcgen/code/src/java/pcgen/core/EquipmentList.java Trunk/pcgen/code/src/java/pcgen/core/EquipmentModifier.java Trunk/pcgen/code/src/java/pcgen/gui/EqBuilder.java Added Paths: ----------- Trunk/pcgen/code/src/java/pcgen/core/analysis/EqModCost.java Trunk/pcgen/code/src/java/pcgen/core/analysis/EqModSpellInfo.java Trunk/pcgen/code/src/java/pcgen/core/analysis/EquipmentChoiceDriver.java Modified: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/EqModNameOpt.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/EqModNameOpt.java 2008-10-01 23:17:14 UTC (rev 7862) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/EqModNameOpt.java 2008-10-01 23:29:39 UTC (rev 7863) @@ -29,6 +29,7 @@ import pcgen.core.EquipmentModifier; import pcgen.core.Globals; import pcgen.core.SettingsHandler; +import pcgen.core.analysis.EqModSpellInfo; import pcgen.core.spell.Spell; import pcgen.core.utils.CoreUtility; @@ -111,7 +112,7 @@ } first = false; - String spellName = EquipmentModifier.getSpellInfoString( + String spellName = EqModSpellInfo.getSpellInfoString( listEntry, "SPELLNAME"); if (SettingsHandler.guiUsesOutputNameSpells()) @@ -126,7 +127,7 @@ sb.append(spellName); - final String info = EquipmentModifier.getSpellInfoString( + final String info = EqModSpellInfo.getSpellInfoString( listEntry, "VARIANT"); if (info.length() != 0) @@ -134,7 +135,7 @@ sb.append(" (").append(info).append(')'); } - String metaFeat = EquipmentModifier.getSpellInfoString( + String metaFeat = EqModSpellInfo.getSpellInfoString( listEntry, "METAFEATS"); List<String> metaFeats = CoreUtility.split(metaFeat, ','); @@ -144,10 +145,10 @@ } sb.append('/').append( - EquipmentModifier.getSpellInfoString(listEntry, + EqModSpellInfo.getSpellInfoString(listEntry, "CASTER")); sb.append('/').append( - CoreUtility.ordinal(EquipmentModifier.getSpellInfo( + CoreUtility.ordinal(EqModSpellInfo.getSpellInfo( listEntry, "CASTERLEVEL"))); } Modified: Trunk/pcgen/code/src/java/pcgen/core/Equipment.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Equipment.java 2008-10-01 23:17:14 UTC (rev 7862) +++ Trunk/pcgen/code/src/java/pcgen/core/Equipment.java 2008-10-01 23:29:39 UTC (rev 7863) @@ -56,6 +56,9 @@ import pcgen.cdom.modifier.ChangeArmorType; import pcgen.cdom.reference.CDOMDirectSingleRef; import pcgen.cdom.reference.CDOMSingleRef; +import pcgen.core.analysis.EqModCost; +import pcgen.core.analysis.EqModSpellInfo; +import pcgen.core.analysis.EquipmentChoiceDriver; import pcgen.core.bonus.BonusObj; import pcgen.core.character.WieldCategory; import pcgen.core.prereq.PrereqHandler; @@ -704,8 +707,7 @@ final BigDecimal eqModCost = new BigDecimal(bc.toString()); c = c.add(eqModCost.multiply(new BigDecimal(Integer .toString(getSafe(IntegerKey.BASE_QUANTITY) * iCount)))); - c = c.add(eqMod.addItemCosts(aPC, "ITEMCOST", - getSafe(IntegerKey.BASE_QUANTITY) * iCount, this)); + c = c.add(EqModCost.addItemCosts(eqMod, aPC, "ITEMCOST", getSafe(IntegerKey.BASE_QUANTITY) * iCount, this)); } for (EquipmentModifier eqMod : altEqModifierList) { @@ -720,7 +722,7 @@ final BigDecimal eqModCost = new BigDecimal(bc.toString()); c = c.add(eqModCost.multiply(new BigDecimal(Integer .toString(getSafe(IntegerKey.BASE_QUANTITY) * iCount)))); - c = c.add(eqMod.addItemCosts(aPC, "ITEMCOST", iCount, this)); + c = c.add(EqModCost.addItemCosts(eqMod, aPC, "ITEMCOST", iCount, this)); } // @@ -771,12 +773,12 @@ Matcher mat; if (hasAssociations(eqMod) - && !costFormula.equals(eqMod.getCost(getFirstAssociation(eqMod)))) { + && !costFormula.equals(EqModCost.getCost(eqMod, getFirstAssociation(eqMod)))) { eqModCost = BigDecimal.ZERO; for (String assoc : getAssociationList(eqMod)) { - mat = pat.matcher(eqMod.getCost(assoc)); + mat = pat.matcher(EqModCost.getCost(eqMod, assoc)); costFormula = mat.replaceAll("(BASECOST/" + getSafe(IntegerKey.BASE_QUANTITY) + ")"); @@ -786,7 +788,7 @@ eqModCost = eqModCost.add(thisModCost); - if (!eqMod.getCostDouble()) { + if (!EqModCost.getCostDouble(eqMod)) { nonDoubleCost = nonDoubleCost.add(thisModCost); } else { modifierCosts.add(thisModCost); @@ -801,7 +803,7 @@ eqModCost = new BigDecimal(getVariableValue(costFormula, "", true, aPC).toString()); - if (!eqMod.getCostDouble()) { + if (!EqModCost.getCostDouble(eqMod)) { nonDoubleCost = nonDoubleCost.add(eqModCost); } else { modifierCosts.add(eqModCost); @@ -1829,7 +1831,7 @@ for (EquipmentModifier eqMod : getEqModifierList(true)) { Integer min = eqMod.get(IntegerKey.MIN_CHARGES); if (min != null && min > 0) { - eqMod.setRemainingCharges(this, remainingCharges); + EqModSpellInfo.setRemainingCharges(this, eqMod, remainingCharges); } } } @@ -1843,7 +1845,7 @@ for (EquipmentModifier eqMod : getEqModifierList(true)) { Integer min = eqMod.get(IntegerKey.MIN_CHARGES); if (min != null && min > 0) { - return eqMod.getRemainingCharges(this); + return EqModSpellInfo.getRemainingCharges(this, eqMod); } } @@ -2010,7 +2012,7 @@ for (EquipmentModifier eqMod : getEqModifierList(true)) { Integer min = eqMod.get(IntegerKey.MIN_CHARGES); if (min != null && min > 0) { - return eqMod.getUsedCharges(this); + return EqModSpellInfo.getUsedCharges(this, eqMod); } } @@ -2414,10 +2416,10 @@ boolean allRemoved = false; if (selectedChoice != null && selectedChoice.length() > 0) { if (!eqMod.getChoiceString().startsWith("EQBUILDER.")) { - aMod.setChoice(this, selectedChoice, equipChoice); + EquipmentChoiceDriver.setChoice(this, aMod, selectedChoice, equipChoice); allRemoved = !hasAssociations(aMod); } - } else if (!aMod.getChoice(1, this, true, aPC)) { + } else if (!EquipmentChoiceDriver.getChoice(1, this, aMod, true, aPC)) { allRemoved = true; } @@ -3237,7 +3239,7 @@ // Get a response from user (if one required) // Remove the modifier if all associated choices are deleted if (!hasAssociations(aMod) - || !aMod.getChoice(0, this, false, aPC)) { + || !EquipmentChoiceDriver.getChoice(0, this, aMod, false, aPC)) { eqModList.remove(aMod); if (bPrimary) { typeListCachePrimary = null; Modified: Trunk/pcgen/code/src/java/pcgen/core/EquipmentChoice.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/EquipmentChoice.java 2008-10-01 23:17:14 UTC (rev 7862) +++ Trunk/pcgen/code/src/java/pcgen/core/EquipmentChoice.java 2008-10-01 23:29:39 UTC (rev 7863) @@ -46,7 +46,7 @@ * @version $Revision$ */ -final class EquipmentChoice +public final class EquipmentChoice { private boolean allowDuplicates = false; private boolean noSign = false; @@ -141,7 +141,7 @@ /** * @return Returns the bAdd. */ - final boolean isBAdd() + public final boolean isBAdd() { return bAdd; } @@ -155,7 +155,7 @@ /** * @return Returns the availableList. */ - final List<String> getAvailableList() + public final List<String> getAvailableList() { return availableList; } @@ -163,7 +163,7 @@ /** * @return Returns the allowDuplicates. */ - final boolean isAllowDuplicates() + public final boolean isAllowDuplicates() { return allowDuplicates; } @@ -177,7 +177,7 @@ /** * @return Returns the incValue. */ - final int getIncValue() + public final int getIncValue() { return incValue; } @@ -191,7 +191,7 @@ /** * @return Returns the maxSelect. */ - final int getMaxSelect() + public final int getMaxSelect() { return maxSelect; } @@ -205,7 +205,7 @@ /** * @return Returns the maxValue. */ - final int getMaxValue() + public final int getMaxValue() { return maxValue; } @@ -219,7 +219,7 @@ /** * @return Returns the minValue. */ - final int getMinValue() + public final int getMinValue() { return minValue; } @@ -247,7 +247,7 @@ /** * @return Returns the title. */ - final String getTitle() + public final String getTitle() { return title; } Modified: Trunk/pcgen/code/src/java/pcgen/core/EquipmentList.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/EquipmentList.java 2008-10-01 23:17:14 UTC (rev 7862) +++ Trunk/pcgen/code/src/java/pcgen/core/EquipmentList.java 2008-10-01 23:29:39 UTC (rev 7863) @@ -33,6 +33,7 @@ import pcgen.cdom.base.Constants; import pcgen.cdom.enumeration.FormulaKey; import pcgen.cdom.enumeration.ObjectKey; +import pcgen.core.analysis.EquipmentChoiceDriver; import pcgen.core.prereq.PrereqHandler; import pcgen.core.utils.CoreUtility; import pcgen.util.Delta; @@ -467,7 +468,7 @@ } // Get list of choices - final EquipmentChoice equipChoice = eqMod.buildEquipmentChoice(0, eq, false, false, 0, null); + final EquipmentChoice equipChoice = EquipmentChoiceDriver.buildEquipmentChoice(0, eq, eqMod, false, false, 0, null); // Iterate over list, creating an item for each choice. final Iterator<String> equipIter = equipChoice.getChoiceIterator(true); @@ -513,7 +514,7 @@ final EquipmentModifier eqMasterwork = getQualifiedModifierNamed("Masterwork", eq); // Get list of choices (extract code from EquipmentModifier.getChoice) - final EquipmentChoice equipChoice = eqMasterwork.buildEquipmentChoice(0, eq, false, false, 0, null); + final EquipmentChoice equipChoice = EquipmentChoiceDriver.buildEquipmentChoice(0, eq, eqMasterwork, false, false, 0, null); // Iterate over list, creating an item for each choice. final Iterator<String> equipIter = equipChoice.getChoiceIterator(true); Modified: Trunk/pcgen/code/src/java/pcgen/core/EquipmentModifier.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/EquipmentModifier.java 2008-10-01 23:17:14 UTC (rev 7862) +++ Trunk/pcgen/code/src/java/pcgen/core/EquipmentModifier.java 2008-10-01 23:29:39 UTC (rev 7863) @@ -25,32 +25,22 @@ */ package pcgen.core; -import java.math.BigDecimal; import java.util.ArrayList; -import java.util.HashSet; import java.util.List; -import java.util.Set; -import java.util.StringTokenizer; import pcgen.base.formula.Formula; import pcgen.cdom.base.Constants; import pcgen.cdom.base.FormulaFactory; import pcgen.cdom.content.SpellResistance; -import pcgen.cdom.enumeration.FormulaKey; -import pcgen.cdom.enumeration.IntegerKey; import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; -import pcgen.cdom.enumeration.StringKey; import pcgen.core.bonus.Bonus; import pcgen.core.bonus.BonusObj; import pcgen.core.prereq.PrereqHandler; import pcgen.core.prereq.Prerequisite; -import pcgen.core.spell.Spell; import pcgen.core.utils.MessageType; import pcgen.core.utils.ShowMessageDelegate; import pcgen.util.Delta; -import pcgen.util.chooser.ChooserFactory; -import pcgen.util.chooser.ChooserInterface; /** * Definition and games rules for an equipment modifier. @@ -60,7 +50,6 @@ */ public final class EquipmentModifier extends PObject implements Comparable<Object> { - private static final String s_CHARGES = "CHARGES"; private static final Formula CHOICE_FORMULA = FormulaFactory.getFormulaFor("%CHOICE"); /** @@ -231,78 +220,6 @@ } /** - * Here be dragons - * - * Builds up a big mad string representing the spell info and then stores - * it in the first entry of associated. - * - * TODO store this a separate fields or as a spell object or some other - * way that doesn't involve turning this into a string and then parsing - * the string when we want to do something with the info. - * @param parent TODO - * @param spellCastingClass a PCClass Object, the class that this spell will be cast as - * @param theSpell a Spell Object - * @param spellVariant a string - * @param spellType arcane, divine, etc. - * @param spellLevel an int the level of the spell - * @param spellCasterLevel Caster level the spell is cast at - * @param spellMetamagicFeats Any metamagic feats applied - * @param charges how many times can it be cast - */ - public void setSpellInfo( - Equipment parent, - final PObject spellCastingClass, - final Spell theSpell, - final String spellVariant, - final String spellType, - final int spellLevel, - final int spellCasterLevel, - final Object[] spellMetamagicFeats, final int charges) - { - final StringBuffer spellInfo = new StringBuffer(100); - spellInfo.append("SPELLNAME[").append(theSpell.getKeyName()).append("] "); - spellInfo.append("CASTER[").append(spellCastingClass.getKeyName()).append("] "); - - if (spellVariant.length() != 0) - { - spellInfo.append("VARIANT[").append(spellVariant).append("] "); - } - - spellInfo.append("SPELLTYPE[").append(spellType).append("] "); - spellInfo.append("SPELLLEVEL[").append(spellLevel).append("] "); - spellInfo.append("CASTERLEVEL[").append(spellCasterLevel).append("] "); - - if (charges > 0) - { - spellInfo.append(s_CHARGES).append('[').append(charges).append("] "); - } - - if ((spellMetamagicFeats != null) && (spellMetamagicFeats.length > 0)) - { - /* Have considered whether this needs to be expanded to include - * Category. These are actually Feats and the information is - * only used by toString()*/ - spellInfo.append("METAFEATS["); - - for (int i = 0; i < spellMetamagicFeats.length; i++) - { - final Ability aFeat = (Ability) spellMetamagicFeats[i]; - - if (i != 0) - { - spellInfo.append(", "); - } - - spellInfo.append(aFeat.getKeyName()); - } - - spellInfo.append("] "); - } - - parent.addAssociation(this, spellInfo.toString()); - } - - /** * Add bonus to * @param aPC * @param aType @@ -373,555 +290,13 @@ } /** - * @param pool - * @param parent - * @param bAdd being added - * @return an integer where apparently (from how it's used) only 0 is significant - */ - boolean getChoice(final int pool, final Equipment parent, final boolean bAdd, PlayerCharacter pc) - { - String choiceString = getChoiceString(); - - if (choiceString.length() == 0) - { - return true; - } - - final boolean forEqBuilder = choiceString.startsWith("EQBUILDER."); - - if (bAdd && forEqBuilder) - { - return true; - } - - final ChooserInterface chooser = ChooserFactory.getChooserInstance(); - chooser.setPoolFlag(false); - chooser.setVisible(false); - List<String> selectedList = parent.getAssociationList(this); - - final EquipmentChoice equipChoice = buildEquipmentChoice( - pool, - parent, - bAdd, - forEqBuilder, - selectedList.size(), - pc); - - if (equipChoice.isBAdd()) - { - chooser.setTotalChoicesAvail(selectedList.size() + equipChoice.getMaxSelect()); - } - else - { - chooser.setTotalChoicesAvail(selectedList.size()); - } - - chooser.setAllowsDups(equipChoice.isAllowDuplicates()); - chooser.setSelectedListTerminator("|"); - chooser.setTitle("Select " + equipChoice.getTitle() + " (" + getDisplayName() + ")"); - Globals.sortChooserLists(equipChoice.getAvailableList(), selectedList); - chooser.setAvailableList(equipChoice.getAvailableList()); - chooser.setSelectedList(selectedList); - chooser.setVisible(true); - - selectedList = chooser.getSelectedList(); - setChoice(parent, selectedList, equipChoice); - - return parent.hasAssociations(this); - } - - void setChoice(Equipment parent, final String choice, final EquipmentChoice equipChoice) - { - final List<String> tempList = new ArrayList<String>(); - tempList.add(choice); - setChoice(parent, tempList, equipChoice); - } - - void setChoice(Equipment parent, final List<String> selectedList, final EquipmentChoice equipChoice) - { - parent.removeAllAssociations(this); - - for (int i = 0; i < selectedList.size(); i++) - { - String aString = selectedList.get(i); - - if (equipChoice.getMinValue() < equipChoice.getMaxValue()) - { - final int idx = aString.indexOf('|'); - - if (idx < 0) - { - final List<String> secondaryChoice = new ArrayList<String>(); - - for ( - int j = equipChoice.getMinValue(); - j <= equipChoice.getMaxValue(); - j += equipChoice.getIncValue()) - { - if (j != 0) - { - secondaryChoice.add(Delta.toString(j)); - } - } - - final ChooserInterface chooser = ChooserFactory.getChooserInstance(); - chooser.setPoolFlag(false); - chooser.setVisible(false); - chooser.setTitle("Select modifier (" + aString + ")"); - chooser.setAvailableList(secondaryChoice); - chooser.setSelectedList(new ArrayList()); - chooser.setTotalChoicesAvail(1); - chooser.setVisible(true); - - if (chooser.getSelectedList().size() == 0) - { - continue; - } - - aString += ('|' + ((String) chooser.getSelectedList().get(0))); - } - } - - if (equipChoice.isAllowDuplicates() || !parent.containsAssociated(this, aString)) - { - parent.addAssociation(this, aString); - } - } - } - - /** - * Build up the details of a required choice - * - * @param pool - * @param parent the equipment this modifer will be applied to - * @param bAdd is a choice being added or removed - * @param forEqBuilder - * @param numSelected - * - * @return A populated EquipmentChoice object - */ - EquipmentChoice buildEquipmentChoice( - final int pool, - final Equipment parent, - final boolean bAdd, - final boolean forEqBuilder, - final int numSelected, - PlayerCharacter pc) - { - final EquipmentChoice equipChoice = new EquipmentChoice(bAdd, pool); - String choiceString = getChoiceString(); - - if (choiceString.length() == 0) - { - return equipChoice; - } - - equipChoice.constructFromChoiceString( - choiceString, - parent, - pool, - numSelected, - forEqBuilder, - pc); - - return equipChoice; - } - - private String replaceCostCasterLevel(String costFormula, final String listEntry) - { - String modChoice = ""; - - while (costFormula.indexOf("%CASTERLEVEL") >= 0) - { - final int idx = costFormula.indexOf("%CASTERLEVEL"); - - if (modChoice.length() == 0) - { - final int iCasterLevel = getSpellInfo(listEntry, "CASTERLEVEL"); - modChoice = Integer.toString(iCasterLevel); - - // - // Tack on the item creation multiplier, if there is one - // - final String castClassKey = getSpellInfoString(listEntry, "CASTER"); - - if (castClassKey.length() != 0) - { - final PCClass castClass = Globals.getContext().ref.silentlyGetConstructedCDOMObject(PCClass.class, castClassKey); - - if (castClass != null) - { - final StringBuffer multiple = new StringBuffer(200); - String aString = castClass.get(StringKey.ITEMCREATE); - - if (aString != null && aString.length() != 0) - { - final StringTokenizer aTok = new StringTokenizer( - aString, - "+-*/()", - true); - - // - // This is to support older versions of the - // ITEMCREATE tag - // that allowed 0.5, because it used to be just a - // multiple - // - if (aTok.countTokens() == 1) - { - multiple.append(iCasterLevel).append('*').append(aString); - } - else - { - while (aTok.hasMoreTokens()) - { - aString = aTok.nextToken(); - - if (aString.equals("CL")) - { - multiple.append(iCasterLevel); - } - else - { - multiple.append(aString); - } - } - } - - modChoice = multiple.toString(); - } - } - } - } - - costFormula = costFormula.substring(0, idx) + "(" + modChoice + ")" + - costFormula.substring(idx + 12); - } - - return costFormula; - } - - private String replaceCostCharges(String costFormula, final String listEntry) - { - String modChoice = ""; - - while (costFormula.indexOf("%" + s_CHARGES) >= 0) - { - final int idx = costFormula.indexOf("%" + s_CHARGES); - - if (modChoice.length() == 0) - { - modChoice = Integer.toString(getSpellInfo(listEntry, s_CHARGES)); - } - - costFormula = costFormula.substring(0, idx) + modChoice + - costFormula.substring(idx + 8); - } - - return costFormula; - } - - private String replaceCostSpellCost(String costFormula, final String listEntry) - { - String modChoice = ""; - - while (costFormula.indexOf("%SPELLCOST") >= 0) - { - final int idx = costFormula.indexOf("%SPELLCOST"); - - if (modChoice.length() == 0) - { - final String spellName = getSpellInfoString(listEntry, "SPELLNAME"); - final Spell aSpell = Globals.getSpellKeyed(spellName); - - if (aSpell != null) - { - modChoice = aSpell.getSafe(ObjectKey.COST).toString(); - } - } - - costFormula = costFormula.substring(0, idx) + modChoice + - costFormula.substring(idx + 10); - } - - return costFormula; - } - - private String replaceCostChoice(String costFormula, final String listEntry) - { - String modChoice = ""; - - while (costFormula.indexOf("%CHOICE") >= 0) - { - final int idx = costFormula.indexOf("%CHOICE"); - - if (modChoice.length() == 0) - { - final int offs = listEntry.lastIndexOf('|'); - int modValue = 0; - - try - { - modValue = Delta.parseInt(listEntry.substring(offs + 1)); - } - catch (NumberFormatException exc) - { - // TODO: Should this really be ignored? - } - - modChoice = Integer.toString(modValue); - } - - costFormula = costFormula.substring(0, idx) + modChoice + - costFormula.substring(idx + 7); - } - - return costFormula; - } - - private String replaceCostSpellXPCost(String costFormula, final String listEntry) - { - String modChoice = ""; - - while (costFormula.indexOf("%SPELLXPCOST") >= 0) - { - final int idx = costFormula.indexOf("%SPELLXPCOST"); - - if (modChoice.length() == 0) - { - final String spellName = getSpellInfoString(listEntry, "SPELLNAME"); - final Spell aSpell = Globals.getSpellKeyed(spellName); - - if (aSpell != null) - { - modChoice = Integer.toString(aSpell.getSafe(IntegerKey.XP_COST)); - } - } - - costFormula = costFormula.substring(0, idx) + modChoice + - costFormula.substring(idx + 12); - } - - return costFormula; - } - - protected String getCost(final String listEntry) - { - String costFormula = getSafe(FormulaKey.COST).toString(); - String modChoice = ""; - - while (costFormula.indexOf("%SPELLLEVEL") >= 0) - { - final int idx = costFormula.indexOf("%SPELLLEVEL"); - - if (modChoice.length() == 0) - { - final int iLevel = getSpellInfo(listEntry, "SPELLLEVEL"); - - if (iLevel == 0) - { - modChoice = "0.5"; - } - else - { - modChoice = Integer.toString(iLevel); - } - } - - costFormula = costFormula.substring(0, idx) + modChoice - + costFormula.substring(idx + 11); - } - - costFormula = replaceCostSpellCost(costFormula, listEntry); - costFormula = replaceCostSpellXPCost(costFormula, listEntry); - costFormula = replaceCostCasterLevel(costFormula, listEntry); - costFormula = replaceCostCharges(costFormula, listEntry); - costFormula = replaceCostChoice(costFormula, listEntry); - - return costFormula; - } - - boolean getCostDouble() - { - // - // Uninitialized? - // - Boolean costdouble = get(ObjectKey.COST_DOUBLE); - if (costdouble == null) - { - if (isType("MagicalEnhancement") || isType("BaseMaterial")) - { - return false; - } - - if (isIType("MAGIC")) - { - return true; - } - - for (Prerequisite preReq : getPrerequisiteList()) - { - if ( - "TYPE".equalsIgnoreCase(preReq.getKind()) && - ( - (preReq.getKey().equalsIgnoreCase( - "EQMODTYPE=MagicalEnhancement")) || - (preReq.getKey().equalsIgnoreCase( - "EQMODTYPE.MagicalEnhancement")) - )) - { - return true; - } - } - return false; - } - - return costdouble; - } - - void setRemainingCharges(Equipment parent, final int remainingCharges) - { - if (parent.hasAssociations(this)) - { - List<String> assoc = parent.removeAllAssociations(this); - String listEntry = assoc.get(0); - String chargeInfo = getSpellInfoString(listEntry, s_CHARGES); - - if (chargeInfo.length() != 0) - { - chargeInfo = s_CHARGES + '[' + chargeInfo + ']'; - - final int idx = listEntry.indexOf(chargeInfo); - listEntry = listEntry.substring(0, idx) + - listEntry.substring(idx + chargeInfo.length()); - listEntry += (s_CHARGES + '[' + Integer.toString(remainingCharges) + ']'); - assoc.set(0, listEntry); - } - for (String s : assoc) - { - parent.addAssociation(this, s); - } - } - } - - int getRemainingCharges(Equipment parent) - { - if (parent.hasAssociations(this)) - { - return getSpellInfo(parent.getFirstAssociation(this), s_CHARGES); - } - - return 0; - } - - int getUsedCharges(Equipment parent) - { - return get(IntegerKey.MAX_CHARGES) - getRemainingCharges(parent); - } - - public static int getSpellInfo(final String listEntry, final String desiredInfo) - { - int modValue = 0; - final String info = getSpellInfoString(listEntry, desiredInfo); - - if (info.length() > 0) - { - try - { - modValue = Delta.parseInt(info); - } - catch (NumberFormatException exc) - { - // TODO: Should this really be ignored? - } - } - - return modValue; - } - - public static String getSpellInfoString( - final String listEntry, - final String desiredInfo) - { - final int offs = listEntry.indexOf(desiredInfo + "["); - final int offs2 = listEntry.indexOf(']', offs + 1); - - if ((offs >= 0) && (offs2 > offs)) - { - return listEntry.substring(offs + desiredInfo.length() + 1, offs2); - } - - return ""; - } - - /** - * Add item cost - * @param aPC - * @param bonusType - * @param qty - * @param parent - * @return added cost - */ - public BigDecimal addItemCosts( - final PlayerCharacter aPC, - final String bonusType, - final int qty, - final Equipment parent) - { - double val = 0; - - Set<String> typesToGetBonusesFor = new HashSet<String>(); - - for ( BonusObj bonus : getBonusList(parent) ) - { - boolean meetsAll = true; - - if (bonus.getBonusName().equals(bonusType)) - { - StringTokenizer aTok = new StringTokenizer( - bonus.toString().substring(bonusType.length()), - "|", - false); - final String bType = aTok.nextToken(); - aTok = new StringTokenizer(bType.substring(5), ".", false); - - String typeString = "TYPE"; - - while (aTok.hasMoreTokens()) - { - final String sub_type = aTok.nextToken(); - meetsAll = parent.isType(sub_type); - - if (!meetsAll) - { - break; - } - - typeString += "." + sub_type; - } - - if (meetsAll) - { - typesToGetBonusesFor.add(typeString); - } - } - } - - for ( String typeString : typesToGetBonusesFor ) - { - val += bonusTo(aPC, bonusType, typeString, parent); - } - - return new BigDecimal(val * qty); - } - - /** * lets this object compare to others. * * @param o The object to compare to * * @return -1, 0 or 1 as per Comparator */ + @Override public int compareTo(final Object o) { if (o instanceof EquipmentModifier) Added: Trunk/pcgen/code/src/java/pcgen/core/analysis/EqModCost.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/analysis/EqModCost.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/core/analysis/EqModCost.java 2008-10-01 23:29:39 UTC (rev 7863) @@ -0,0 +1,338 @@ +package pcgen.core.analysis; + +import java.math.BigDecimal; +import java.util.HashSet; +import java.util.Set; +import java.util.StringTokenizer; + +import pcgen.cdom.enumeration.FormulaKey; +import pcgen.cdom.enumeration.IntegerKey; +import pcgen.cdom.enumeration.ObjectKey; +import pcgen.cdom.enumeration.StringKey; +import pcgen.core.Equipment; +import pcgen.core.EquipmentModifier; +import pcgen.core.Globals; +import pcgen.core.PCClass; +import pcgen.core.PlayerCharacter; +import pcgen.core.bonus.BonusObj; +import pcgen.core.prereq.Prerequisite; +import pcgen.core.spell.Spell; +import pcgen.util.Delta; + +public class EqModCost +{ + private static final String s_CHARGES = "CHARGES"; + + public static BigDecimal addItemCosts(EquipmentModifier eqMod, + final PlayerCharacter aPC, final String bonusType, final int qty, + final Equipment parent) + { + double val = 0; + + Set<String> typesToGetBonusesFor = new HashSet<String>(); + + for (BonusObj bonus : eqMod.getBonusList(parent)) + { + boolean meetsAll = true; + + if (bonus.getBonusName().equals(bonusType)) + { + StringTokenizer aTok = new StringTokenizer(bonus.toString() + .substring(bonusType.length()), "|", false); + final String bType = aTok.nextToken(); + aTok = new StringTokenizer(bType.substring(5), ".", false); + + String typeString = "TYPE"; + + while (aTok.hasMoreTokens()) + { + final String sub_type = aTok.nextToken(); + meetsAll = parent.isType(sub_type); + + if (!meetsAll) + { + break; + } + + typeString += "." + sub_type; + } + + if (meetsAll) + { + typesToGetBonusesFor.add(typeString); + } + } + } + + for (String typeString : typesToGetBonusesFor) + { + val += eqMod.bonusTo(aPC, bonusType, typeString, parent); + } + + return new BigDecimal(val * qty); + } + + public static boolean getCostDouble(EquipmentModifier eqMod) + { + // + // Uninitialized? + // + Boolean costdouble = eqMod.get(ObjectKey.COST_DOUBLE); + if (costdouble == null) + { + if (eqMod.isType("MagicalEnhancement") + || eqMod.isType("BaseMaterial")) + { + return false; + } + + if (eqMod.isIType("MAGIC")) + { + return true; + } + + for (Prerequisite preReq : eqMod.getPrerequisiteList()) + { + if ("TYPE".equalsIgnoreCase(preReq.getKind()) + && ((preReq.getKey() + .equalsIgnoreCase("EQMODTYPE=MagicalEnhancement")) || (preReq + .getKey() + .equalsIgnoreCase("EQMODTYPE.MagicalEnhancement")))) + { + return true; + } + } + return false; + } + + return costdouble; + } + + public static String getCost(EquipmentModifier eqMod, final String listEntry) + { + String costFormula = eqMod.getSafe(FormulaKey.COST).toString(); + String modChoice = ""; + + while (costFormula.indexOf("%SPELLLEVEL") >= 0) + { + final int idx = costFormula.indexOf("%SPELLLEVEL"); + + if (modChoice.length() == 0) + { + final int iLevel = EqModSpellInfo.getSpellInfo(listEntry, + "SPELLLEVEL"); + + if (iLevel == 0) + { + modChoice = "0.5"; + } + else + { + modChoice = Integer.toString(iLevel); + } + } + + costFormula = costFormula.substring(0, idx) + modChoice + + costFormula.substring(idx + 11); + } + + costFormula = replaceCostSpellCost(costFormula, listEntry); + costFormula = replaceCostSpellXPCost(costFormula, listEntry); + costFormula = replaceCostCasterLevel(costFormula, listEntry); + costFormula = replaceCostCharges(costFormula, listEntry); + costFormula = replaceCostChoice(costFormula, listEntry); + + return costFormula; + } + + private static String replaceCostCasterLevel(String costFormula, + final String listEntry) + { + String modChoice = ""; + + while (costFormula.indexOf("%CASTERLEVEL") >= 0) + { + final int idx = costFormula.indexOf("%CASTERLEVEL"); + + if (modChoice.length() == 0) + { + final int iCasterLevel = EqModSpellInfo.getSpellInfo( + listEntry, "CASTERLEVEL"); + modChoice = Integer.toString(iCasterLevel); + + // + // Tack on the item creation multiplier, if there is one + // + final String castClassKey = EqModSpellInfo + .getSpellInfoString(listEntry, "CASTER"); + + if (castClassKey.length() != 0) + { + final PCClass castClass = Globals.getContext().ref + .silentlyGetConstructedCDOMObject(PCClass.class, + castClassKey); + + if (castClass != null) + { + final StringBuffer multiple = new StringBuffer(200); + String aString = castClass.get(StringKey.ITEMCREATE); + + if (aString != null && aString.length() != 0) + { + final StringTokenizer aTok = new StringTokenizer( + aString, "+-*/()", true); + + // + // This is to support older versions of the + // ITEMCREATE tag + // that allowed 0.5, because it used to be just a + // multiple + // + if (aTok.countTokens() == 1) + { + multiple.append(iCasterLevel).append('*') + .append(aString); + } + else + { + while (aTok.hasMoreTokens()) + { + aString = aTok.nextToken(); + + if (aString.equals("CL")) + { + multiple.append(iCasterLevel); + } + else + { + multiple.append(aString); + } + } + } + + modChoice = multiple.toString(); + } + } + } + } + + costFormula = costFormula.substring(0, idx) + "(" + modChoice + ")" + + costFormula.substring(idx + 12); + } + + return costFormula; + } + + private static String replaceCostCharges(String costFormula, + final String listEntry) + { + String modChoice = ""; + + while (costFormula.indexOf("%" + s_CHARGES) >= 0) + { + final int idx = costFormula.indexOf("%" + s_CHARGES); + + if (modChoice.length() == 0) + { + modChoice = Integer.toString(EqModSpellInfo.getSpellInfo( + listEntry, s_CHARGES)); + } + + costFormula = costFormula.substring(0, idx) + modChoice + + costFormula.substring(idx + 8); + } + + return costFormula; + } + + private static String replaceCostSpellCost(String costFormula, + final String listEntry) + { + String modChoice = ""; + + while (costFormula.indexOf("%SPELLCOST") >= 0) + { + final int idx = costFormula.indexOf("%SPELLCOST"); + + if (modChoice.length() == 0) + { + final String spellName = EqModSpellInfo.getSpellInfoString( + listEntry, "SPELLNAME"); + final Spell aSpell = Globals.getSpellKeyed(spellName); + + if (aSpell != null) + { + modChoice = aSpell.getSafe(ObjectKey.COST).toString(); + } + } + + costFormula = costFormula.substring(0, idx) + modChoice + + costFormula.substring(idx + 10); + } + + return costFormula; + } + + private static String replaceCostChoice(String costFormula, + final String listEntry) + { + String modChoice = ""; + + while (costFormula.indexOf("%CHOICE") >= 0) + { + final int idx = costFormula.indexOf("%CHOICE"); + + if (modChoice.length() == 0) + { + final int offs = listEntry.lastIndexOf('|'); + int modValue = 0; + + try + { + modValue = Delta.parseInt(listEntry.substring(offs + 1)); + } + catch (NumberFormatException exc) + { + // TODO: Should this really be ignored? + } + + modChoice = Integer.toString(modValue); + } + + costFormula = costFormula.substring(0, idx) + modChoice + + costFormula.substring(idx + 7); + } + + return costFormula; + } + + private static String replaceCostSpellXPCost(String costFormula, + final String listEntry) + { + String modChoice = ""; + + while (costFormula.indexOf("%SPELLXPCOST") >= 0) + { + final int idx = costFormula.indexOf("%SPELLXPCOST"); + + if (modChoice.length() == 0) + { + final String spellName = EqModSpellInfo.getSpellInfoString( + listEntry, "SPELLNAME"); + final Spell aSpell = Globals.getSpellKeyed(spellName); + + if (aSpell != null) + { + modChoice = Integer.toString(aSpell + .getSafe(IntegerKey.XP_COST)); + } + } + + costFormula = costFormula.substring(0, idx) + modChoice + + costFormula.substring(idx + 12); + } + + return costFormula; + } + +} Added: Trunk/pcgen/code/src/java/pcgen/core/analysis/EqModSpellInfo.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/analysis/EqModSpellInfo.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/core/analysis/EqModSpellInfo.java 2008-10-01 23:29:39 UTC (rev 7863) @@ -0,0 +1,180 @@ +package pcgen.core.analysis; + +import java.util.List; + +import pcgen.cdom.enumeration.IntegerKey; +import pcgen.core.Ability; +import pcgen.core.Equipment; +import pcgen.core.EquipmentModifier; +import pcgen.core.PObject; +import pcgen.core.spell.Spell; +import pcgen.util.Delta; + +public class EqModSpellInfo +{ + private static final String s_CHARGES = "CHARGES"; + + public static String getSpellInfoString(final String listEntry, + final String desiredInfo) + { + final int offs = listEntry.indexOf(desiredInfo + "["); + final int offs2 = listEntry.indexOf(']', offs + 1); + + if ((offs >= 0) && (offs2 > offs)) + { + return listEntry.substring(offs + desiredInfo.length() + 1, offs2); + } + + return ""; + } + + public static int getSpellInfo(final String listEntry, + final String desiredInfo) + { + int modValue = 0; + final String info = getSpellInfoString(listEntry, desiredInfo); + + if (info.length() > 0) + { + try + { + modValue = Delta.parseInt(info); + } + catch (NumberFormatException exc) + { + // TODO: Should this really be ignored? + } + } + + return modValue; + } + + public static void setRemainingCharges(Equipment parent, + EquipmentModifier eqMod, final int remainingCharges) + { + if (parent.hasAssociations(eqMod)) + { + List<String> assoc = parent.removeAllAssociations(eqMod); + String listEntry = assoc.get(0); + String chargeInfo = EqModSpellInfo.getSpellInfoString(listEntry, + s_CHARGES); + + if (chargeInfo.length() != 0) + { + chargeInfo = s_CHARGES + '[' + chargeInfo + ']'; + + final int idx = listEntry.indexOf(chargeInfo); + listEntry = listEntry.substring(0, idx) + + listEntry.substring(idx + chargeInfo.length()); + listEntry += (s_CHARGES + '[' + + Integer.toString(remainingCharges) + ']'); + assoc.set(0, listEntry); + } + for (String s : assoc) + { + parent.addAssociation(eqMod, s); + } + } + } + + public static int getRemainingCharges(Equipment parent, + EquipmentModifier eqMod) + { + if (parent.hasAssociations(eqMod)) + { + return EqModSpellInfo.getSpellInfo(parent + .getFirstAssociation(eqMod), s_CHARGES); + } + + return 0; + } + + public static int getUsedCharges(Equipment parent, EquipmentModifier eqMod) + { + return eqMod.get(IntegerKey.MAX_CHARGES) + - getRemainingCharges(parent, eqMod); + } + + /** + * Here be dragons + * + * Builds up a big mad string representing the spell info and then stores it + * in the first entry of associated. + * + * TODO store this a separate fields or as a spell object or some other way + * that doesn't involve turning this into a string and then parsing the + * string when we want to do something with the info. + * + * @param parent + * TODO + * @param spellCastingClass + * a PCClass Object, the class that this spell will be cast as + * @param theSpell + * a Spell Object + * @param spellVariant + * a string + * @param spellType + * arcane, divine, etc. + * @param spellLevel + * an int the level of the spell + * @param spellCasterLevel + * Caster level the spell is cast at + * @param spellMetamagicFeats + * Any metamagic feats applied + * @param charges + * how many times can it be cast + */ + public static void setSpellInfo(Equipment parent, EquipmentModifier eqMod, + final PObject spellCastingClass, final Spell theSpell, + final String spellVariant, final String spellType, + final int spellLevel, final int spellCasterLevel, + final Object[] spellMetamagicFeats, final int charges) + { + final StringBuffer spellInfo = new StringBuffer(100); + spellInfo.append("SPELLNAME[").append(theSpell.getKeyName()).append( + "] "); + spellInfo.append("CASTER[").append(spellCastingClass.getKeyName()) + .append("] "); + + if (spellVariant.length() != 0) + { + spellInfo.append("VARIANT[").append(spellVariant).append("] "); + } + + spellInfo.append("SPELLTYPE[").append(spellType).append("] "); + spellInfo.append("SPELLLEVEL[").append(spellLevel).append("] "); + spellInfo.append("CASTERLEVEL[").append(spellCasterLevel).append("] "); + + if (charges > 0) + { + spellInfo.append(s_CHARGES).append('[').append(charges) + .append("] "); + } + + if ((spellMetamagicFeats != null) && (spellMetamagicFeats.length > 0)) + { + /* + * Have considered whether this needs to be expanded to include + * Category. These are actually Feats and the information is only + * used by toString() + */ + spellInfo.append("METAFEATS["); + + for (int i = 0; i < spellMetamagicFeats.length; i++) + { + final Ability aFeat = (Ability) spellMetamagicFeats[i]; + + if (i != 0) + { + spellInfo.append(", "); + } + + spellInfo.append(aFeat.getKeyName()); + } + + spellInfo.append("] "); + } + + parent.addAssociation(eqMod, spellInfo.toString()); + } +} Added: Trunk/pcgen/code/src/java/pcgen/core/analysis/EquipmentChoiceDriver.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/analysis/EquipmentChoiceDriver.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/core/analysis/EquipmentChoiceDriver.java 2008-10-01 23:29:39 UTC (rev 7863) @@ -0,0 +1,175 @@ +package pcgen.core.analysis; + +import java.util.ArrayList; +import java.util.List; + +import pcgen.core.Equipment; +import pcgen.core.EquipmentChoice; +import pcgen.core.EquipmentModifier; +import pcgen.core.Globals; +import pcgen.core.PlayerCharacter; +import pcgen.util.Delta; +import pcgen.util.chooser.ChooserFactory; +import pcgen.util.chooser.ChooserInterface; + +public class EquipmentChoiceDriver +{ + /** + * @param pool + * @param parent + * @param bAdd being added + * @return an integer where apparently (from how it's used) only 0 is significant + */ + public static boolean getChoice(final int pool, final Equipment parent, EquipmentModifier eqMod, final boolean bAdd, PlayerCharacter pc) + { + String choiceString = eqMod.getChoiceString(); + + if (choiceString.length() == 0) + { + return true; + } + + final boolean forEqBuilder = choiceString.startsWith("EQBUILDER."); + + if (bAdd && forEqBuilder) + { + return true; + } + + final ChooserInterface chooser = ChooserFactory.getChooserInstance(); + chooser.setPoolFlag(false); + chooser.setVisible(false); + List<String> selectedList = parent.getAssociationList(eqMod); + + final EquipmentChoice equipChoice = buildEquipmentChoice( + pool, + parent, + eqMod, + bAdd, + forEqBuilder, + selectedList.size(), + pc); + + if (equipChoice.isBAdd()) + { + chooser.setTotalChoicesAvail(selectedList.size() + equipChoice.getMaxSelect()); + } + else + { + chooser.setTotalChoicesAvail(selectedList.size()); + } + + chooser.setAllowsDups(equipChoice.isAllowDuplicates()); + chooser.setSelectedListTerminator("|"); + chooser.setTitle("Select " + equipChoice.getTitle() + " (" + eqMod.getDisplayName() + ")"); + Globals.sortChooserLists(equipChoice.getAvailableList(), selectedList); + chooser.setAvailableList(equipChoice.getAvailableList()); + chooser.setSelectedList(selectedList); + chooser.setVisible(true); + + selectedList = chooser.getSelectedList(); + setChoice(parent, eqMod, selectedList, equipChoice); + + return parent.hasAssociations(eqMod); + } + + public static void setChoice(Equipment parent, EquipmentModifier eqMod, final String choice, final EquipmentChoice equipChoice) + { + final List<String> tempList = new ArrayList<String>(); + tempList.add(choice); + setChoice(parent, eqMod, tempList, equipChoice); + } + + private static void setChoice(Equipment parent, EquipmentModifier eqMod, final List<String> selectedList, final EquipmentChoice equipChoice) + { + parent.removeAllAssociations(eqMod); + + for (int i = 0; i < selectedList.size(); i++) + { + String aString = selectedList.get(i); + + if (equipChoice.getMinValue() < equipChoice.getMaxValue()) + { + final int idx = aString.indexOf('|'); + + if (idx < 0) + { + final List<String> secondaryChoice = new ArrayList<String>(); + + for ( + int j = equipChoice.getMinValue(); + j <= equipChoice.getMaxValue(); + j += equipChoice.getIncValue()) + { + if (j != 0) + { + secondaryChoice.add(Delta.toString(j)); + } + } + + final ChooserInterface chooser = ChooserFactory.getChooserInstance(); + chooser.setPoolFlag(false); + chooser.setVisible(false); + chooser.setTitle("Select modifier (" + aString + ")"); + chooser.setAvailableList(secondaryChoice); + chooser.setSelectedList(new ArrayList()); + chooser.setTotalChoicesAvail(1); + chooser.setVisible(true); + + if (chooser.getSelectedList().size() == 0) + { + continue; + } + + aString += ('|' + ((String) chooser.getSelectedList().get(0))); + } + } + + if (equipChoice.isAllowDuplicates() || !parent.containsAssociated(eqMod, aString)) + { + parent.addAssociation(eqMod, aString); + } + } + } + + /** + * Build up the details of a required choice + * + * @param pool + * @param parent the equipment this modifer will be applied to + * @param bAdd is a choice being added or removed + * @param forEqBuilder + * @param numSelected + * + * @return A populated EquipmentChoice object + */ + public static EquipmentChoice buildEquipmentChoice( + final int pool, + final Equipment parent, + EquipmentModifier eqMod, + final boolean bAdd, + final boolean forEqBuilder, + final int numSelected, + PlayerCharacter pc) + { + final EquipmentChoice equipChoice = new EquipmentChoice(bAdd, pool); + String choiceString = eqMod.getChoiceString(); + + if (choiceString.length() == 0) + { + return equipChoice; + } + + equipChoice.constructFromChoiceString( + choiceString, + parent, + pool, + numSelected, + forEqBuilder, + pc); + + return equipChoice; + } + + +} Modified: Trunk/pcgen/code/src/java/pcgen/gui/EqBuilder.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/EqBuilder.java 2008-10-01 23:17:14 UTC (rev 7862) +++ Trunk/pcgen/code/src/java/pcgen/gui/EqBuilder.java 2008-10-01 23:29:39 UTC (rev 7863) @@ -80,6 +80,7 @@ import pcgen.core.SettingsHandler; import pcgen.core.SizeAdjustment; import pcgen.core.SpecialProperty; +import pcgen.core.analysis.EqModSpellInfo; import pcgen.core.prereq.PrerequisiteUtilities; import pcgen.core.spell.Spell; import pcgen.core.utils.MessageType; @@ -1384,12 +1385,12 @@ if (existingEqMod == null) { - //Add will implicitly clone if necessary aNewEq.addEqModifier(eqMod, true, aPC); } existingEqMod = aNewEq.getEqModifierKeyed(eqMod.getKeyName(), true); - existingEqMod.setSpellInfo(aNewEq, (PObject) castingClass, theSpell, variant, spellType, + EqModSpellInfo.setSpellInfo(aNewEq, existingEqMod, + (PObject) castingClass, theSpell, variant, spellType, baseSpellLevel, casterLevel, metamagicFeats, charges); updateDisplay(true); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-10-04 01:00:37
|
Revision: 7894 http://pcgen.svn.sourceforge.net/pcgen/?rev=7894&view=rev Author: thpr Date: 2008-10-04 01:00:34 +0000 (Sat, 04 Oct 2008) Log Message: ----------- [ 2115669 ] ARMORTYPE:Medium|Light broken. Issue#: 2115669 Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/cdom/modifier/ChangeArmorType.java Trunk/pcgen/code/src/java/pcgen/core/Equipment.java Modified: Trunk/pcgen/code/src/java/pcgen/cdom/modifier/ChangeArmorType.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/modifier/ChangeArmorType.java 2008-10-04 00:19:45 UTC (rev 7893) +++ Trunk/pcgen/code/src/java/pcgen/cdom/modifier/ChangeArmorType.java 2008-10-04 01:00:34 UTC (rev 7894) @@ -77,8 +77,8 @@ // throw new IllegalArgumentException( // "Resulting Type for ChangeArmorType cannot be null"); // } - result = resultType; - source = sourceType; + result = resultType.toUpperCase(); + source = sourceType.toUpperCase(); } /** @@ -104,7 +104,7 @@ */ public String applyModifier(String obj, Object context) { - return source.equals(obj) ? result : obj; + return source.equalsIgnoreCase(obj) ? result : obj; } /** Modified: Trunk/pcgen/code/src/java/pcgen/core/Equipment.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Equipment.java 2008-10-04 00:19:45 UTC (rev 7893) +++ Trunk/pcgen/code/src/java/pcgen/core/Equipment.java 2008-10-04 01:00:34 UTC (rev 7894) @@ -4635,7 +4635,7 @@ // // Use the primary type(s) if none defined for secondary // - final List<String> calculatedTypeList; + List<String> calculatedTypeList; if (bPrimary || (getAltTypeCount() == 0)) { calculatedTypeList = new ArrayList<String>(getTypeList(false)); @@ -4669,6 +4669,12 @@ } } + /* + * CONSIDER I think there is a weird order of operations issue nere, need to check + * if it existed way back, e.g. SVN 6206. The issue is if a Type is introduced by a + * MOD, then the ChangeArmorType system doesn't seem to be able to grab/modify it + * Is that correct? - thpr 10/3/08 + */ // // Add in all of the types from each EquipmentModifier // currently applied to this piece of equipment @@ -4695,6 +4701,7 @@ List<String> removedTypeList = new ArrayList<String>(calculatedTypeList); removedTypeList.removeAll(newTypeList); modTypeList.removeAll(removedTypeList); + calculatedTypeList = newTypeList; for (String aType : eqMod.getSafeListFor(ListKey.ITEM_TYPES)) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-10-04 20:46:53
|
Revision: 7922 http://pcgen.svn.sourceforge.net/pcgen/?rev=7922&view=rev Author: thpr Date: 2008-10-04 20:44:11 +0000 (Sat, 04 Oct 2008) Log Message: ----------- Puts in an initial framework for AssociationReference that should work Theoretically fixes [ 2001291 ] MONCSKILL fails on LIST although that tracker really isn't valid based on RACE not firing CHOOSE: properly. Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/cdom/reference/AssociationReference.java Trunk/pcgen/code/src/java/pcgen/core/Ability.java Trunk/pcgen/code/src/java/pcgen/core/Globals.java Trunk/pcgen/code/src/java/pcgen/core/PCClass.java Trunk/pcgen/code/src/java/pcgen/core/PCStat.java Trunk/pcgen/code/src/java/pcgen/core/PCTemplate.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/Race.java Trunk/pcgen/code/src/java/pcgen/core/Skill.java Trunk/pcgen/code/src/java/pcgen/core/spell/Spell.java Modified: Trunk/pcgen/code/src/java/pcgen/cdom/reference/AssociationReference.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/reference/AssociationReference.java 2008-10-04 20:10:11 UTC (rev 7921) +++ Trunk/pcgen/code/src/java/pcgen/cdom/reference/AssociationReference.java 2008-10-04 20:44:11 UTC (rev 7922) @@ -23,9 +23,9 @@ import pcgen.cdom.base.CDOMObject; import pcgen.cdom.base.CDOMReference; -import pcgen.core.AssociationStore; import pcgen.core.Globals; import pcgen.core.PObject; +import pcgen.core.PlayerCharacter; /** * An AssociationReference is a CDOMReference that points to associations on a @@ -89,12 +89,6 @@ throw new IllegalArgumentException( "PObject in AssociationReference cannot be null"); } - /* - * TODO BUG this is a problem because it's not true that this is - * necessarily the object that will contain the associations :( Since - * PCGen currently clones a ton of stuff, this assumption fails, and - * thus AssociationReference is useless. - */ referenceObj = ref; } @@ -131,9 +125,11 @@ { return false; } - AssociationStore as = Globals.getCurrentPC(); + //CONSIDER once getActiveEquivalent goes away, this should be AssocationStore + PlayerCharacter as = Globals.getCurrentPC(); String key = obj.getKeyName(); - for (String assoc : as.getAssociationList(referenceObj)) + PObject active = referenceObj.getActiveEquivalent(as); + for (String assoc : as.getAssociationList(active)) { if (key.equalsIgnoreCase(assoc)) { @@ -160,8 +156,9 @@ public Collection<T> getContainedObjects() { List<T> list = new ArrayList<T>(); - AssociationStore as = Globals.getCurrentPC(); - List<String> associationList = as.getAssociationList(referenceObj); + PlayerCharacter as = Globals.getCurrentPC(); + PObject active = referenceObj.getActiveEquivalent(as); + List<String> associationList = as.getAssociationList(active); for (T obj : all.getContainedObjects()) { String key = obj.getKeyName(); @@ -202,8 +199,9 @@ @Override public int getObjectCount() { - AssociationStore as = Globals.getCurrentPC(); - return as.getDetailedAssociationCount(referenceObj); + PlayerCharacter as = Globals.getCurrentPC(); + PObject active = referenceObj.getActiveEquivalent(as); + return as.getDetailedAssociationCount(active); } /** Modified: Trunk/pcgen/code/src/java/pcgen/core/Ability.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Ability.java 2008-10-04 20:10:11 UTC (rev 7921) +++ Trunk/pcgen/code/src/java/pcgen/core/Ability.java 2008-10-04 20:44:11 UTC (rev 7922) @@ -342,4 +342,15 @@ return ListKey.DESCRIPTION; } + @Override + public PObject getActiveEquivalent(PlayerCharacter pc) + { + AbilityCategory cat = SettingsHandler.getGame() + .silentlyGetAbilityCategory(getCategory()); + PObject ability = pc.getAbilityKeyed(cat, getAbilityNature(), + getKeyName()); + return ability == null ? this : ability; + } + + } Modified: Trunk/pcgen/code/src/java/pcgen/core/Globals.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Globals.java 2008-10-04 20:10:11 UTC (rev 7921) +++ Trunk/pcgen/code/src/java/pcgen/core/Globals.java 2008-10-04 20:44:11 UTC (rev 7922) @@ -2956,7 +2956,7 @@ return aList; } - public static AssociationStore getCurrentPC() + public static PlayerCharacter getCurrentPC() { return currentPC; } Modified: Trunk/pcgen/code/src/java/pcgen/core/PCClass.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-10-04 20:10:11 UTC (rev 7921) +++ Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-10-04 20:44:11 UTC (rev 7922) @@ -4777,4 +4777,10 @@ e.printStackTrace(); } } + + @Override + public PObject getActiveEquivalent(PlayerCharacter pc) + { + return pc.getClassKeyed(getKeyName()); + } } Modified: Trunk/pcgen/code/src/java/pcgen/core/PCStat.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PCStat.java 2008-10-04 20:10:11 UTC (rev 7921) +++ Trunk/pcgen/code/src/java/pcgen/core/PCStat.java 2008-10-04 20:44:11 UTC (rev 7922) @@ -158,4 +158,11 @@ { return statMod; } + + @Override + public PObject getActiveEquivalent(PlayerCharacter pc) + { + int index = SettingsHandler.getGame().getStatFromAbbrev(getKeyName()); + return pc.getStatList().getStatAt(index); + } } Modified: Trunk/pcgen/code/src/java/pcgen/core/PCTemplate.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PCTemplate.java 2008-10-04 20:10:11 UTC (rev 7921) +++ Trunk/pcgen/code/src/java/pcgen/core/PCTemplate.java 2008-10-04 20:44:11 UTC (rev 7922) @@ -336,5 +336,10 @@ return list; } + @Override + public PObject getActiveEquivalent(PlayerCharacter pc) + { + return pc.getTemplateKeyed(getKeyName()); + } } Modified: Trunk/pcgen/code/src/java/pcgen/core/PObject.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-10-04 20:10:11 UTC (rev 7921) +++ Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-10-04 20:44:11 UTC (rev 7922) @@ -2891,4 +2891,12 @@ { return ""; } + + /* + * Any PObject which is cloned before it is added to a PC must override this + */ + public PObject getActiveEquivalent(PlayerCharacter as) + { + return this; + } } Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-10-04 20:10:11 UTC (rev 7921) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-10-04 20:44:11 UTC (rev 7922) @@ -16703,21 +16703,36 @@ return getAbilityKeyed(AbilityCategory.FEAT, featName); } + public Ability getAbilityKeyed(final AbilityCategory aCategory, - final String aKey) + Ability.Nature nature, final String aKey) { - final List<Ability> abilities = getAggregateAbilityList(aCategory); - for (final Ability ability : abilities) + List<Ability> abilityList = theAbilities.get(aCategory, nature); + for (Ability ab : abilityList) { - if (ability.getKeyName().equals(aKey)) + if (ab.getKeyName().equals(aKey)) { - return ability; + return ab; } } - return null; } + public Ability getAbilityKeyed(final AbilityCategory aCategory, + final String aKey) + { + final List<Ability> abilities = getAggregateAbilityList(aCategory); + for (final Ability ability : abilities) + { + if (ability.getKeyName().equals(aKey)) + { + return ability; + } + } + + return null; + } + /** * Get an ability of any ctageory tat matches the key. * @param aKey The key to search for Modified: Trunk/pcgen/code/src/java/pcgen/core/Race.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Race.java 2008-10-04 20:10:11 UTC (rev 7921) +++ Trunk/pcgen/code/src/java/pcgen/core/Race.java 2008-10-04 20:44:11 UTC (rev 7922) @@ -209,4 +209,15 @@ return steps; } } + + @Override + public PObject getActiveEquivalent(PlayerCharacter pc) + { + if (pc.getRace().getKeyName().equals(getKeyName())) + { + return pc.getRace(); + } + return this; + } + } Modified: Trunk/pcgen/code/src/java/pcgen/core/Skill.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Skill.java 2008-10-04 20:10:11 UTC (rev 7921) +++ Trunk/pcgen/code/src/java/pcgen/core/Skill.java 2008-10-04 20:44:11 UTC (rev 7922) @@ -316,4 +316,11 @@ return keyStat == null ? "" : keyStat.getAbb(); } + @Override + public PObject getActiveEquivalent(PlayerCharacter pc) + { + return pc.getSkillKeyed(getKeyName()); + } + + } Modified: Trunk/pcgen/code/src/java/pcgen/core/spell/Spell.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/spell/Spell.java 2008-10-04 20:10:11 UTC (rev 7921) +++ Trunk/pcgen/code/src/java/pcgen/core/spell/Spell.java 2008-10-04 20:44:11 UTC (rev 7922) @@ -1135,4 +1135,10 @@ return true; } + // TODO Not sure how to do this (and if it's necessary?) + // Overall, grants is still an interesting behavior in Spells, so no need in 5.x + // @Override + // public PObject getActiveEquivalent(PlayerCharacter pc) + // { + // } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-10-01 23:03:59
|
Revision: 7861 http://pcgen.svn.sourceforge.net/pcgen/?rev=7861&view=rev Author: thpr Date: 2008-10-01 23:03:50 +0000 (Wed, 01 Oct 2008) Log Message: ----------- Domain refactoring Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/Domain.java 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/PlayerCharacter.java Trunk/pcgen/code/src/java/pcgen/core/kit/KitDeity.java Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbility.java Trunk/pcgen/code/src/java/pcgen/core/npcgen/NPCGenerator.java Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoDomain.java Trunk/pcgen/code/src/java/pcgen/io/PCGVer0Parser.java Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Parser.java Added Paths: ----------- Trunk/pcgen/code/src/java/pcgen/core/analysis/DomainApplication.java Modified: Trunk/pcgen/code/src/java/pcgen/core/Domain.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Domain.java 2008-10-01 22:52:58 UTC (rev 7860) +++ Trunk/pcgen/code/src/java/pcgen/core/Domain.java 2008-10-01 23:03:50 UTC (rev 7861) @@ -25,15 +25,7 @@ */ package pcgen.core; -import java.util.ArrayList; -import java.util.List; - import pcgen.cdom.base.Constants; -import pcgen.cdom.enumeration.IntegerKey; -import pcgen.core.character.CharacterSpell; -import pcgen.core.chooser.ChooserUtilities; -import pcgen.core.prereq.PrereqHandler; -import pcgen.core.spell.Spell; import pcgen.core.utils.MessageType; import pcgen.core.utils.ShowMessageDelegate; @@ -45,115 +37,6 @@ */ public final class Domain extends PObject { - /** - * Sets the locked flag on a PC - * @param pc - */ - public void applyDomain(final PlayerCharacter pc) - { - final CharacterDomain aCD = pc.getCharacterDomainForDomain(keyName); - PCClass aClass = null; - - if (aCD != null) - { - if (aCD.isFromPCClass()) - { - aClass = pc.getClassKeyed(aCD.getObjectName()); - - if (aClass != null) - { - int maxLevel; - - for (maxLevel = 0; maxLevel < 10; maxLevel++) - { - if (aClass.getCastForLevel(maxLevel, pc) == 0) - { - break; - } - } - - if (maxLevel > 0) - { - addSpellsToClassForLevels(aClass, 0, maxLevel - 1); - } - - if ((maxLevel > 1) && (aClass.getSafe(IntegerKey.KNOWN_SPELLS_FROM_SPECIALTY) == 0)) - { - final List<Spell> aList = Globals.getSpellsIn(-1, "", keyName); - - for ( Spell gcs : aList ) - { - if (gcs.levelForKey("DOMAIN", keyName, pc) < maxLevel) - { - if (aClass.getSafe(IntegerKey.KNOWN_SPELLS_FROM_SPECIALTY) == 0) - { - aClass.put(IntegerKey.KNOWN_SPELLS_FROM_SPECIALTY, 1); - break; - } - } - } - } - } - } - } - - final List<PCSpell> spellList = getSpellList(); - - if ((aClass != null) && (spellList != null) && !spellList.isEmpty()) - { - for ( PCSpell pcSpell : spellList ) - { - final Spell aSpell = Globals.getSpellKeyed(pcSpell.getKeyName()); - - if (aSpell == null) - { - return; - } - - final int times = Integer.parseInt(pcSpell.getTimesPerDay()); - - final String book = pcSpell.getSpellbook(); - - if (PrereqHandler.passesAll(pcSpell.getPrerequisiteList(), pc, this)) - { - final List<CharacterSpell> aList = aClass.getSpellSupport() - .getCharacterSpell(aSpell, book, -1); - - if (aList.isEmpty()) - { - final CharacterSpell cs = new CharacterSpell(this, aSpell); - cs.addInfo(1, times, book); - aClass.getSpellSupport().addCharacterSpell(cs); - } - } - } - } - - // sage_sam stop here - String choiceString = getChoiceString(); - - if ( - (choiceString.length() > 0) && - !pc.isImporting() && - !choiceString.startsWith("FEAT|")) - { - ChooserUtilities.modChoices( - this, - new ArrayList(), - new ArrayList(), - true, - pc, - true, - null); - } - - if (!pc.isImporting()) - { - globalChecks(pc); - activateBonuses(pc); - } - } - @Override public String getSpellKey() { @@ -214,44 +97,4 @@ return result; } - - void addSpellsToClassForLevels( - final PCClass aClass, - final int minLevel, - final int maxLevel) - { - if (aClass == null) - { - return; - } - - for (int aLevel = minLevel; aLevel <= maxLevel; aLevel++) - { - final List<Spell> domainSpells = Globals.getSpellsIn(aLevel, "", keyName); - - for ( Spell spell : domainSpells ) - { - final List<CharacterSpell> slist = aClass.getSpellSupport() - .getCharacterSpell(spell, Globals.getDefaultSpellBook(), aLevel); - boolean flag = true; - - for ( CharacterSpell cs1 : slist ) - { - flag = !(cs1.getOwner().equals(this)); - - if (!flag) - { - break; - } - } - - if (flag) - { - final CharacterSpell cs = new CharacterSpell(this, spell); - cs.addInfo(aLevel, 1, Globals.getDefaultSpellBook()); - aClass.getSpellSupport().addCharacterSpell(cs); - } - } - } - } } Modified: Trunk/pcgen/code/src/java/pcgen/core/PCClass.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-10-01 22:52:58 UTC (rev 7860) +++ Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-10-01 23:03:50 UTC (rev 7861) @@ -67,6 +67,7 @@ import pcgen.cdom.reference.CDOMSingleRef; import pcgen.core.Ability.Nature; import pcgen.core.QualifiedObject.LevelAwareQualifiedObject; +import pcgen.core.analysis.DomainApplication; import pcgen.core.analysis.SkillRankControl; import pcgen.core.bonus.Bonus; import pcgen.core.bonus.BonusObj; @@ -1849,8 +1850,8 @@ { if ((cd.getDomain() != null) && cd.isFromPCClass(getKeyName())) { - cd.getDomain() - .addSpellsToClassForLevels(this, 0, _maxLevel); + DomainApplication.addSpellsToClassForLevels(cd.getDomain(), + this, 0, _maxLevel); } } } @@ -4904,7 +4905,7 @@ aCD.setDomain(aDomain, aPC); aPC.addCharacterDomain(aCD); aDomain = aCD.getDomain(); - aDomain.applyDomain(aPC); + DomainApplication.applyDomain(aPC, aDomain); } } else Modified: Trunk/pcgen/code/src/java/pcgen/core/PObject.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-10-01 22:52:58 UTC (rev 7860) +++ Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-10-01 23:03:50 UTC (rev 7861) @@ -1791,7 +1791,7 @@ // Override in any class that wants to store type information } - protected void globalChecks(final PlayerCharacter aPC) + public void globalChecks(final PlayerCharacter aPC) { globalChecks(false, aPC); } Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-10-01 22:52:58 UTC (rev 7860) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-10-01 23:03:50 UTC (rev 7861) @@ -89,6 +89,7 @@ import pcgen.cdom.list.CompanionList; import pcgen.cdom.reference.CDOMSingleRef; import pcgen.core.Ability.Nature; +import pcgen.core.analysis.DomainApplication; import pcgen.core.analysis.RaceStat; import pcgen.core.analysis.SkillRankControl; import pcgen.core.analysis.TemplateSR; @@ -7654,8 +7655,8 @@ if (domainClass != null) { final int _maxLevel = domainClass.getMaxCastLevel(); - aCD.getDomain().addSpellsToClassForLevels(domainClass, 0, - _maxLevel); + DomainApplication.addSpellsToClassForLevels(aCD.getDomain(), + domainClass, 0, _maxLevel); } setDirty(true); } Added: Trunk/pcgen/code/src/java/pcgen/core/analysis/DomainApplication.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/analysis/DomainApplication.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/core/analysis/DomainApplication.java 2008-10-01 23:03:50 UTC (rev 7861) @@ -0,0 +1,172 @@ +package pcgen.core.analysis; + +import java.util.ArrayList; +import java.util.List; + +import pcgen.cdom.enumeration.IntegerKey; +import pcgen.core.CharacterDomain; +import pcgen.core.Domain; +import pcgen.core.Globals; +import pcgen.core.PCClass; +import pcgen.core.PCSpell; +import pcgen.core.PlayerCharacter; +import pcgen.core.character.CharacterSpell; +import pcgen.core.chooser.ChooserUtilities; +import pcgen.core.prereq.PrereqHandler; +import pcgen.core.spell.Spell; + +public class DomainApplication +{ + /** + * Sets the locked flag on a PC + * + * @param pc + */ + public static void applyDomain(PlayerCharacter pc, Domain d) + { + String keyName = d.getKeyName(); + final CharacterDomain aCD = pc.getCharacterDomainForDomain(keyName); + PCClass aClass = null; + + if (aCD != null) + { + if (aCD.isFromPCClass()) + { + aClass = pc.getClassKeyed(aCD.getObjectName()); + + if (aClass != null) + { + int maxLevel; + + for (maxLevel = 0; maxLevel < 10; maxLevel++) + { + if (aClass.getCastForLevel(maxLevel, pc) == 0) + { + break; + } + } + + if (maxLevel > 0) + { + addSpellsToClassForLevels(d, aClass, 0, maxLevel - 1); + } + + if ((maxLevel > 1) + && (aClass + .getSafe(IntegerKey.KNOWN_SPELLS_FROM_SPECIALTY) == 0)) + { + final List<Spell> aList = Globals.getSpellsIn(-1, "", + keyName); + + for (Spell gcs : aList) + { + if (gcs.levelForKey("DOMAIN", keyName, pc) < maxLevel) + { + if (aClass + .getSafe(IntegerKey.KNOWN_SPELLS_FROM_SPECIALTY) == 0) + { + aClass + .put( + IntegerKey.KNOWN_SPELLS_FROM_SPECIALTY, + 1); + break; + } + } + } + } + } + } + } + + final List<PCSpell> spellList = d.getSpellList(); + + if ((aClass != null) && (spellList != null) && !spellList.isEmpty()) + { + for (PCSpell pcSpell : spellList) + { + final Spell aSpell = Globals + .getSpellKeyed(pcSpell.getKeyName()); + + if (aSpell == null) + { + return; + } + + final int times = Integer.parseInt(pcSpell.getTimesPerDay()); + + final String book = pcSpell.getSpellbook(); + + if (PrereqHandler.passesAll(pcSpell.getPrerequisiteList(), pc, + d)) + { + final List<CharacterSpell> aList = aClass.getSpellSupport() + .getCharacterSpell(aSpell, book, -1); + + if (aList.isEmpty()) + { + final CharacterSpell cs = new CharacterSpell(d, aSpell); + cs.addInfo(1, times, book); + aClass.getSpellSupport().addCharacterSpell(cs); + } + } + } + } + + // sage_sam stop here + String choiceString = d.getChoiceString(); + + if ((choiceString.length() > 0) && !pc.isImporting() + && !choiceString.startsWith("FEAT|")) + { + ChooserUtilities.modChoices(d, new ArrayList(), new ArrayList(), + true, pc, true, null); + } + + if (!pc.isImporting()) + { + d.globalChecks(pc); + d.activateBonuses(pc); + } + } + + public static void addSpellsToClassForLevels(Domain d, PCClass aClass, + int minLevel, int maxLevel) + { + if (aClass == null) + { + return; + } + + for (int aLevel = minLevel; aLevel <= maxLevel; aLevel++) + { + List<Spell> domainSpells = Globals.getSpellsIn(aLevel, "", d + .getKeyName()); + + for (Spell spell : domainSpells) + { + List<CharacterSpell> slist = aClass.getSpellSupport() + .getCharacterSpell(spell, + Globals.getDefaultSpellBook(), aLevel); + boolean flag = true; + + for (CharacterSpell cs1 : slist) + { + flag = !(cs1.getOwner().equals(d)); + + if (!flag) + { + break; + } + } + + if (flag) + { + CharacterSpell cs = new CharacterSpell(d, spell); + cs.addInfo(aLevel, 1, Globals.getDefaultSpellBook()); + aClass.getSpellSupport().addCharacterSpell(cs); + } + } + } + } + +} Modified: Trunk/pcgen/code/src/java/pcgen/core/kit/KitDeity.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/kit/KitDeity.java 2008-10-01 22:52:58 UTC (rev 7860) +++ Trunk/pcgen/code/src/java/pcgen/core/kit/KitDeity.java 2008-10-01 23:03:50 UTC (rev 7861) @@ -23,6 +23,7 @@ package pcgen.core.kit; import pcgen.core.*; +import pcgen.core.analysis.DomainApplication; import pcgen.core.prereq.PrereqHandler; import pcgen.gui.CharacterInfo; import pcgen.gui.PCGen_Frame1; @@ -265,7 +266,7 @@ } domainsToAdd.add(domain); - domain.applyDomain(aPC); + DomainApplication.applyDomain(aPC, domain); aCD.setDomain(domain, aPC); aPC.addCharacterDomain(aCD); } @@ -305,7 +306,7 @@ // Shouldn't happen continue; } - domain.applyDomain(aPC); + DomainApplication.applyDomain(aPC, domain); aCD.setDomain(domain, aPC); aPC.addCharacterDomain(aCD); } Modified: Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbility.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbility.java 2008-10-01 22:52:58 UTC (rev 7860) +++ Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbility.java 2008-10-01 23:03:50 UTC (rev 7861) @@ -24,6 +24,7 @@ import pcgen.cdom.enumeration.ListKey; import pcgen.core.*; +import pcgen.core.analysis.DomainApplication; import pcgen.core.pclevelinfo.PCLevelInfo; import pcgen.core.prereq.PrereqHandler; import pcgen.util.Logging; @@ -389,7 +390,7 @@ classKey); aCD.setDomain(aDom, aPC); aPC.addCharacterDomain(aCD); - aDom.applyDomain(aPC); + DomainApplication.applyDomain(aPC, aDom); --dnum; } } Modified: Trunk/pcgen/code/src/java/pcgen/core/npcgen/NPCGenerator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/npcgen/NPCGenerator.java 2008-10-01 22:52:58 UTC (rev 7860) +++ Trunk/pcgen/code/src/java/pcgen/core/npcgen/NPCGenerator.java 2008-10-01 23:03:50 UTC (rev 7861) @@ -48,6 +48,7 @@ import pcgen.core.SettingsHandler; import pcgen.core.Skill; import pcgen.core.SystemCollections; +import pcgen.core.analysis.DomainApplication; import pcgen.core.analysis.SkillRankControl; import pcgen.core.character.CharacterSpell; import pcgen.core.pclevelinfo.PCLevelInfo; @@ -443,7 +444,7 @@ // space remains for another domain, so add it if (existingDomain == null) { - domain.applyDomain(aPC); + DomainApplication.applyDomain(aPC, domain); aCD.setDomain(domain, aPC); aPC.addCharacterDomain(aCD); Modified: Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoDomain.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoDomain.java 2008-10-01 22:52:58 UTC (rev 7860) +++ Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoDomain.java 2008-10-01 23:03:50 UTC (rev 7861) @@ -106,6 +106,7 @@ import pcgen.core.SettingsHandler; import pcgen.core.WeaponProf; import pcgen.core.analysis.DescriptionFormatting; +import pcgen.core.analysis.DomainApplication; import pcgen.core.prereq.PrereqHandler; import pcgen.core.prereq.Prerequisite; import pcgen.core.prereq.PrerequisiteUtilities; @@ -1408,7 +1409,7 @@ // space remains for another domain, so add it if (existingDomain == null) { - addedDomain.applyDomain(pc); + DomainApplication.applyDomain(pc, addedDomain); aCD.setDomain(addedDomain, pc); pc.addCharacterDomain(aCD); Modified: Trunk/pcgen/code/src/java/pcgen/io/PCGVer0Parser.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/PCGVer0Parser.java 2008-10-01 22:52:58 UTC (rev 7860) +++ Trunk/pcgen/code/src/java/pcgen/io/PCGVer0Parser.java 2008-10-01 23:03:50 UTC (rev 7861) @@ -56,6 +56,7 @@ import pcgen.core.Skill; import pcgen.core.SpecialAbility; import pcgen.core.SpecialProperty; +import pcgen.core.analysis.DomainApplication; import pcgen.core.analysis.SkillRankControl; import pcgen.core.character.CharacterSpell; import pcgen.core.character.EquipSet; @@ -719,7 +720,7 @@ } } - aDomain.applyDomain(aPC); + DomainApplication.applyDomain(aPC, aDomain); } else { Modified: Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Parser.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Parser.java 2008-10-01 22:52:58 UTC (rev 7860) +++ Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Parser.java 2008-10-01 23:03:50 UTC (rev 7861) @@ -72,6 +72,7 @@ import pcgen.core.SubClass; import pcgen.core.SubstitutionClass; import pcgen.core.WeaponProf; +import pcgen.core.analysis.DomainApplication; import pcgen.core.analysis.SkillRankControl; import pcgen.core.bonus.Bonus; import pcgen.core.bonus.BonusObj; @@ -2106,7 +2107,7 @@ } thePC.addCharacterDomain(aCharacterDomain); - aDomain.applyDomain(thePC); + DomainApplication.applyDomain(thePC, aDomain); // TODO // set associated list This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-10-03 02:21:13
|
Revision: 7881 http://pcgen.svn.sourceforge.net/pcgen/?rev=7881&view=rev Author: thpr Date: 2008-10-03 02:21:03 +0000 (Fri, 03 Oct 2008) Log Message: ----------- convert subclass & substitutionclass list to CDOM-style lists Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java Trunk/pcgen/code/src/java/pcgen/core/PCClass.java Trunk/pcgen/code/src/java/pcgen/core/chooser/ClassChoiceManager.java Trunk/pcgen/code/src/java/pcgen/core/npcgen/ClassData.java Trunk/pcgen/code/src/java/pcgen/gui/editor/EditorMainForm.java Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoClasses.java Trunk/pcgen/code/src/java/pcgen/persistence/lst/PCClassLoader.java Trunk/pcgen/code/src/java/pcgen/rules/context/AbstractReferenceContext.java Modified: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java 2008-10-03 02:04:47 UTC (rev 7880) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java 2008-10-03 02:21:03 UTC (rev 7881) @@ -59,6 +59,8 @@ import pcgen.core.SpecialAbility; import pcgen.core.SpecialProperty; import pcgen.core.SpellProhibitor; +import pcgen.core.SubClass; +import pcgen.core.SubstitutionClass; import pcgen.core.Vision; import pcgen.core.WeaponProf; import pcgen.core.bonus.BonusObj; @@ -224,6 +226,8 @@ public static final ListKey<ChangeProf> CHANGEPROF = new ListKey<ChangeProf>(); public static final ListKey<Equipment> NATURAL_WEAPON = new ListKey<Equipment>(); public static final ListKey<SpecialAbility> SAB = new ListKey<SpecialAbility>(); + public static final ListKey<SubClass> SUB_CLASS = new ListKey<SubClass>(); + public static final ListKey<SubstitutionClass> SUBSTITUTION_CLASS = new ListKey<SubstitutionClass>(); /** Private constructor to prevent instantiation of this class */ private ListKey() { Modified: Trunk/pcgen/code/src/java/pcgen/core/PCClass.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-10-03 02:04:47 UTC (rev 7880) +++ Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-10-03 02:21:03 UTC (rev 7881) @@ -126,22 +126,6 @@ private String specialty = null; /* - * PCCLASSONLY This is really an item that the PCClass knows, and then the - * selected subClass, if any, is structured into the PCClassLevel during the - * construction of the PCClassLevel (inheritAttributesFrom - although that - * could really be cleaned up and a better method found) - */ - private List<SubClass> subClassList = null; - - /* - * PCCLASSONLY This is really an item that the PCClass knows, and then the - * selected substitutionClass, if any, is structured into the PCClassLevel - * during the construction of the PCClassLevel (inheritAttributesFrom - - * although that could really be cleaned up and a better method found) - */ - private List<SubstitutionClass> substitutionClassList = null; - - /* * ALLCLASSLEVELS castForLevelMap is part of PCClassLevel - or nothing at * all since this seems to be a form of cache? - DELETEVARIABLE */ @@ -1480,6 +1464,7 @@ */ public final SubClass getSubClassKeyed(final String aKey) { + List<SubClass> subClassList = getListFor(ListKey.SUB_CLASS); if (subClassList == null) { return null; @@ -1503,6 +1488,7 @@ */ public final SubstitutionClass getSubstitutionClassKeyed(final String aKey) { + List<SubstitutionClass> substitutionClassList = getListFor(ListKey.SUBSTITUTION_CLASS); if (substitutionClassList == null) { return null; @@ -2189,14 +2175,9 @@ */ public final void addSubClass(final SubClass sClass) { - if (subClassList == null) - { - subClassList = new ArrayList<SubClass>(); - } - sClass.setHitPointMap(hitPointMap); sClass.put(ObjectKey.LEVEL_HITDIE, get(ObjectKey.LEVEL_HITDIE)); - subClassList.add(sClass); + addToListFor(ListKey.SUB_CLASS, sClass); } /* @@ -2206,14 +2187,9 @@ */ public final void addSubstitutionClass(final SubstitutionClass sClass) { - if (substitutionClassList == null) - { - substitutionClassList = new ArrayList<SubstitutionClass>(); - } - sClass.setHitPointMap(hitPointMap); sClass.put(ObjectKey.LEVEL_HITDIE, get(ObjectKey.LEVEL_HITDIE)); - substitutionClassList.add(sClass); + addToListFor(ListKey.SUBSTITUTION_CLASS, sClass); } /** @@ -2472,7 +2448,6 @@ { aClass.hitPointMap = new HashMap<Integer, Integer>(hitPointMap); } - aClass.substitutionClassList = substitutionClassList; levelMap = new TreeMap<Integer, PCClassLevel>(); for (Map.Entry<Integer, PCClassLevel> me : aClass.levelMap.entrySet()) @@ -2555,26 +2530,6 @@ } /* - * FINALPCCLASSONLY This is really an item that the PCClass knows, and then the - * selected subClass, if any, is structured into the PCClassLevel during the - * construction of the PCClassLevel - */ - public List<SubClass> getSubClassList() - { - return subClassList; - } - - /* - * PCCLASSONLY This is really an item that the PCClass knows, and then the - * selected substitutionClass, if any, is structured into the PCClassLevel - * during the construction of the PCClassLevel - */ - public List<SubstitutionClass> getSubstitutionClassList() - { - return substitutionClassList; - } - - /* * FINALPCCLASSLEVELONLY This is only part of the level, as the skill list is * calculated based on other factors, it is not a Tag */ @@ -4106,7 +4061,7 @@ final PlayerCharacter aPC) { - for (SubstitutionClass sc : substitutionClassList) + for (SubstitutionClass sc : getListFor(ListKey.SUBSTITUTION_CLASS)) { if (!PrereqHandler.passesAll(sc.getPrerequisiteList(), aPC, this)) { @@ -4133,7 +4088,8 @@ */ private void checkForSubClass(final PlayerCharacter aPC) { - if (!hasSubClass || (subClassList == null) || (subClassList.isEmpty())) + List<SubClass> subClassList = getListFor(ListKey.SUB_CLASS); + if (subClassList == null || subClassList.isEmpty()) { return; } @@ -4344,8 +4300,8 @@ private void checkForSubstitutionClass(final int aLevel, final PlayerCharacter aPC) { - if (!hasSubstitutionClass || (substitutionClassList == null) - || (substitutionClassList.isEmpty())) + List<SubstitutionClass> substitutionClassList = getListFor(ListKey.SUBSTITUTION_CLASS); + if (substitutionClassList == null || substitutionClassList.isEmpty()) { return; } Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/ClassChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/ClassChoiceManager.java 2008-10-03 02:04:47 UTC (rev 7880) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/ClassChoiceManager.java 2008-10-03 02:21:03 UTC (rev 7881) @@ -28,6 +28,7 @@ import java.util.List; import java.util.StringTokenizer; +import pcgen.cdom.enumeration.ListKey; import pcgen.core.Globals; import pcgen.core.PCClass; import pcgen.core.PObject; @@ -82,7 +83,7 @@ { if(aClass.hasSubClass()) { - for (PCClass aSubClass : aClass.getSubClassList()) + for (PCClass aSubClass : aClass.getListFor(ListKey.SUB_CLASS)) { availableList.add(aSubClass); } @@ -113,7 +114,7 @@ { if(aClass.hasSubClass()) { - for (PCClass aSubClass : aClass.getSubClassList()) + for (PCClass aSubClass : aClass.getListFor(ListKey.SUB_CLASS)) { availableList.add(aSubClass); } @@ -134,7 +135,7 @@ availableList.add(aClass); if(aClass.hasSubClass()) { - for (PCClass aSubClass : aClass.getSubClassList()) + for (PCClass aSubClass : aClass.getListFor(ListKey.SUB_CLASS)) { availableList.add(aSubClass); } Modified: Trunk/pcgen/code/src/java/pcgen/core/npcgen/ClassData.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/npcgen/ClassData.java 2008-10-03 02:04:47 UTC (rev 7880) +++ Trunk/pcgen/code/src/java/pcgen/core/npcgen/ClassData.java 2008-10-03 02:21:03 UTC (rev 7881) @@ -29,6 +29,7 @@ import pcgen.base.util.WeightedCollection; import pcgen.cdom.base.CDOMReference; import pcgen.cdom.base.Constants; +import pcgen.cdom.enumeration.ListKey; import pcgen.core.Ability; import pcgen.core.AbilityCategory; import pcgen.core.Deity; @@ -387,7 +388,7 @@ final PCClass pcClass = Globals.getContext().ref.silentlyGetConstructedCDOMObject(PCClass.class, theClassKey); if (pcClass != null) { - for ( final SubClass subClass : pcClass.getSubClassList() ) + for ( final SubClass subClass : pcClass.getListFor(ListKey.SUB_CLASS) ) { addSubClass( subClass.getKeyName(), 1 ); } Modified: Trunk/pcgen/code/src/java/pcgen/gui/editor/EditorMainForm.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/editor/EditorMainForm.java 2008-10-03 02:04:47 UTC (rev 7880) +++ Trunk/pcgen/code/src/java/pcgen/gui/editor/EditorMainForm.java 2008-10-03 02:21:03 UTC (rev 7881) @@ -1455,7 +1455,7 @@ } if (aClass.hasSubClass()) { - for (SubClass subClass : aClass.getSubClassList()) + for (SubClass subClass : aClass.getListFor(ListKey.SUB_CLASS)) { availableFavouredClassList.add(aClass.getKeyName() + "." + subClass.getKeyName()); @@ -1463,7 +1463,7 @@ } if (aClass.hasSubstitutionClass()) { - for (SubstitutionClass subClass : aClass.getSubstitutionClassList()) + for (SubstitutionClass subClass : aClass.getListFor(ListKey.SUBSTITUTION_CLASS)) { availableFavouredClassList.add(aClass.getKeyName() + "." + subClass.getKeyName()); @@ -1854,7 +1854,7 @@ } if (aClass.hasSubClass()) { - for (SubClass subClass : aClass.getSubClassList()) + for (SubClass subClass : aClass.getListFor(ListKey.SUB_CLASS)) { availableFavouredClassesList.add(aClass.getKeyName() + "." + subClass.getKeyName()); @@ -1862,7 +1862,7 @@ } if (aClass.hasSubstitutionClass()) { - for (SubstitutionClass subClass : aClass.getSubstitutionClassList()) + for (SubstitutionClass subClass : aClass.getListFor(ListKey.SUBSTITUTION_CLASS)) { availableFavouredClassesList.add(aClass.getKeyName() + "." + subClass.getKeyName()); Modified: Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoClasses.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoClasses.java 2008-10-03 02:04:47 UTC (rev 7880) +++ Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoClasses.java 2008-10-03 02:21:03 UTC (rev 7881) @@ -76,6 +76,7 @@ import pcgen.cdom.base.Constants; import pcgen.cdom.content.HitDie; import pcgen.cdom.enumeration.IntegerKey; +import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; import pcgen.cdom.enumeration.StringKey; import pcgen.core.GameMode; @@ -1912,10 +1913,10 @@ private void addSubClassesTo(PObjectNode aFN, PCClass aClass) { - if ((aClass.getSubClassList() != null) - && !aClass.getSubClassList().isEmpty()) + List<SubClass> subClassList = aClass.getListFor(ListKey.SUB_CLASS); + if (subClassList != null) { - for (SubClass sClass : aClass.getSubClassList()) + for (SubClass sClass : subClassList) { PObjectNode aSN = new PObjectNode(); aSN.setParent(aFN); Modified: Trunk/pcgen/code/src/java/pcgen/persistence/lst/PCClassLoader.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/persistence/lst/PCClassLoader.java 2008-10-03 02:04:47 UTC (rev 7880) +++ Trunk/pcgen/code/src/java/pcgen/persistence/lst/PCClassLoader.java 2008-10-03 02:21:03 UTC (rev 7881) @@ -27,6 +27,7 @@ import java.util.StringTokenizer; import pcgen.cdom.enumeration.IntegerKey; +import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.inst.PCClassLevel; import pcgen.core.Globals; import pcgen.core.PCClass; @@ -97,12 +98,10 @@ } else { - if ((pcClass.getSubClassList() != null) - && !pcClass.getSubClassList().isEmpty()) + List<SubClass> subClassList = pcClass.getListFor(ListKey.SUB_CLASS); + if (subClassList != null) { - subClass = - pcClass.getSubClassList().get( - pcClass.getSubClassList().size() - 1); + subClass = subClassList.get(subClassList.size() - 1); subClass.addToLevelArray(lstLine.substring(14)); return pcClass; @@ -147,12 +146,14 @@ } else { - if ((pcClass.getSubstitutionClassList() != null) - && !pcClass.getSubstitutionClassList().isEmpty() - && lstLine.length() > 18) + List<SubstitutionClass> substitutionClassList = pcClass + .getListFor(ListKey.SUBSTITUTION_CLASS); + if (substitutionClassList != null + && !substitutionClassList.isEmpty() + && lstLine.length() > 18) { - substitutionClass = pcClass.getSubstitutionClassList().get( - pcClass.getSubstitutionClassList().size() - 1); + substitutionClass = substitutionClassList + .get(substitutionClassList.size() - 1); substitutionClass.addToLevelArray(lstLine.substring(18)); return pcClass; Modified: Trunk/pcgen/code/src/java/pcgen/rules/context/AbstractReferenceContext.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/rules/context/AbstractReferenceContext.java 2008-10-03 02:04:47 UTC (rev 7880) +++ Trunk/pcgen/code/src/java/pcgen/rules/context/AbstractReferenceContext.java 2008-10-03 02:21:03 UTC (rev 7881) @@ -21,7 +21,6 @@ import java.util.Collection; import java.util.HashMap; import java.util.HashSet; -import java.util.List; import java.util.Map; import java.util.Set; @@ -29,6 +28,7 @@ import pcgen.cdom.base.CDOMObject; import pcgen.cdom.base.CategorizedCDOMObject; import pcgen.cdom.base.Category; +import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; import pcgen.cdom.enumeration.StringKey; import pcgen.cdom.enumeration.SubClassCategory; @@ -318,11 +318,10 @@ // .getConstructedCDOMObjects(SUBCLASS_CLASS, SubClassCategory // .getConstant(key)); // for (CDOMSubClass subcl : subclasses) - List<SubClass> subc = pcc.getSubClassList(); - if (subc != null) + if (pcc.hasSubClass()) { SubClassCategory cat = SubClassCategory.getConstant(key); - for (SubClass subcl : subc) + for (SubClass subcl : pcc.getListFor(ListKey.SUB_CLASS)) { String subKey = subcl.getKeyName(); constructCDOMObject(CLASSSKILLLIST_CLASS, subKey); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2009-08-16 15:18:27
|
Revision: 10252 http://pcgen.svn.sourceforge.net/pcgen/?rev=10252&view=rev Author: thpr Date: 2009-08-16 15:18:20 +0000 (Sun, 16 Aug 2009) Log Message: ----------- remove getChoices from PObject Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/PObject.java Trunk/pcgen/code/src/java/pcgen/core/chooser/ChooserUtilities.java Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoSpecialAbilities.java Modified: Trunk/pcgen/code/src/java/pcgen/core/PObject.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2009-08-16 15:14:02 UTC (rev 10251) +++ Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2009-08-16 15:18:20 UTC (rev 10252) @@ -48,7 +48,6 @@ import pcgen.cdom.enumeration.Type; import pcgen.core.analysis.OutputNameFormatting; import pcgen.core.bonus.BonusObj; -import pcgen.core.chooser.ChooserUtilities; import pcgen.core.prereq.PrereqHandler; import pcgen.core.prereq.Prerequisite; import pcgen.core.spell.Spell; @@ -73,7 +72,6 @@ { /** Standard serialVersionUID for Serializable objects */ private static final long serialVersionUID = 1; - /** a boolean for whether something should recurse, default is false */ private static boolean dontRecurse = false; @@ -157,20 +155,6 @@ } /** - * Get the choices for this PC - * @param aChoice - * @param aPC - */ - public final void getChoices( - final String aChoice, - final PlayerCharacter aPC) - { - final List availableList = new ArrayList(); - final List selectedList = new ArrayList(); - ChooserUtilities.getChoices(this, aChoice, availableList, selectedList, aPC); - } - - /** * Set the name (sets keyname also) * @param aString */ Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/ChooserUtilities.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/ChooserUtilities.java 2009-08-16 15:14:02 UTC (rev 10251) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/ChooserUtilities.java 2009-08-16 15:18:20 UTC (rev 10252) @@ -617,5 +617,13 @@ stringList.add(String.valueOf(iter.next())); } } + + public static void getChoices(PObject object, String choice, + PlayerCharacter apc) + { + final List availableList = new ArrayList(); + final List selectedList = new ArrayList(); + ChooserUtilities.getChoices(object, choice, availableList, selectedList, apc); + } } Modified: Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoSpecialAbilities.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoSpecialAbilities.java 2009-08-16 15:14:02 UTC (rev 10251) +++ Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoSpecialAbilities.java 2009-08-16 15:18:20 UTC (rev 10252) @@ -69,6 +69,7 @@ import pcgen.core.SpecialAbility; import pcgen.core.WeaponProf; import pcgen.core.analysis.SkillLanguage; +import pcgen.core.chooser.ChooserUtilities; import pcgen.core.utils.MessageType; import pcgen.core.utils.ShowMessageDelegate; import pcgen.gui.AddSpecialAbility; @@ -676,7 +677,7 @@ if (profBonusObject instanceof Domain) { final Domain aDomain = (Domain) profBonusObject; - aDomain.getChoices(aDomain.getSafe(StringKey.CHOICE_STRING), pc); + ChooserUtilities.getChoices(aDomain, aDomain.getSafe(StringKey.CHOICE_STRING), pc); } else { @@ -687,11 +688,10 @@ PObject po = (PObject) profBonusObject; Collection<CDOMReference<WeaponProf>> wplist = po .getListMods(WeaponProf.STARTING_LIST); - po.getChoices("WEAPONPROF|1|" - + ReferenceUtilities.joinLstFormat(wplist, - "[WEAPONPROF]|") - + PropertyFactory.getString("in_proficiency"), - pc); + ChooserUtilities.getChoices(po, "WEAPONPROF|1|" + + ReferenceUtilities.joinLstFormat(wplist, + "[WEAPONPROF]|") + + PropertyFactory.getString("in_proficiency"), pc); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2009-09-07 21:55:01
|
Revision: 10431 http://pcgen.svn.sourceforge.net/pcgen/?rev=10431&view=rev Author: thpr Date: 2009-09-07 21:54:54 +0000 (Mon, 07 Sep 2009) Log Message: ----------- ClassLevelFacet Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java Added Paths: ----------- Trunk/pcgen/code/src/java/pcgen/cdom/facet/ClassLevelFacet.java Added: Trunk/pcgen/code/src/java/pcgen/cdom/facet/ClassLevelFacet.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/facet/ClassLevelFacet.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/cdom/facet/ClassLevelFacet.java 2009-09-07 21:54:54 UTC (rev 10431) @@ -0,0 +1,51 @@ +/* + * Copyright (c) Thomas Parker, 2009. + * + * 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 pcgen.cdom.facet; + +import pcgen.cdom.enumeration.CharID; +import pcgen.cdom.facet.ClassFacet.ClassLevelChangeEvent; +import pcgen.cdom.facet.ClassFacet.ClassLevelChangeListener; +import pcgen.cdom.inst.PCClassLevel; +import pcgen.core.PCClass; + +public class ClassLevelFacet extends AbstractSourcedListFacet<PCClassLevel> + implements ClassLevelChangeListener +{ + + private ClassFacet classFacet = FacetLibrary.getFacet(ClassFacet.class); + + public void update(CharID id, PCClass pcc, Integer oldLevel, int level) + { + int old = oldLevel == null ? 0 : oldLevel; + for (int i = old + 1; i <= level; i++) + { + add(id, classFacet.getClassLevel(id, pcc, i), pcc); + } + for (int i = old; i > level; i--) + { + remove(id, classFacet.getClassLevel(id, pcc, i), pcc); + } + } + + public void levelChanged(ClassLevelChangeEvent lce) + { + update(lce.getCharID(), lce.getPCClass(), lce.getOldLevel(), lce + .getNewLevel()); + } + +} Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2009-09-07 21:52:31 UTC (rev 10430) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2009-09-07 21:54:54 UTC (rev 10431) @@ -96,6 +96,7 @@ import pcgen.cdom.facet.ChallengeRatingFacet; import pcgen.cdom.facet.CheckFacet; import pcgen.cdom.facet.ClassFacet; +import pcgen.cdom.facet.ClassLevelFacet; import pcgen.cdom.facet.CompanionModFacet; import pcgen.cdom.facet.DataFacetChangeEvent; import pcgen.cdom.facet.DataFacetChangeListener; @@ -219,6 +220,7 @@ private CheckFacet checkFacet = FacetLibrary.getFacet(CheckFacet.class); private SkillFacet skillFacet = FacetLibrary.getFacet(SkillFacet.class); private ClassFacet classFacet = FacetLibrary.getFacet(ClassFacet.class); + private ClassLevelFacet classLevelFacet = FacetLibrary.getFacet(ClassLevelFacet.class); private CompanionModFacet companionModFacet = FacetLibrary.getFacet(CompanionModFacet.class); private CampaignFacet campaignFacet = FacetLibrary.getFacet(CampaignFacet.class); private ExpandedCampaignFacet expandedCampaignFacet = FacetLibrary.getFacet(ExpandedCampaignFacet.class); @@ -435,6 +437,7 @@ campaignFacet.addDataFacetChangeListener(expandedCampaignFacet); activeEquipmentFacet.addDataFacetChangeListener(activeEqModFacet); + classFacet.addLevelChangeListener(classLevelFacet); resolveFacet.associatePlayerCharacter(id, this); bonusFacet.associatePlayerCharacter(id, this); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2009-09-26 21:58:31
|
Revision: 10613 http://pcgen.svn.sourceforge.net/pcgen/?rev=10613&view=rev Author: thpr Date: 2009-09-26 21:58:22 +0000 (Sat, 26 Sep 2009) Log Message: ----------- FindBugs cleanup Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/BonusManager.java Trunk/pcgen/code/src/java/pcgen/core/Equipment.java Trunk/pcgen/code/src/java/pcgen/core/EquipmentChoice.java Trunk/pcgen/code/src/java/pcgen/core/Kit.java Trunk/pcgen/code/src/java/pcgen/core/kit/KitSkill.java Trunk/pcgen/code/src/java/pcgen/core/term/BasePCCountAbilitiesNatureTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/core/term/EvaluatorFactory.java Trunk/pcgen/code/src/java/pcgen/core/term/PCCasterLevelTotalTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/io/Compatibility.java Trunk/pcgen/code/src/java/pcgen/io/ExportHandler.java Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Parser.java Modified: Trunk/pcgen/code/src/java/pcgen/core/BonusManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/BonusManager.java 2009-09-26 21:32:37 UTC (rev 10612) +++ Trunk/pcgen/code/src/java/pcgen/core/BonusManager.java 2009-09-26 21:58:22 UTC (rev 10613) @@ -1266,7 +1266,7 @@ return bonusList; } - public class TempBonusInfo + public static class TempBonusInfo { public final Object source; public final Object target; Modified: Trunk/pcgen/code/src/java/pcgen/core/Equipment.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Equipment.java 2009-09-26 21:32:37 UTC (rev 10612) +++ Trunk/pcgen/code/src/java/pcgen/core/Equipment.java 2009-09-26 21:58:22 UTC (rev 10613) @@ -3990,8 +3990,8 @@ { Integer acCombatBonus = Integer.valueOf(aString.substring(10, iOffs)); - acCombatBonus = new Float( - acCombatBonus.doubleValue() * mult).intValue(); + double d = acCombatBonus.doubleValue() * mult; + acCombatBonus = (int) d; aString = aString.substring(0, 10) + acCombatBonus.toString() + aString.substring(iOffs); @@ -4467,9 +4467,11 @@ for (ChangeArmorType cat : eqMod.getSafeListFor(ListKey.ARMORTYPE)) { List<String> tempTypeList = cat.applyModifier(newTypeList); + LinkedHashSet<String> tempTypeSet = new LinkedHashSet<String>( + tempTypeList); boolean noMatch = newTypeList.size() != tempTypeList.size() - || tempTypeList.equals(newTypeList); - newTypeList = new LinkedHashSet<String>(tempTypeList); + || newTypeList.equals(tempTypeSet); + newTypeList = tempTypeSet; if (!noMatch) { break; @@ -5891,68 +5893,66 @@ { String bType = (aType != null) ? aType.toUpperCase() : null; - if (bType != null) - { - bType = bType.toUpperCase(); - } - // Default to non-stacking bonuses int index = -1; - final StringTokenizer aTok = new StringTokenizer(bType, "."); - // e.g. "COMBAT.AC.DODGE" - if ((bType != null) && (aTok.countTokens() >= 2)) + if (aType != null) { + final StringTokenizer aTok = new StringTokenizer(bType, "."); + if (aTok.countTokens() >= 2) + { - // we need to get the 3rd token to see - // if it should .STACK or .REPLACE - aTok.nextToken(); //Discard token - String aString = aTok.nextToken(); - String nextTok = null; + // we need to get the 3rd token to see + // if it should .STACK or .REPLACE + aTok.nextToken(); // Discard token + String aString = aTok.nextToken(); + String nextTok = null; - // if the 3rd token is "BASE" we have something like - // CHECKS.BASE.Fortitude - if ("BASE".equals(aString)) - { - if (aTok.hasMoreTokens()) + // if the 3rd token is "BASE" we have something like + // CHECKS.BASE.Fortitude + if ("BASE".equals(aString)) { - // discard next token (Fortitude) - aTok.nextToken(); + if (aTok.hasMoreTokens()) + { + // discard next token (Fortitude) + aTok.nextToken(); + } + + if (aTok.hasMoreTokens()) + { + // check for a TYPE + nextTok = aTok.nextToken(); + } } - - if (aTok.hasMoreTokens()) + else { - // check for a TYPE - nextTok = aTok.nextToken(); + if (aTok.hasMoreTokens()) + { + // Type: .DODGE + nextTok = aTok.nextToken(); + } } - } - else - { - if (aTok.hasMoreTokens()) + + if (nextTok != null) { - // Type: .DODGE - nextTok = aTok.nextToken(); + index = SettingsHandler.getGame() + .getUnmodifiableBonusStackList().indexOf(nextTok); // e.g. + // Dodge } - } - if (nextTok != null) - { - index = SettingsHandler.getGame().getUnmodifiableBonusStackList().indexOf(nextTok); // e.g. Dodge + // + // un-named (or un-TYPE'd) bonus should stack + if (nextTok == null) + { + index = 1; + } + else if ("NULL".equals(nextTok)) + { + index = 1; + } } - - // - // un-named (or un-TYPE'd) bonus should stack - if (nextTok == null) - { - index = 1; - } - else if ("NULL".equals(nextTok)) - { - index = 1; - } } - // .STACK means stack // .REPLACE stacks with other .REPLACE bonuses if ((bType != null) && (bType.endsWith(".STACK") || bType.endsWith(".REPLACE"))) @@ -6022,7 +6022,7 @@ * The Class <code>EquipmentHeadCostSummary</code> carries the multi * valued response back when calculating the cost of a head. */ - private class EquipmentHeadCostSummary + private static class EquipmentHeadCostSummary { BigDecimal postSizeCost = BigDecimal.ZERO; BigDecimal nonDoubleCost = BigDecimal.ZERO; Modified: Trunk/pcgen/code/src/java/pcgen/core/EquipmentChoice.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/EquipmentChoice.java 2009-09-26 21:32:37 UTC (rev 10612) +++ Trunk/pcgen/code/src/java/pcgen/core/EquipmentChoice.java 2009-09-26 21:58:22 UTC (rev 10613) @@ -408,6 +408,10 @@ { for ( EquipmentModifier sibling : parent.getEqModifierList(true) ) { + /* + * TODO sibling can't be this - different classes... so this is a + * bug of some form. + */ if ( !(sibling.equals(this)) && sibling.getSafe(StringKey.CHOICE_STRING).startsWith(choiceType)) @@ -696,7 +700,7 @@ } } - private class EquipChoiceIterator implements Iterator<String> + private static class EquipChoiceIterator implements Iterator<String> { List<String> choiceList; int currPos; Modified: Trunk/pcgen/code/src/java/pcgen/core/Kit.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Kit.java 2009-09-26 21:32:37 UTC (rev 10612) +++ Trunk/pcgen/code/src/java/pcgen/core/Kit.java 2009-09-26 21:58:22 UTC (rev 10613) @@ -254,7 +254,7 @@ } } - private class ObjectTypeComparator implements Comparator<BaseKit> + private static class ObjectTypeComparator implements Comparator<BaseKit> { public int compare(BaseKit bk1, BaseKit bk2) { Modified: Trunk/pcgen/code/src/java/pcgen/core/kit/KitSkill.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/kit/KitSkill.java 2009-09-26 21:32:37 UTC (rev 10612) +++ Trunk/pcgen/code/src/java/pcgen/core/kit/KitSkill.java 2009-09-26 21:58:22 UTC (rev 10613) @@ -41,6 +41,7 @@ import pcgen.core.analysis.SkillLanguage; import pcgen.core.analysis.SkillRankControl; import pcgen.core.pclevelinfo.PCLevelInfo; +import pcgen.core.utils.CoreUtility; import pcgen.gui.CharacterInfo; import pcgen.gui.PCGen_Frame1; import pcgen.util.Logging; @@ -348,7 +349,7 @@ Math.min(pc.getMaxRank(aSkill, pcClass) .doubleValue(), curRank + ranksLeftToAdd); ranksToAdd -= curRank; - if (ranksToAdd != ranksLeftToAdd) + if (CoreUtility.doublesEqual(ranksToAdd, ranksLeftToAdd)) { warnings.add("SKILL: Could not add " + (ranksLeftToAdd - ranksToAdd) + " to " + aSkill.getDisplayName() Modified: Trunk/pcgen/code/src/java/pcgen/core/term/BasePCCountAbilitiesNatureTermEvaluator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/term/BasePCCountAbilitiesNatureTermEvaluator.java 2009-09-26 21:32:37 UTC (rev 10612) +++ Trunk/pcgen/code/src/java/pcgen/core/term/BasePCCountAbilitiesNatureTermEvaluator.java 2009-09-26 21:58:22 UTC (rev 10613) @@ -34,9 +34,6 @@ public abstract class BasePCCountAbilitiesNatureTermEvaluator extends BasePCCountAbilitiesTermEvaluator { - protected boolean visible; - protected boolean hidden; - public BasePCCountAbilitiesNatureTermEvaluator() { } Modified: Trunk/pcgen/code/src/java/pcgen/core/term/EvaluatorFactory.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/term/EvaluatorFactory.java 2009-09-26 21:32:37 UTC (rev 10612) +++ Trunk/pcgen/code/src/java/pcgen/core/term/EvaluatorFactory.java 2009-09-26 21:58:22 UTC (rev 10613) @@ -50,10 +50,10 @@ new HashMap<String, Map<String, TermEvaluator>>(); - public static EvaluatorFactory PC = + public static final EvaluatorFactory PC = new EvaluatorFactory(true, TermEvaluatorBuilderPCVar.values()); - public static EvaluatorFactory EQ = + public static final EvaluatorFactory EQ = new EvaluatorFactory(false, TermEvaluatorBuilderEQVar.values()); private EvaluatorFactory ( Modified: Trunk/pcgen/code/src/java/pcgen/core/term/PCCasterLevelTotalTermEvaluator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/term/PCCasterLevelTotalTermEvaluator.java 2009-09-26 21:32:37 UTC (rev 10612) +++ Trunk/pcgen/code/src/java/pcgen/core/term/PCCasterLevelTotalTermEvaluator.java 2009-09-26 21:58:22 UTC (rev 10613) @@ -63,9 +63,7 @@ final int castBonus = (int) pc.getTotalBonusTo("CASTERLEVEL", classKey); final int iClass = (castBonus == 0) ? pc.getLevel(pcClass) : 0; - String spellType = (pcClass == null) ? - Constants.s_NONE : - pcClass.getSpellType(); + String spellType = pcClass.getSpellType(); iLev += pc.getTotalCasterLevelWithSpellBonus( aSpell, aSpell.getSpell(), Modified: Trunk/pcgen/code/src/java/pcgen/io/Compatibility.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/Compatibility.java 2009-09-26 21:32:37 UTC (rev 10612) +++ Trunk/pcgen/code/src/java/pcgen/io/Compatibility.java 2009-09-26 21:58:22 UTC (rev 10613) @@ -88,7 +88,7 @@ { hd.append('+'); } - else if (max != min) + else if (!max.equals(min)) { hd.append('-').append(max); } Modified: Trunk/pcgen/code/src/java/pcgen/io/ExportHandler.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/ExportHandler.java 2009-09-26 21:32:37 UTC (rev 10612) +++ Trunk/pcgen/code/src/java/pcgen/io/ExportHandler.java 2009-09-26 21:58:22 UTC (rev 10613) @@ -1249,53 +1249,39 @@ { final String bString = bTok.nextToken(); + float bf = Float.parseFloat(bString); + float vf = Float.parseFloat(valString); switch (mode) { case ADDITION_MODE: + float addf = bf + vf; newAttackData += ("/+" + Integer - .toString(new Float( - Float - .parseFloat(bString) - + Float - .parseFloat(valString)) - .intValue())); + .toString((int) addf)); break; case SUBTRACTION_MODE: + float subf = bf - vf; newAttackData += ("/+" + Integer - .toString(new Float( - Float - .parseFloat(bString) - - Float - .parseFloat(valString)) - .intValue())); + .toString((int) subf)); break; case MULTIPLICATION_MODE: + float multf = bf * vf; newAttackData += ("/+" + Integer - .toString(new Float( - Float - .parseFloat(bString) - * Float - .parseFloat(valString)) - .intValue())); + .toString((int) multf)); break; case DIVISION_MODE: + float divf = bf / vf; newAttackData += ("/+" + Integer - .toString(new Float( - Float - .parseFloat(bString) - / Float - .parseFloat(valString)) - .intValue())); + .toString((int) divf)); break; @@ -3436,6 +3422,8 @@ } else { + Logging.errorPrint("Unknown comparison type: " + bString + + " assuming NEQ"); canWrite = !CoreUtility.doublesEqual(varval.doubleValue(), valval .doubleValue()); Modified: Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Parser.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Parser.java 2009-09-26 21:32:37 UTC (rev 10612) +++ Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Parser.java 2009-09-26 21:58:22 UTC (rev 10613) @@ -2922,7 +2922,7 @@ if (!Constants.EMPTY_STRING.equals(aFollower.getFileName()) && !Constants.EMPTY_STRING.equals(aFollower.getName()) - && !Constants.EMPTY_STRING.equals(aFollower.getType()) + && !Constants.EMPTY_STRING.equals(aFollower.getType().toString()) && aFollower.getType() != null) { thePC.addFollower(aFollower); @@ -3194,7 +3194,7 @@ if (!Constants.EMPTY_STRING.equals(aMaster.getFileName()) && !Constants.EMPTY_STRING.equals(aMaster.getName()) - && !Constants.EMPTY_STRING.equals(aMaster.getType())) + && !Constants.EMPTY_STRING.equals(aMaster.getType().toString())) { thePC.setMaster(aMaster); } @@ -4041,7 +4041,7 @@ ClassSpellList.class, objectKey); if (((aPCClass != null) && objectKey.equals(aPCClass .getKeyName())) - || (aPCClass.getSpellLists(thePC).contains(csl))) + || (aPCClass != null && aPCClass.getSpellLists(thePC).contains(csl))) { source = aPCClass; } @@ -4180,10 +4180,7 @@ if (aCharacterSpell == null) { aCharacterSpell = new CharacterSpell(source, aSpell); - if (!(source instanceof Domain)) - { - aCharacterSpell.addInfo(level, times, spellBook); - } + aCharacterSpell.addInfo(level, times, spellBook); thePC.addAssoc(aPCClass, AssociationListKey.CHARACTER_SPELLS, aCharacterSpell); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2010-06-29 03:08:52
|
Revision: 12373 http://pcgen.svn.sourceforge.net/pcgen/?rev=12373&view=rev Author: thpr Date: 2010-06-29 03:08:45 +0000 (Tue, 29 Jun 2010) Log Message: ----------- Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/PObject.java Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java Added Paths: ----------- Trunk/pcgen/code/src/java/pcgen/cdom/facet/LegalDeityFacet.java Added: Trunk/pcgen/code/src/java/pcgen/cdom/facet/LegalDeityFacet.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/facet/LegalDeityFacet.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/cdom/facet/LegalDeityFacet.java 2010-06-29 03:08:45 UTC (rev 12373) @@ -0,0 +1,82 @@ +/* + * Copyright (c) Thomas Parker, 2010. + * + * 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 pcgen.cdom.facet; + +import java.util.List; + +import pcgen.cdom.base.CDOMReference; +import pcgen.cdom.enumeration.CharID; +import pcgen.cdom.enumeration.ListKey; +import pcgen.core.Deity; +import pcgen.core.PCClass; + +public class LegalDeityFacet +{ + private ClassFacet classFacet = FacetLibrary.getFacet(ClassFacet.class); + + private PrerequisiteFacet prereqFacet = FacetLibrary + .getFacet(PrerequisiteFacet.class); + + /* + * Note this facet makes no sense to turn into a "push" facet that is a + * listener to classes. The reason it makes no sense is that no token + * defaults to ANY, and loading the default ANY reference into a cache and + * running contains against it would probably be slower than just testing + * each Class every time. + */ + public boolean allows(CharID id, Deity aDeity) + { + if (aDeity == null) + { + return false; + } + boolean result; + if (classFacet.isEmpty(id)) + { + result = true; + } + else + { + result = false; + CLASS: for (PCClass aClass : classFacet.getClassSet(id)) + { + List<CDOMReference<Deity>> deityList = aClass + .getListFor(ListKey.DEITY); + if (deityList == null) + { + result = true; + break; + } + else + { + for (CDOMReference<Deity> deity : deityList) + { + if (deity.contains(aDeity)) + { + result = true; + break CLASS; + } + } + } + } + } + + return result && prereqFacet.qualifies(id, aDeity, aDeity); + } + +} Modified: Trunk/pcgen/code/src/java/pcgen/core/PObject.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2010-06-29 02:30:51 UTC (rev 12372) +++ Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2010-06-29 03:08:45 UTC (rev 12373) @@ -33,6 +33,7 @@ import pcgen.base.lang.StringUtil; import pcgen.cdom.base.CDOMList; import pcgen.cdom.base.CDOMObject; +import pcgen.cdom.base.QualifyingObject; import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.StringKey; import pcgen.cdom.enumeration.Type; @@ -53,7 +54,7 @@ * */ public class PObject extends CDOMObject implements Cloneable, Serializable, Comparable<Object>, - KeyedListContainer + KeyedListContainer, QualifyingObject { /** Standard serialVersionUID for Serializable objects */ private static final long serialVersionUID = 1; Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2010-06-29 02:30:51 UTC (rev 12372) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2010-06-29 03:08:45 UTC (rev 12373) @@ -134,6 +134,7 @@ import pcgen.cdom.facet.InitiativeFacet; import pcgen.cdom.facet.KitFacet; import pcgen.cdom.facet.LanguageFacet; +import pcgen.cdom.facet.LegalDeityFacet; import pcgen.cdom.facet.LegsFacet; import pcgen.cdom.facet.LevelFacet; import pcgen.cdom.facet.LevelTableFacet; @@ -188,7 +189,6 @@ import pcgen.core.analysis.BonusCalc; import pcgen.core.analysis.ChooseActivation; import pcgen.core.analysis.DomainApplication; -import pcgen.core.analysis.SizeUtilities; import pcgen.core.analysis.SkillRankControl; import pcgen.core.analysis.SpecialAbilityResolution; import pcgen.core.analysis.SpellCountCalc; @@ -284,6 +284,7 @@ private MasterFacet masterFacet = FacetLibrary.getFacet(MasterFacet.class); private AutoEquipmentListFacet autoListEquipmentFacet = FacetLibrary.getFacet(AutoEquipmentListFacet.class); private MonsterCSkillFacet monCSkillFacet = FacetLibrary.getFacet(MonsterCSkillFacet.class); + private LegalDeityFacet legalDeityFacet = FacetLibrary.getFacet(LegalDeityFacet.class); private LanguageFacet languageFacet = FacetLibrary.getFacet(LanguageFacet.class); private LanguageFacet freeLangFacet = FacetLibrary.getFacet(FreeLanguageFacet.class); @@ -6983,42 +6984,7 @@ */ public boolean canSelectDeity(final Deity aDeity) { - if (aDeity == null) - { - return false; - } - boolean result; - if (classFacet.isEmpty(id)) - { - result = true; - } - else - { - result = false; - CLASS: for (PCClass aClass : getClassSet()) - { - List<CDOMReference<Deity>> deityList = - aClass.getListFor(ListKey.DEITY); - if (deityList == null) - { - result = true; - break; - } - else - { - for (CDOMReference<Deity> deity : deityList) - { - if (deity.contains(aDeity)) - { - result = true; - break CLASS; - } - } - } - } - } - - return result && aDeity.qualifies(this, aDeity); + return legalDeityFacet.allows(id, aDeity); } public int classAC() This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jde...@us...> - 2012-06-05 11:46:09
|
Revision: 16831 http://pcgen.svn.sourceforge.net/pcgen/?rev=16831&view=rev Author: jdempsey Date: 2012-06-05 11:45:57 +0000 (Tue, 05 Jun 2012) Log Message: ----------- Spell Tab - Available Spells Should Show as RED if there are prereqs not met Issue#: CODE-1484 Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/facade/CharacterFacade.java Trunk/pcgen/code/src/java/pcgen/gui2/facade/CharacterFacadeImpl.java Trunk/pcgen/code/src/java/pcgen/gui2/tabs/models/QualifiedTreeCellRenderer.java Trunk/pcgen/code/src/java/pcgen/gui2/tabs/spells/SpellBooksTab.java Trunk/pcgen/code/src/java/pcgen/gui2/tabs/spells/SpellsKnownTab.java Trunk/pcgen/code/src/java/pcgen/gui2/tabs/spells/SpellsPreparedTab.java Added Paths: ----------- Trunk/pcgen/code/src/java/pcgen/gui2/tabs/spells/QualifiedSpellTreeCellRenderer.java Modified: Trunk/pcgen/code/src/java/pcgen/core/facade/CharacterFacade.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/facade/CharacterFacade.java 2012-06-05 11:01:58 UTC (rev 16830) +++ Trunk/pcgen/code/src/java/pcgen/core/facade/CharacterFacade.java 2012-06-05 11:45:57 UTC (rev 16831) @@ -613,6 +613,14 @@ */ public boolean isQualifiedFor(DomainFacade domain); + /** + * Check if the character meets all requirements to know the spell. + * @param spell The spell to be checked. + * @param classFacade The class the spell would be added within. + * @return True if the character can know the spell, false if not. + */ + public boolean isQualifiedFor(SpellFacade spell, ClassFacade classFacade); + public void addCharacterChangeListener(CharacterChangeListener listener); public void removeCharacterChangeListener(CharacterChangeListener listener); @@ -793,7 +801,6 @@ /** * @return calculate a variable for the current character */ - public Float getVariable(final String variableString, final boolean isMax) -; + public Float getVariable(final String variableString, final boolean isMax); } Modified: Trunk/pcgen/code/src/java/pcgen/gui2/facade/CharacterFacadeImpl.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui2/facade/CharacterFacadeImpl.java 2012-06-05 11:01:58 UTC (rev 16830) +++ Trunk/pcgen/code/src/java/pcgen/gui2/facade/CharacterFacadeImpl.java 2012-06-05 11:45:57 UTC (rev 16831) @@ -87,6 +87,7 @@ import pcgen.core.Skill; import pcgen.core.VariableProcessor; import pcgen.core.analysis.DomainApplication; +import pcgen.core.analysis.SpellCountCalc; import pcgen.core.analysis.StatAnalysis; import pcgen.core.bonus.BonusObj; import pcgen.core.character.CharacterSpell; @@ -126,6 +127,7 @@ import pcgen.core.facade.ReferenceFacade; import pcgen.core.facade.SimpleFacade; import pcgen.core.facade.SkillFacade; +import pcgen.core.facade.SpellFacade; import pcgen.core.facade.SpellSupportFacade; import pcgen.core.facade.StatFacade; import pcgen.core.facade.TempBonusFacade; @@ -3563,6 +3565,35 @@ return true; } + /** + * {@inheritDoc} + */ + @Override + public boolean isQualifiedFor(SpellFacade spellFacade, + ClassFacade classFacade) + { + if (!(spellFacade instanceof SpellFacadeImplem) + || !(classFacade instanceof PCClass)) + { + return false; + } + + SpellFacadeImplem spellFI = (SpellFacadeImplem) spellFacade; + PCClass pcClass = (PCClass) classFacade; + + if (!theCharacter.isQualified(spellFI.getSpell())) + { + return false; + } + if (!spellFI.getCharSpell().isSpecialtySpell(theCharacter) + && SpellCountCalc.isProhibited(spellFI.getSpell(), pcClass, + theCharacter)) + { + return false; + } + return true; + } + /* (non-Javadoc) * @see pcgen.core.facade.CharacterFacade#addTemplate(pcgen.core.facade.TemplateFacade) */ Modified: Trunk/pcgen/code/src/java/pcgen/gui2/tabs/models/QualifiedTreeCellRenderer.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui2/tabs/models/QualifiedTreeCellRenderer.java 2012-06-05 11:01:58 UTC (rev 16830) +++ Trunk/pcgen/code/src/java/pcgen/gui2/tabs/models/QualifiedTreeCellRenderer.java 2012-06-05 11:45:57 UTC (rev 16831) @@ -29,6 +29,7 @@ import pcgen.core.facade.CharacterFacade; import pcgen.core.facade.InfoFacade; import pcgen.gui2.UIPropertyContext; +import pcgen.system.LanguageBundle; /** * @@ -39,6 +40,10 @@ private CharacterFacade character; + /** + * Create a new instance of QualifiedTreeCellRenderer + * @param character The character for which this instance is rendering. + */ public QualifiedTreeCellRenderer(CharacterFacade character) { this.character = character; @@ -53,9 +58,9 @@ boolean sel, boolean expanded, boolean leaf, int row, boolean focus) { Object obj = ((DefaultMutableTreeNode) value).getUserObject(); - if ("".equals(obj)) + if ("".equals(obj)) //$NON-NLS-1$ { - obj = "None"; + obj = LanguageBundle.getString("in_none"); //$NON-NLS-1$ } super.getTreeCellRendererComponent(tree, obj, sel, expanded, leaf, row, focus); if (obj instanceof InfoFacade && !character.isQualifiedFor((InfoFacade) obj)) Added: Trunk/pcgen/code/src/java/pcgen/gui2/tabs/spells/QualifiedSpellTreeCellRenderer.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui2/tabs/spells/QualifiedSpellTreeCellRenderer.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/gui2/tabs/spells/QualifiedSpellTreeCellRenderer.java 2012-06-05 11:45:57 UTC (rev 16831) @@ -0,0 +1,106 @@ +/* + * QualifiedSpellTreeCellRenderer.java + * Copyright James Dempsey, 2012 + * + * 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 05/06/2012 9:40:42 PM + * + * $Id$ + */ +package pcgen.gui2.tabs.spells; + +import java.awt.Component; +import java.awt.Font; + +import javax.swing.JTree; +import javax.swing.tree.DefaultMutableTreeNode; +import javax.swing.tree.DefaultTreeCellRenderer; +import pcgen.core.facade.CharacterFacade; +import pcgen.core.facade.ClassFacade; +import pcgen.core.facade.InfoFacade; +import pcgen.core.facade.SpellFacade; +import pcgen.core.facade.SpellSupportFacade.SpellNode; +import pcgen.gui2.UIPropertyContext; +import pcgen.system.LanguageBundle; + +/** + * The Class <code>QualifiedSpellTreeCellRenderer</code> renders a spell tree cell + * with colouring indicating if the item can be known by the character. It is + * heavily based on QualifiedTreeCellRenderer + * + * <br/> + * Last Editor: $Author$ + * Last Edited: $Date$ + * + * @author James Dempsey <jde...@us...> + * @version $Revision$ + */ +public class QualifiedSpellTreeCellRenderer extends DefaultTreeCellRenderer +{ + + /** Version for serialisation. */ + private static final long serialVersionUID = -5763535370085434234L; + + private CharacterFacade character; + + /** + * Create a new instance of QualifiedSpellTreeCellRenderer + * @param character The character for which this instance is rendering. + */ + public QualifiedSpellTreeCellRenderer(CharacterFacade character) + { + this.character = character; + setTextNonSelectionColor(UIPropertyContext.getQualifiedColor()); + setClosedIcon(null); + setLeafIcon(null); + setOpenIcon(null); + } + + /** + * {@inheritDoc} + */ + @Override + public Component getTreeCellRendererComponent(JTree tree, Object value, + boolean sel, boolean expanded, boolean leaf, int row, boolean focus) + { + Object obj = ((DefaultMutableTreeNode) value).getUserObject(); + if ("".equals(obj)) //$NON-NLS-1$ + { + obj = LanguageBundle.getString("in_none"); //$NON-NLS-1$ + } + super.getTreeCellRendererComponent(tree, obj, sel, expanded, leaf, row, focus); + if (obj instanceof SpellNode) + { + SpellNode spellNode = (SpellNode) obj; + SpellFacade spell = spellNode.getSpell(); + ClassFacade pcClass = spellNode.getSpellcastingClass(); + if (!character.isQualifiedFor(spell, pcClass)) + { + setForeground(UIPropertyContext.getNotQualifiedColor()); + } + } + if (obj instanceof InfoFacade && ((InfoFacade) obj).isNamePI()) + { + setFont(getFont().deriveFont(Font.BOLD + Font.ITALIC)); + } + else + { + setFont(getFont().deriveFont(Font.PLAIN)); + } + return this; + } + +} Property changes on: Trunk/pcgen/code/src/java/pcgen/gui2/tabs/spells/QualifiedSpellTreeCellRenderer.java ___________________________________________________________________ Added: svn:keywords + Date Author Revision Id Added: svn:eol-style + native Modified: Trunk/pcgen/code/src/java/pcgen/gui2/tabs/spells/SpellBooksTab.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui2/tabs/spells/SpellBooksTab.java 2012-06-05 11:01:58 UTC (rev 16830) +++ Trunk/pcgen/code/src/java/pcgen/gui2/tabs/spells/SpellBooksTab.java 2012-06-05 11:45:57 UTC (rev 16831) @@ -158,6 +158,8 @@ defaultSpellBookModel.setListFacade(character.getSpellSupport().getSpellbooks()); defaultSpellBookModel.setReference(character.getSpellSupport().getDefaultSpellBookRef()); state.put(Models.DefaultSpellBookModel, defaultSpellBookModel); + state.put(QualifiedSpellTreeCellRenderer.class, + new QualifiedSpellTreeCellRenderer(character)); return state; } @@ -172,6 +174,12 @@ addButton.setAction((AddSpellAction) state.get(AddSpellAction.class)); removeButton.setAction((RemoveSpellAction) state.get(RemoveSpellAction.class)); defaultBookCombo.setModel((ComboBoxModel) state.get(Models.DefaultSpellBookModel)); + availableTable + .setTreeCellRenderer((QualifiedSpellTreeCellRenderer) state + .get(QualifiedSpellTreeCellRenderer.class)); + selectedTable + .setTreeCellRenderer((QualifiedSpellTreeCellRenderer) state + .get(QualifiedSpellTreeCellRenderer.class)); } public void storeModels(Hashtable<Object, Object> state) Modified: Trunk/pcgen/code/src/java/pcgen/gui2/tabs/spells/SpellsKnownTab.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui2/tabs/spells/SpellsKnownTab.java 2012-06-05 11:01:58 UTC (rev 16830) +++ Trunk/pcgen/code/src/java/pcgen/gui2/tabs/spells/SpellsKnownTab.java 2012-06-05 11:45:57 UTC (rev 16831) @@ -181,6 +181,8 @@ selectedTable, spellsPane)); state.put(ClassInfoHandler.class, new ClassInfoHandler(character, availableTable, selectedTable, classPane)); + state.put(QualifiedSpellTreeCellRenderer.class, + new QualifiedSpellTreeCellRenderer(character)); return state; } @@ -200,6 +202,12 @@ ((UseHigherSlotsAction) state.get(UseHigherSlotsAction.class)).install(); previewSpellsButton.setAction((PreviewSpellsAction) state.get(PreviewSpellsAction.class)); exportSpellsButton.setAction((ExportSpellsAction) state.get(ExportSpellsAction.class)); + availableTable + .setTreeCellRenderer((QualifiedSpellTreeCellRenderer) state + .get(QualifiedSpellTreeCellRenderer.class)); + selectedTable + .setTreeCellRenderer((QualifiedSpellTreeCellRenderer) state + .get(QualifiedSpellTreeCellRenderer.class)); } @Override Modified: Trunk/pcgen/code/src/java/pcgen/gui2/tabs/spells/SpellsPreparedTab.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui2/tabs/spells/SpellsPreparedTab.java 2012-06-05 11:01:58 UTC (rev 16830) +++ Trunk/pcgen/code/src/java/pcgen/gui2/tabs/spells/SpellsPreparedTab.java 2012-06-05 11:45:57 UTC (rev 16831) @@ -158,6 +158,8 @@ selectedTable, spellsPane)); state.put(ClassInfoHandler.class, new ClassInfoHandler(character, availableTable, selectedTable, classPane)); + state.put(QualifiedSpellTreeCellRenderer.class, + new QualifiedSpellTreeCellRenderer(character)); return state; } @@ -175,6 +177,12 @@ removeSpellListButton.setAction((RemoveSpellListAction) state.get(RemoveSpellListAction.class)); slotsBox.setAction((UseHigherSlotsAction) state.get(UseHigherSlotsAction.class)); ((UseHigherSlotsAction) state.get(UseHigherSlotsAction.class)).install(); + availableTable + .setTreeCellRenderer((QualifiedSpellTreeCellRenderer) state + .get(QualifiedSpellTreeCellRenderer.class)); + selectedTable + .setTreeCellRenderer((QualifiedSpellTreeCellRenderer) state + .get(QualifiedSpellTreeCellRenderer.class)); } public void storeModels(Hashtable<Object, Object> state) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jde...@us...> - 2013-09-29 12:26:56
|
Revision: 21542 http://sourceforge.net/p/pcgen/code/21542 Author: jdempsey Date: 2013-09-29 12:26:52 +0000 (Sun, 29 Sep 2013) Log Message: ----------- Fix bug: MODS:REQUIRED no longer popping up a screen to make the selections - breaks strength bows Issue#: CODE-2141 Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/cdom/base/Constants.java Trunk/pcgen/code/src/java/pcgen/gui2/facade/CharacterFacadeImpl.java Modified: Trunk/pcgen/code/src/java/pcgen/cdom/base/Constants.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/base/Constants.java 2013-09-29 06:14:44 UTC (rev 21541) +++ Trunk/pcgen/code/src/java/pcgen/cdom/base/Constants.java 2013-09-29 12:26:52 UTC (rev 21542) @@ -678,4 +678,7 @@ /** The size (in pixels) of a side of the square thumbnail image */ public static final int THUMBNAIL_SIZE = 100; + + /** Type that signifies the modifier marks what the equipment item is made from. */ + public static final String EQMOD_TYPE_BASEMATERIAL = "BaseMaterial"; } Modified: Trunk/pcgen/code/src/java/pcgen/gui2/facade/CharacterFacadeImpl.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui2/facade/CharacterFacadeImpl.java 2013-09-29 06:14:44 UTC (rev 21541) +++ Trunk/pcgen/code/src/java/pcgen/gui2/facade/CharacterFacadeImpl.java 2013-09-29 12:26:52 UTC (rev 21542) @@ -3422,8 +3422,7 @@ { if (equipItemToAdjust.getSafe(ObjectKey.MOD_CONTROL).getModifiersRequired()) { - if ((equipItemToAdjust.getEqModifierList(true).size() == 0) - && (equipItemToAdjust.getEqModifierList(false).size() == 0)) + if (!hasBeenAdjusted(equipItemToAdjust)) { delegate.showErrorMessage(Constants.APPLICATION_NAME, LanguageBundle @@ -3476,6 +3475,20 @@ updateWealthFields(); } + private boolean hasBeenAdjusted(Equipment equipItemToAdjust) + { + Set<EquipmentModifier> allEqMods = new HashSet<EquipmentModifier>(equipItemToAdjust.getEqModifierList(true)); + allEqMods.addAll(equipItemToAdjust.getEqModifierList(false)); + for (EquipmentModifier eqMod : allEqMods) + { + if (!eqMod.isType(Constants.EQMOD_TYPE_BASEMATERIAL)) + { + return true; + } + } + return false; + } + /** * This method is called to determine whether the character can afford to buy * the requested quantity of an item at the rate selected. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2014-02-16 21:59:18
|
Revision: 23259 http://sourceforge.net/p/pcgen/code/23259 Author: thpr Date: 2014-02-16 21:59:13 +0000 (Sun, 16 Feb 2014) Log Message: ----------- Convert hasAbilityKeyed to use the Ability facets Issue#: CODE-2465 Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/cdom/facet/GrantedAbilityFacet.java Trunk/pcgen/code/src/java/pcgen/cdom/facet/input/ActiveAbilityFacet.java Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java Modified: Trunk/pcgen/code/src/java/pcgen/cdom/facet/GrantedAbilityFacet.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/facet/GrantedAbilityFacet.java 2014-02-16 21:54:07 UTC (rev 23258) +++ Trunk/pcgen/code/src/java/pcgen/cdom/facet/GrantedAbilityFacet.java 2014-02-16 21:59:13 UTC (rev 23259) @@ -1016,4 +1016,30 @@ return set; } + public boolean hasAbilityKeyed(CharID id, AbilityCategory cat, String aKey) + { + Map<Category<Ability>, Map<Nature, Map<Ability, List<Object>>>> catMap = getCachedMap(id); + if (catMap != null) + { + for (Entry<Category<Ability>, Map<Nature, Map<Ability, List<Object>>>> catME : catMap.entrySet()) + { + Category<Ability> c = catME.getKey(); + if (c.getParentCategory().equals(cat)) + { + for (Map<Ability, List<Object>> aMap : catME.getValue().values()) + { + for (Ability a : aMap.keySet()) + { + if (a.getKeyName().equals(aKey)) + { + return true; + } + } + } + } + } + } + return false; + } + } \ No newline at end of file Modified: Trunk/pcgen/code/src/java/pcgen/cdom/facet/input/ActiveAbilityFacet.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/facet/input/ActiveAbilityFacet.java 2014-02-16 21:54:07 UTC (rev 23258) +++ Trunk/pcgen/code/src/java/pcgen/cdom/facet/input/ActiveAbilityFacet.java 2014-02-16 21:59:13 UTC (rev 23259) @@ -863,4 +863,30 @@ return set; } + public boolean hasAbilityKeyed(CharID id, AbilityCategory cat, String aKey) + { + Map<Category<Ability>, Map<Nature, Set<Ability>>> catMap = getCachedMap(id); + if (catMap != null) + { + for (Entry<Category<Ability>, Map<Nature, Set<Ability>>> catME : catMap.entrySet()) + { + Category<Ability> c = catME.getKey(); + if (c.getParentCategory().equals(cat)) + { + for (Set<Ability> abils : catME.getValue().values()) + { + for (Ability a : abils) + { + if (a.getKeyName().equals(aKey)) + { + return true; + } + } + } + } + } + } + return false; + } + } \ No newline at end of file Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2014-02-16 21:54:07 UTC (rev 23258) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2014-02-16 21:59:13 UTC (rev 23259) @@ -8947,18 +8947,10 @@ return null; } - public boolean hasAbilityKeyed(final AbilityCategory aCategory, final String aKey) + public boolean hasAbilityKeyed(final AbilityCategory cat, final String aKey) { - final List<Ability> abilities = getAggregateAbilityList(aCategory); - for (final Ability ability : abilities) - { - if (ability.getKeyName().equals(aKey)) - { - return true; - } - } - - return false; + return abFacet.hasAbilityKeyed(id, cat, aKey) + || grantedAbilityFacet.hasAbilityKeyed(id, cat, aKey); } /** This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jde...@us...> - 2008-10-05 04:20:36
|
Revision: 7933 http://pcgen.svn.sourceforge.net/pcgen/?rev=7933&view=rev Author: jdempsey Date: 2008-10-05 04:20:11 +0000 (Sun, 05 Oct 2008) Log Message: ----------- Fix bug: Feats & Abilities Tab listing incomplete Issue#: 2147171 Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java Trunk/pcgen/code/src/java/pcgen/gui/tabs/ability/SelectedAbilityPanel.java Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-10-05 03:13:45 UTC (rev 7932) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-10-05 04:20:11 UTC (rev 7933) @@ -16776,12 +16776,29 @@ return rebuildFeatAggreagateList(); } + /** + * Retrieve a list of all abilities held by the character in the specified + * category. <br> + * NB: Abilities are only returned in the category they are taken + * in, so if parent catgeory is supplied only those taken directly in the + * parent category will be returned. e.g. If asking for feats, Power Attack + * taken as a fighter feat will nto be returned. You would need to query + * fighter feats to get that. <br> + * NB: Duplicate abilities may be returned also. This may occur where an + * ability is taken multiple times, but in different natures. + * e.g. Skill Focus in two different skills, but once as Normal and once + * as Automatic. + * + * @param aCategory The ability category to be queried. + * @return The list of abilities of the category regardless of nature. + */ public List<Ability> getAggregateAbilityList(final AbilityCategory aCategory) { - if (aCategory == AbilityCategory.FEAT) - { - return aggregateFeatList(); - } + // Note we use the direct feat lists here to make feats behave like other abilities. +// if (aCategory == AbilityCategory.FEAT) +// { +// return aggregateFeatList(); +// } final List<Ability> abilities = new ArrayList<Ability>(getRealAbilitiesList(aCategory)); Modified: Trunk/pcgen/code/src/java/pcgen/gui/tabs/ability/SelectedAbilityPanel.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/tabs/ability/SelectedAbilityPanel.java 2008-10-05 03:13:45 UTC (rev 7932) +++ Trunk/pcgen/code/src/java/pcgen/gui/tabs/ability/SelectedAbilityPanel.java 2008-10-05 04:20:11 UTC (rev 7933) @@ -217,19 +217,11 @@ } /** - * This method gets the feat list from the current PC by calling - * <code>pc.aggregateFeatList()</code>. Because - * <code>aggregateFeatList()</code> (correctly) returns - * chosen/auto/virtual feats aggregated together, this elimiates duplicate - * feats. However, since we want to display feats with multiple choices - * (e.g. Weapon Focus) separately if they are chosen/auto/etc., we add back - * the chosen, virtual, and automatic feats when the - * <code>isMultiples()</code> returns <code>true</code>. Note that this - * <b>may</b> cause problems for the prerequisite tree, although the code - * there <b>appears</b> robust enough to handle it. The list is sorted - * before it is returned. + * This method gets the ability list from the current PC for each ability + * category and sorts each for display. Note that duplicates may appear + * where an ability is taken in different natures (e.g. normal and auto) * - * @return A list of the current PCs feats. + * @return A list of the current PCs abilities. */ private Map<AbilityCategory,List<Ability>> buildPCAbilityList() { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-10-08 21:16:30
|
Revision: 7995 http://pcgen.svn.sourceforge.net/pcgen/?rev=7995&view=rev Author: thpr Date: 2008-10-08 21:16:18 +0000 (Wed, 08 Oct 2008) Log Message: ----------- Foundation work for Associations Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java Added Paths: ----------- Trunk/pcgen/code/src/java/pcgen/cdom/base/ChooseResultActor.java Added: Trunk/pcgen/code/src/java/pcgen/cdom/base/ChooseResultActor.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/base/ChooseResultActor.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/cdom/base/ChooseResultActor.java 2008-10-08 21:16:18 UTC (rev 7995) @@ -0,0 +1,30 @@ +/* + * Copyright 2008 (C) Tom 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 pcgen.cdom.base; + +import pcgen.core.PlayerCharacter; + +public interface ChooseResultActor +{ + + void apply(PlayerCharacter pc, CDOMObject obj, String o); + + void remove(PlayerCharacter pc, CDOMObject obj, String o); + +} Modified: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java 2008-10-08 20:50:03 UTC (rev 7994) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java 2008-10-08 21:16:18 UTC (rev 7995) @@ -32,6 +32,7 @@ import pcgen.base.formula.Formula; import pcgen.base.util.CaseInsensitiveMap; import pcgen.cdom.base.CDOMReference; +import pcgen.cdom.base.ChooseResultActor; import pcgen.cdom.base.TransitionChoice; import pcgen.cdom.content.ChangeProf; import pcgen.cdom.content.KnownSpellIdentifier; @@ -241,6 +242,7 @@ public static final ListKey<CDOMReference<Race>> SERVES_AS_RACE = new ListKey<CDOMReference<Race>>(); public static final ListKey<CDOMReference<PCClass>> SERVES_AS_CLASS = new ListKey<CDOMReference<PCClass>>(); public static final ListKey<CDOMReference<Ability>> SERVES_AS_ABILITY = new ListKey<CDOMReference<Ability>>(); + public static final ListKey<ChooseResultActor> CHOOSE_ACTOR = new ListKey<ChooseResultActor>(); private static CaseInsensitiveMap<ListKey<?>> map = null; Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-10-08 20:50:03 UTC (rev 7994) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-10-08 21:16:18 UTC (rev 7995) @@ -62,6 +62,7 @@ import pcgen.cdom.base.CDOMObject; import pcgen.cdom.base.CDOMObjectUtilities; import pcgen.cdom.base.CDOMReference; +import pcgen.cdom.base.ChooseResultActor; import pcgen.cdom.base.Constants; import pcgen.cdom.base.TransitionChoice; import pcgen.cdom.content.ChallengeRating; @@ -17898,6 +17899,14 @@ public void addAssociation(CDOMObject obj, String o) { assocSupt.addAssoc(obj, AssociationListKey.CHOICES, new FixedStringList(o)); + List<ChooseResultActor> actors = obj.getListFor(ListKey.CHOOSE_ACTOR); + if (actors != null) + { + for (ChooseResultActor cra : actors) + { + cra.apply(this, obj, o); + } + } } public void addAssociation(CDOMObject obj, FixedStringList o) @@ -17953,11 +17962,30 @@ { List<String> list = getAssociationList(obj); assocSupt.removeAllAssocs(obj, AssociationListKey.CHOICES); + List<ChooseResultActor> actors = obj.getListFor(ListKey.CHOOSE_ACTOR); + if (actors != null) + { + for (ChooseResultActor cra : actors) + { + for (String o : list) + { + cra.remove(this, obj, o); + } + } + } return list; } public void removeAssociation(CDOMObject obj, String o) { + List<ChooseResultActor> actors = obj.getListFor(ListKey.CHOOSE_ACTOR); + if (actors != null) + { + for (ChooseResultActor cra : actors) + { + cra.remove(this, obj, o); + } + } assocSupt.removeAssoc(obj, AssociationListKey.CHOICES, new FixedStringList(o)); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <nu...@us...> - 2008-10-11 22:42:14
|
Revision: 8043 http://pcgen.svn.sourceforge.net/pcgen/?rev=8043&view=rev Author: nuance Date: 2008-10-11 22:42:07 +0000 (Sat, 11 Oct 2008) Log Message: ----------- Remove the crusty old evaluators from the VariableProcessors. Change the way that the Evaluators convert Strings to Floats. Change to use the Float producing part of the TermEvaluators. Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/VariableProcessor.java Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorEq.java Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorPC.java Trunk/pcgen/code/src/java/pcgen/core/term/BaseEQTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/core/term/BasePCTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/core/term/EQACCheckTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/core/term/EQBaseCostTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/core/term/EQDamageDiceTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/core/term/EQDamageDieTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/core/term/EQEquipSizeTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/core/term/EQHandsTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/core/term/EQRaceReachTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/core/term/EQRangeTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/core/term/EQReachMultTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/core/term/EQReachTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/core/term/EQSizeTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/core/term/EQSpellFailureTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/core/term/EQWeightTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/core/term/PCCLTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/core/term/PCEncumberanceTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/core/term/PCEqTypeTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/core/term/PCMoveBaseTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/core/term/PCMovementTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/core/term/PCSkillRankTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/core/term/TermEvaluator.java Trunk/pcgen/code/src/java/pcgen/io/ExportHandler.java Modified: Trunk/pcgen/code/src/java/pcgen/core/VariableProcessor.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/VariableProcessor.java 2008-10-11 19:22:00 UTC (rev 8042) +++ Trunk/pcgen/code/src/java/pcgen/core/VariableProcessor.java 2008-10-11 22:42:07 UTC (rev 8043) @@ -53,8 +53,43 @@ { /** The current indenting to be used for debug output of jep evaluations. */ protected String jepIndent = ""; - private PlayerCharacter pc; + protected PlayerCharacter pc; + private int cachePaused; + private int serial; + + private Map<String, CachedVariable<String>> sVariableCache = + new HashMap<String, CachedVariable<String>>(); + private Map<String, CachedVariable<Float>> fVariableCache = + new HashMap<String, CachedVariable<Float>>(); + + protected Float convertToFloat(String element, String foo) + { + Float d = null; + try + { + d = new Float(foo); + } + catch (NumberFormatException nfe) + { + // What we got back was not a number + } + + Float retVal = null; + if (d != null && !d.isNaN()) + { + retVal = d; + Logging.debugPrint( + new StringBuilder().append(jepIndent) + .append("export variable for: '") + .append(element) + .append("' = ") + .append(d).toString()); + } + + return retVal; + } + /** * <code>CachableResult</code> encapsulates a result returned from JEP processing * allowing us to retrieve both the result and its cachability. @@ -99,49 +134,26 @@ String src, int spellLevelTemp) { - // First try to just parse it as a number. - try + Float result = getJepOnlyVariableValue( + aSpell, + varString, + src, + spellLevelTemp); + + if (null == result) { - return new Float(varString); - } - catch (NumberFormatException e) - { - // Nothing to handle here, we're attempting to see if varString was a - // number, If we got here it wasn't - } + result = processBrokenParser( + aSpell, + varString, + src, + spellLevelTemp); + + String cacheString = + makeCacheString(aSpell, varString, src, spellLevelTemp); - - String cacheString = varString +"#"+src; - if (aSpell != null) - { - cacheString += aSpell.getKeyName(); + addCachedVariable(cacheString, result); } - if (spellLevelTemp > 0) - { - cacheString += spellLevelTemp; - } - - Float total = getCachedVariable(cacheString); - if (total != null) - { - return total; - } - - - CachableResult cRes = processJepFormula(aSpell, varString, src); - if (cRes != null) - { - if (cRes.cachable) - { - addCachedVariable(cacheString, cRes.result); - } - return cRes.result; - } - - - Float result = processBrokenParser(aSpell, varString, src, spellLevelTemp); - addCachedVariable(cacheString, result); return result; } @@ -150,48 +162,38 @@ * e.g: getJepOnlyVariableValue("3+CHA","CLASS:Cleric") for Turn Undead * * @param aSpell This is specifically to compute bonuses to CASTERLEVEL for a specific spell. - * @param aString The variable to be evaluated + * @param varString The variable to be evaluated * @param src The source within which the variable is evaluated * @param spellLevelTemp The temporary spell level * @return The value of the variable, or null if the formula is not JEP */ public Float getJepOnlyVariableValue( final Spell aSpell, - String aString, + String varString, String src, int spellLevelTemp) { // First try to just parse it as a number. try { - return new Float(aString); + return new Float(varString); } catch (NumberFormatException e) { - // Nothing to handle here, we're attempting to see if aString was a + // Nothing to handle here, we're attempting to see if varString was a // number, If we got here it wasn't } + String cacheString = + makeCacheString(aSpell, varString, src, spellLevelTemp); - String cacheString = aString+"#"+src; - if (aSpell != null) - { - cacheString += aSpell.getKeyName(); - } - - if (spellLevelTemp > 0) - { - cacheString += spellLevelTemp; - } - Float total = getCachedVariable(cacheString); if (total != null) { return total; } - - CachableResult cRes = processJepFormula(aSpell, aString, src); + CachableResult cRes = processJepFormula(aSpell, varString, src); if (cRes != null) { if (cRes.cachable) @@ -203,8 +205,25 @@ return null; } + private String makeCacheString( + Spell aSpell, String varString, String src, int spellLevelTemp) + { + StringBuilder cS = new StringBuilder(varString).append("#").append(src); + + if (aSpell != null) + { + cS.append(aSpell.getKeyName()); + } + if (spellLevelTemp > 0) + { + cS.append(spellLevelTemp); + } + return cS.toString(); + } + + /** * Evaluate the variable using the old non-JEP variable parser. Use of this * parser is being phased out. @@ -375,10 +394,19 @@ { valString += aString.substring(i, i + 1); - if ((i == (aString.length() - 1)) || (delimiter.lastIndexOf(aString.charAt(i)) > -1) - || ((valString.length() > 3) - && (valString.endsWith("MIN") || (!valString.startsWith("MODEQUIP") && valString.endsWith("MAX")) - || valString.endsWith("REQ")))) + if ( + // end of string + (i == (aString.length() - 1)) || + + // have found one of +, -, *, / + (delimiter.lastIndexOf(aString.charAt(i)) > -1) || + + // there are more than three characters + ((valString.length() > 3) && + (valString.endsWith("MIN") || + (!valString.startsWith("MODEQUIP") && valString.endsWith("MAX")) || + valString.endsWith("REQ"))) + ) { if ((valString.length() == 1) && (delimiter.lastIndexOf(aString.charAt(i)) > -1)) { @@ -429,19 +457,19 @@ nextMode = 0; endMode += 3; } - else if ((aString.length() > 0) && (aString.charAt(i) == '+')) + else if (aString.length() > 0 && aString.charAt(i) == '+') { nextMode = 0; } - else if ((aString.length() > 0) && (aString.charAt(i) == '-')) + else if (aString.length() > 0 && aString.charAt(i) == '-') { nextMode = 1; } - else if ((aString.length() > 0) && (aString.charAt(i) == '*')) + else if (aString.length() > 0 && aString.charAt(i) == '*') { nextMode = 2; } - else if ((aString.length() > 0) && (aString.charAt(i) == '/')) + else if (aString.length() > 0 && aString.charAt(i) == '/') { nextMode = 3; } @@ -493,7 +521,7 @@ nextMode = 0; valString = ""; - if ((total1 == null) && ((endMode % 10) != 0)) + if (total1 == null && endMode % 10 != 0) { total1 = total; total = new Float(0.0); @@ -503,17 +531,17 @@ if (total1 != null) { - if ((endMode % 10) == 1) + if (endMode % 10 == 1) { total = new Float(Math.min(total.doubleValue(), total1.doubleValue())); } - if ((endMode % 10) == 2) + if (endMode % 10 == 2) { total = new Float(Math.max(total.doubleValue(), total1.doubleValue())); } - if ((endMode % 10) == 3) + if (endMode % 10 == 3) { if (total1.doubleValue() < total.doubleValue()) { @@ -526,7 +554,7 @@ } } - if ((endMode / 10) > 0) + if (endMode / 10 > 0) { total = (float) total.intValue(); } @@ -615,19 +643,58 @@ } } + abstract Float getInternalVariable( + final Spell aSpell, + String valString, + final String src); /** - * Lookup the value of a variable - * - * @param element The variable to be evaluated. - * @param src The source within which the variable is evaluated - * @param spell This is specifically to compute bonuses to CASTERLEVEL for a specific spell. - * @return The value of the variable + * Get a value for the term as evaluated in the context of the PC that + * owns this VariableEvaluator (getPc()) the term itself and the source + * of the term e.g. RACE:Halfling. If the term is CASTERLEVEL the + * Spell parameter is also used, if not it is ignored and may be null. + * + * @param term + * The string to be evaluated + * @param src + * The source of the term + * @param spell + * A spell which is only used if the term is related to CASTERLEVEL + * + * @return a Float value for this term */ - abstract Float lookupVariable(String element, String src, Spell spell); + public Float lookupVariable(String term, String src, Spell spell) + { + Float retVal = null; + if (pc.hasVariable(term)) + { + final Float value = pc.getVariable(term, true, src, ""); + Logging.debugPrint( + new StringBuilder().append(jepIndent) + .append("variable for: '") + .append(term) + .append("' = ") + .append(value).toString()); + retVal = new Float(value.doubleValue()); + } + if (retVal == null) + { + retVal = getInternalVariable(spell, term, src); + } + if (retVal == null) + { + final String evReturn = getExportVariable(term); + if (evReturn != null) + { + retVal = convertToFloat(term, evReturn); + } + } + return retVal; + } + /** * Attempt to retrieve a cached value of a variable. * @@ -673,8 +740,6 @@ fVariableCache.put(lookup, cached); } - - /** * Restart caching of variable values. Used after caching has * been paused by a call to pauseCache. @@ -703,12 +768,6 @@ return cachePaused>0; } - private int cachePaused; - private int serial; - - private Map<String, CachedVariable<String>> sVariableCache = new HashMap<String, CachedVariable<String>>(); - private Map<String, CachedVariable<Float>> fVariableCache = new HashMap<String, CachedVariable<Float>>(); - /** * Retrieve the current cache serial. This value identifies the currency * of the cache and can be compared against the serial of entries in the Modified: Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorEq.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorEq.java 2008-10-11 19:22:00 UTC (rev 8042) +++ Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorEq.java 2008-10-11 22:42:07 UTC (rev 8043) @@ -20,12 +20,9 @@ */ package pcgen.core; -import java.math.BigDecimal; - -import pcgen.cdom.enumeration.IntegerKey; -import pcgen.cdom.enumeration.ObjectKey; import pcgen.core.spell.Spell; -import pcgen.util.Logging; +import pcgen.core.term.TermEvaluator; +import pcgen.core.term.EvaluatorFactory; /** * <code>VariableProcessorEq</code> is a processor for variables @@ -46,15 +43,21 @@ private boolean primaryHead; /** - * Create a new VariableProcessorEq instance for an equipment item, and pc. It - * also allows splitting of the processing of the heads of double weapons. + * Create a new VariableProcessorEq instance for an equipment item, and + * pc. It also allows splitting of the processing of the heads of double + * weapons. * - * @param eq The item of equipment being processed. - * @param pc The player character being processed. - * @param primaryHead Is this the primary head of a double weapon? + * @param eq + * The item of equipment being processed. + * @param pc + * The player character being processed. + * @param primaryHead + * Is this the primary head of a double weapon? */ - public VariableProcessorEq(Equipment eq, PlayerCharacter pc, - boolean primaryHead) + public VariableProcessorEq( + Equipment eq, + PlayerCharacter pc, + boolean primaryHead) { super(pc); this.eq = eq; @@ -62,219 +65,51 @@ } /** - * @see pcgen.core.VariableProcessor#lookupVariable(java.lang.String, java.lang.String, pcgen.core.spell.Spell) - */ - Float lookupVariable(String element, String src, Spell spell) - { - Float retVal = null; - if (getPc().hasVariable(element)) - { - final Float value = getPc().getVariable(element, true, src, ""); - Logging.debugPrint(jepIndent + "variable for: '" + element + "' = " - + value); - retVal = new Float(value.doubleValue()); - } - - if (retVal == null) - { - final String foo = getInternalVariable(spell, element, src); - if (foo != null) - { - Float d = null; - try - { - d = new Float(foo); - } - catch (NumberFormatException nfe) - { - // What we got back was not a number - } - if (d != null) - { - if (!d.isNaN()) - { - retVal = d; - Logging.debugPrint(jepIndent - + "internal variable for: '" - + element + "' = " + d); - } - } - else - { - try - { - d = new Float(foo.substring(1)); - if (!d.isNaN()) - { - retVal = d; - Logging.debugPrint(jepIndent + "internal variable for: '" + element + "' = " + d); - } - } - catch (NumberFormatException nfe) - { - // What we got back was not a number - } - } - } - } - - if (retVal == null) - { - final String foo = getExportVariable(element); - if (foo != null) - { - Float d = null; - try - { - d = new Float(foo); - } - catch (NumberFormatException nfe) - { - // What we got back was not a number - } - if (d != null) - { - if (!d.isNaN()) - { - retVal = d; - Logging.debugPrint(jepIndent + "export variable for: '" - + element + "' = " + d); - } - } - } - } - - return retVal; - } - - /** - * Retrieve a pre-coded variable for a piece of equipment. These are known properties of - * all equipment items. If a value is not found for the equipment item, a search will be - * made of the character. + * Retrieve a pre-coded variable for a piece of equipment. These are known + * properties of all equipment items. If a value is not found for the + * equipment item, a search will be made of the character. * - * @param aSpell This is specifically to compute bonuses to CASTERLEVEL for a specific spell. - * @param valString The variable to be evaluated - * @param src The source within which the variable is evaluated + * @param aSpell + * This is specifically to compute bonuses to CASTERLEVEL + * for a specific spell. + * @param valString + * The variable to be evaluated + * @param src + * The source within which the variable is evaluated * @return The value of the variable */ - public String getInternalVariable( + + Float getInternalVariable( final Spell aSpell, String valString, final String src) { - String retVal = null; - if ("SIZE".equals(valString)) + TermEvaluator t1 = getTermEvaluator(valString, src); + + Float fResult; + if (t1 != null) { - retVal = String.valueOf(eq.sizeInt()); + fResult = t1.resolve(eq, primaryHead, pc); } - else if (valString.startsWith("EQUIP.SIZE")) + else { - if ("EQUIP.SIZE".equals(valString)) - { - retVal = eq.getSize(); - } - else if ("INT".equals(valString.substring(11))) - { - retVal = String.valueOf(eq.sizeInt()); - } + fResult = 0f; } - else if ("WT".equals(valString)) - { - if (eq.isCalculatingCost() && eq.isWeightAlreadyUsed()) - { - retVal = "0"; - } - else - { - BigDecimal weightInPounds = eq.getWeightInPounds(); - if (eq.isCalculatingCost() && eq.isAmmunition()) - { - Float unitWeight = weightInPounds.floatValue(); - unitWeight /= eq.getSafe(IntegerKey.BASE_QUANTITY); - retVal = unitWeight.toString(); - } - else - { - retVal = weightInPounds.toString(); - } - eq.setWeightAlreadyUsed(true); - } - } - else if ("BASECOST".equals(valString)) + return t1 == null ? null : fResult; + } + + TermEvaluator getTermEvaluator(String valString, String src) + { + TermEvaluator t1 = EvaluatorFactory.EQ.getTermEvaluator(valString, src); + + if (t1 == null) { - retVal = eq.getSafe(ObjectKey.COST).toString(); + return EvaluatorFactory.PC.getTermEvaluator(valString, src); } - else if ("DMGDIE".equals(valString)) - { - final RollInfo aRollInfo = new RollInfo(eq.getDamage(getPc())); - retVal = Integer.toString(aRollInfo.sides); - } - else if ("DMGDICE".equals(valString)) - { - final RollInfo aRollInfo = new RollInfo(eq.getDamage(getPc())); - retVal = Integer.toString(aRollInfo.times); - } - else if ("EQACCHECK".equals(valString)) - { - retVal = Integer.toString(eq.getSafe(IntegerKey.AC_CHECK)); - } - else if ("EQHANDS".equals(valString)) - { - retVal = Integer.toString(eq.getSafe(IntegerKey.SLOTS)); - } - else if ("EQSPELLFAIL".equals(valString)) - { - retVal = Integer.toString(eq.getSafe(IntegerKey.SPELL_FAILURE)); - } - else if ("RANGE".equals(valString)) - { - retVal = Integer.toString(eq.getSafe(IntegerKey.RANGE)); - } - else if ("CRITMULT".equals(valString)) - { - if (primaryHead) - { - retVal = eq.getCritMult(); - } - else - { - retVal = eq.getAltCritMult(); - } - } - else if ("RACEREACH".equals(valString)) - { - retVal = getPc().getVariableValue("REACH.VAL", src).toString(); - } - else if ("REACH".equals(valString)) - { - retVal = Integer.toString(eq.getSafe(IntegerKey.REACH)); - } - else if ("REACHMULT".equals(valString)) - { - retVal = Integer.toString(eq.getSafe(IntegerKey.REACH_MULT)); - } else { - for (int j = 0; j < SettingsHandler.getGame().s_ATTRIBSHORT.length; - ++j) - { - if (valString.equals(SettingsHandler.getGame().s_ATTRIBSHORT[j])) - { - retVal = String.valueOf(getPc().getStatList().getStatModFor( - SettingsHandler.getGame().s_ATTRIBSHORT[j])); - - break; - } - } + return t1; } - if (retVal == null) - { - // we have not managed to find an internal variable for the equipment, so try to find - // one for the character. - VariableProcessorPC vpc = new VariableProcessorPC(getPc()); - retVal = vpc.getInternalVariable(aSpell, valString, src); - } - return retVal; } } Modified: Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorPC.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorPC.java 2008-10-11 19:22:00 UTC (rev 8042) +++ Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorPC.java 2008-10-11 22:42:07 UTC (rev 8043) @@ -20,27 +20,9 @@ */ package pcgen.core; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.StringTokenizer; - -import pcgen.cdom.base.Constants; -import pcgen.cdom.enumeration.FormulaKey; -import pcgen.cdom.enumeration.ListKey; -import pcgen.cdom.enumeration.ObjectKey; -import pcgen.cdom.enumeration.StringKey; -import pcgen.cdom.reference.CDOMSingleRef; -import pcgen.core.analysis.SkillModifier; -import pcgen.core.analysis.SkillRankControl; -import pcgen.core.character.Follower; import pcgen.core.spell.Spell; -import pcgen.core.utils.CoreUtility; import pcgen.core.term.TermEvaluator; import pcgen.core.term.EvaluatorFactory; -import pcgen.io.exporttoken.EqTypeToken; -import pcgen.util.Logging; -import pcgen.util.enumeration.Visibility; /** * <code>VariableProcessorPC</code> is a processor for variables @@ -68,1472 +50,36 @@ } /** - * @see pcgen.core.VariableProcessor#lookupVariable(java.lang.String, java.lang.String, pcgen.core.spell.Spell) - */ - public Float lookupVariable(String element, String src, Spell spell) - { - Float retVal = null; - if (getPc().hasVariable(element)) - { - final Float value = getPc().getVariable(element, true, src, ""); - Logging.debugPrint(jepIndent + "variable for: '" + element + "' = " + value); - retVal = new Float(value.doubleValue()); - } - - if (retVal==null) { - final String foo = getInternalVariable(spell, element, src); - if (foo != null) - { - Float d=null; - try - { - d = new Float(foo); - } - catch (NumberFormatException nfe) - { - // What we got back was not a number - } - if (d != null) { - if (!d.isNaN()) - { - retVal = d; - Logging.debugPrint(jepIndent + "internal variable for: '" + element + "' = " + d); - } - } - } - } - - if (retVal==null) { - final String foo = getExportVariable(element); - if (foo != null) - { - Float d=null; - try - { - d = new Float(foo); - } - catch (NumberFormatException nfe) - { - // What we got back was not a number - } - if (d != null) { - if (!d.isNaN()) - { - retVal = d; - Logging.debugPrint(jepIndent + "export variable for: '" + element + "' = " + d); - } - } - } - } - - return retVal; - } - - /** - * Count the number of times the character has the feat. This can be limited - * to either hidden or visible feats, and can be limited to only counting - * once per feat rather than once per time taken (e.g. Weapon specialisation - * in two weapons would count as 2 unless the onceOnly flag was true). + * Retrieve a pre-coded variable for a PC. These are known + * properties of all PCs. * - * @param feat The feat to be counted. - * @param countVisible Should it be counted if it is visible? - * @param countHidden Should it be counted if it is hidden? - * @param onceOnly Should it be counted as one if was taken multiple times? - * @return The number of occurrences of the feat. + * @param aSpell + * This is specifically to compute bonuses to CASTERLEVEL + * for a specific spell. + * @param valString + * The variable to be evaluated + * @param src + * The source within which the variable is evaluated + * @return The value of the variable */ - private int countVisibleFeat(final Ability feat, final boolean countVisible, final boolean countHidden, final boolean onceOnly) - { - int count = 0; - if (countVisible) - { - if ((feat.getSafe(ObjectKey.VISIBILITY) != Visibility.DISPLAY_ONLY) && (feat.getSafe(ObjectKey.VISIBILITY) != Visibility.HIDDEN)) - { - if (onceOnly) - { - count++; - } - else - { - count += Math.max(1, getPc().getSelectCorrectedAssociationCount(feat)); - } - } - } - - if (countHidden) - { - if ((feat.getSafe(ObjectKey.VISIBILITY) == Visibility.DISPLAY_ONLY) || (feat.getSafe(ObjectKey.VISIBILITY) == Visibility.HIDDEN)) - { - if (onceOnly) - { - count++; - } - else - { - count += Math.max(1, getPc().getSelectCorrectedAssociationCount(feat)); - } - } - } - - return count; - } - - /** - * This function takes a list of feats and a list of types and returns - * the number of visible, or hidden feats that are in the list and of - * one of the specified types. The visible flag determines if - * the result should be the number of hidden feats, or the number of - * visible feats - * - * @param featsList The feats to look through. - * @param featTypesList The feat types to limit the search to. - * @param countVisible Count visible feats - * @param countHidden Count hidden feats - * @return An int containing the number of matching feats in the list - */ - private int countVisibleFeatTypes(final List<Ability> featsList, final List<String> featTypesList, final boolean countVisible, final boolean countHidden) { - int count = 0; - - for ( Ability feat : featsList ) - { - // for each feat, look to see if it has any of the required types. - for ( String featType : featTypesList ) - { - if (feat.isType(featType)) - { - count += countVisibleFeat(feat, countVisible, countHidden, false); - - break; - } - } - } - - return count; - } - - /** - * This function takes a list of feats and a name and returns - * the number of visible, or hidden feats that are in the list and - * have the requested name. The visible flag determines if - * the result should be the number of hidden feats, or the number of - * visible feats - * - * @param argFeatList The feats to look through. - * @param featKey The key of the feat to find. - * @param countVisible Count visible feats - * @param countHidden Count hidden feats - * @return An int containing the number of matching feats in the list - */ - private int countVisibleFeatsOfKey(final List<Ability> argFeatList, final String featKey, final boolean countVisible, final boolean countHidden) { - int count = 0; - - for ( Ability feat : argFeatList ) - { - if (feat.getKeyName().equalsIgnoreCase(featKey)) - { - count += countVisibleFeat(feat, countVisible, countHidden, false); - - break; - } - } - - return count; - } - - /** - * This function takes a list of feats and returns the number of visible, - * or hidden feats that are in the list The visible flag determines if - * the result should be the number of hidden feats, or the number of - * visible feats - * - * @param aList a list of the feats to look through. - * @param countVisible Count visible feats - * @param countHidden Count hidden feats - * @return An int containing the number of feats in the list - */ - private int countVisibleFeats(final List<Ability> aList, final boolean countVisible, final boolean countHidden) { - int count = 0; - - for (Ability feat : aList) - { - count += countVisibleFeat(feat, countVisible, countHidden, true); - } - - return count; - } - - protected String getInternalVariable(final Spell aSpell, String valString, final String src) + Float getInternalVariable( + final Spell aSpell, + String valString, + final String src) { TermEvaluator t1 = EvaluatorFactory.PC.getTermEvaluator(valString, src); - - String result1 = ""; + + Float fResult; if (t1 != null) { - result1 = t1.evaluate(getPc(), aSpell); - String result2 = oldGetInternalVariable(aSpell, valString, src); - - if (!result1.equals(result2)) - { - StringBuffer sB = new StringBuffer("mismatch for "); - sB.append(valString); - sB.append(" new: "); - sB.append(result1); - sB.append(" old: "); - sB.append(result2); - - Logging.log(Logging.INFO, sB.toString()); - return result2; - } + fResult = t1.resolve(pc, aSpell); } - return t1 == null ? null : result1; - } - - /** - * Retrieve a pre-coded variable for a character. These are known properties of - * all character. - * - * @param aSpell This is specifically to compute bonuses to CASTERLEVEL for a specific spell. - * @param valString The variable to be evaluated - * @param src The source within which the variable is evaluated - * @return The value of the variable - */ - protected String oldGetInternalVariable(final Spell aSpell, String valString, final String src) - { - if (!Globals.checkRule(RuleConstants.SYS_LDPACSK)) - { - // Need to make sure the MXDXEN value - // is 1000 to ensure no Dex penalty - // to AC for load > LIGHT - if (valString.equals(getPc().getStatList().getPenaltyVar("DEX"))) - { - valString = "1000"; - } - } - - - if ("SCORE".equals(valString) && src.startsWith("STAT:")) - { - valString = String.valueOf(getPc().getStatList().getTotalStatFor(src.substring(5))); - } - else if ("SPELLBASESTATSCORE".equals(valString)) - { - final PCClass aClass = getPc().getClassKeyed(src.substring(6)); - - if (aClass != null) - { - PCStat ss = aClass.get(ObjectKey.SPELL_STAT); - if (ss == null) - { - valString = "10"; - } - else - { - valString = ss.getAbb() + "SCORE"; - } - } - else - { - valString = "0"; - } - } - else if ("SPELLBASESTAT".equals(valString)) - { - final PCClass aClass = getPc().getClassKeyed(src.substring(6)); - - if (aClass != null) - { - PCStat ss = aClass.get(ObjectKey.SPELL_STAT); - if (ss == null) - { - valString = "0"; - } - else - { - valString = ss.getAbb(); - } - } - else - { - valString = "0"; - } - } - else if ("BASESPELLSTAT".equals(valString)) - { - PCClass aClass = null; - - // if there's no class, then assume a basespellstat modifier of 0 - if (src.length() < 7) - { - valString = "0"; - } - else - { - // src should be CLASS. something - aClass = getPc().getClassKeyed(src.substring(6)); - } - - if (aClass != null) - { - valString = String.valueOf(getPc().getBaseSpellStatBonus(aClass)); - } - } - else if ("SPELLLEVEL".equals(valString)) - { - valString = String.valueOf(getPc().getSpellLevelTemp()); - } - - else if ((valString.length() > 0) && (SettingsHandler.getGame().getStatFromAbbrev(valString) > -1)) - { - // TODO: JSC -- more testing! - // Big Changes here! - final int iX = SettingsHandler.getGame().getStatFromAbbrev(valString); - final int statNum = getPc().getStatList().getTotalStatFor(valString); - final int statMod = getPc().getStatList().getModForNumber(statNum, iX); - valString = Integer.toString(statMod); - - //valString = Integer.toString(statList.getStatModFor(valString)); - } - else if ((valString.length() == 8) && (SettingsHandler.getGame().getStatFromAbbrev(valString.substring(0, 3)) > -1) - && valString.endsWith(".BASE")) - { - valString = Integer.toString(getPc().getStatList().getBaseStatFor(valString.substring(0, 3))); - } - else if ((valString.length() >= 8) && valString.substring(3).startsWith("SCORE")) - { - if (valString.endsWith(".BASE")) - { - valString = Integer.toString(getPc().getStatList().getBaseStatFor(valString.substring(0, 3))); - } - else - { - valString = Integer.toString(getPc().getStatList().getTotalStatFor(valString.substring(0, 3))); - } - } - else if ("CASTERLEVEL".equals(valString) && src.startsWith("RACE:")) - { - final int iLev = getPc().getTotalCasterLevelWithSpellBonus(aSpell, Constants.s_NONE, "RACE." + src.substring(5), 0); - - if (iLev > 0) - { - valString = Integer.toString(iLev); - } - - // If no CASTERLEVEL has been defined for this race then don't substitute - // so it will be apparent on the output sheet that it needs to be defined.. - } - else if ("CASTERLEVEL.TOTAL".equals(valString) || ("CASTERLEVEL".equals(valString) && !src.startsWith("CLASS:"))) - { - - int iLev = 0; - - for ( PCClass pcClass : getPc().getClassList() ) - { - String spellType = pcClass.get(StringKey.SPELLTYPE); - if (spellType != null) - { - final String classKey = pcClass.getKeyName(); - final int pcBonusLevel = (int) getPc().getTotalBonusTo("PCLEVEL", classKey); - - if (CoreUtility.doublesEqual(getPc().getTotalBonusTo("CASTERLEVEL", classKey), 0.0)) - { - final int iClass = Integer.parseInt(getPc().getClassLevelString(classKey, false)); - iLev += getPc().getTotalCasterLevelWithSpellBonus(aSpell, spellType, classKey, iClass + pcBonusLevel); - } - else - { - iLev += getPc().getTotalCasterLevelWithSpellBonus(aSpell, spellType, classKey, pcBonusLevel); - } - } - } - - valString = Integer.toString(iLev); - } - else if ("CASTERLEVEL".equals(valString) && src.startsWith("CLASS:")) - { - String classKey = src.substring(6); - - // check if this is a domain spell - final CharacterDomain aCD = getPc().getCharacterDomainForDomain(classKey); - if (aCD != null) //yup, it's a domain alright - { - classKey = aCD.getObjectName(); //returns Domain source (e.g, "Cleric") - } - - final PCClass spClass = Globals.getContext().ref.silentlyGetConstructedCDOMObject(PCClass.class, classKey); - - String spellType = Constants.s_NONE; - if ((spClass != null) && (spClass.get(StringKey.SPELLTYPE) != null)) - { - spellType = spClass.getSpellType(); - } - - final int pcBonusLevel = (int) getPc().getTotalBonusTo("PCLEVEL", classKey); - - int iLev = (int) getPc().getTotalBonusTo("CASTERLEVEL", classKey); - - if (iLev == 0) - { - // If no CASTERLEVEL has been - // defined for this class then - // use total class level instead - iLev = Integer.parseInt(getPc().getClassLevelString(classKey, false)); - iLev = getPc().getTotalCasterLevelWithSpellBonus(aSpell, spellType, classKey, iLev + pcBonusLevel); - } - else - { - iLev = getPc().getTotalCasterLevelWithSpellBonus(aSpell, spellType, classKey, pcBonusLevel); - } - - valString = Integer.toString(iLev); - } - else if ("CASTERLEVEL".equals(valString)) - { - Logging.debugPrint("src for CASTERLEVEL: " + src); - } - else if ("CL".equals(valString) && src.startsWith("CLASS:")) - { - valString = getPc().getClassLevelString(src.substring(6), false); - } - else if (valString.startsWith("CL=") || valString.startsWith("CL.")) - { - valString = getPc().getClassLevelString(valString.substring(3), false); - } - else if ((valString.startsWith("CL;BEFORELEVEL=") || valString.startsWith("CL;BEFORELEVEL.")) - && src.startsWith("CLASS:")) - { - valString = getPc().getClassLevelString(src.substring(6) + valString.substring(2), false); - } - else if ("BL".equals(valString) && src.startsWith("CLASS:")) - { - valString = Integer.toString((int) getPc().getTotalBonusTo("PCLEVEL", src.substring(6))); - } - else if (valString.startsWith("BL=") || valString.startsWith("BL.")) - { - valString = Integer.toString((int) getPc().getTotalBonusTo("PCLEVEL", valString.substring(3))); - } - else if ("BAB".equals(valString)) - { - 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(); - if (spClass.hasCastList()) - { - for (int i = 0; i < cutoff; i++) { - if (spClass.getCastForLevel(i, getPc()) != 0) - { - max = Math.max(max,i); - } - } - } - else - { - 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.equals("ANY")) - { - int max = 0; - for (PCClass spClass : getPc().getClassList()) - { - int cutoff = spClass.getHighestLevelSpell(); - if (spClass.hasCastList()) - { - for (int i = 0; i < cutoff; i++) - { - if (spClass.getCastForLevel(i, getPc()) != 0) - { - max = Math.max(max, i); - } - } - } - else - { - 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); - int max = -1; - for (PCClass spClass : getPc().getClassList()) - { - StringTokenizer st = - new StringTokenizer(spClass.getSpellKey(getPc()), - Constants.PIPE); - while (st.hasMoreTokens()) - { - String type = st.nextToken(); - //Doesn't need to be guarded - if this throws an exception the problem is in getSpellKey() - String key = st.nextToken(); - if (type.equals("CLASS") && key.equalsIgnoreCase(classKey)) - { - int cutoff = spClass.getHighestLevelSpell(); - if (spClass.hasCastList()) - { - for (int i = 0; i < cutoff; i++) { - if (spClass.getCastForLevel(i, getPc()) != 0) - { - max = Math.max(max,i); - } - } - } - else - { - 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("DOMAIN:")) - { - String domainKey = src.substring(6); - - // check if this is a domain spell - CharacterDomain aCD = getPc() - .getCharacterDomainForDomain(domainKey); - if (aCD != null) // yup, it's a domain alright - { - String classKey = aCD.getObjectName(); // returns Domain source - // (e.g, "Cleric") - PCClass spClass = getPc().getClassKeyed(classKey); - int cutoff = spClass.getHighestLevelSpell(); - int max = 0; - if (spClass.hasCastList()) - { - for (int i = 0; i < cutoff; i++) { - if (spClass.getCastForLevel(i, getPc()) != 0) - { - max = Math.max(max,i); - } - } - } - else - { - for (int i = 0; i < cutoff; i++) { - if (spClass.getKnownForLevel(i, getPc()) != 0) - { - max = Math.max(max,i); - } - } - } - valString = Integer.toString(max); - } - } - else if (valString.startsWith("CLASSLEVEL=") || valString.startsWith("CLASSLEVEL.")) - { - valString = getPc().getClassLevelString(valString.substring(11), true); - } - else if (valString.startsWith("CLASS=") || valString.startsWith("CLASS.")) - { - PCClass aClass = null; - - if (valString.length() > 6) - { - aClass = getPc().getClassKeyed(valString.substring(6)); - } - else - { - Logging.errorPrint("Error! Cannot determine CLASS!"); - } - - if (aClass != null) - { - valString = "1"; - } - else - { - valString = "0"; - } - } - else if (valString.startsWith("SKILLRANK=") || valString.startsWith("SKILLRANK.")) - { - final Skill aSkill = getPc().getSkillKeyed(valString.substring(10).replace('{', '(').replace('}', ')')); - if (aSkill != null) - { - valString = SkillRankControl.getRank(getPc(), aSkill).toString(); - } - else - { - valString = "0"; - } - } - else if (valString.startsWith("SKILLTOTAL=") || valString.startsWith("SKILLTOTAL.")) - { - final Skill aSkill = getPc().getSkillKeyed(valString.substring(11).replace('{', '(').replace('}', ')')); - if (aSkill != null) - { - valString = Integer.toString(SkillRankControl.getTotalRank(getPc(), aSkill).intValue() + SkillModifier.modifier(aSkill, getPc()).intValue()); - } - else - { - valString = "0"; - } - } - else if ("TL".equals(valString)) - { - valString = Integer.toString(getPc().getTotalLevels()); - } - else if ("HD".equals(valString)) - { - // check companionModList? - valString = Integer.toString(getPc().totalHitDice()); - } - else if ("PROFACCHECK".equals(valString) && src.startsWith("EQ:")) - { - final Equipment eq = Globals.getContext().ref - .silentlyGetConstructedCDOMObject(Equipment.class, src - .substring(3)); - - if ((eq != null) && !getPc().isProficientWith(eq)) - { - valString = Integer.toString(eq.acCheck(getPc()).intValue()); - } - else - { - valString = "0"; - } - } - else if ("ACCHECK".equals(valString) || "ACHECK".equals(valString)) - { - int maxCheck = 0; - - for ( Equipment eq : getPc().getEquipmentOfType("Armor", 1) ) - { - maxCheck += eq.acCheck(getPc()).intValue(); - } - - for ( Equipment eq : getPc().getEquipmentOfType("Shield", 1) ) - { - maxCheck += eq.acCheck(getPc()).intValue(); - } - - valString = Integer.toString(maxCheck); - } - else if ("ARMORACCHECK".equals(valString) || "ARMORACHECK".equals(valString)) - { - int maxCheck = 0; - - for ( Equipment eq : getPc().getEquipmentOfType("Armor", 1) ) - { - maxCheck += eq.acCheck(getPc()).intValue(); - } - - valString = Integer.toString(maxCheck); - } - else if ("SHIELDACCHECK".equals(valString) || "SHIELDACHECK".equals(valString)) - { - int maxCheck = 0; - - for ( Equipment eq : getPc().getEquipmentOfType("Shield", 1) ) - { - maxCheck += eq.acCheck(getPc()).intValue(); - } - - valString = Integer.toString(maxCheck); - } - else if ("SIZE".equals(valString)) - { - valString = String.valueOf(getPc().sizeInt()); - } - else if ("SIZEMOD".equals(valString)) - { - valString = String.valueOf((int) getPc().getSizeAdjustmentBonusTo("COMBAT", "AC")); - } - else if ("RACESIZE".equals(valString)) - { - valString = getPc().getRace().getSafe( - FormulaKey.SIZE).resolve(getPc(), "").toString(); - } - else if ("ENCUMBERANCE".equals(valString)) - { - final int loadScore = getVariableValue(null, "LOADSCORE", "", getPc().getSpellLevelTemp()).intValue(); - valString = String.valueOf(Globals.loadTypeForLoadScore( loadScore, getPc().totalWeight(), getPc())); - } - else if ("MOVEBASE".equals(valString)) - { - valString = getPc().getRace().getSafeListFor(ListKey.MOVEMENT).get(0).getDoubleMovement().toString(); - } - else if ("FAVCLASSLEVEL".equals(valString)) - { - valString = Integer.toString(getPc().getFavoredClassLevel()); - } - else if (valString.startsWith("MOVE[")) - { - final String moveString = valString.substring(5, valString.lastIndexOf("]")); - valString = String.valueOf(getPc().movementOfType(moveString)); - } - else if ("COUNT[ATTACKS]".equals(valString)) - { - valString = Integer.toString(getPc().getNumAttacks()); - } - else if ("COUNT[CHECKS]".equals(valString)) - { - valString = String.valueOf(SettingsHandler.getGame().getUnmodifiableCheckList().size()); - } - else if ("COUNT[FOLLOWERS]".equals(valString)) - { - valString = Integer.toString(getPc().getFollowerList().size()); - } - else if ("COUNT[STATS]".equals(valString)) - { - valString = Integer.toString(SettingsHandler.getGame().s_ATTRIBLONG.length); - } - else if ("COUNT[SKILLS]".equals(valString)) - { - // We use the list in output order to ensure the size - // does not include hidden skills - final List<Skill> skillList = getPc().getSkillListInOutputOrder(); - valString = Integer.toString(skillList.size()); - } - else if (valString.startsWith("COUNT[SKILLTYPE=") || valString.startsWith("COUNT[SKILLTYPE.")) - { - if (valString.endsWith("]")) - { - final List<Skill> skillList = getPc().getSkillListInOutputOrder( new ArrayList<Skill>(getPc().getAllSkillList(true))); - - int typeCount = 0; - valString = valString.substring(16); - valString = valString.substring(0, valString.length() - 1); - for ( Skill skill : skillList ) - { - if (skill.isType(valString)) - { - ++typeCount; - } - } - valString = Integer.toString(typeCount); - } - } - else if ("COUNT[FEATS.ALL]".equals(valString)) - { - valString = Integer.toString(getPc().getRealAbilitiesListAnyCat(AbilityCategory.FEAT).size()); - } - else if ("COUNT[FEATS.HIDDEN]".equals(valString)) - { - valString = Integer.toString(countVisibleFeats(getPc().getRealAbilitiesListAnyCat(AbilityCategory.FEAT), false, true)); - } - else if ("COUNT[FEATS]".equals(valString) || "COUNT[FEATS.VISIBLE]".equals(valString)) - { - valString = Integer.toString(countVisibleFeats(getPc().getRealAbilitiesListAnyCat(AbilityCategory.FEAT), true, false)); - } - else if ("COUNT[VFEATS.ALL]".equals(valString)) - { - valString = Integer.toString(getPc().getVirtualFeatList().size()); - } - else if ("COUNT[VFEATS.HIDDEN]".equals(valString)) - { - valString = Integer.toString(countVisibleFeats(getPc().getVirtualFeatList(), false, true)); - } - else if ("COUNT[VFEATS]".equals(valString) || "COUNT[VFEATS.VISIBLE]".equals(valString)) - { - valString = Integer.toString(countVisibleFeats(getPc().getVirtualFeatList(), true, false)); - } - else if ("COUNT[FEATSAUTO.ALL]".equals(valString)) - { - valString = Integer.toString(getPc().featAutoList().size()); - } - else if ("COUNT[FEATSAUTO]".equals(valString) || "COUNT[FEATSAUTO.VISIBLE]".equals(valString)) - { - valString = Integer.toString(countVisibleFeats(getPc().featAutoList(), true, false)); - } - else if ("COUNT[FEATSAUTO.HIDDEN]".equals(valString)) - { - valString = Integer.toString(countVisibleFeats(getPc().featAutoList(), false, true)); - } - else if ("COUNT[FEATSALL]".equals(valString) - || "COUNT[FEATSALL.VISIBLE]".equals(valString)) - { - String catKey = AbilityCategory.FEAT.getKeyName(); - valString = - Integer.toString(countVisibleFeats( - getAggregateAbilitiesListForKey(catKey), true, false)); - } - else if ("COUNT[FEATSALL.ALL]".equals(valString)) - { - String catKey = AbilityCategory.FEAT.getKeyName(); - List<Ability> abilityList = getAggregateAbilitiesListForKey(catKey); - valString = Integer.toString(abilityList.size()); - } - else if ("COUNT[FEATSALL.HIDDEN]".equals(valString)) - { - String catKey = AbilityCategory.FEAT.getKeyName(); - valString = - Integer.toString(countVisibleFeats( - getAggregateAbilitiesListForKey(catKey), false, true)); - } - else if ((valString.startsWith("COUNT[FEATTYPE=") || valString.startsWith("COUNT[FEATTYPE.")) - && valString.endsWith(".ALL]")) - { - String catKey = AbilityCategory.FEAT.getKeyName(); - List<Ability> abilityList = getAggregateAbilitiesListForKey(catKey); - final List<String> featTypes = CoreUtility.split(valString.substring(15, valString.length() - 5), '.'); - valString = Integer.toString(countVisibleFeatTypes(abilityList, featTypes, true, true)); - } - else if ((valString.startsWith("COUNT[FEATTYPE=") || valString.startsWith("COUNT[FEATTYPE.")) - && valString.endsWith(".HIDDEN]")) - { - String catKey = AbilityCategory.FEAT.getKeyName(); - List<Ability> abilityList = getAggregateAbilitiesListForKey(catKey); - final List<String> featTypes = CoreUtility.split(valString.substring(15, valString.length() - 8), '.'); - valString = Integer.toString(countVisibleFeatTypes(abilityList, featTypes, false, true)); - } - else if ((valString.startsWith("COUNT[FEATTYPE=") || valString.startsWith("COUNT[FEATTYPE.")) - && valString.endsWith(".VISIBLE]")) - { - String catKey = AbilityCategory.FEAT.getKeyName(); - List<Ability> abilityList = getAggregateAbilitiesListForKey(catKey); - final List<String> featTypes = CoreUtility.split(valString.substring(15, valString.length() - 9), '.'); - valString = Integer.toString(countVisibleFeatTypes(abilityList, featTypes, true, false)); - } - else if ((valString.startsWith("COUNT[FEATTYPE=") || valString.startsWith("COUNT[FEATTYPE.")) - && valString.endsWith("]")) - { - String catKey = AbilityCategory.FEAT.getKeyName(); - List<Ability> abilityList = getAggregateAbilitiesListForKey(catKey); - final List<String> featTypes = CoreUtility.split(valString.substring(15, valString.length() - 1), '.'); - valString = Integer.toString(countVisibleFeatTypes(abilityList, featTypes, true, false)); - } - - // - else if ((valString.startsWith("COUNT[VFEATTYPE=") || valString.startsWith("COUNT[VFEATTYPE.")) - && valString.endsWith(".ALL]")) - { - final List<String> featTypes = CoreUtility.split(valString.substring(16, valString.length() - 5), '.'); - valString = Integer.toString(countVisibleFeatTypes(getPc().getVirtualFeatList(), featTypes, true, true)); - } - else if ((valString.startsWith("COUNT[VFEATTYPE=") || valString.startsWith("COUNT[VFEATTYPE.")) - && valString.endsWith(".HIDDEN]")) - { - final List<String> featTypes = CoreUtility.split(valString.substring(16, valString.length() - 8), '.'); - valString = Integer.toString(countVisibleFeatTypes(getPc().getVirtualFeatList(), featTypes, false, true)); - } - else if ((valString.startsWith("COUNT[VFEATTYPE=") || valString.startsWith("COUNT[VFEATTYPE.")) - && valString.endsWith(".VISIBLE]")) - { - final List<String> featTypes = CoreUtility.split(valString.substring(16, valString.length() - 9), '.'); - valString = Integer.toString(countVisibleFeatTypes(getPc().getVirtualFeatList(), featTypes, true, false)); - } - else if ((valString.startsWith("COUNT[VFEATTYPE=") || valString.startsWith("COUNT[VFEATTYPE.")) - && valString.endsWith("]")) - { - final List<String> featTypes = CoreUtility.split(valString.substring(16, valString.length() - 1), '.'); - valString = Integer.toString(countVisibleFeatTypes(getPc().getVirtualFeatList(), featTypes, true, false)); - } - - // - else if ((valString.startsWith("COUNT[FEATAUTOTYPE=") || valString.startsWith("COUNT[FEATAUTOTYPE.")) - && valString.endsWith(".ALL]")) - { - final List<String> featTypes = CoreUtility.split(valString.substring(19, valString.length() - 5), '.'); - valString = Integer.toString(countVisibleFeatTypes(getPc().featAutoList(), featTypes, true, true)); - } - else if ((valString.startsWith("COUNT[FEATAUTOTYPE=") || valString.startsWith("COUNT[FEATAUTOTYPE.")) - && valString.endsWith(".HIDDEN]")) - { - final List<String> featTypes = CoreUtility.split(valString.substring(19, valString.length() - 8), '.'); - valString = Integer.toString(countVisibleFeatTypes(getPc().featAutoList(), featTypes, false, true)); - } - else if ((valString.startsWith("COUNT[FEATAUTOTYPE=") || valString.startsWith("COUNT[FEATAUTOTYPE.")) - && valString.endsWith(".VISIBLE]")) - { - final List<String> featTypes = CoreUtility.split(valString.substring(19, valString.length() - 9), '.'); - valString = Integer.toString(countVisibleFeatTypes(getPc().featAutoList(), featTypes, true, false)); - } - else if ((valString.startsWith("COUNT[FEATAUTOTYPE=") || valString.startsWith("COUNT[FEATAUTOTYPE.")) - && valString.endsWith("]")) - { - final List<String> featTypes = CoreUtility.split(valString.substring(19, valString.length() - 1), '.'); - valString = Integer.toString(countVisibleFeatTypes(getPc().featAutoList(), featTypes, true, false)); - } - - // - else if ((valString.startsWith("COUNT[FEATNAME=") || valString.startsWith("COUNT[FEATNAME.")) - && valString.endsWith(".ALL]")) - { - final String featKey = valString.substring(15, valString.length() - 5); - valString = Integer.toString(countVisibleFeatsOfKey(getPc().aggregateFeatList(), featKey, true, true)); - } - else if ((valString.startsWith("COUNT[FEATNAME=") || valString.startsWith("COUNT[FEATNAME.")) - && valString.endsWith(".HIDDEN]")) - { - final String featKey = valString.substring(15, valString.length() - 8); - valString = Integer.toString(countVisibleFeatsOfKey(getPc().aggregateFeatList(), featKey, false, true)); - } - else if ((valString.startsWith("COUNT[FEATNAME=") || valString.startsWith("COUNT[FEATNAME.")) - && valString.endsWith(".VISIBLE]")) - { - final String featKey = valString.substring(15, valString.length() - 9); - valString = Integer.toString(countVisibleFeatsOfKey(getPc().aggregateFeatList(), featKey, true, false)); - } - else if ((valString.startsWith("COUNT[FEATNAME=") || valString.startsWith("COUNT[FEATNAME.")) - && valString.endsWith("]")) - { - final String featKey = valString.substring(15, valString.length() - 1); - valString = Integer.toString(countVisibleFeatsOfKey(getPc().aggregateFeatList(), featKey, true, false)); - } - else if (valString.startsWith("COUNT[SPELLSKNOWN") && valString.endsWith("]")) - { - int spellCount = 0; - - if (SettingsHandler.getPrintSpellsWithPC()) - { - spellCount = getPc().countSpellListBook(valString); - } - - valString = Integer.toString(spellCount); - } - else if (valString.startsWith("COUNT[SPELLSINBOOK") && valString.endsWith("]")) - { - valString = valString.substring(18); - valString = valString.substring(0, valString.length() - 1); - - int sbookCount = 0; - - if (SettingsHandler.getPrintSpellsWithPC()) - { - sbookCount = getPc().countSpellsInBook(valString); - } - - valString = Integer.toString(sbookCount); - } - else if (valString.startsWith("COUNT[SPELLSLEVELSINBOOK") && valString.endsWith("]")) - { - valString = valString.substring(24); - valString = valString.substring(0, valString.length() - 1); - - final int sbookCount = getPc().countSpellLevelsInBook(valString); - valString = Integer.toString(sbookCount); - } - else if (valString.startsWith("COUNT[SPELLTIMES") && valString.endsWith("]")) - { - valString = valString.substring(6); - valString = valString.substring(0, valString.length() - 1); - valString = String.valueOf(getPc().countSpellTimes(valString)); - } - else if (valString.startsWith("COUNT[SPELLBOOKS") && valString.endsWith("]")) - { - valString = Integer.toString(getPc().getSpellBooks().size()); - } - else if ("COUNT[SPELLCLASSES]".equals(valString)) - { - valString = String.valueOf(getPc().getSpellClassCount()); - } - else if ("COUNT[SPELLRACE]".equals(valString)) - { - final PObject aSpellRace = getPc().getSpellClassAtIndex(0); - valString = (aSpellRace instanceof Race) ? "1" : "0"; - } - else if ("COUNT[TEMPBONUSNAMES]".equals(valString)) - { - valString = String.valueOf(getPc().getNamedTempBonusList().size()); - } - else if ("COUNT[CLASSES]".equals(valString)) - { - getPc().getClassList().trimToSize(); - - int iCount = getPc().getClassList().size(); - - if (SettingsHandler.hideMonsterClasses()) - { - for ( PCClass pcClass : getPc().getClassList() ) - { - if (pcClass.isMonster()) - { - --iCount; - } - } - } - - valString = Integer.toString(iCount); - } - else if ("COUNT[DOMAINS]".equals(valString)) - { - valString = Integer.toString(getPc().getCharacterDomainList().size()); - } - else if (valString.startsWith("COUNT[EQUIPMENT") && valString.endsWith("]")) - { - int merge = Constants.MERGE_ALL; - - // check to see how we are merging - if (valString.indexOf("MERGENONE") > 0) - { - merge = Constants.MERGE_NONE; - } - else if (valString.indexOf("MERGELOC") > 0) - { - merge = Constants.MERGE_LOCATION; - } - - ArrayList<Equipment> aList = new ArrayList<Equipment>(); - final List<Equipment> equipList = getPc().getEquipmentListInOutputOrder(merge); - - for ( Equipment eq : equipList ) - { - aList.add(eq); - } - - if ("COUNT[EQUIPMENT]".equals(valString)) - { - valString = Integer.toString(aList.size()); - } - else - { - final StringTokenizer bTok = new StringTokenizer(valString.substring(16, valString.length() - 1), "."); - - while (bTok.hasMoreTokens()) //should be ok, assumes last two fields are # and a Param - { - final String bString = bTok.nextToken(); - - if ("NOT".equalsIgnoreCase(bString)) - { - aList = new ArrayList<Equipment>(EquipmentUtilities.removeEqType(aList, bTok.nextToken())); - } - else if ("ADD".equalsIgnoreCase(bString)) - { - aList = new ArrayList<Equipment>(getPc().addEqType(aList, bTok.nextToken())); - } - else if ("IS".equalsIgnoreCase(bString)) - { - aList = new ArrayList<Equipment>(EquipmentUtilities.removeNotEqType(aList, bTok.nextToken())); - } - } - - valString = Integer.toString(aList.size()); - } - - aList.clear(); - } - else if (valString.startsWith("COUNT[EQTYPE.") && valString.endsWith("]")) - { - int merge = Constants.MERGE_ALL; - List<Equipment> aList = new ArrayList<Equipment>(); - final StringTokenizer bTok = new StringTokenizer(valString.substring(13, valString.length() - 1), "."); - String aType = bTok.nextToken(); - - // check to see how we are merging equipment - if ("MERGENONE".equals(aType)) - { - merge = Constants.MERGE_NONE; - aType = bTok.nextToken(); - } - else if ("MERGELOC".equals(aType)) - { - merge = Constants.MERGE_LOCATION; - aType = bTok.nextToken(); - } - - if ("CONTAINER".equals(aType)) - { - aList.clear(); - - final List<Equipment> equipList = getPc().getEquipmentListInOutputOrder(merge); - for ( Equipment eq : equipList ) - { - if (eq.acceptsChildren()) - { - aList.add(eq); - } - } - } - else - { - if ("WEAPON".equalsIgnoreCase(aType)) - { - aList = getPc().getExpandedWeapons(merge); - } - else if ("ACITEM".equalsIgnoreCase(aType)) - { - // special check for ACITEM - // which is realy anything - // with AC in the bonus section, - // but is not type SHIELD or ARMOR - final List<Equipment> equipList = getPc().getEquipmentListInOutputOrder(merge); - for ( Equipment eq : equipList ) - { - if (eq.hasBonusWithInfo(getPc(), "AC") && !eq.isArmor() && !eq.isShield()) - { - aList.add(eq); - } - } - } - else - { - aList = getPc().getEquipmentOfTypeInOutputOrder(aType, 3, merge); - } - } - - while (bTok.hasMoreTokens()) - { - final String bString = bTok.nextToken(); - - if ("NOT".equalsIgnoreCase(bString)) - { - aList = new ArrayList<Equipment>(EquipmentUtilities.removeEqType(aList, bTok.nextToken())); - } - else if ("ADD".equalsIgnoreCase(bString)) - { - aList = new ArrayList<Equipment>(getPc().addEqType(aList, bTok.nextToken())); - } - else if ("IS".equalsIgnoreCase(bString)) - { - aList = new ArrayList<Equipment>(EquipmentUtilities.removeNotEqType(aList, bTok.nextToken())); - } - else if ("EQUIPPED".equalsIgnoreCase(bString) || "NOTEQUIPPED".equalsIgnoreCase(bString)) - { - final boolean eFlag = "EQUIPPED".equalsIgnoreCase(bString); - - for (int ix = aList.size() - 1; ix >= 0; --ix) - { - final Equipment anEquip = aList.get(ix); - - if (anEquip.isEquipped() != eFlag) - { - aList.remove(anEquip); - } - } - } - } - - valString = Integer.toString(aList.size()); - aList.clear(); - } - else if ("COUNT[CONTAINERS]".equals(valString)) - { - final int merge = Constants.MERGE_ALL; - - final ArrayList<Equipment> aList = new ArrayList<Equipment>(); - final List<Equipment> equipList = getPc().getEquipmentListInOutputOrder(merge); - - for ( Equipment eq : equipList ) - { - if (eq.acceptsChildren()) - { - aList.add(eq); - } - } - - valString = Integer.toString(aList.size()); - } - else if ("COUNT[SA]".equals(valString)) - { - valString = String.valueOf(getPc().getSpecialAbilityTimesList().size()); - } - else if ("COUNT[TEMPLATES]".equals(valString)) - { - getPc().getTemplateList().trimToSize(); - valString = String.valueOf(getPc().getTemplateList().size()); - } - else if ("COUNT[RACESUBTYPES]".equals(valString)) - { - valString = Integer.toString(getPc().getRacialSubTypes().size()); - } - else if ("COUNT[VISIBLETEMPLATES]".equals(valString)) - { - int count = 0; - - for ( PCTemplate template : getPc().getTemplateList() ) - { - final Visibility vis = template.getSafe(ObjectKey.VISIBILITY); - - if ((vis == Visibility.DEFAULT) - || (vis == Visibility.OUTPUT_ONLY)) - { - ++count; - } - } - - valString = Integer... [truncated message content] |
From: <th...@us...> - 2008-10-14 22:01:13
|
Revision: 8074 http://pcgen.svn.sourceforge.net/pcgen/?rev=8074&view=rev Author: thpr Date: 2008-10-14 22:01:10 +0000 (Tue, 14 Oct 2008) Log Message: ----------- Refactoring to avoid casting Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/cdom/base/Category.java Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/SubClassCategory.java Trunk/pcgen/code/src/java/pcgen/cdom/reference/CDOMCategorizedSingleRef.java Trunk/pcgen/code/src/java/pcgen/core/AbilityCategory.java Trunk/pcgen/code/src/java/pcgen/rules/context/ReferenceContext.java Modified: Trunk/pcgen/code/src/java/pcgen/cdom/base/Category.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/base/Category.java 2008-10-14 12:12:56 UTC (rev 8073) +++ Trunk/pcgen/code/src/java/pcgen/cdom/base/Category.java 2008-10-14 22:01:10 UTC (rev 8074) @@ -30,4 +30,6 @@ public interface Category<T extends CategorizedCDOMObject<T>> { + Category<T> getParentCategory(); + } Modified: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/SubClassCategory.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/SubClassCategory.java 2008-10-14 12:12:56 UTC (rev 8073) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/SubClassCategory.java 2008-10-14 22:01:10 UTC (rev 8074) @@ -182,4 +182,9 @@ } } + public Category<SubClass> getParentCategory() + { + return null; + } + } Modified: Trunk/pcgen/code/src/java/pcgen/cdom/reference/CDOMCategorizedSingleRef.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/reference/CDOMCategorizedSingleRef.java 2008-10-14 12:12:56 UTC (rev 8073) +++ Trunk/pcgen/code/src/java/pcgen/cdom/reference/CDOMCategorizedSingleRef.java 2008-10-14 22:01:10 UTC (rev 8074) @@ -22,8 +22,6 @@ import pcgen.cdom.base.CategorizedCDOMObject; import pcgen.cdom.base.Category; -import pcgen.core.AbilityCategory; -import pcgen.core.AbilityUtilities; /** * A CDOMCategorizedSingleRef is a CDOMReference which is intended to contain a @@ -151,7 +149,7 @@ { if (o instanceof CDOMCategorizedSingleRef) { - CDOMCategorizedSingleRef<?> ref = (CDOMCategorizedSingleRef) o; + CDOMCategorizedSingleRef<?> ref = (CDOMCategorizedSingleRef<?>) o; return getReferenceClass().equals(ref.getReferenceClass()) && getName().equals(ref.getName()) && category.equals(ref.category); @@ -217,27 +215,17 @@ } if (!category.equals(obj.getCDOMCategory())) { - boolean parentMatch = false; - if (category.getClass().isAssignableFrom(AbilityCategory.class)) + Category<T> parent = category.getParentCategory(); + if (parent != null) { - Category tempCat = category; - AbilityCategory child = (AbilityCategory) tempCat; - if (!child.getAbilityCategory().equals(child.getKeyName())) + if (!parent.equals(obj.getCDOMCategory())) { - AbilityCategory parent = - AbilityUtilities.getAbilityCategory(child - .getAbilityCategory()); - parentMatch = parent.equals(obj.getCDOMCategory()); + throw new IllegalArgumentException("Cannot resolve a " + + getReferenceClass().getSimpleName() + " " + + obj.getCDOMCategory() + " Reference to category " + + category); } } - - if (!parentMatch) - { - throw new IllegalArgumentException("Cannot resolve a " - + getReferenceClass().getSimpleName() + " " - + obj.getCDOMCategory() + " Reference to category " - + category); - } } referencedObject = obj; } Modified: Trunk/pcgen/code/src/java/pcgen/core/AbilityCategory.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/AbilityCategory.java 2008-10-14 12:12:56 UTC (rev 8073) +++ Trunk/pcgen/code/src/java/pcgen/core/AbilityCategory.java 2008-10-14 22:01:10 UTC (rev 8074) @@ -463,4 +463,9 @@ return false; return true; } + + public Category<Ability> getParentCategory() + { + return AbilityUtilities.getAbilityCategory(getAbilityCategory()); + } } Modified: Trunk/pcgen/code/src/java/pcgen/rules/context/ReferenceContext.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/rules/context/ReferenceContext.java 2008-10-14 12:12:56 UTC (rev 8073) +++ Trunk/pcgen/code/src/java/pcgen/rules/context/ReferenceContext.java 2008-10-14 22:01:10 UTC (rev 8074) @@ -30,8 +30,6 @@ import pcgen.cdom.reference.CategorizedReferenceManufacturer; import pcgen.cdom.reference.ReferenceManufacturer; import pcgen.cdom.reference.SimpleReferenceManufacturer; -import pcgen.core.AbilityCategory; -import pcgen.core.AbilityUtilities; public class ReferenceContext extends AbstractReferenceContext { @@ -75,30 +73,23 @@ { mfg = new CategorizedReferenceManufacturer<T>(cl, cat); catmap.put(cl, cat, mfg); - if (cat != null && cat.getClass().isAssignableFrom(AbilityCategory.class)) + if (cat != null) { - Category foo = cat; - AbilityCategory child = (AbilityCategory) foo; - if (!child.getAbilityCategory().equals(child.getKeyName())) + Category<T> parent = cat.getParentCategory(); + if (parent != null) { - AbilityCategory parent = - AbilityUtilities.getAbilityCategory(child - .getAbilityCategory()); - CategorizedReferenceManufacturer<T> parentMfg = - (CategorizedReferenceManufacturer<T>) catmap.get( - cl, parent); + CategorizedReferenceManufacturer<T> parentMfg = (CategorizedReferenceManufacturer<T>) catmap + .get(cl, parent); if (parentMfg == null) { Category parentCat = parent; - parentMfg = - new CategorizedReferenceManufacturer<T>(cl, - parentCat); + parentMfg = new CategorizedReferenceManufacturer<T>(cl, + parentCat); catmap.put(cl, cat, parentMfg); } mfg.setParentCRM(parentMfg); } } - } return mfg; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |