From: <th...@us...> - 2008-07-19 00:59:46
|
Revision: 7192 http://pcgen.svn.sourceforge.net/pcgen/?rev=7192&view=rev Author: thpr Date: 2008-07-19 00:59:45 +0000 (Sat, 19 Jul 2008) Log Message: ----------- Allows new ADD tokens (in parallel with old tokens) Converts ADD:TEMPLATE to new Token Format Converts ADD:LANGUAGE to new Token Format Also, generally prepares the Global tokens for safe transition even with LEVEL:x: in Template LST Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/base/formula/Formula.java Trunk/pcgen/code/src/java/pcgen/cdom/base/CDOMObject.java Trunk/pcgen/code/src/java/pcgen/cdom/content/TransitionChoice.java 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/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/Skill.java Trunk/pcgen/code/src/java/pcgen/core/SubstitutionClass.java Trunk/pcgen/code/src/java/pcgen/core/analysis/TemplateModifier.java Trunk/pcgen/code/src/java/pcgen/io/IOConstants.java Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Creator.java Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Parser.java Trunk/pcgen/code/src/java/pcgen/rules/persistence/TokenSupport.java Trunk/pcgen/code/src/java/pcgen/util/StringPClassUtil.java Trunk/pcgen/code/src/java/plugin/exporttokens/TemplateToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/AbilityLst.java Trunk/pcgen/code/src/java/plugin/lsttokens/AddLst.java Trunk/pcgen/code/src/java/plugin/lsttokens/AutoLst.java Trunk/pcgen/code/src/java/plugin/lsttokens/BonusLst.java Trunk/pcgen/code/src/java/plugin/lsttokens/DefineLst.java Trunk/pcgen/code/src/java/plugin/lsttokens/DrLst.java Trunk/pcgen/code/src/java/plugin/lsttokens/KitLst.java Trunk/pcgen/code/src/java/plugin/lsttokens/MoveLst.java Trunk/pcgen/code/src/java/plugin/lsttokens/MovecloneLst.java Trunk/pcgen/code/src/java/plugin/lsttokens/NaturalattacksLst.java Trunk/pcgen/code/src/java/plugin/lsttokens/RegionLst.java Trunk/pcgen/code/src/java/plugin/lsttokens/RemoveLst.java Trunk/pcgen/code/src/java/plugin/lsttokens/SabLst.java Trunk/pcgen/code/src/java/plugin/lsttokens/SpellsLst.java Trunk/pcgen/code/src/java/plugin/lsttokens/SrLst.java Trunk/pcgen/code/src/java/plugin/lsttokens/UdamLst.java Trunk/pcgen/code/src/java/plugin/lsttokens/add/LanguageToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/add/TemplateToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/pcclass/SkilllistToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/pcclass/SpelllistToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/template/LevelToken.java Trunk/pcgen/code/src/test/pcgen/core/PCTemplateTest.java Added Paths: ----------- Trunk/pcgen/code/src/java/pcgen/cdom/content/ChoiceActor.java Trunk/pcgen/code/src/java/pcgen/core/AssociationStore.java Trunk/pcgen/code/src/java/pcgen/core/AssociationSupport.java Modified: Trunk/pcgen/code/src/java/pcgen/base/formula/Formula.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/base/formula/Formula.java 2008-07-18 09:21:09 UTC (rev 7191) +++ Trunk/pcgen/code/src/java/pcgen/base/formula/Formula.java 2008-07-19 00:59:45 UTC (rev 7192) @@ -45,6 +45,24 @@ } }; + /** + * A Formula for the integer constant ONE. This is done in order to + * minimize memory usage in the many cases where a default Formula of ONE + * is required. + */ + public final Formula ONE = new Formula() + { + public Integer resolve(PlayerCharacter pc, String source) + { + return Integer.valueOf(1); + } + + public boolean isStatic() + { + return true; + } + }; + /* * The idea is to hide JEP behind this interface, so that Formula are type * safe and other optimizations can be performed that may help speed up Modified: Trunk/pcgen/code/src/java/pcgen/cdom/base/CDOMObject.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/base/CDOMObject.java 2008-07-18 09:21:09 UTC (rev 7191) +++ Trunk/pcgen/code/src/java/pcgen/cdom/base/CDOMObject.java 2008-07-19 00:59:45 UTC (rev 7192) @@ -28,6 +28,7 @@ import pcgen.base.formula.Formula; import pcgen.base.util.DoubleKeyMapToList; +import pcgen.cdom.content.TransitionChoice; import pcgen.cdom.enumeration.FormulaKey; import pcgen.cdom.enumeration.IntegerKey; import pcgen.cdom.enumeration.ListKey; @@ -35,6 +36,7 @@ import pcgen.cdom.enumeration.StringKey; import pcgen.cdom.enumeration.VariableKey; import pcgen.cdom.util.ListKeyMapToList; +import pcgen.core.PlayerCharacter; public abstract class CDOMObject extends ConcretePrereqObject implements Cloneable @@ -487,4 +489,22 @@ } return false; } + + public void addAdds(final PlayerCharacter aPC) + { + List<TransitionChoice<?>> addList = getListFor(ListKey.ADD); + if (addList != null) + { + for (TransitionChoice<?> tc : addList) + { + driveChoice(tc, aPC); + } + } + } + + private <T> void driveChoice(TransitionChoice<T> tc, final PlayerCharacter aPC) + { + tc.act(tc.driveChoice(aPC), aPC); + } + } Added: Trunk/pcgen/code/src/java/pcgen/cdom/content/ChoiceActor.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/content/ChoiceActor.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/cdom/content/ChoiceActor.java 2008-07-19 00:59:45 UTC (rev 7192) @@ -0,0 +1,8 @@ +package pcgen.cdom.content; + +import pcgen.core.PlayerCharacter; + +public interface ChoiceActor<T> +{ + public void applyChoice(T choice, PlayerCharacter pc); +} Property changes on: Trunk/pcgen/code/src/java/pcgen/cdom/content/ChoiceActor.java ___________________________________________________________________ Added: svn:mime-type + text/plain Modified: Trunk/pcgen/code/src/java/pcgen/cdom/content/TransitionChoice.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/content/TransitionChoice.java 2008-07-18 09:21:09 UTC (rev 7191) +++ Trunk/pcgen/code/src/java/pcgen/cdom/content/TransitionChoice.java 2008-07-19 00:59:45 UTC (rev 7192) @@ -17,7 +17,16 @@ */ package pcgen.cdom.content; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Set; + +import pcgen.base.formula.Formula; import pcgen.cdom.base.ChoiceSet; +import pcgen.core.PlayerCharacter; +import pcgen.util.StringPClassUtil; +import pcgen.util.chooser.ChooserFactory; +import pcgen.util.chooser.ChooserInterface; /** * This is a transitional class from PCGen 5.15+ to the final CDOM core. It is @@ -30,9 +39,12 @@ { private final ChoiceSet<? extends T> choices; - private final int choiceCount; + private final Formula choiceCount; + private String title; + private boolean required = true; + private ChoiceActor<T> choiceActor; - public TransitionChoice(ChoiceSet<? extends T> cs, int count) + public TransitionChoice(ChoiceSet<? extends T> cs, Formula count) { choices = cs; choiceCount = count; @@ -43,7 +55,7 @@ return choices; } - public int getCount() + public Formula getCount() { return choiceCount; } @@ -54,8 +66,8 @@ if (obj instanceof TransitionChoice) { TransitionChoice<?> other = (TransitionChoice<?>) obj; - return choiceCount == other.choiceCount - && choices.equals(other.choices); + return choiceCount.equals(other.choiceCount) + && choices.equals(other.choices); } return false; } @@ -63,7 +75,76 @@ @Override public int hashCode() { - return choiceCount * 29 + choices.hashCode(); + return choiceCount.hashCode() * 29 + choices.hashCode(); } + public Collection<? extends T> driveChoice(PlayerCharacter pc) + { + ChooserInterface c = ChooserFactory.getChooserInstance(); + int intValue = choiceCount.resolve(pc, "").intValue(); + c.setPoolFlag(required); + if (intValue == Integer.MAX_VALUE) + { + c.setPickAll(true); + } + else + { + c.setTotalChoicesAvail(intValue); + } + if (title == null) + { + title = + "Choose a " + + StringPClassUtil.getStringFor(choices + .getChoiceClass()); + } + c.setTitle(title); + Set<? extends T> set = choices.getSet(pc); + + if (c.pickAll()) + { + return set; + } + else + { + c.setAvailableList(new ArrayList<T>(set)); + c.setVisible(true); + return c.getSelectedList(); + } + } + + public void setTitle(String string) + { + title = string; + } + + public void setRequired(boolean b) + { + required = b; + } + + public void setChoiceActor(ChoiceActor<T> ca) + { + choiceActor = ca; + } + + public void act(Collection<? extends T> driveChoice, PlayerCharacter apc) + { + if (choiceActor == null) + { + throw new IllegalStateException( + "Cannot act without a defined ChoiceActor"); + } + for (T choice : driveChoice) + { + choiceActor.applyChoice(choice, apc); + apc.addAssociation(this, choice); + } + } + + public T castChoice(Object o) + { + return (T) o; + } + } Modified: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java 2008-07-18 09:21:09 UTC (rev 7191) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java 2008-07-19 00:59:45 UTC (rev 7192) @@ -29,6 +29,7 @@ import pcgen.cdom.base.CDOMReference; import pcgen.cdom.content.KnownSpellIdentifier; import pcgen.cdom.content.LevelCommandFactory; +import pcgen.cdom.content.TransitionChoice; import pcgen.cdom.helper.AttackCycle; import pcgen.cdom.helper.PointCost; import pcgen.cdom.helper.Quality; @@ -201,6 +202,7 @@ public static final ListKey<CDOMReference<PCTemplate>> TEMPLATE = new ListKey<CDOMReference<PCTemplate>>(); public static final ListKey<CDOMReference<PCTemplate>> REMOVE_TEMPLATES = new ListKey<CDOMReference<PCTemplate>>(); public static final ListKey<Vision> VISION_CACHE = new ListKey<Vision>(); + public static final ListKey<TransitionChoice<?>> ADD = new ListKey<TransitionChoice<?>>(); /** Private constructor to prevent instantiation of this class */ private ListKey() { Added: Trunk/pcgen/code/src/java/pcgen/core/AssociationStore.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/AssociationStore.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/core/AssociationStore.java 2008-07-19 00:59:45 UTC (rev 7192) @@ -0,0 +1,20 @@ +package pcgen.core; + +import java.util.List; + +public interface AssociationStore +{ + public void addAssociation(Object obj, Object o); + + public void removeAssociation(Object obj, Object o); + + public List<Object> removeAllAssociations(Object obj); + + public int getAssociationCount(Object obj); + + public boolean hasAssociations(Object obj); + + public List<Object> getAssociationList(Object obj); + + public boolean containsAssociated(Object obj, Object o); +} Property changes on: Trunk/pcgen/code/src/java/pcgen/core/AssociationStore.java ___________________________________________________________________ Added: svn:mime-type + text/plain Added: Trunk/pcgen/code/src/java/pcgen/core/AssociationSupport.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/AssociationSupport.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/core/AssociationSupport.java 2008-07-19 00:59:45 UTC (rev 7192) @@ -0,0 +1,47 @@ +package pcgen.core; + +import java.util.List; + +import pcgen.base.util.HashMapToList; + +public class AssociationSupport implements AssociationStore +{ + + private final HashMapToList<Object, Object> assocMap = + new HashMapToList<Object, Object>(); + + public void addAssociation(Object obj, Object o) + { + assocMap.addToListFor(obj, o); + } + + public void removeAssociation(Object obj, Object o) + { + assocMap.removeFromListFor(obj, o); + } + + public List<Object> removeAllAssociations(Object obj) + { + return assocMap.removeListFor(obj); + } + + public int getAssociationCount(Object obj) + { + return assocMap.sizeOfListFor(obj); + } + + public boolean hasAssociations(Object obj) + { + return assocMap.containsListFor(obj); + } + + public List<Object> getAssociationList(Object obj) + { + return assocMap.getListFor(obj); + } + + public boolean containsAssociated(Object obj, Object o) + { + return assocMap.containsInList(obj, o); + } +} Property changes on: Trunk/pcgen/code/src/java/pcgen/core/AssociationSupport.java ___________________________________________________________________ Added: svn:mime-type + text/plain Modified: Trunk/pcgen/code/src/java/pcgen/core/PCClass.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-07-18 09:21:09 UTC (rev 7191) +++ Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-07-19 00:59:45 UTC (rev 7192) @@ -41,7 +41,6 @@ import pcgen.cdom.base.AssociatedPrereqObject; import pcgen.cdom.base.CDOMListObject; import pcgen.cdom.base.CDOMReference; -import pcgen.cdom.base.ChoiceSet; import pcgen.cdom.base.Constants; import pcgen.cdom.base.FormulaFactory; import pcgen.cdom.content.HitDie; @@ -3982,6 +3981,7 @@ KitUtilities.makeKitSelections(0, l.get(i), i, aPC); } makeRegionSelection(0, aPC); + addAdds(aPC); } List<String> l = getSafeListFor(ListKey.KITS); @@ -4180,6 +4180,10 @@ // for bug #688564 -- sage_sam, 18 March 2003 aPC.calcActiveBonuses(); addAddsForLevel(newLevel, aPC, pcLevelInfo); + if (!aPC.isImporting() && aPC.doLevelAbilities()) + { + getClassLevel(newLevel).addAdds(aPC); + } } /** @@ -5192,25 +5196,8 @@ } clearClassSkillList(); - - ChoiceSet<? extends ClassSkillList> choiceSet = csc.getChoices(); - Set<? extends ClassSkillList> lists = choiceSet.getSet(null); - if (lists.size() == 1) + for (ClassSkillList st : csc.driveChoice(null)) { - addClassSkill(lists.iterator().next()); - return; - } - - final ChooserInterface c = ChooserFactory.getChooserInstance(); - c.setTitle("Select class whose class-skills this class will inherit"); - c.setTotalChoicesAvail(csc.getCount()); - c.setPoolFlag(false); - c.setAvailableList(new ArrayList<ClassSkillList>(lists)); - c.setVisible(true); - - List<ClassSkillList> selectedList = c.getSelectedList(); - for (ClassSkillList st : selectedList) - { addClassSkill(st); } } @@ -5229,25 +5216,8 @@ } clearClassSpellList(); - - ChoiceSet<? extends CDOMListObject<Spell>> choiceSet = csc.getChoices(); - Set<? extends CDOMListObject<Spell>> lists = choiceSet.getSet(null); - if (lists.size() == 1) + for (CDOMListObject<Spell> st : csc.driveChoice(null)) { - addClassSpellList(lists.iterator().next()); - return; - } - - final ChooserInterface c = ChooserFactory.getChooserInstance(); - c.setTitle("Select class whose list of spells this class will use"); - c.setTotalChoicesAvail(csc.getCount()); - c.setPoolFlag(false); - c.setAvailableList(new ArrayList<CDOMListObject<Spell>>(lists)); - c.setVisible(true); - - List<CDOMListObject<Spell>> selectedList = c.getSelectedList(); - for (CDOMListObject<Spell> st : selectedList) - { addClassSpellList(st); } } Modified: Trunk/pcgen/code/src/java/pcgen/core/PCTemplate.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PCTemplate.java 2008-07-18 09:21:09 UTC (rev 7191) +++ Trunk/pcgen/code/src/java/pcgen/core/PCTemplate.java 2008-07-19 00:59:45 UTC (rev 7192) @@ -27,6 +27,7 @@ import java.awt.geom.Point2D; import java.math.BigDecimal; +import java.util.ArrayList; import java.util.List; import pcgen.base.lang.StringUtil; @@ -36,6 +37,7 @@ import pcgen.cdom.enumeration.Region; import pcgen.cdom.enumeration.SubRace; import pcgen.cdom.enumeration.SubRegion; +import pcgen.core.bonus.BonusObj; import pcgen.util.enumeration.Visibility; /** @@ -311,4 +313,63 @@ } return new Point2D.Double(width.doubleValue(), height.doubleValue()); } + + public void getConditionalTemplates(int totalLevels, int totalHitDice, + List<? super PCTemplate> list) + { + for (PCTemplate rlt : getSafeListFor(ListKey.REPEATLEVEL_TEMPLATES)) + { + for (PCTemplate lt : rlt.getSafeListFor(ListKey.LEVEL_TEMPLATES)) + { + if (lt.get(IntegerKey.LEVEL) <= totalLevels) + { + list.add(lt); + } + } + } + + for (PCTemplate lt : getSafeListFor(ListKey.LEVEL_TEMPLATES)) + { + if (lt.get(IntegerKey.LEVEL) <= totalLevels) + { + list.add(lt); + } + } + + for (PCTemplate lt : getSafeListFor(ListKey.HD_TEMPLATES)) + { + if (lt.get(IntegerKey.HD_MAX) <= totalHitDice + && lt.get(IntegerKey.HD_MIN) >= totalHitDice) + { + list.add(lt); + } + } + } + + @Override + public List<BonusObj> getBonusList() + { + List<BonusObj> list = new ArrayList<BonusObj>(super.getBonusList()); + for (PCTemplate rlt : getSafeListFor(ListKey.REPEATLEVEL_TEMPLATES)) + { + for (PCTemplate lt : rlt.getSafeListFor(ListKey.LEVEL_TEMPLATES)) + { + list.addAll(lt.getBonusList()); + } + } + + for (PCTemplate lt : getSafeListFor(ListKey.LEVEL_TEMPLATES)) + { + list.addAll(lt.getBonusList()); + } + + for (PCTemplate lt : getSafeListFor(ListKey.HD_TEMPLATES)) + { + list.addAll(lt.getBonusList()); + } + + return list; + } + + } Modified: Trunk/pcgen/code/src/java/pcgen/core/PObject.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-07-18 09:21:09 UTC (rev 7191) +++ Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-07-19 00:59:45 UTC (rev 7192) @@ -48,6 +48,7 @@ import pcgen.cdom.base.CDOMObject; import pcgen.cdom.base.CDOMReference; import pcgen.cdom.base.Constants; +import pcgen.cdom.content.TransitionChoice; import pcgen.cdom.enumeration.IntegerKey; import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; @@ -1089,21 +1090,6 @@ } /** - * Returns true if this object has a variable named variableName - * @param variableName - * @return true if this object has a variable named variableName - */ - public final boolean hasVariableNamed(final String variableName) - { - if (variableList == null) - { - return false; - } - - return variableList.hasVariableNamed(variableName); - } - - /** * Clear the associated list for this object */ public final void clearAssociated() @@ -2774,13 +2760,16 @@ if ( aPC == null || aPC.isImporting() || - levelAbilityList == null || - levelAbilityList.isEmpty() || !aPC.doLevelAbilities()) { return; } + if (levelAbilityList == null || levelAbilityList.isEmpty()) + { + return; + } + for ( LevelAbility levAbility : levelAbilityList ) { levAbility.setOwner(this); @@ -2921,11 +2910,13 @@ final PCClass aClass = (PCClass) this; final PCLevelInfo pcLevelInfo = aPC.getLevelInfoFor(getKeyName(), aClass.level); addAddsForLevel(aClass.level, aPC, pcLevelInfo); + aClass.getClassLevel(aClass.level).addAdds(aPC); } else { addAddsForLevel(-9, aPC, null); addAddsForLevel(0, aPC, null); + addAdds(aPC); } activateBonuses(aPC); Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-07-18 09:21:09 UTC (rev 7191) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-07-19 00:59:45 UTC (rev 7192) @@ -127,7 +127,7 @@ * @version $Revision$ */ public final class PlayerCharacter extends Observable implements Cloneable, - VariableContainer + VariableContainer, AssociationStore { // Constants for use in getBonus /** ATTACKBONUS = 0 */ @@ -137,6 +137,7 @@ private static String lastVariable = null; private ObjectCache cache = new ObjectCache(); + private AssociationSupport assocSupt = new AssociationSupport(); // List of Armor Proficiencies private final List<String> armorProfList = new ArrayList<String>(); @@ -2355,6 +2356,7 @@ for (CompanionMod cMod : newCompanionMods) { cMod.addAddsForLevel(-9, this, null); + cMod.addAdds(this); for (CDOMReference<PCTemplate> ref : cMod.getSafeListFor(ListKey.TEMPLATE)) { @@ -3138,6 +3140,14 @@ aList.addAll(al); aPObj.addSABToList(aList, this); } + // for (CDOMObject cdo : getCDOMObjectList()) + // { + // //TODO this is for once SAB: is converted to new token style + // } + for (PObject po : getConditionalTemplateObjects()) + { + po.addSABToList(aList, this); + } Collections.sort(aList); @@ -8725,6 +8735,11 @@ drList.addAll(obj.getDRList()); } } + for (PObject obj : getConditionalTemplateObjects()) + { + drList.addAll(obj.getDRList()); + } + //TODO need to use getCDOMObject once DR: is converted to new token syntax return DamageReduction.getDRList(this, drList); } @@ -9509,6 +9524,9 @@ if (pcload == null) { pcload = Load.LIGHT; + /* + * Can't use getCDOMObjectList here due to override in Class LST file :P + */ for (PObject po : getPObjectList()) { if (po != null && !(po instanceof PCClass)) @@ -12474,40 +12492,14 @@ return list; } - private List<CDOMObject> getConditionalTemplateObjects() + private List<PObject> getConditionalTemplateObjects() { - List<CDOMObject> list = new ArrayList<CDOMObject>(); + List<PObject> list = new ArrayList<PObject>(); int totalLevels = getTotalLevels(); int totalHitDice = totalHitDice(); for (PCTemplate templ : getTemplateList()) { - for (PCTemplate rlt : templ.getSafeListFor(ListKey.REPEATLEVEL_TEMPLATES)) - { - for (PCTemplate lt : rlt.getSafeListFor(ListKey.LEVEL_TEMPLATES)) - { - if (lt.get(IntegerKey.LEVEL) <= totalLevels) - { - list.add(lt); - } - } - } - - for (PCTemplate lt : templ.getSafeListFor(ListKey.LEVEL_TEMPLATES)) - { - if (lt.get(IntegerKey.LEVEL) <= totalLevels) - { - list.add(lt); - } - } - - for (PCTemplate lt : templ.getSafeListFor(ListKey.HD_TEMPLATES)) - { - if (lt.get(IntegerKey.HD_MAX) <= totalHitDice - && lt.get(IntegerKey.HD_MIN) >= totalHitDice) - { - list.add(lt); - } - } + templ.getConditionalTemplates(totalLevels, totalHitDice, list); } return list; } @@ -17096,7 +17088,9 @@ i++; List<PCTemplate> templateList = new ArrayList<PCTemplate>(); List<Equipment> naturalWeaponsList = new ArrayList<Equipment>(); - List<? extends PObject> pobjectList = getPObjectList(); + List<PObject> pobjectList = getConditionalTemplateObjects(); + pobjectList.addAll(getPObjectList()); + //TODO pobjectList needs to be getCDOMObjects() once Ability & AUTO are new syntax for (AbilityCategory cat : theAbilities.getKeySet()) { for (Ability.Nature nature : theAbilities.getSecondaryKeySet(cat)) @@ -17470,14 +17464,18 @@ */ public void addAddsFromAllObjForLevel() { + int totalCharacterLevel = getTotalCharacterLevel(); for (PObject pobj : getPObjectList()) { if (!(pobj instanceof PCClass)) { - pobj.addAddsForLevel(this.getTotalCharacterLevel(), this, null); + pobj.addAddsForLevel(totalCharacterLevel, this, null); } } - + for (PObject pobj : getConditionalTemplateObjects()) + { + pobj.addAddsForLevel(totalCharacterLevel, this, null); + } } /** @@ -17851,4 +17849,41 @@ { return cache.getSkillCost(this, sk, cl); } + + public void addAssociation(Object obj, Object o) + { + assocSupt.addAssociation(obj, o); + } + + public boolean containsAssociated(Object obj, Object o) + { + return assocSupt.containsAssociated(obj, o); + } + + public int getAssociationCount(Object obj) + { + return assocSupt.getAssociationCount(obj); + } + + public List<Object> getAssociationList(Object obj) + { + return assocSupt.getAssociationList(obj); + } + + public boolean hasAssociations(Object obj) + { + return assocSupt.hasAssociations(obj); + } + + public List<Object> removeAllAssociations(Object obj) + { + return assocSupt.removeAllAssociations(obj); + } + + public void removeAssociation(Object obj, Object o) + { + assocSupt.removeAssociation(obj, o); + } + + } Modified: Trunk/pcgen/code/src/java/pcgen/core/Skill.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Skill.java 2008-07-18 09:21:09 UTC (rev 7191) +++ Trunk/pcgen/code/src/java/pcgen/core/Skill.java 2008-07-19 00:59:45 UTC (rev 7192) @@ -600,6 +600,7 @@ if (iCount == 0) { addAddsForLevel(-9, aPC, null); + addAdds(aPC); } } } Modified: Trunk/pcgen/code/src/java/pcgen/core/SubstitutionClass.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/SubstitutionClass.java 2008-07-18 09:21:09 UTC (rev 7191) +++ Trunk/pcgen/code/src/java/pcgen/core/SubstitutionClass.java 2008-07-19 00:59:45 UTC (rev 7192) @@ -22,14 +22,15 @@ */ package pcgen.core; +import java.util.ArrayList; +import java.util.List; + +import pcgen.cdom.enumeration.ListKey; import pcgen.persistence.PersistenceLayerException; import pcgen.persistence.lst.CampaignSourceEntry; import pcgen.persistence.lst.PCClassLoader; import pcgen.util.Logging; -import java.util.ArrayList; -import java.util.List; - /** * <code>SubClass</code>. * @@ -107,6 +108,7 @@ aClass.removeAllAutoAbilites(aLevel); aClass.removeAllVirtualAbilites(aLevel); aClass.removeAllLevelAbilities(aLevel); + aClass.getClassLevel(aLevel).removeListFor(ListKey.ADD); aClass.clearSABList(aLevel); aClass.removeLevelDR(aLevel); aClass.removelevelVariable(aLevel); Modified: Trunk/pcgen/code/src/java/pcgen/core/analysis/TemplateModifier.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/analysis/TemplateModifier.java 2008-07-18 09:21:09 UTC (rev 7191) +++ Trunk/pcgen/code/src/java/pcgen/core/analysis/TemplateModifier.java 2008-07-19 00:59:45 UTC (rev 7192) @@ -1,6 +1,8 @@ package pcgen.core.analysis; import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.List; import pcgen.cdom.enumeration.ObjectKey; import pcgen.core.DamageReduction; @@ -44,11 +46,20 @@ } } - if (pct.getDRList().size() != 0) + List<DamageReduction> drList = new ArrayList<DamageReduction>(); + int totalLevels = aPC.getTotalLevels(); + int totalHitDice = aPC.totalHitDice(); + List<PCTemplate> templList = new ArrayList<PCTemplate>(); + templList.add(pct); + pct.getConditionalTemplates(totalLevels, totalHitDice, templList); + for (PCTemplate subt : templList) { - mods.append("DR:").append( - DamageReduction.getDRString(aPC, pct.getDRList())); + drList.addAll(subt.getDRList()); } + if (drList.size() != 0) + { + mods.append("DR:").append(DamageReduction.getDRString(aPC, drList)); + } if (aPC == null) { @@ -81,19 +92,18 @@ mods.append("AC BONUS:").append(nat); } - if (pct.getCR(aPC.getTotalLevels(), aPC.totalHitDice()) != 0) + if (pct.getCR(totalLevels, totalHitDice) != 0) { mods.append("CR:").append( - pct.getCR(aPC.getTotalLevels(), aPC.totalHitDice())) + pct.getCR(totalLevels, totalHitDice)) .append(' '); } if (TemplateSR - .getSR(pct, aPC.getTotalLevels(), aPC.totalHitDice(), aPC) != 0) + .getSR(pct, totalLevels, totalHitDice, aPC) != 0) { mods.append("SR:").append( - TemplateSR.getSR(pct, aPC.getTotalLevels(), aPC - .totalHitDice(), aPC)).append(' '); + TemplateSR.getSR(pct, totalLevels, totalHitDice, aPC)).append(' '); } // if (!getDR(aPC.getTotalLevels(), aPC.totalHitDice()).equals("")) Modified: Trunk/pcgen/code/src/java/pcgen/io/IOConstants.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/IOConstants.java 2008-07-18 09:21:09 UTC (rev 7191) +++ Trunk/pcgen/code/src/java/pcgen/io/IOConstants.java 2008-07-19 00:59:45 UTC (rev 7192) @@ -48,6 +48,8 @@ /** ABILITY */ String TAG_ABILITY = "ABILITY"; + String TAG_ADDTOKEN = "ADD"; + /** Tag for Follower ADJUSTMENT */ String TAG_ADJUSTMENT = "ADJUSTMENT"; Modified: Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Creator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Creator.java 2008-07-18 09:21:09 UTC (rev 7191) +++ Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Creator.java 2008-07-19 00:59:45 UTC (rev 7192) @@ -37,8 +37,11 @@ import pcgen.base.lang.StringUtil; import pcgen.cdom.base.CDOMListObject; +import pcgen.cdom.base.CDOMObject; import pcgen.cdom.base.CDOMReference; +import pcgen.cdom.base.ChoiceSet; import pcgen.cdom.base.Constants; +import pcgen.cdom.content.TransitionChoice; import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; import pcgen.cdom.list.ClassSpellList; @@ -77,6 +80,7 @@ import pcgen.core.pclevelinfo.PCLevelInfoStat; import pcgen.core.spell.Spell; import pcgen.util.Logging; +import pcgen.util.StringPClassUtil; /** * <code>PCGVer2Creator</code><br> @@ -966,6 +970,7 @@ // Remember what choices were made for each of the ADD: tags // appendLevelAbilityInfo(buffer, pcClass, lvl); + appendAddTokenInfo(buffer, pcClass.getClassLevel(lvl + 1)); } List<PCLevelInfoStat> statList = pcl.getModifiedStats(true); @@ -2550,8 +2555,45 @@ private void appendLevelAbilityInfo(StringBuffer buffer, PObject pObj) { appendLevelAbilityInfo(buffer, pObj, -10); + appendAddTokenInfo(buffer, pObj); } + private void appendAddTokenInfo(StringBuffer buffer, CDOMObject pObj) + { + List<TransitionChoice<?>> addList = pObj.getListFor(ListKey.ADD); + if (addList == null) + { + return; + } + for (TransitionChoice<?> tc : addList) + { + List<Object> assocList = thePC.getAssociationList(tc); + if (assocList == null) + { + continue; + } + // + // |ADD:[PROMPT:SUBTOKEN|blah|CHOICE:choice1|CHOICE:choice2|CHOICE:choice3...] + // + ChoiceSet<?> choices = tc.getChoices(); + buffer.append('|').append(TAG_ADDTOKEN).append(':').append('['); + buffer.append(EntityEncoder.encode(StringPClassUtil + .getStringFor(choices.getChoiceClass()))).append(':'); + buffer.append(EntityEncoder.encode(choices.getLSTformat())); + + for (Object assoc : assocList) + { + buffer + .append('|') + .append(TAG_CHOICE) + .append(':') + .append(EntityEncoder.encode(((CDOMObject) assoc).getKeyName())); + } + + buffer.append(']'); + } + } + private void appendLevelAbilityInfo(StringBuffer buffer, PObject pObj, final int lvl) { Modified: Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Parser.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Parser.java 2008-07-18 09:21:09 UTC (rev 7191) +++ Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Parser.java 2008-07-19 00:59:45 UTC (rev 7192) @@ -34,10 +34,14 @@ import java.util.Set; import java.util.StringTokenizer; +import pcgen.cdom.base.CDOMObject; +import pcgen.cdom.base.ChoiceSet; import pcgen.cdom.base.Constants; +import pcgen.cdom.content.TransitionChoice; import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; import pcgen.cdom.enumeration.StringKey; +import pcgen.cdom.inst.PCClassLevel; import pcgen.cdom.list.ClassSpellList; import pcgen.cdom.list.DomainSpellList; import pcgen.core.Ability; @@ -84,8 +88,10 @@ import pcgen.persistence.lst.PCClassLstToken; import pcgen.persistence.lst.TokenStore; import pcgen.rules.context.AbstractReferenceContext; +import pcgen.rules.context.LoadContext; import pcgen.util.Logging; import pcgen.util.PropertyFactory; +import pcgen.util.StringPClassUtil; /** * <code>PCGVer2Parser</code> @@ -1674,6 +1680,10 @@ { parseLevelAbilityInfo(element, aPCClass, level); } + else if (tag.equals(TAG_ADDTOKEN)) + { + parseAddTokenInfo(element, aPCClass.getClassLevel(level)); + } // // abbrev=score @@ -1763,6 +1773,50 @@ // - missing entries for a given class/level pair } + private void parseAddTokenInfo(PCGElement element, CDOMObject cdo) + { + Iterator<PCGElement> it2 = element.getChildren().iterator(); + + List<TransitionChoice<?>> addList = cdo.getListFor(ListKey.ADD); + if (addList == null) + { + //TODO Error + return; + } + if (!it2.hasNext()) + { + //TODO Error + return; + } + LoadContext context = Globals.getContext(); + PCGElement addType = it2.next(); + Class<? extends CDOMObject> cl = StringPClassUtil.getClassFor(addType.getName()); + String dString = EntityEncoder.decode(addType.getText()); + for (TransitionChoice<?> tc : addList) + { + ChoiceSet<?> choices = tc.getChoices(); + if (dString.equals(choices.getLSTformat())) + { + //Match + while (it2.hasNext()) + { + String choice = EntityEncoder.decode(it2.next().getText()); + CDOMObject obj = + context.ref.silentlyGetConstructedCDOMObject(cl, + choice); + if (obj == null) + { + //TODO Error + } + else + { + thePC.addAssociation(tc, obj); + } + } + } + } + } + /* * ############################################################### * Character Class(es) methods @@ -2611,6 +2665,10 @@ { parseLevelAbilityInfo(element, aFeat); } + else if (tag.equals(TAG_ADDTOKEN)) + { + parseAddTokenInfo(element, aFeat); + } } return added; @@ -3408,6 +3466,10 @@ { parseLevelAbilityInfo(element, aSkill); } + else if (tag.equals(TAG_ADDTOKEN)) + { + parseAddTokenInfo(element, aSkill); + } } } Modified: Trunk/pcgen/code/src/java/pcgen/rules/persistence/TokenSupport.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/rules/persistence/TokenSupport.java 2008-07-18 09:21:09 UTC (rev 7191) +++ Trunk/pcgen/code/src/java/pcgen/rules/persistence/TokenSupport.java 2008-07-19 00:59:45 UTC (rev 7192) @@ -65,8 +65,8 @@ /* * CONSIDER Better option than toString, given that T != CDOMObject */ - Logging.errorPrint("Illegal " + tokenName + " subtoken '" + key + "' '" - + value + "' for " + cdo.toString()); + Logging.addParseMessage(Logging.LST_ERROR, "Illegal " + tokenName + + " subtoken '" + key + "' '" + value + "' for " + cdo.toString()); return false; } Modified: Trunk/pcgen/code/src/java/pcgen/util/StringPClassUtil.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/util/StringPClassUtil.java 2008-07-18 09:21:09 UTC (rev 7191) +++ Trunk/pcgen/code/src/java/pcgen/util/StringPClassUtil.java 2008-07-19 00:59:45 UTC (rev 7192) @@ -9,8 +9,10 @@ import pcgen.core.Domain; import pcgen.core.Equipment; import pcgen.core.EquipmentModifier; +import pcgen.core.Language; import pcgen.core.PCClass; import pcgen.core.PCTemplate; +import pcgen.core.PObject; import pcgen.core.Race; import pcgen.core.Skill; import pcgen.core.WeaponProf; @@ -18,12 +20,12 @@ public class StringPClassUtil { - private static Map<String, Class<?>> classMap; - private static Map<Class<?>, String> stringMap; + private static Map<String, Class<? extends PObject>> classMap; + private static Map<Class<? extends PObject>, String> stringMap; static { - classMap = new HashMap<String, Class<?>>(); - stringMap = new HashMap<Class<?>, String>(); + classMap = new HashMap<String, Class<? extends PObject>>(); + stringMap = new HashMap<Class<? extends PObject>, String>(); classMap.put("DEITY", Deity.class); classMap.put("DOMAIN", Domain.class); @@ -31,6 +33,7 @@ classMap.put("EQMOD", EquipmentModifier.class); classMap.put("FEAT", Ability.class); classMap.put("CLASS", PCClass.class); + classMap.put("LANGUAGE", Language.class); classMap.put("RACE", Race.class); classMap.put("SPELL", Spell.class); classMap.put("SKILL", Skill.class); @@ -43,6 +46,7 @@ stringMap.put(EquipmentModifier.class, "EQMOD"); stringMap.put(Ability.class, "FEAT"); stringMap.put(PCClass.class, "CLASS"); + stringMap.put(Language.class, "LANGUAGE"); stringMap.put(Race.class, "RACE"); stringMap.put(Spell.class, "SPELL"); stringMap.put(Skill.class, "SKILL"); @@ -50,7 +54,7 @@ stringMap.put(WeaponProf.class, "WEAPONPROF"); } - public static Class getClassFor(String key) { + public static Class<? extends PObject> getClassFor(String key) { return classMap.get(key); } @@ -58,7 +62,7 @@ return classMap.keySet(); } - public static String getStringFor(Class cl) { + public static String getStringFor(Class<?> cl) { return stringMap.get(cl); } Modified: Trunk/pcgen/code/src/java/plugin/exporttokens/TemplateToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/exporttokens/TemplateToken.java 2008-07-18 09:21:09 UTC (rev 7191) +++ Trunk/pcgen/code/src/java/plugin/exporttokens/TemplateToken.java 2008-07-19 00:59:45 UTC (rev 7192) @@ -227,6 +227,12 @@ List<SpecialAbility> saList = new ArrayList<SpecialAbility>(); template.addSpecialAbilitiesToList(saList, pc); template.addSABToList(saList, pc); + List<PCTemplate> subList = new ArrayList<PCTemplate>(); + template.getConditionalTemplates(pc.getTotalLevels(), pc.totalHitDice(), subList); + for (PCTemplate subt : subList) + { + subt.addSABToList(saList, pc); + } List<String> saDescList = new ArrayList<String>(); for (SpecialAbility sa : saList) { Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/AbilityLst.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/AbilityLst.java 2008-07-18 09:21:09 UTC (rev 7191) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/AbilityLst.java 2008-07-19 00:59:45 UTC (rev 7192) @@ -90,8 +90,10 @@ { /* - * FIXME Template's LevelToken needs adjustment before this can be converted - * to the new syntax, since this is level-dependent + * Template's LevelToken handled in rebuildAggregateAbilityListWorker() + * + * TODO rebuildAggregateAbilityListWorker needs to be updated to use + * getCDOMObjects() once this is new token (due to class levels) */ /** * @see pcgen.persistence.lst.GlobalLstToken#parse(pcgen.core.PObject, java.lang.String, int) Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/AddLst.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/AddLst.java 2008-07-18 09:21:09 UTC (rev 7191) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/AddLst.java 2008-07-19 00:59:45 UTC (rev 7192) @@ -4,21 +4,26 @@ */ package plugin.lsttokens; +import pcgen.cdom.base.CDOMObject; import pcgen.cdom.base.Constants; +import pcgen.cdom.enumeration.ListKey; import pcgen.core.PObject; +import pcgen.persistence.PersistenceLayerException; import pcgen.persistence.lst.AddLoader; import pcgen.persistence.lst.GlobalLstToken; +import pcgen.rules.context.LoadContext; +import pcgen.rules.persistence.token.CDOMPrimaryToken; import pcgen.util.Logging; /** * @author djones4 * */ -public class AddLst implements GlobalLstToken +public class AddLst implements GlobalLstToken, CDOMPrimaryToken<CDOMObject> { /* - * FIXME Template's LevelToken needs adjustment before this can be converted - * to the new syntax, since this is level-dependent + * Template's LevelToken adjustment done in addAddsFromAllObjForLevel() in + * PlayerCharacter */ public String getTokenName() @@ -32,13 +37,13 @@ if (barLoc == -1) { Logging.errorPrint("Invalid " + getTokenName() + " syntax: " - + value + " ... must have a PIPE"); + + value + " ... must have a PIPE"); return false; } else if (barLoc == 0) { Logging.errorPrint("Invalid " + getTokenName() + " syntax: " - + value + " ... cannot start with a PIPE"); + + value + " ... cannot start with a PIPE"); return false; } String key = value.substring(0, barLoc); @@ -46,10 +51,40 @@ if (contents == null || contents.length() == 0) { Logging.errorPrint("Invalid " + getTokenName() + " syntax: " - + value + " ... cannot end with a PIPE"); + + value + " ... cannot end with a PIPE"); return false; } // Guaranteed to be the new syntax here... return AddLoader.parseLine(obj, key, contents, anInt); } + + public boolean parse(LoadContext context, CDOMObject obj, String value) + throws PersistenceLayerException + { + int pipeLoc = value.indexOf(Constants.PIPE); + if (pipeLoc == -1) + { + Logging.addParseMessage(Logging.LST_ERROR, getTokenName() + + " requires a SubToken"); + return false; + } + String key = value.substring(0, pipeLoc); + if (".CLEAR".equals(key)) + { + context.getObjectContext().removeList(obj, ListKey.ADD); + } + return context.processSubToken(obj, getTokenName(), key, value + .substring(pipeLoc + 1)); + } + + public String[] unparse(LoadContext context, CDOMObject obj) + { + //TODO Need to unparse .CLEAR + return context.unparse(obj, getTokenName()); + } + + public Class<CDOMObject> getTokenClass() + { + return CDOMObject.class; + } } Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/AutoLst.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/AutoLst.java 2008-07-18 09:21:09 UTC (rev 7191) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/AutoLst.java 2008-07-19 00:59:45 UTC (rev 7192) @@ -18,8 +18,12 @@ { /* - * FIXME Template's LevelToken needs adjustment before this can be converted - * to the new syntax, since this is level-dependent + * Template's LevelToken for AUTO:FEAT handled in + * rebuildAggregateAbilityListWorker() ; other subtokens do not support + * levels + * + * TODO rebuildAggregateAbilityListWorker needs to be updated to use + * getCDOMObjects() once this is new token (due to class levels) */ public String getTokenName() { Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/BonusLst.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/BonusLst.java 2008-07-18 09:21:09 UTC (rev 7191) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/BonusLst.java 2008-07-19 00:59:45 UTC (rev 7192) @@ -20,8 +20,11 @@ * take place in BonusToken, which is currently calling PObjectLoader */ /* - * FIXME Template's LevelToken needs adjustment before this can be converted - * to the new syntax, since this is level-dependent + * Template's LevelToken adjustment performed by adding getBonusList() to + * PCTemplate + * + * TODO need to do an update (to getBonusList()?) in PCClass once this is a + * new token */ /** * Returns token name Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/DefineLst.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/DefineLst.java 2008-07-18 09:21:09 UTC (rev 7191) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/DefineLst.java 2008-07-19 00:59:45 UTC (rev 7192) @@ -17,8 +17,8 @@ public class DefineLst implements GlobalLstToken { /* - * FIXME Template's LevelToken needs adjustment before this can be converted - * to the new syntax, since this is level-dependent + * Note: Don't need to wait for Template's LevelToken before this can be converted + * as there is no level support in templates for this token */ public String getTokenName() Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/DrLst.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/DrLst.java 2008-07-18 09:21:09 UTC (rev 7191) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/DrLst.java 2008-07-19 00:59:45 UTC (rev 7192) @@ -23,9 +23,13 @@ public class DrLst implements GlobalLstToken { /* - * FIXME Template's LevelToken needs adjustment before this can be converted - * to the new syntax, since this is level-dependent + * Template's LevelToken adjustment effectively completed by altering getDRList in PlayerCharacter. */ + /* + * TODO When this is converted to the new sytnax, getDRList in + * PlayerCharacter needs to be converted to look at class levels (use + * getCDOMObjects()) + */ public String getTokenName() { Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/KitLst.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/KitLst.java 2008-07-18 09:21:09 UTC (rev 7191) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/KitLst.java 2008-07-19 00:59:45 UTC (rev 7192) @@ -14,8 +14,8 @@ public class KitLst implements GlobalLstToken { /* - * FIXME Template's LevelToken needs adjustment before this can be converted - * to the new syntax, since this is level-dependent + * Note: Don't need to wait for Template's LevelToken before this can be converted + * as there is no level support in templates for this token */ public String getTokenName() Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/MoveLst.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/MoveLst.java 2008-07-18 09:21:09 UTC (rev 7191) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/MoveLst.java 2008-07-19 00:59:45 UTC (rev 7192) @@ -20,8 +20,8 @@ public class MoveLst implements GlobalLstToken { /* - * FIXME Template's LevelToken needs adjustment before this can be converted - * to the new syntax, since this is level-dependent + * Note: Don't need to wait for Template's LevelToken before this can be converted + * as there is no level support in templates for this token */ public String getTokenName() Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/MovecloneLst.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/MovecloneLst.java 2008-07-18 09:21:09 UTC (rev 7191) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/MovecloneLst.java 2008-07-19 00:59:45 UTC (rev 7192) @@ -19,8 +19,8 @@ public class MovecloneLst implements GlobalLstToken { /* - * FIXME Template's LevelToken needs adjustment before this can be converted - * to the new syntax, since this is level-dependent + * Note: Don't need to wait for Template's LevelToken before this can be converted + * as there is no level support in templates for this token */ public String getTokenName() Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/NaturalattacksLst.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/NaturalattacksLst.java 2008-07-18 09:21:09 UTC (rev 7191) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/NaturalattacksLst.java 2008-07-19 00:59:45 UTC (rev 7192) @@ -33,8 +33,8 @@ public class NaturalattacksLst implements GlobalLstToken { /* - * FIXME Template's LevelToken needs adjustment before this can be converted - * to the new syntax, since this is level-dependent + * Note: Don't need to wait for Template's LevelToken before this can be converted + * as there is no level support in templates for this token */ /** Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/RegionLst.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/RegionLst.java 2008-07-18 09:21:09 UTC (rev 7191) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/RegionLst.java 2008-07-19 00:59:45 UTC (rev 7192) @@ -14,8 +14,8 @@ public class RegionLst implements GlobalLstToken { /* - * FIXME Template's LevelToken needs adjustment before this can be converted - * to the new syntax, since this is level-dependent + * Note: Don't need to wait for Template's LevelToken before this can be converted + * as there is a REGION token in Template, so this is never hit by Templates */ public String getTokenName() Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/RemoveLst.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/RemoveLst.java 2008-07-18 09:21:09 UTC (rev 7191) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/RemoveLst.java 2008-07-19 00:59:45 UTC (rev 7192) @@ -17,8 +17,8 @@ public class RemoveLst implements GlobalLstToken { /* - * FIXME Template's LevelToken needs adjustment before this can be converted - * to the new syntax, since this is level-dependent + * Note: Don't need to wait for Template's LevelToken before this can be converted + * as there is no level support in templates for this token */ public String getTokenName() Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/SabLst.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/SabLst.java 2008-07-18 09:21:09 UTC (rev 7191) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/SabLst.java 2008-07-19 00:59:45 UTC (rev 7192) @@ -16,9 +16,15 @@ public class SabLst implements GlobalLstToken { /* - * FIXME Template's LevelToken needs adjustment before this can be converted - * to the new syntax, since this is level-dependent + * Template's LevelToken adjustment done by modifying + * getSpecialAbilityList() in PlayerCharacter and getSAToken in + * TemplateToken (export) */ + /* + * TODO When this is converted to the new sytnax, getSpecialAbilityList in + * PlayerCharacter needs to be converted to look at class levels (use + * getCDOMObjects()) + */ public String getTokenName() { Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/SpellsLst.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/SpellsLst.java 2008-07-18 09:21:09 UTC (rev 7191) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/SpellsLst.java 2008-07-19 00:59:45 UTC (rev 7192) @@ -26,8 +26,8 @@ { /* - * FIXME Template's LevelToken needs adjustment before this can be converted - * to the new syntax, since this is level-dependent + * Note: Don't need to wait for Template's LevelToken before this can be converted + * as there is no level support in templates for this token */ public String getTokenName() Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/SrLst.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/SrLst.java 2008-07-18 09:21:09 UTC (rev 7191) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/SrLst.java 2008-07-19 00:59:45 UTC (rev 7192) @@ -20,6 +20,10 @@ * %CHOICE usage in EquipmentModifier not being handled by JEP due to use of % * [which is the modulo function to JEP] */ + /* + * Note: Don't need to wait for Template's LevelToken before this can be converted + * as there is no level support in templates for this token + */ public String getTokenName() { Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/UdamLst.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/UdamLst.java 2008-07-18 09:21:09 UTC (rev 7191) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/UdamLst.java 2008-07-19 00:59:45 UTC (rev 7192) @@ -18,6 +18,10 @@ * FIXME Classes must be resolved/in context before this is converted due to * undocumented "features" */ + /* + * Note: Don't need to wait for Template's LevelToken before this can be converted + * as there is no level support in templates for this token + */ public String getTokenName() { Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/add/LanguageToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/add/LanguageToken.java 2008-07-18 09:21:09 UTC (rev 7191) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/add/LanguageToken.java 2008-07-19 00:59:45 UTC (rev 7192) @@ -17,42 +17,178 @@ */ package plugin.lsttokens.add; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.StringTokenizer; + +import pcgen.base.formula.Formula; +import pcgen.cdom.base.CDOMObject; +import pcgen.cdom.base.CDOMReference; +import pcgen.cdom.base.ChoiceSet; import pcgen.cdom.base.Constants; -import pcgen.core.PObject; -import pcgen.persistence.lst.AddLstToken; +import pcgen.cdom.base.FormulaFactory; +import pcgen.cdom.choiceset.ReferenceChoiceSet; +import pcgen.cdom.content.ChoiceActor; +import pcgen.cdom.content.TransitionChoice; +import pcgen.cdom.enumeration.ListKey; +import pcgen.core.Language; +import pcgen.core.PlayerCharacter; +import pcgen.rules.context.Changes; +import pcgen.rules.context.LoadContext; +import pcgen.rules.persistence.TokenUtilities; +import pcgen.rules.persistence.token.AbstractToken; +import pcgen.rules.persistence.token.CDOMSecondaryToken; import pcgen.util.Logging; -public class LanguageToken implements AddLstToken +public class LanguageToken extends AbstractToken implements + CDOMSecondaryToken<CDOMObject>, ChoiceActor<Language> { - public boolean parse(PObject target, String value, int level) + private static final Class<Language> LANGUAGE_CLASS = Language.class; + + public String getParentToken() { + return "ADD"; + } + + private String getFullName() + { + return getParentToken() + ":" + getTokenName(); + } + + @Override + public String getTokenName() + { + return "LANGUAGE"; + } + + public boolean parse(LoadContext context, CDOMObject obj, String value) + { + if (value.length() == 0) + { + Logging.errorPrint(getFullName() + " may not have empty argument"); + return false; + } int pipeLoc = value.indexOf(Constants.PIPE); - String countString; + Formula count; String items; if (pipeLoc == -1) { - countString = "1"; + count = Formula.ONE; items = value; } else { - if (pipeLoc != value.lastIndexOf(Constants.PIPE)) + String countString = value.substring(0, pipeLoc); + count = FormulaFactory.getFormulaFor(countString); + if (count.isStatic() && count.resolve(null, "").doubleValue() <= 0) { - Logging.errorPrint("Syntax of ADD:" + getTokenName() - + " only allows one | : " + value); + Logging + .errorPrint("Count in " + getFullName() + " must be > 0"); return false; } - countString = value.substring(0, pipeLoc); items = value.substring(pipeLoc + 1); } - target.addAddList(level, getTokenName() + "(" + items + ")" - + countString); + + if (isEmpty(items) || hasIllegalSeparator(',', items)) + { + return false; + } + + List<CDOMReference<Language>> refs = + new ArrayList<CDOMReference<Language>>(); + StringTokenizer tok = new StringTokenizer(items, Constants.COMMA); + boolean foundAny = false; + boolean foundOther = false; + while (tok.hasMoreTokens()) + { + String tokText = tok.nextToken(); + CDOMReference<Language> lang; + if (Constants.LST_ALL.equals(tokText)) + { + foundAny = true; + lang = context.ref.getCDOMAllReference(LANGUAGE_CLASS); + } + else + { + foundOther = true; + lang = + TokenUtilities.getTypeOrPrimitive(context, + LANGUAGE_CLASS, tokText); + } + if (lang == null) + { + Logging.errorPrint(" Error was encountered while parsing " + + getFullName() + ": " + value + + " had an invalid reference: " + tokText); + return false; + } + refs.add(lang); + } + if (foundAny && foundOther) + { + Logging.errorPrint("Non-sensical " + getFullName() + + ": Contains ANY and a specific reference: " + value); + return false; + } + + ReferenceChoiceSet<Language> rcs = + new ReferenceChoiceSet<Language>(refs); + ChoiceSet<Language> cs = new ChoiceSet<Language>("ADD", rcs); + TransitionChoice<Language> tc = + new TransitionChoice<Language>(cs, count); + context.getObjectContext().addToList(obj, ListKey.ADD, tc); + tc.setTitle("Language Choice"); + tc.setChoiceActor(this); return true; } - public String getTokenName() + public String[] unparse(LoadContext context, CDOMObject obj) { - return "LANGUAGE"; + Changes<TransitionChoice<?>> grantChanges = + context.getObjectContext().getListChanges(obj, ListKey.ADD); + Collection<TransitionChoice<?>> addedItems = grantChanges.getAdded(); + if (addedItems == null || addedItems.isEmpty()) + { + // Zero indicates no Token + return null; + } + List<String> addStrings = new ArrayList<String>(); + for (TransitionChoice<?> container : addedItems) + { + ChoiceSet<?> cs = container.getChoices(); + if (LANGUAGE_CLASS.equals(cs.getChoiceClass())) + { + Formula f = container.getCount(); + if (f == null) + { + context.addWriteMessage("Unable to find " + getFullName() + + " Count"); + return null; + } + String fString = f.toString(); + StringBuilder sb = new StringBuilder(); + if (!"1".equals(fString)) + { + sb.append(fString).append(Constants.PIPE); + } + sb.append(cs.getLSTformat()); + addStrings.add(sb.toString()); + + // assoc.getAssociation(AssociationKey.CHOICE_MAXCOUNT); + } + } + return addStrings.toArray(new String[addStrings.size()]); } + + public Class<CDOMObject> getTokenClass() + { + return CDOMObject.class; + } + + public void applyChoice(Language choice, PlayerCharacter pc) + { + pc.addLanguageKeyed(choice.getKeyName()); + } } Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/add/TemplateToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/add/TemplateToken.java 2008-07-18 09:21:09 UTC (rev 7191) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/add/TemplateToken.java 2008-07-19 00:59:45 UTC (rev 7192) @@ -17,42 +17,148 @@ */ package plugin.lsttokens.add; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.StringTokenizer; + +import pcgen.base.formula.Formula; +import pcgen.cdom.base.CDOMObject; +import pcgen.cdom.base.CDOMReference; +import pcgen.cdom.base.ChoiceSet; import pcgen.cdom.base.Constants; -import pcgen.core.PObject; -import pcgen.persistence.lst.AddLstToken; +import pcgen.cdom.base.FormulaFactory; +import pcgen.cdom.choiceset.ReferenceChoiceSet; +import pcgen.cdom.content.ChoiceActor; +import pcgen.cdom.content.TransitionChoice; +import pcgen.cdom.enumeration.ListKey; +import pcgen.core.PCTemplate; +import pcgen.core.PlayerCharacter; +import pcgen.rules.context.Changes; +import pcgen.rules.context.LoadContext; +import pcgen.rules.persistence.token.AbstractToken; +import pcgen.rules.persistence.token.CDOMSecondaryToken; import pcgen.util.Logging; -public class TemplateToken implements AddLstToken +public class TemplateToken extends AbstractToken implements + CDOMSecondaryToken<CDOMObject>, ChoiceActor<PCTemplate> { - public boolean parse(PObject target, String value, int level) + private static final Class<PCTemplate> PCTEMPLATE_CLASS = PCTemplate.class; + + public String getParentToken() { + return "ADD"; + } + + private String getFullName() + { + return getParentToken() + ":" + getTokenName(); + } + + @Override + public String getTokenName() + { + return "TEMPLATE"; + } + + public boolean parse(LoadContext context, CDOMObject obj, String value) + { + if (value.length() == 0) + { + Logging.errorPrint(getFullName() + " may not have empty argument"); + return false; + } int pipeLoc = value.indexOf(Constants.PIPE); - String countString; + Formula count; String items; if (pipeLoc == -1) { - countString = "1"; + count = Formula.ONE; items = value; } else { - if (pipeLoc != value.lastIndexOf(Constants.PIPE)) + String countString = value.substring(0, pipeLoc); + count = FormulaFactory.getFormulaFor(countString); + if (count.isStatic() && count.resolve(null, "").doubleValue() <= 0) { - Logging.errorPrint("Syntax of ADD:" + getTokenName() - + " only allows one | : " + value); + Logging + .errorPrint("Count in " + getFullName() + " must be > 0"); return false; } - countString = value.substring(0, pipeLoc); items = value.substring(pipeLoc + 1); } - target.addAddList(... [truncated message content] |
From: <jde...@us...> - 2008-07-20 07:25:12
|
Revision: 7205 http://pcgen.svn.sourceforge.net/pcgen/?rev=7205&view=rev Author: jdempsey Date: 2008-07-20 07:24:45 +0000 (Sun, 20 Jul 2008) Log Message: ----------- FReq: [Pathfinder] Experience point tables Issue#: 2016413 Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/GameMode.java Trunk/pcgen/code/src/java/pcgen/core/Globals.java Trunk/pcgen/code/src/java/pcgen/core/SettingsHandler.java Trunk/pcgen/code/src/java/pcgen/gui/PreferencesDialog.java Trunk/pcgen/code/src/java/pcgen/gui/prop/LanguageBundle.properties Trunk/pcgen/code/src/java/pcgen/persistence/lst/LevelLoader.java Trunk/pcgen/code/src/java/pcgen/persistence/lst/LstSystemLoader.java Trunk/pcgen/code/src/test/pcgen/io/ExportHandlerTest.java Trunk/pcgen/code/src/test/plugin/exporttokens/SkillTokenTest.java Added Paths: ----------- Trunk/pcgen/code/src/java/pcgen/gui/prefs/ Trunk/pcgen/code/src/java/pcgen/gui/prefs/ExperiencePanel.java Trunk/pcgen/code/src/java/pcgen/gui/prefs/MonsterPanel.java Trunk/pcgen/code/src/java/pcgen/gui/prefs/PCGenPrefsPanel.java Modified: Trunk/pcgen/code/src/java/pcgen/core/GameMode.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/GameMode.java 2008-07-20 06:06:42 UTC (rev 7204) +++ Trunk/pcgen/code/src/java/pcgen/core/GameMode.java 2008-07-20 07:24:45 UTC (rev 7205) @@ -72,7 +72,7 @@ private List<ClassType> classTypeList = new ArrayList<ClassType>(); private List<String> defaultDataSetList = new ArrayList<String>(); private List<String> defaultDeityList = new ArrayList<String>(); - private Map<String, LevelInfo> levelInfo = new HashMap<String, LevelInfo>(); + private Map<String, Map<String, LevelInfo>> levelInfo = new HashMap<String, Map<String, LevelInfo>>(); private List<String> loadStrings = new ArrayList<String>(); private List<String> skillMultiplierLevels = new ArrayList<String>(); private List<String> wcStepsList = new ArrayList<String>(); @@ -193,6 +193,9 @@ private List<String> resizableTypeList = new ArrayList<String>(); private Map<Class<?>, Set<String>> hiddenTypes = new HashMap<Class<?>, Set<String>>(); + private List<String> xpTableNames = new ArrayList<String>(); + private String currXpTableName; + /** * Creates a new instance of GameMode. * @@ -566,21 +569,30 @@ } /** - * map of LevelInfo objects + * map of LevelInfo objects. + * + * @param xpTable the xp table to be used + * * @return level info map */ - public Map<String, LevelInfo> getLevelInfo() + public Map<String, LevelInfo> getLevelInfo(final String xpTable) { - return levelInfo; + return levelInfo.get(xpTable); } /** * Add the level info * @param levInfo */ - public void addLevelInfo(final LevelInfo levInfo) + public void addLevelInfo(final String xpTable, final LevelInfo levInfo) { - levelInfo.put(levInfo.getLevelString(),levInfo); + Map<String, LevelInfo> tableInfo = levelInfo.get(xpTable); + if (tableInfo == null) + { + tableInfo = new HashMap<String, LevelInfo>(); + levelInfo.put(xpTable, tableInfo); + } + tableInfo.put(levInfo.getLevelString(),levInfo); } /** @@ -3452,5 +3464,58 @@ Set<String> set = hiddenTypes.get(cl); return set != null && set.contains(type); } + + /** + * Gets the name of the currently selected experience table + * + * @return the XP table name + */ + public String getXpTableName() + { + if (currXpTableName == null || currXpTableName.equals("")) + { + if (xpTableNames.isEmpty()) + { + xpTableNames.add("Default"); + } + currXpTableName = xpTableNames.get(0); + } + return currXpTableName; + } + + /** + * Sets the name of the currently selected experience table + * + * @param tableName the new XP table name + */ + public void setXpTableName(String tableName) + { + currXpTableName = tableName; + } + + /** + * Gets the array of names of defined experience tables. + * + * @return the xp table names + */ + public List<String> getAvailXpTableNames() + { + return xpTableNames; + } + + /** + * Sets the array of names of defined experience tables. + * + * @param names the new avail XP table names + */ + public void setAvailXpTableNames(List<String> names) + { + xpTableNames = names; + } + + public void addXpTable(String name) + { + xpTableNames.add(name); + } } Modified: Trunk/pcgen/code/src/java/pcgen/core/Globals.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Globals.java 2008-07-20 06:06:42 UTC (rev 7204) +++ Trunk/pcgen/code/src/java/pcgen/core/Globals.java 2008-07-20 07:24:45 UTC (rev 7205) @@ -1240,7 +1240,13 @@ */ public static Map<String, LevelInfo> getLevelInfo() { - return SettingsHandler.getGame().getLevelInfo(); + GameMode game = SettingsHandler.getGame(); + Map<String, LevelInfo> levelInfo = game.getLevelInfo(game.getXpTableName()); + if (levelInfo == null) + { + levelInfo = new HashMap<String, LevelInfo>(); + } + return levelInfo; } /** Modified: Trunk/pcgen/code/src/java/pcgen/core/SettingsHandler.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/SettingsHandler.java 2008-07-20 06:06:42 UTC (rev 7204) +++ Trunk/pcgen/code/src/java/pcgen/core/SettingsHandler.java 2008-07-20 07:24:45 UTC (rev 7205) @@ -715,6 +715,8 @@ game.setAllStatsValue(getPCGenOption("gameMode." + key + ".allStatsValue", 10)); game.setRollMethod(getPCGenOption("gameMode." + key + ".rollMethod", 0)); //$NON-NLS-1$ + game.setXpTableName(getPCGenOption("gameMode." + key + ".xpTableName", "")); //$NON-NLS-1$ //$NON-NLS-2$ + getChosenCampaignFiles(game); } @@ -1521,6 +1523,7 @@ setPCGenOption("gameMode." + gameModeKey + ".rollMethod", gameMode.getRollMethod()); //$NON-NLS-1$ setPCGenOption("gameMode." + gameModeKey + ".rollMethodExpression", gameMode.getRollMethodExpressionName()); //$NON-NLS-1$ setPCGenOption("gameMode." + gameModeKey + ".allStatsValue", gameMode.getAllStatsValue()); + setPCGenOption("gameMode." + gameModeKey + ".xpTableName", gameMode.getXpTableName()); } setRuleChecksInOptions("ruleChecks"); //$NON-NLS-1$ Modified: Trunk/pcgen/code/src/java/pcgen/gui/PreferencesDialog.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/PreferencesDialog.java 2008-07-20 06:06:42 UTC (rev 7204) +++ Trunk/pcgen/code/src/java/pcgen/gui/PreferencesDialog.java 2008-07-20 07:24:45 UTC (rev 7205) @@ -63,6 +63,9 @@ import pcgen.core.utils.MessageType; import pcgen.core.utils.ShowMessageDelegate; import pcgen.gui.panes.FlippingSplitPane; +import pcgen.gui.prefs.ExperiencePanel; +import pcgen.gui.prefs.MonsterPanel; +import pcgen.gui.prefs.PCGenPrefsPanel; import pcgen.gui.utils.*; import pcgen.util.Logging; import pcgen.util.PropertyFactory; @@ -367,11 +370,9 @@ private JCheckBox expertGUICheckBox = new JCheckBox(); private JCheckBox featDescriptionShown = new JCheckBox(); // private JCheckBox featDialogShownAtLevelUp = new JCheckBox(); - private JCheckBox hideMonsterClasses = new JCheckBox(); // Level Up private JCheckBox hpDialogShownAtLevelUp = new JCheckBox(); - private JCheckBox ignoreMonsterHDCap = new JCheckBox(); private JCheckBox loadURL = new JCheckBox(); private JCheckBox maxHpAtFirstLevel = new JCheckBox(); private JCheckBox maxHpAtFirstClassLevel = new JCheckBox(); @@ -396,7 +397,6 @@ private JCheckBox showMemory = new JCheckBox(); private JCheckBox showImagePreview = new JCheckBox(); - // "Monsters" private JCheckBox useOutputNamesEquipment = new JCheckBox(); private JCheckBox useOutputNamesSpells = new JCheckBox(); private JCheckBox waitCursor = new JCheckBox(); @@ -509,6 +509,12 @@ private String[] paperNames = null; private String[] unitSetNames = null; + // "Monsters" + private PCGenPrefsPanel monsterPanel; + + // "Experience" + private PCGenPrefsPanel experiencePanel; + //Plugins private static PreferencesComponent compInst; private PreferencesPluginsPanel pluginsPanel; @@ -727,9 +733,11 @@ // SettingsHandler.setIntCrossClassSkillCost(crossClassSkillCostCombo.getSelectedIndex()); // Monsters - SettingsHandler.setHideMonsterClasses(hideMonsterClasses.isSelected()); - SettingsHandler.setIgnoreMonsterHDCap(ignoreMonsterHDCap.isSelected()); + monsterPanel.setOptionsBasedOnControls(); + // Expereience + experiencePanel.setOptionsBasedOnControls(); + // Tab Options switch (mainTabPlacementCombo.getSelectedIndex()) { @@ -1249,9 +1257,11 @@ // crossClassSkillCostCombo.setSelectedIndex(SettingsHandler.getIntCrossClassSkillCost()); // Monsters - hideMonsterClasses.setSelected(SettingsHandler.hideMonsterClasses()); - ignoreMonsterHDCap.setSelected(SettingsHandler.isIgnoreMonsterHDCap()); - + monsterPanel.applyOptionValuesToControls(); + + // Experience + experiencePanel.applyOptionValuesToControls(); + // Colors prereqQualifyColor.setForeground(new Color(SettingsHandler .getPrereqQualifyColor())); @@ -2924,65 +2934,6 @@ return lafPanel; } - private JPanel buildMonstersPanel() - { - GridBagLayout gridbag = new GridBagLayout(); - GridBagConstraints c = new GridBagConstraints(); - JLabel label; - Border etched = null; - TitledBorder title1 = - BorderFactory.createTitledBorder(etched, in_monsters); - JPanel monstersPanel = new JPanel(); - - title1.setTitleJustification(TitledBorder.LEFT); - monstersPanel.setBorder(title1); - gridbag = new GridBagLayout(); - monstersPanel.setLayout(gridbag); - c = new GridBagConstraints(); - c.fill = GridBagConstraints.HORIZONTAL; - c.anchor = GridBagConstraints.NORTHWEST; - c.insets = new Insets(2, 2, 2, 2); - - Utility.buildConstraints(c, 0, 0, 2, 1, 0, 0); - label = - new JLabel(PropertyFactory - .getString("in_Prefs_defaultMonsters") - + ": "); - gridbag.setConstraints(label, c); - monstersPanel.add(label); - Utility.buildConstraints(c, 2, 0, 1, 1, 0, 0); - - Utility.buildConstraints(c, 0, 1, 2, 1, 0, 0); - label = - new JLabel(PropertyFactory - .getString("in_Prefs_hideMonsterClasses") - + ": "); - gridbag.setConstraints(label, c); - monstersPanel.add(label); - Utility.buildConstraints(c, 2, 1, 1, 1, 0, 0); - gridbag.setConstraints(hideMonsterClasses, c); - monstersPanel.add(hideMonsterClasses); - - Utility.buildConstraints(c, 0, 2, 2, 1, 0, 0); - label = - new JLabel(PropertyFactory - .getString("in_Prefs_ignoreMonsterHDCap") - + ": "); - gridbag.setConstraints(label, c); - monstersPanel.add(label); - Utility.buildConstraints(c, 2, 2, 1, 1, 0, 0); - gridbag.setConstraints(ignoreMonsterHDCap, c); - monstersPanel.add(ignoreMonsterHDCap); - - Utility.buildConstraints(c, 5, 20, 1, 1, 1, 1); - c.fill = GridBagConstraints.BOTH; - label = new JLabel(" "); - gridbag.setConstraints(label, c); - monstersPanel.add(label); - - return monstersPanel; - } - private JPanel buildOutputPanel() { GridBagLayout gridbag = new GridBagLayout(); @@ -3236,7 +3187,12 @@ characterNode.add(new DefaultMutableTreeNode(in_houseRules)); settingsPanel.add(buildHouseRulesPanel(), in_houseRules); characterNode.add(new DefaultMutableTreeNode(in_monsters)); - settingsPanel.add(buildMonstersPanel(), in_monsters); + monsterPanel = new MonsterPanel(); + settingsPanel.add(monsterPanel, monsterPanel.getTitle()); + experiencePanel = new ExperiencePanel(); + characterNode + .add(new DefaultMutableTreeNode(experiencePanel.getTitle())); + settingsPanel.add(experiencePanel, experiencePanel.getTitle()); rootNode.add(characterNode); appearanceNode = new DefaultMutableTreeNode(in_appearance); Added: Trunk/pcgen/code/src/java/pcgen/gui/prefs/ExperiencePanel.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/prefs/ExperiencePanel.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/gui/prefs/ExperiencePanel.java 2008-07-20 07:24:45 UTC (rev 7205) @@ -0,0 +1,136 @@ +/* + * ExperiencePanel.java + * Copyright 2008 (C) James Dempsey + * + * 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 20/07/2008 14:21:40 + * + * $Id: $ + */ +package pcgen.gui.prefs; + +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.util.List; + +import javax.swing.BorderFactory; +import javax.swing.JLabel; +import javax.swing.border.Border; +import javax.swing.border.TitledBorder; + +import pcgen.core.GameMode; +import pcgen.core.SettingsHandler; +import pcgen.gui.utils.JComboBoxEx; +import pcgen.gui.utils.Utility; +import pcgen.util.PropertyFactory; + +/** + * The Class <code>ExperiencePanel</code> is responsible for + * displaying experience related preferences and allowing the + * preferences to be edited by the user. + * + * Last Editor: $Author: $ + * Last Edited: $Date: $ + * + * @author James Dempsey <jde...@us...> + * @version $Revision: $ + */ +@SuppressWarnings("serial") +public class ExperiencePanel extends PCGenPrefsPanel +{ + private static String in_experience = + PropertyFactory.getString("in_Prefs_experience"); + private JComboBoxEx xpTableCombo = new JComboBoxEx(); + + /** + * Instantiates a new monster panel. + */ + public ExperiencePanel() + { + GridBagLayout gridbag = new GridBagLayout(); + GridBagConstraints c = new GridBagConstraints(); + JLabel label; + Border etched = null; + TitledBorder title1 = + BorderFactory.createTitledBorder(etched, in_experience); + + title1.setTitleJustification(TitledBorder.LEFT); + this.setBorder(title1); + gridbag = new GridBagLayout(); + this.setLayout(gridbag); + c = new GridBagConstraints(); + c.fill = GridBagConstraints.HORIZONTAL; + c.anchor = GridBagConstraints.NORTHWEST; + c.insets = new Insets(2, 2, 2, 2); + + Utility.buildConstraints(c, 0, 0, 2, 1, 0, 0); + label = + new JLabel(PropertyFactory + .getString("in_Prefs_xpTable") + + ": "); + gridbag.setConstraints(label, c); + this.add(label); + Utility.buildConstraints(c, 2, 0, 1, 1, 0, 0); + gridbag.setConstraints(xpTableCombo, c); + this.add(xpTableCombo); + + Utility.buildConstraints(c, 5, 20, 1, 1, 1, 1); + c.fill = GridBagConstraints.BOTH; + label = new JLabel(" "); + gridbag.setConstraints(label, c); + this.add(label); + } + + /* (non-Javadoc) + * @see pcgen.gui.prefs.PCGenPrefsPanel#getTitle() + */ + @Override + public String getTitle() + { + return in_experience; + } + + /* (non-Javadoc) + * @see pcgen.gui.prefs.PreferencesPanel#applyPreferences() + */ + @Override + public void setOptionsBasedOnControls() + { + final GameMode gameMode = SettingsHandler.getGame(); + gameMode.setXpTableName(String.valueOf(xpTableCombo.getSelectedItem())); + } + + /* (non-Javadoc) + * @see pcgen.gui.prefs.PreferencesPanel#initPreferences() + */ + @Override + public void applyOptionValuesToControls() + { + final GameMode gameMode = SettingsHandler.getGame(); + final String xpTableName = gameMode.getXpTableName(); + + List<String> xpTableNames = gameMode.getAvailXpTableNames(); + xpTableCombo.removeAllItems(); + + for (String name : xpTableNames) + { + xpTableCombo.addItem(name); + } + xpTableCombo.setSelectedItem(xpTableName); + } + +} Added: Trunk/pcgen/code/src/java/pcgen/gui/prefs/MonsterPanel.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/prefs/MonsterPanel.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/gui/prefs/MonsterPanel.java 2008-07-20 07:24:45 UTC (rev 7205) @@ -0,0 +1,146 @@ +/* + * MonsterPanel.java + * Copyright 2008 (C) James Dempsey + * + * 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 20/07/2008 13:23:43 + * + * $Id: $ + */ +package pcgen.gui.prefs; + +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; + +import javax.swing.BorderFactory; +import javax.swing.JCheckBox; +import javax.swing.JLabel; +import javax.swing.border.Border; +import javax.swing.border.TitledBorder; + +import pcgen.core.SettingsHandler; +import pcgen.gui.utils.Utility; +import pcgen.util.PropertyFactory; + +/** + * The Class <code>MonsterPanel</code> is responsible for + * displaying monster related preferences and allowing the + * preferences to be edited by the user. + * + * Last Editor: $Author: $ + * Last Edited: $Date: $ + * + * @author James Dempsey <jde...@us...> + * @version $Revision: $ + */ +@SuppressWarnings("serial") +public class MonsterPanel extends PCGenPrefsPanel +{ + private static String in_monsters = + PropertyFactory.getString("in_Prefs_monsters"); + private JCheckBox hideMonsterClasses = new JCheckBox(); + private JCheckBox ignoreMonsterHDCap = new JCheckBox(); + + /** + * Instantiates a new monster panel. + */ + public MonsterPanel() + { + GridBagLayout gridbag = new GridBagLayout(); + GridBagConstraints c = new GridBagConstraints(); + JLabel label; + Border etched = null; + TitledBorder title1 = + BorderFactory.createTitledBorder(etched, in_monsters); + + title1.setTitleJustification(TitledBorder.LEFT); + this.setBorder(title1); + gridbag = new GridBagLayout(); + this.setLayout(gridbag); + c = new GridBagConstraints(); + c.fill = GridBagConstraints.HORIZONTAL; + c.anchor = GridBagConstraints.NORTHWEST; + c.insets = new Insets(2, 2, 2, 2); + +// Utility.buildConstraints(c, 0, 0, 2, 1, 0, 0); +// label = +// new JLabel(PropertyFactory +// .getString("in_Prefs_defaultMonsters") +// + ": "); +// gridbag.setConstraints(label, c); +// this.add(label); +// Utility.buildConstraints(c, 2, 0, 1, 1, 0, 0); + + Utility.buildConstraints(c, 0, 1, 2, 1, 0, 0); + label = + new JLabel(PropertyFactory + .getString("in_Prefs_hideMonsterClasses") + + ": "); + gridbag.setConstraints(label, c); + this.add(label); + Utility.buildConstraints(c, 2, 1, 1, 1, 0, 0); + gridbag.setConstraints(hideMonsterClasses, c); + this.add(hideMonsterClasses); + + Utility.buildConstraints(c, 0, 2, 2, 1, 0, 0); + label = + new JLabel(PropertyFactory + .getString("in_Prefs_ignoreMonsterHDCap") + + ": "); + gridbag.setConstraints(label, c); + this.add(label); + Utility.buildConstraints(c, 2, 2, 1, 1, 0, 0); + gridbag.setConstraints(ignoreMonsterHDCap, c); + this.add(ignoreMonsterHDCap); + + Utility.buildConstraints(c, 5, 20, 1, 1, 1, 1); + c.fill = GridBagConstraints.BOTH; + label = new JLabel(" "); + gridbag.setConstraints(label, c); + this.add(label); + } + + /* (non-Javadoc) + * @see pcgen.gui.prefs.PCGenPrefsPanel#getTitle() + */ + @Override + public String getTitle() + { + return in_monsters; + } + + /* (non-Javadoc) + * @see pcgen.gui.prefs.PreferencesPanel#applyPreferences() + */ + @Override + public void setOptionsBasedOnControls() + { + SettingsHandler.setHideMonsterClasses(hideMonsterClasses.isSelected()); + SettingsHandler.setIgnoreMonsterHDCap(ignoreMonsterHDCap.isSelected()); + } + + /* (non-Javadoc) + * @see pcgen.gui.prefs.PreferencesPanel#initPreferences() + */ + @Override + public void applyOptionValuesToControls() + { + hideMonsterClasses.setSelected(SettingsHandler.hideMonsterClasses()); + ignoreMonsterHDCap.setSelected(SettingsHandler.isIgnoreMonsterHDCap()); + } + +} Added: Trunk/pcgen/code/src/java/pcgen/gui/prefs/PCGenPrefsPanel.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/prefs/PCGenPrefsPanel.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/gui/prefs/PCGenPrefsPanel.java 2008-07-20 07:24:45 UTC (rev 7205) @@ -0,0 +1,56 @@ +/* + * PreferencesPanel.java + * Copyright 2008 (C) James Dempsey + * + * 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 20/07/2008 12:29:10 + * + * $Id: $ + */ +package pcgen.gui.prefs; + +import javax.swing.JPanel; + +/** + * The abstract class <code>PCGenPrefsPanel</code> defines the + * interface for a panel in the Preferences dialog. + * + * Last Editor: $Author: $ + * Last Edited: $Date: $ + * + * @author James Dempsey <jde...@us...> + * @version $Revision: $ + */ +@SuppressWarnings("serial") +public abstract class PCGenPrefsPanel extends JPanel +{ + + /** + * Returns the title of the panel. + */ + public abstract String getTitle(); + + /** + * Initialises the panel's values based on the current preferences. + */ + public abstract void applyOptionValuesToControls(); + + /** + * Updates the current preferences based on the panel's values. + */ + public abstract void setOptionsBasedOnControls(); + +} Modified: Trunk/pcgen/code/src/java/pcgen/gui/prop/LanguageBundle.properties =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/prop/LanguageBundle.properties 2008-07-20 06:06:42 UTC (rev 7204) +++ Trunk/pcgen/code/src/java/pcgen/gui/prop/LanguageBundle.properties 2008-07-20 07:24:45 UTC (rev 7205) @@ -2910,6 +2910,10 @@ in_Prefs_ignoreMonsterHDCap=Ignore Monster HD Cap +in_Prefs_experience=Experience + +in_Prefs_xpTable=Experience table to be used + in_Prefs_pcgen=PCGen in_Prefs_pcgenTip=Settings that affect the way PCGen works. Modified: Trunk/pcgen/code/src/java/pcgen/persistence/lst/LevelLoader.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/persistence/lst/LevelLoader.java 2008-07-20 06:06:42 UTC (rev 7204) +++ Trunk/pcgen/code/src/java/pcgen/persistence/lst/LevelLoader.java 2008-07-20 07:24:45 UTC (rev 7205) @@ -27,8 +27,10 @@ import java.net.URI; import java.util.Map; +import java.util.Set; import java.util.StringTokenizer; +import pcgen.core.GameMode; import pcgen.core.LevelInfo; import pcgen.persistence.SystemLoader; import pcgen.util.Logging; @@ -56,14 +58,43 @@ * @param inputLine The line to be parsed * @param lineNum The number of the line being parsed. */ - public static void parseLine(LevelInfo levelInfo, String inputLine, - int lineNum, URI source) + public static String parseLine(GameMode gameMode, String inputLine, + int lineNum, URI source, String xpTable) { - if (levelInfo == null) + if (gameMode == null) { - return; + return ""; } + // Deal with the start of a new XPTable definition + if (inputLine.startsWith("XPTABLE:")) + { + String value = inputLine.substring(8); + if (value.indexOf("\t") >= 0) + { + value = value.substring(0, value.indexOf("\t")); + } + value = value.trim(); + if (value.equals("")) + { + Logging.errorPrint("Error parsing level line \"" + + inputLine + "\": empty XPTABLE value."); + } + else + { + gameMode.addXpTable(value); + return value; + } + } + + // Provide a default fallback table name for backwards compatibility + if (xpTable.equals("")) + { + xpTable = "Default"; + gameMode.addXpTable(xpTable); + } + + final LevelInfo levelInfo = new LevelInfo(); final StringTokenizer colToken = new StringTokenizer(inputLine, SystemLoader.TAB_DELIM); @@ -103,5 +134,80 @@ + colString + "' at line " + lineNum + ". Token ignored."); } } + if (validateLevelInfo(gameMode, xpTable, levelInfo, inputLine, lineNum, source)) + { + gameMode.addLevelInfo(xpTable, levelInfo); + } + return xpTable; } + + private static boolean validateLevelInfo(GameMode gameMode, String xpTable, + LevelInfo levelInfo, String inputLine, + int lineNum, URI source) + { + String level = levelInfo.getLevelString(); + if (level == null) + { + Logging.errorPrint("LevelLoader got empty level value in '" + + inputLine + "' at line " + lineNum + " of " + source + ". Line ignored."); + return false; + } + Map<String, LevelInfo> existingInfo = gameMode.getLevelInfo(xpTable); + if (existingInfo == null) + { + // No data on this table held yet, so it has to be right + return true; + } + + // Not a number so just check for a duplicate + if (existingInfo.get(level) != null) + { + Logging.errorPrint("LevelLoader got duplicate level value of '" + level + "' in '" + + inputLine + "' at line " + lineNum + " of " + source + ". Line ignored."); + return false; + } + if (!isNumeric(level)) + { + // Not a number so must be good now + return true; + } + + int levelValue = getIntValue(level); + Set<String> keys = existingInfo.keySet(); + for (String lvlKey : keys) + { + if (levelValue < getIntValue(existingInfo.get(lvlKey).getLevelString())) + { + Logging.errorPrint("LevelLoader got out of sequence level value of '" + level + "' in '" + + inputLine + "' at line " + lineNum + " of " + source + ". Line ignored."); + return false; + } + } + return true; + } + + private static boolean isNumeric(String level) + { + try + { + Integer.parseInt(level); + return true; + } + catch (NumberFormatException e) + { + return false; + } + } + + private static int getIntValue(String level) + { + try + { + return Integer.parseInt(level); + } + catch (NumberFormatException e) + { + return 0; + } + } } \ No newline at end of file Modified: Trunk/pcgen/code/src/java/pcgen/persistence/lst/LstSystemLoader.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/persistence/lst/LstSystemLoader.java 2008-07-20 06:06:42 UTC (rev 7204) +++ Trunk/pcgen/code/src/java/pcgen/persistence/lst/LstSystemLoader.java 2008-07-20 07:24:45 UTC (rev 7205) @@ -1013,7 +1013,7 @@ } String[] fileLines = data.split(LstFileLoader.LINE_SEPARATOR_REGEXP); - + String xpTable = ""; for (int i = 0; i < fileLines.length; i++) { String aLine = fileLines[i]; @@ -1031,9 +1031,7 @@ } else if (aType.equals("level")) { - final LevelInfo level = new LevelInfo(); - LevelLoader.parseLine(level, aLine, i + 1, uri); - gameMode.addLevelInfo(level); + xpTable = LevelLoader.parseLine(gameMode, aLine, i + 1, uri, xpTable); } else if (aType.equals("rules")) { Modified: Trunk/pcgen/code/src/test/pcgen/io/ExportHandlerTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/io/ExportHandlerTest.java 2008-07-20 06:06:42 UTC (rev 7204) +++ Trunk/pcgen/code/src/test/pcgen/io/ExportHandlerTest.java 2008-07-20 07:24:45 UTC (rev 7205) @@ -107,7 +107,7 @@ levelInfo.setMaxClassSkillString("LEVEL+3"); levelInfo.setMaxCrossClassSkillString("(LEVEL+3)/2"); GameMode gamemode = SettingsHandler.getGame(); - gamemode.addLevelInfo(levelInfo); + gamemode.addLevelInfo("Default", levelInfo); //Stats setPCStat(character, "DEX", 16); Modified: Trunk/pcgen/code/src/test/plugin/exporttokens/SkillTokenTest.java =================================================================== --- Trunk/pcgen/code/src/test/plugin/exporttokens/SkillTokenTest.java 2008-07-20 06:06:42 UTC (rev 7204) +++ Trunk/pcgen/code/src/test/plugin/exporttokens/SkillTokenTest.java 2008-07-20 07:24:45 UTC (rev 7205) @@ -96,7 +96,7 @@ levelInfo.setMaxClassSkillString("LEVEL+3"); levelInfo.setMaxCrossClassSkillString("(LEVEL+3)/2"); GameMode gamemode = SettingsHandler.getGame(); - gamemode.addLevelInfo(levelInfo); + gamemode.addLevelInfo("Default", levelInfo); //Stats setPCStat(character, "DEX", 16); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-08-04 23:05:52
|
Revision: 7340 http://pcgen.svn.sourceforge.net/pcgen/?rev=7340&view=rev Author: thpr Date: 2008-08-04 23:05:30 +0000 (Mon, 04 Aug 2008) Log Message: ----------- Global Define new Token Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/cdom/base/CDOMObject.java Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java Trunk/pcgen/code/src/java/pcgen/core/CharacterDomain.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/Race.java Trunk/pcgen/code/src/java/pcgen/core/StatList.java Trunk/pcgen/code/src/java/pcgen/core/SubstitutionClass.java Trunk/pcgen/code/src/java/pcgen/core/analysis/TemplateStat.java Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassLevelPanel.java Trunk/pcgen/code/src/java/pcgen/gui/editor/EditorMainForm.java Trunk/pcgen/code/src/java/plugin/lsttokens/DefineLst.java Trunk/pcgen/code/src/test/pcgen/AbstractCharacterTestCase.java Trunk/pcgen/code/src/test/pcgen/core/DescriptionTest.java Trunk/pcgen/code/src/test/pcgen/core/PCClassTest.java Trunk/pcgen/code/src/test/pcgen/core/PCTemplateTest.java Trunk/pcgen/code/src/test/pcgen/core/PlayerCharacterTest.java Trunk/pcgen/code/src/test/pcgen/core/RaceTest.java Trunk/pcgen/code/src/test/pcgen/core/StatListTest.java Trunk/pcgen/code/src/test/pcgen/core/bonus/BonusTest.java Trunk/pcgen/code/src/test/pcgen/io/ExportHandlerTest.java Trunk/pcgen/code/src/test/pcgen/io/exporttoken/VarTokenTest.java Trunk/pcgen/code/src/test/pcgen/io/exporttoken/WeaponTokenTest.java Trunk/pcgen/code/src/test/pcgen/persistence/lst/PObjectLoaderTest.java Trunk/pcgen/code/src/test/pcgen/util/PJepTest.java Added Paths: ----------- Trunk/pcgen/code/src/java/pcgen/cdom/helper/StatLock.java Modified: Trunk/pcgen/code/src/java/pcgen/cdom/base/CDOMObject.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/base/CDOMObject.java 2008-08-04 22:58:20 UTC (rev 7339) +++ Trunk/pcgen/code/src/java/pcgen/cdom/base/CDOMObject.java 2008-08-04 23:05:30 UTC (rev 7340) @@ -186,6 +186,11 @@ return variableChar.remove(arg0); } + public final void removeAllVariables() + { + variableChar.clear(); + } + public final boolean containsKey(ObjectKey<?> arg0) { return objectChar.containsKey(arg0); Modified: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java 2008-08-04 22:58:20 UTC (rev 7339) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java 2008-08-04 23:05:30 UTC (rev 7340) @@ -33,6 +33,7 @@ import pcgen.cdom.helper.AttackCycle; import pcgen.cdom.helper.PointCost; import pcgen.cdom.helper.Quality; +import pcgen.cdom.helper.StatLock; import pcgen.cdom.list.ClassSkillList; import pcgen.cdom.modifier.ChangeArmorType; import pcgen.cdom.reference.CDOMSingleRef; @@ -44,6 +45,7 @@ import pcgen.core.EquipmentModifier; import pcgen.core.Kit; import pcgen.core.Language; +import pcgen.core.PCStat; import pcgen.core.Movement; import pcgen.core.PCTemplate; import pcgen.core.QualifiedObject; @@ -203,6 +205,8 @@ public static final ListKey<CDOMReference<PCTemplate>> REMOVE_TEMPLATES = new ListKey<CDOMReference<PCTemplate>>(); public static final ListKey<Vision> VISION_CACHE = new ListKey<Vision>(); public static final ListKey<TransitionChoice<?>> ADD = new ListKey<TransitionChoice<?>>(); + public static final ListKey<PCStat> UNLOCKED_STATS = new ListKey<PCStat>(); + public static final ListKey<StatLock> STAT_LOCKS = new ListKey<StatLock>(); public static final ListKey<TransitionChoice<Kit>> KIT_CHOICE = new ListKey<TransitionChoice<Kit>>(); public static final ListKey<Movement> MOVEMENT = new ListKey<Movement>(); Added: Trunk/pcgen/code/src/java/pcgen/cdom/helper/StatLock.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/helper/StatLock.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/cdom/helper/StatLock.java 2008-08-04 23:05:30 UTC (rev 7340) @@ -0,0 +1,45 @@ +package pcgen.cdom.helper; + +import pcgen.base.formula.Formula; +import pcgen.core.PCStat; + +public class StatLock +{ + + private final PCStat lockedStat; + private final Formula lockValue; + + public StatLock(PCStat stat, Formula f) + { + lockedStat = stat; + lockValue = f; + } + + public PCStat getLockedStat() + { + return lockedStat; + } + + public Formula getLockValue() + { + return lockValue; + } + + @Override + public int hashCode() + { + return lockValue.hashCode(); + } + + @Override + public boolean equals(Object o) + { + if (o instanceof StatLock) + { + StatLock other = (StatLock) o; + return lockValue.equals(other.lockValue) + && lockedStat.equals(other.lockedStat); + } + return false; + } +} Modified: Trunk/pcgen/code/src/java/pcgen/core/CharacterDomain.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/CharacterDomain.java 2008-08-04 22:58:20 UTC (rev 7339) +++ Trunk/pcgen/code/src/java/pcgen/core/CharacterDomain.java 2008-08-04 23:05:30 UTC (rev 7340) @@ -25,9 +25,9 @@ */ package pcgen.core; -import java.util.Collections; -import java.util.Set; +import pcgen.cdom.enumeration.VariableKey; + /** * <code>CharacterDomain</code>. * @@ -173,20 +173,6 @@ } /** - * Gets the variable names as a set that cannot be modified - * @return Set - */ - public Set<String> getVariableNamesAsUnmodifiableSet() - { - if (domain != null) - { - return domain.getVariableNamesAsUnmodifiableSet(); - } - - return Collections.emptySet(); - } - - /** * Converts this object to a String * The String format is as follows (without the braces) : * <ul> @@ -287,19 +273,22 @@ if ((aPC != null) && (aDomain != null)) { - final String aString = "DOMAIN:" + aDomain.getKeyName() + '|'; + StringBuilder prefix = new StringBuilder(); + prefix.append("DOMAIN:").append(aDomain.getKeyName()).append('|') + .append(-9).append('|'); - for (int i = 0; i < aDomain.getVariableCount(); i++) + for (VariableKey vk : aDomain.getVariableKeys()) { - final String aVar = aString + aDomain.getVariableDefinition(i); + StringBuilder sb = new StringBuilder(); + sb.append(prefix).append(vk.toString()).append('|').append(aDomain.get(vk)); if (addIt) { - aPC.addVariable(aVar); + aPC.addVariable(sb.toString()); } else { - aPC.removeVariable(aVar); + aPC.removeVariable(sb.toString()); } } } Modified: Trunk/pcgen/code/src/java/pcgen/core/PCClass.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-08-04 22:58:20 UTC (rev 7339) +++ Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-08-04 23:05:30 UTC (rev 7340) @@ -41,6 +41,7 @@ import pcgen.base.util.DoubleKeyMap; import pcgen.cdom.base.AssociatedPrereqObject; import pcgen.cdom.base.CDOMListObject; +import pcgen.cdom.base.CDOMObject; import pcgen.cdom.base.CDOMReference; import pcgen.cdom.base.Constants; import pcgen.cdom.base.FormulaFactory; @@ -54,6 +55,7 @@ import pcgen.cdom.enumeration.ObjectKey; import pcgen.cdom.enumeration.RaceType; import pcgen.cdom.enumeration.StringKey; +import pcgen.cdom.enumeration.VariableKey; import pcgen.cdom.helper.AttackCycle; import pcgen.cdom.inst.PCClassLevel; import pcgen.cdom.list.ClassSkillList; @@ -2408,14 +2410,6 @@ pccTxt.append("\tBONUS:").append(bonusString); } - for (int x = 0; x < getVariableCount(); ++x) - { - final String c = getVariableDefinition(x); - final int y = c.indexOf('|'); - pccTxt.append(lineSep).append(c.substring(0, y)) - .append("\tDEFINE:").append(c.substring(y + 1)); - } - List<LevelAbility> levelAbilityList = getLevelAbilityList(); if ((levelAbilityList != null) && !levelAbilityList.isEmpty()) { @@ -4071,6 +4065,10 @@ void doPlusLevelMods(final int newLevel, final PlayerCharacter aPC, final PCLevelInfo pcLevelInfo) { + if (newLevel == 1) + { + addVariablesForLevel(0, aPC); + } addVariablesForLevel(newLevel, aPC); // moved after changeSpecials and addVariablesForLevel @@ -4133,16 +4131,17 @@ // Go through the variable list (DEFINE) and adjust the class to the new // name // - if (getVariableCount() > 0) + for (VariableKey vk : getVariableKeys()) { - for (int idx = getVariableCount() - 1; idx >= 0; --idx) + put(vk, FormulaFactory.getFormulaFor(get(vk).toString().replaceAll( + "=" + oldClass, "=" + newClass))); + } + for (PCClassLevel pcl : getClassLevelCollection()) + { + for (VariableKey vk : pcl.getVariableKeys()) { - final Variable variable = getVariable(idx); - String formula = variable.getValue(); - - formula = formula.replaceAll("=" + oldClass, "=" + newClass); - - variable.setValue(formula); + pcl.put(vk, FormulaFactory.getFormulaFor(pcl.get(vk).toString() + .replaceAll("=" + oldClass, "=" + newClass))); } } @@ -4597,26 +4596,23 @@ private void addVariablesForLevel(final int aLevel, final PlayerCharacter aPC) { - if (getVariableCount() == 0) + StringBuilder prefix = new StringBuilder(); + prefix.append(classKey).append('|').append(aLevel); + CDOMObject cdo; + if (aLevel == 0) { - return; + cdo = this; } - - if (aLevel == 1) + else { - addVariablesForLevel(0, aPC); + cdo = getClassLevel(aLevel); } - - final String prefix = classKey + '|'; - - for (Iterator<Variable> i = getVariableIterator(); i.hasNext();) + for (VariableKey vk : cdo.getVariableKeys()) { - final Variable v = i.next(); - - if (v.getLevel() == aLevel) - { - aPC.addVariable(prefix + v.getDefinition()); - } + StringBuilder sb = new StringBuilder(); + sb.append(prefix).append('|').append(vk.toString()).append('|') + .append(cdo.get(vk)); + aPC.addVariable(sb.toString()); } } @@ -5172,9 +5168,9 @@ getBonusList().addAll(otherClass.getBonusList()); } - if (otherClass.getVariableCount() > 0) + for (VariableKey vk : otherClass.getVariableKeys()) { - addAllVariablesFrom(otherClass); + put(vk, otherClass.get(vk)); } if (otherClass.getCSkillList() != null) Modified: Trunk/pcgen/code/src/java/pcgen/core/PObject.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-08-04 22:58:20 UTC (rev 7339) +++ Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-08-04 23:05:30 UTC (rev 7340) @@ -48,10 +48,12 @@ import pcgen.cdom.base.CDOMObject; import pcgen.cdom.base.CDOMReference; import pcgen.cdom.base.Constants; +import pcgen.cdom.base.FormulaFactory; import pcgen.cdom.enumeration.IntegerKey; import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; import pcgen.cdom.enumeration.StringKey; +import pcgen.cdom.enumeration.VariableKey; import pcgen.cdom.reference.CDOMSingleRef; import pcgen.core.bonus.Bonus; import pcgen.core.bonus.BonusObj; @@ -61,7 +63,6 @@ import pcgen.core.pclevelinfo.PCLevelInfo; import pcgen.core.prereq.PrereqHandler; import pcgen.core.prereq.Prerequisite; -import pcgen.core.utils.EmptyIterator; import pcgen.core.utils.KeyedListContainer; import pcgen.core.utils.MapKey; import pcgen.core.utils.MapKeyMapToList; @@ -122,8 +123,6 @@ private SpellSupport spellSupport = new SpellSupport(); - private VariableList variableList = null; - private boolean isNewItem = true; private List<DamageReduction> drList = new ArrayList<DamageReduction>(); @@ -608,34 +607,6 @@ } /** - * Get the count of variables on this object - * @return the count of variables on this object - */ - public final int getVariableCount() - { - if (variableList == null) - { - return 0; - } - - return variableList.size(); - } - - /** - * Get an unmodifiable set of variable names for this object - * @return an unmodifiable set of variable names for this object - */ - public final Set<String> getVariableNamesAsUnmodifiableSet() - { - if (variableList == null) - { - variableList = new VariableList(); - } - - return variableList.getVariableNamesAsUnmodifiableSet(); - } - - /** * Get the list of virtual feats for this object * @return the list of virtual feats for this object */ @@ -848,52 +819,6 @@ } /** - * Add a variable to the variable list - * @param level - * @param variableName - * @param defaultFormula - */ - public final void addVariable(final int level, final String variableName, final String defaultFormula) - { - if (variableList == null) - { - variableList = new VariableList(); - } - - variableList.add(level, variableName, defaultFormula); - } - /** - * Add a variable to the variable list - * @param level - * @param variableName - * @param defaultFormula - */ - public final void removelevelVariable(final int level) - { - VariableList tempVariableList = new VariableList(); - if (variableList == null) - { - variableList = new VariableList(); - return; - } - - Iterator<Variable> vInt = variableList.iterator(); - while (vInt.hasNext()) - { - Variable var = vInt.next(); - if ((var.getLevel() != level)) - { - tempVariableList.add(var.getLevel(), var.getName(),var.getValue() ); - } - } - variableList = tempVariableList; - - - - } - - - /** * Add a virtual feat to the character list * @param aFeat */ @@ -917,17 +842,6 @@ } /** - * Clear the variable list - */ - public final void clearVariableList() - { - if (variableList != null) - { - variableList.clear(); - } - } - - /** * Get a list of WeaponProf|ProfType strings from changeProfMap * @param character * @return List @@ -1098,11 +1012,6 @@ } } - if (variableList != null) - { - retVal.variableList = (VariableList) variableList.clone(); - } - if (bonusMap != null) { retVal.bonusMap = new HashMap<String, String>(bonusMap); @@ -1692,50 +1601,6 @@ } /** - * Get the variable by index - * @param i - * @return the variable by index - */ - public final Variable getVariable(final int i) - { - if (variableList != null) - { - return variableList.getVariable(i); - } - return null; - } - - /** - * This gets the entire definition for a variable, | values and all - * <p/> - * not-yet-deprecated This should be replaced by getVariable - * @param i - * @return variable definition - */ - public final String getVariableDefinition(final int i) - { - if (variableList != null) - { - return variableList.getDefinition(i); - } - return null; - } - - /** - * This gets an unmodifiable representation of a variable - * @return Iterator - */ - public final Iterator<Variable> getVariableIterator() - { - if (variableList == null) - { - return EmptyIterator.emptyIterator(); - } - - return variableList.iterator(); - } - - /** * Parse the output name to get a useable Name token * @param aString * @param aPC @@ -2393,29 +2258,6 @@ return 0; } - protected final void setVariable(final int idx, final int level, final String variableName, final String defaultFormula) - { - if (variableList == null) - { - variableList = new VariableList(); - } - - variableList.set(idx, level, variableName, defaultFormula); - } - - protected final void addAllVariablesFrom(final PObject other) - { - if (other.getVariableCount() > 0) - { - if (variableList == null) - { - variableList = new VariableList(); - } - - variableList.addAll(other.variableList); - } - } - /** * Get the PCC text with the saved name * @return the PCC text with the saved name @@ -2501,23 +2343,6 @@ txt.append("\tCHOOSE:").append(aString); } - int iCount = getVariableCount(); - - if (!(this instanceof PCClass) && (iCount != 0)) - { - for (int i = 0; i < iCount; ++i) - { - aString = getVariableDefinition(i); - - if (aString.startsWith("-9|")) - { - aString = aString.substring(3); - } - - txt.append("\tDEFINE:").append(aString); - } - } - for (DamageReduction reduction : getDRList()) { boolean levelBased = false; @@ -4658,5 +4483,4 @@ return c.getDefaultChoice(); } - } Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-08-04 22:58:20 UTC (rev 7339) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-08-04 23:05:30 UTC (rev 7340) @@ -77,6 +77,8 @@ import pcgen.cdom.enumeration.RaceType; import pcgen.cdom.enumeration.SkillCost; import pcgen.cdom.enumeration.StringKey; +import pcgen.cdom.enumeration.VariableKey; +import pcgen.cdom.helper.StatLock; import pcgen.cdom.inst.EquipmentHead; import pcgen.cdom.inst.ObjectCache; import pcgen.cdom.inst.PCClassLevel; @@ -239,7 +241,7 @@ private String descriptionLst = "EMPTY"; //$NON-NLS-1$ private String tabName = Constants.EMPTY_STRING; private String gender = Globals.getAllGenders().get(0); - private HashSet<String> variableSet = new HashSet<String>(); + private TreeSet<String> variableSet = new TreeSet<String>(String.CASE_INSENSITIVE_ORDER); // Weapon, Armor and Shield proficiencies // private final TreeSet<WeaponProf> weaponProfList = new @@ -3689,8 +3691,7 @@ { final String varInList = checkForVariableInList(obj, variableString, isMax, - Constants.EMPTY_STRING, Constants.EMPTY_STRING, found, - value, decrement); + found, value, decrement); if (varInList.length() > 0) { @@ -3706,8 +3707,7 @@ { final String varInList = checkForVariableInList(obj, variableString, isMax, - Constants.EMPTY_STRING, Constants.EMPTY_STRING, found, - value, 0); + found, value, 0); if (varInList.length() > 0) { @@ -3722,8 +3722,7 @@ { final String eS = checkForVariableInList(obj, variableString, isMax, - Constants.EMPTY_STRING, Constants.EMPTY_STRING, found, - value, 0); + found, value, 0); if (eS.length() > 0) { @@ -3737,8 +3736,8 @@ { final String varInList = checkForVariableInList(em, variableString, isMax, - Constants.EMPTY_STRING, Constants.EMPTY_STRING, - found, value, decrement); + found, value, + decrement); if (varInList.length() > 0) { @@ -3753,8 +3752,8 @@ { final String varInList = checkForVariableInList(em, variableString, isMax, - Constants.EMPTY_STRING, Constants.EMPTY_STRING, - found, value, decrement); + found, value, + decrement); if (varInList.length() > 0) { @@ -3770,8 +3769,7 @@ { final String aString = checkForVariableInList(obj, variableString, isMax, - Constants.EMPTY_STRING, Constants.EMPTY_STRING, found, - value, decrement); + found, value, decrement); if (aString.length() > 0) { @@ -3786,8 +3784,7 @@ { final String aString = checkForVariableInList(obj, variableString, isMax, - Constants.EMPTY_STRING, Constants.EMPTY_STRING, found, - value, decrement); + found, value, decrement); if (aString.length() > 0) { @@ -3802,8 +3799,7 @@ { final String aString = checkForVariableInList(race, variableString, isMax, - Constants.EMPTY_STRING, Constants.EMPTY_STRING, found, - value, decrement); + found, value, decrement); if (aString.length() > 0) { @@ -3818,8 +3814,7 @@ { final String aString = checkForVariableInList(deity, variableString, isMax, - Constants.EMPTY_STRING, Constants.EMPTY_STRING, found, - value, decrement); + found, value, decrement); if (aString.length() > 0) { @@ -3839,8 +3834,8 @@ final String aString = checkForVariableInList(obj.getDomain(), variableString, - isMax, Constants.EMPTY_STRING, Constants.EMPTY_STRING, - found, value, decrement); + isMax, found, value, + decrement); if (aString.length() > 0) { @@ -3875,8 +3870,7 @@ { final String aString = checkForVariableInList(obj, variableString, isMax, - Constants.EMPTY_STRING, Constants.EMPTY_STRING, found, - value, decrement); + found, value, decrement); if (aString.length() > 0) { @@ -3892,8 +3886,7 @@ { final String aString = checkForVariableInList(obj, variableString, isMax, - Constants.EMPTY_STRING, Constants.EMPTY_STRING, found, - value, decrement); + found, value, decrement); if (aString.length() > 0) { @@ -4349,17 +4342,17 @@ { // Building the PObject list relies on variables for evaluating prereqs, // so we have to grab it before clearing out the variables. - List<? extends PObject> pObjList = getPObjectList(); + List<? extends CDOMObject> pObjList = getCDOMObjectList(); variableSet.clear(); // Go through all objects that could add a VAR // and build the HashSet // Try all possible POBjects - for (PObject aPObj : pObjList) + for (CDOMObject aPObj : pObjList) { - if (aPObj != null) + for (VariableKey vk : aPObj.getVariableKeys()) { - variableSet.addAll(aPObj.getVariableNamesAsUnmodifiableSet()); + variableSet.add(vk.toString()); } } @@ -13643,48 +13636,19 @@ private String checkForVariableInList(final PObject obj, final String variableString, final boolean isMax, - final String matchSrc, final String matchSubSrc, boolean found, - double value, int decrement) + boolean found, double value, int decrement) { boolean flag = false; - for (int i = 0, x = obj.getVariableCount(); i < x; ++i) + String src = obj.getSpellKey(); + + for (VariableKey vk : obj.getVariableKeys()) { - final String vString = obj.getVariableDefinition(i); - final StringTokenizer aTok = new StringTokenizer(vString, "|"); - final String src = aTok.nextToken(); + String nString = vk.toString(); - if ((matchSrc.length() > 0) && !src.equals(matchSrc)) - { - continue; - } - - if ((matchSubSrc.length() > 0) || (matchSrc.length() > 0)) - { - final String subSrc = aTok.nextToken(); - - if ((matchSubSrc.length() > 0) && !subSrc.equals(matchSubSrc)) - { - continue; - } - } - - if (!aTok.hasMoreTokens()) - { - continue; - } - - final String nString = aTok.nextToken(); - - if (!aTok.hasMoreTokens()) - { - continue; - } - if (nString.equalsIgnoreCase(variableString)) { - final String sString = aTok.nextToken(); - final Float newValue = getVariableValue(sString, src); + Float newValue = getVariableValue(obj.get(vk).toString(), src); if (!found) { @@ -13706,7 +13670,7 @@ if (flag) { - return value + Constants.EMPTY_STRING; + return Double.toString(value); } return Constants.EMPTY_STRING; // signifies that the variable was found // in this list @@ -17988,5 +17952,35 @@ assocSupt.removeAssociation(obj, o); } - + public boolean hasUnlockedStat(PCStat stat) + { + for (CDOMObject cdo : getCDOMObjectList()) + { + if (cdo.containsInList(ListKey.UNLOCKED_STATS, stat)) + { + return true; + } + } + return false; + } + + public Number getLockedStat(PCStat stat) + { + for (CDOMObject cdo : getCDOMObjectList()) + { + List<StatLock> lockList = cdo.getListFor(ListKey.STAT_LOCKS); + if (lockList != null) + { + for (StatLock lock : lockList) + { + if (lock.getLockedStat().equals(stat)) + { + return lock.getLockValue().resolve(this, cdo.getKeyName()); + } + } + } + } + return null; + } + } Modified: Trunk/pcgen/code/src/java/pcgen/core/Race.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Race.java 2008-08-04 22:58:20 UTC (rev 7339) +++ Trunk/pcgen/code/src/java/pcgen/core/Race.java 2008-08-04 23:05:30 UTC (rev 7340) @@ -33,6 +33,7 @@ import pcgen.cdom.enumeration.FormulaKey; import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; +import pcgen.cdom.helper.StatLock; import pcgen.core.bonus.BonusObj; import pcgen.core.prereq.Prerequisite; import pcgen.core.utils.MessageType; @@ -165,15 +166,15 @@ return false; } - final String aStat = "|LOCK." + statList.get(statIdx).getAbb() + "|10"; - - for (int i = 0, x = getVariableCount(); i < x; ++i) + PCStat stat = statList.get(statIdx); + for (StatLock sl : getSafeListFor(ListKey.STAT_LOCKS)) { - final String varString = getVariableDefinition(i); - - if (varString.endsWith(aStat)) + if (sl.getLockedStat().equals(stat)) { - return true; + if (sl.getLockValue().toString().equals("10")) + { + return true; + } } } @@ -200,18 +201,7 @@ return false; } - String aStat = "|UNLOCK." + statList.get(statIdx).getAbb() + "|"; - for (int i = 0, x = getVariableCount(); i < x; ++i) - { - final String varString = getVariableDefinition(i); - - if (varString.endsWith(aStat)) - { - return true; - } - } - - return false; + return containsInList(ListKey.UNLOCKED_STATS, statList.get(statIdx)); } /** Modified: Trunk/pcgen/code/src/java/pcgen/core/StatList.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/StatList.java 2008-08-04 22:58:20 UTC (rev 7339) +++ Trunk/pcgen/code/src/java/pcgen/core/StatList.java 2008-08-04 23:05:30 UTC (rev 7340) @@ -25,14 +25,14 @@ */ package pcgen.core; -import pcgen.core.bonus.BonusObj; - import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.regex.Pattern; +import pcgen.core.bonus.BonusObj; + /** * <code>StatList</code>. * @@ -61,12 +61,12 @@ final PCStat stat = stats.get(x); final PlayerCharacter aPC = ownerPC; // Only check for a lock if the stat hasn't been unlocked - if (!aPC.hasVariable("UNLOCK." + stat.getAbb())) + if (!aPC.hasUnlockedStat(stat)) { - int z = aPC.getVariableValue("LOCK." + stat.getAbb(), "").intValue(); - if ((z != 0) || ((z == 0) && aPC.hasVariable("LOCK." + stat.getAbb()))) + Number val = aPC.getLockedStat(stat); + if (val != null) { - return z; + return val.intValue(); } } @@ -208,12 +208,12 @@ final PCStat stat = stats.get(x); final PlayerCharacter aPC = ownerPC; // Only check for a lock if the stat hasn't been unlocked - if (!aPC.hasVariable("UNLOCK." + stat.getAbb())) + if (!aPC.hasUnlockedStat(stat)) { - x = aPC.getVariableValue("LOCK." + stat.getAbb(), "").intValue(); - if ((x != 0) || ((x == 0) && aPC.hasVariable("LOCK." + stat.getAbb()))) + Number val = aPC.getLockedStat(stat); + if (val != null) { - return x; + return val.intValue(); } } @@ -262,11 +262,10 @@ final PCStat stat = stats.get(x); final PlayerCharacter aPC = ownerPC; - x = aPC.getVariableValue("LOCK." + stat.getAbb(), "").intValue(); - - if ((x != 0) || ((x == 0) && aPC.hasVariable("LOCK." + stat.getAbb()))) + Number val = aPC.getLockedStat(stat); + if (val != null) { - return x; + return val.intValue(); } y += aPC.getPartialStatBonusFor(stat.getAbb(), useTemp, useEquip); Modified: Trunk/pcgen/code/src/java/pcgen/core/SubstitutionClass.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/SubstitutionClass.java 2008-08-04 22:58:20 UTC (rev 7339) +++ Trunk/pcgen/code/src/java/pcgen/core/SubstitutionClass.java 2008-08-04 23:05:30 UTC (rev 7340) @@ -1,189 +1,189 @@ -/* - * SubClass.java - * Copyright 2002 (C) Bryan McRoberts <mer...@ya...> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Created on November 19, 2002, 10:29 PM - * - * $Id: SubClass.java 254 2006-03-15 16:46:10Z karianna $ - */ -package pcgen.core; - -import java.util.ArrayList; -import java.util.List; - -import pcgen.cdom.enumeration.ListKey; -import pcgen.persistence.PersistenceLayerException; -import pcgen.persistence.lst.CampaignSourceEntry; -import pcgen.persistence.lst.PCClassLoader; -import pcgen.util.Logging; - -/** - * <code>SubClass</code>. - * - * @author Bryan McRoberts <mer...@us...> - * @version $Revision: 254 $ - */ -public final class SubstitutionClass extends PCClass -{ - private List<String> levelArray = null; - private List<Integer> modLevels = null; - - /** Constructor */ - public SubstitutionClass() - { - } - - /** - * Add substitution class to the level array - * @param arg - */ - public void addToLevelArray(final String arg) - { - if (levelArray == null) - { - levelArray = new ArrayList<String>(); - modLevels = new ArrayList<Integer>(); - } - - levelArray.add(arg); - - final Integer level = Integer.valueOf(arg.substring(0, arg.indexOf("\t"))); - modLevels.add(level); - } - - /** - * Apply the level mods to a class - * @param aClass - */ - public void applyLevelArrayModsToLevel(final PCClass aClass, final int aLevel, final PlayerCharacter aPC) - { - if (levelArray == null) - { - return; - } - - try - { - final Campaign customCampaign = new Campaign(); - customCampaign.setName("Custom"); - customCampaign.addDescription(new Description("Custom data")); - - final CampaignSourceEntry tempSource = new CampaignSourceEntry(customCampaign, aClass.getSourceURI()); - - ArrayList<String> newLevels = new ArrayList<String>(); - final PCClassLoader classLoader = new PCClassLoader(); - - // find all qualifying level lines for this level - // and put into newLevels list. - for (String aLine : levelArray) - { - final int modLevel = Integer.parseInt(aLine.substring(0, aLine.indexOf("\t"))); - - if (aLevel == modLevel) - { - if (levelArrayQualifies(aPC, aLine, tempSource)) - { - newLevels.add(aLine); - } - } - } - if (newLevels.size() >1) - { - // remove all stuff from the original level - aClass.removeAllBonuses(aLevel); - aClass.removeAllAutoAbilites(aLevel); - aClass.removeAllVirtualAbilites(aLevel); - aClass.removeAllLevelAbilities(aLevel); - aClass.getClassLevel(aLevel).removeListFor(ListKey.ADD); - aClass.clearSABList(aLevel); - aClass.removeLevelDR(aLevel); - aClass.removelevelVariable(aLevel); - - - // Now add in each new level line in turn. - for (String theLine: newLevels) - { - classLoader.parseLine(Globals.getContext(), aClass, theLine, tempSource); - } - } - } - catch (PersistenceLayerException exc) - { - Logging.errorPrint(exc.getMessage()); - } - } - - /** - * Get the level mods for a specific level - * @param aClass - */ - public boolean hasLevelArrayModsForLevel(final int aLevel) - { - return modLevels.contains(Integer.valueOf(aLevel)); - } - - public boolean qualifiesForSubstitutionLevel(PlayerCharacter pc, int level) - { - boolean passes =false; - for (String aLine : levelArray) - { - final int modLevel = Integer.parseInt(aLine.substring(0, aLine.indexOf("\t"))); - final Campaign customCampaign = new Campaign(); - customCampaign.setName("Custom"); - customCampaign.addDescription(new Description("Custom data")); - - final CampaignSourceEntry tempSource = new CampaignSourceEntry(customCampaign, this.getSourceURI()); - - if (level == modLevel) - { - passes = levelArrayQualifies(pc, aLine, tempSource); - if (passes) - { - return passes; - } - } - } - return passes; - } - - /** - * @param pc - * @param aLine - * @param tempSource - * @return - */ - private boolean levelArrayQualifies(final PlayerCharacter pc, final String aLine, - final CampaignSourceEntry tempSource) - { - final PCClassLoader classLoader = new PCClassLoader(); - PCClass dummyClass = new PCClass(); - - try - { - classLoader.parseLine(Globals.getContext(), dummyClass, aLine, tempSource); - } - catch (PersistenceLayerException e) - { - Logging - .errorPrint("Unable to parse line from levelArray: " + aLine); - } - return dummyClass.qualifies(pc); - } - - - -} +/* + * SubClass.java + * Copyright 2002 (C) Bryan McRoberts <mer...@ya...> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Created on November 19, 2002, 10:29 PM + * + * $Id: SubClass.java 254 2006-03-15 16:46:10Z karianna $ + */ +package pcgen.core; + +import java.util.ArrayList; +import java.util.List; + +import pcgen.cdom.enumeration.ListKey; +import pcgen.persistence.PersistenceLayerException; +import pcgen.persistence.lst.CampaignSourceEntry; +import pcgen.persistence.lst.PCClassLoader; +import pcgen.util.Logging; + +/** + * <code>SubClass</code>. + * + * @author Bryan McRoberts <mer...@us...> + * @version $Revision: 254 $ + */ +public final class SubstitutionClass extends PCClass +{ + private List<String> levelArray = null; + private List<Integer> modLevels = null; + + /** Constructor */ + public SubstitutionClass() + { + } + + /** + * Add substitution class to the level array + * @param arg + */ + public void addToLevelArray(final String arg) + { + if (levelArray == null) + { + levelArray = new ArrayList<String>(); + modLevels = new ArrayList<Integer>(); + } + + levelArray.add(arg); + + final Integer level = Integer.valueOf(arg.substring(0, arg.indexOf("\t"))); + modLevels.add(level); + } + + /** + * Apply the level mods to a class + * @param aClass + */ + public void applyLevelArrayModsToLevel(final PCClass aClass, final int aLevel, final PlayerCharacter aPC) + { + if (levelArray == null) + { + return; + } + + try + { + final Campaign customCampaign = new Campaign(); + customCampaign.setName("Custom"); + customCampaign.addDescription(new Description("Custom data")); + + final CampaignSourceEntry tempSource = new CampaignSourceEntry(customCampaign, aClass.getSourceURI()); + + ArrayList<String> newLevels = new ArrayList<String>(); + final PCClassLoader classLoader = new PCClassLoader(); + + // find all qualifying level lines for this level + // and put into newLevels list. + for (String aLine : levelArray) + { + final int modLevel = Integer.parseInt(aLine.substring(0, aLine.indexOf("\t"))); + + if (aLevel == modLevel) + { + if (levelArrayQualifies(aPC, aLine, tempSource)) + { + newLevels.add(aLine); + } + } + } + if (newLevels.size() >1) + { + // remove all stuff from the original level + aClass.removeAllBonuses(aLevel); + aClass.removeAllAutoAbilites(aLevel); + aClass.removeAllVirtualAbilites(aLevel); + aClass.removeAllLevelAbilities(aLevel); + aClass.getClassLevel(aLevel).removeListFor(ListKey.ADD); + aClass.clearSABList(aLevel); + aClass.removeLevelDR(aLevel); + aClass.getClassLevel(aLevel).removeAllVariables(); + + + // Now add in each new level line in turn. + for (String theLine: newLevels) + { + classLoader.parseLine(Globals.getContext(), aClass, theLine, tempSource); + } + } + } + catch (PersistenceLayerException exc) + { + Logging.errorPrint(exc.getMessage()); + } + } + + /** + * Get the level mods for a specific level + * @param aClass + */ + public boolean hasLevelArrayModsForLevel(final int aLevel) + { + return modLevels.contains(Integer.valueOf(aLevel)); + } + + public boolean qualifiesForSubstitutionLevel(PlayerCharacter pc, int level) + { + boolean passes =false; + for (String aLine : levelArray) + { + final int modLevel = Integer.parseInt(aLine.substring(0, aLine.indexOf("\t"))); + final Campaign customCampaign = new Campaign(); + customCampaign.setName("Custom"); + customCampaign.addDescription(new Description("Custom data")); + + final CampaignSourceEntry tempSource = new CampaignSourceEntry(customCampaign, this.getSourceURI()); + + if (level == modLevel) + { + passes = levelArrayQualifies(pc, aLine, tempSource); + if (passes) + { + return passes; + } + } + } + return passes; + } + + /** + * @param pc + * @param aLine + * @param tempSource + * @return + */ + private boolean levelArrayQualifies(final PlayerCharacter pc, final String aLine, + final CampaignSourceEntry tempSource) + { + final PCClassLoader classLoader = new PCClassLoader(); + PCClass dummyClass = new PCClass(); + + try + { + classLoader.parseLine(Globals.getContext(), dummyClass, aLine, tempSource); + } + catch (PersistenceLayerException e) + { + Logging + .errorPrint("Unable to parse line from levelArray: " + aLine); + } + return dummyClass.qualifies(pc); + } + + + +} Modified: Trunk/pcgen/code/src/java/pcgen/core/analysis/TemplateStat.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/analysis/TemplateStat.java 2008-08-04 22:58:20 UTC (rev 7339) +++ Trunk/pcgen/code/src/java/pcgen/core/analysis/TemplateStat.java 2008-08-04 23:05:30 UTC (rev 7340) @@ -2,6 +2,8 @@ import java.util.List; +import pcgen.cdom.enumeration.ListKey; +import pcgen.cdom.helper.StatLock; import pcgen.core.PCStat; import pcgen.core.PCTemplate; import pcgen.core.SettingsHandler; @@ -40,15 +42,16 @@ { return false; } - - String aStat = "|LOCK." + statList.get(statIdx).getAbb() + "|10"; - for (int i = 0, x = pct.getVariableCount(); i < x; ++i) + + PCStat stat = statList.get(statIdx); + for (StatLock sl : pct.getSafeListFor(ListKey.STAT_LOCKS)) { - final String varString = pct.getVariableDefinition(i); - - if (varString.endsWith(aStat)) + if (sl.getLockedStat().equals(stat)) { - return true; + if (sl.getLockValue().toString().equals("10")) + { + return true; + } } } @@ -73,19 +76,8 @@ { return false; } - - String aStat = "|UNLOCK." + statList.get(statIdx).getAbb() + "|"; - for (int i = 0, x = pct.getVariableCount(); i < x; ++i) - { - final String varString = pct.getVariableDefinition(i); - - if (varString.endsWith(aStat)) - { - return true; - } - } - - return false; + + return pct.containsInList(ListKey.UNLOCKED_STATS, statList.get(statIdx)); } } Modified: Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassLevelPanel.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassLevelPanel.java 2008-08-04 22:58:20 UTC (rev 7339) +++ Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassLevelPanel.java 2008-08-04 23:05:30 UTC (rev 7340) @@ -55,6 +55,7 @@ import pcgen.cdom.content.TransitionChoice; import pcgen.cdom.enumeration.IntegerKey; import pcgen.cdom.enumeration.ListKey; +import pcgen.cdom.enumeration.VariableKey; import pcgen.cdom.inst.PCClassLevel; import pcgen.core.Campaign; import pcgen.core.CustomData; @@ -204,19 +205,25 @@ { Collection<CDOMReference<Domain>> domains = pcl.getListMods(PCClass.ALLOWED_DOMAINS); + int lvl = pcl.getSafe(IntegerKey.LEVEL); if (domains != null) { for (CDOMReference<Domain> ref : domains) { for (Domain d : ref.getContainedObjects()) { - int l = pcl.getSafe(IntegerKey.LEVEL); String t = d.getKeyName(); - LevelTag lt = new LevelTag(l, LevelTag.TAG_ADDDOMAINS, t); + LevelTag lt = new LevelTag(lvl, LevelTag.TAG_ADDDOMAINS, t); levelTagList.add(lt); } } } + for (VariableKey vk : pcl.getVariableKeys()) + { + LevelTag lt = new LevelTag(lvl, LevelTag.TAG_DEFINE, vk.toString() + + '|' + obj.get(vk)); + levelTagList.add(lt); + } } final Iterator<BonusObj> bonusIter = obj.getBonusList().iterator(); @@ -237,11 +244,12 @@ levelTagList.add(lt); } - for (int x = 0; x < obj.getVariableCount(); ++x) + StringBuilder prefix = new StringBuilder(); + prefix.append(-9).append('|'); + + for (VariableKey vk : obj.getVariableKeys()) { - String c = obj.getVariableDefinition(x); - int y = c.indexOf('|'); - LevelTag lt = new LevelTag(c.substring(0, y), LevelTag.TAG_DEFINE, c.substring(y + 1)); + LevelTag lt = new LevelTag(0, LevelTag.TAG_DEFINE, vk.toString() + '|' + obj.get(vk)); levelTagList.add(lt); } Modified: Trunk/pcgen/code/src/java/pcgen/gui/editor/EditorMainForm.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/editor/EditorMainForm.java 2008-08-04 22:58:20 UTC (rev 7339) +++ Trunk/pcgen/code/src/java/pcgen/gui/editor/EditorMainForm.java 2008-08-04 23:05:30 UTC (rev 7340) @@ -60,6 +60,7 @@ import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; import pcgen.cdom.enumeration.Pantheon; +import pcgen.cdom.enumeration.VariableKey; import pcgen.cdom.inst.PCClassLevel; import pcgen.cdom.list.ClassSkillList; import pcgen.cdom.list.DomainList; @@ -87,7 +88,6 @@ import pcgen.core.SpellSupport; import pcgen.core.SubClass; import pcgen.core.SubstitutionClass; -import pcgen.core.Variable; import pcgen.core.Vision; import pcgen.core.WeaponProf; import pcgen.core.bonus.BonusObj; @@ -344,30 +344,18 @@ return wasCancelled; } - private static void addVariables(List<String> availableList, Collection objList) + private static void addVariables(List<String> availableList, Collection<? extends CDOMObject> objList) { - for (Iterator e = objList.iterator(); e.hasNext();) + for (CDOMObject obj : objList) { - final Object obj = e.next(); - - if (obj instanceof PObject) + for (VariableKey vk : obj.getVariableKeys()) { - PObject pobj = (PObject) obj; - - for (Iterator i = pobj.getVariableIterator(); i.hasNext();) + String vname = vk.toString(); + if (!availableList.contains(vname)) { - Variable var = (Variable) i.next(); - - if (!var.getUpperName().startsWith("LOCK.") && !availableList.contains(var.getName())) - { - availableList.add(var.getName()); - } + availableList.add(vname); } } - else - { - Logging.errorPrint(PropertyFactory.getString("in_demEr1") + ": " + obj.getClass().getName()); - } } } @@ -629,7 +617,7 @@ pnlMainTab.updateData(thisPObject); thisPObject.getBonusList().clear(); - thisPObject.clearVariableList(); + thisPObject.removeAllVariables(); // thisPObject.setDR(".CLEAR"); thisPObject.clearDR(); thisPObject.clearPrerequisiteList(); @@ -2167,7 +2155,8 @@ // List<String> availableVariableList = new ArrayList<String>(); addVariables(availableVariableList, Globals.getContext().ref.getConstructedCDOMObjects(PCClass.class)); - addVariables(availableVariableList, Globals.getUnmodifiableAbilityList("FEAT")); //TODO this list is a list of Ability objects, unfortunately in a List<? extends Categorisable>. Don't know how to typesafe this. JK070101 + List unmodifiableAbilityList = Globals.getUnmodifiableAbilityList("FEAT"); + addVariables(availableVariableList, unmodifiableAbilityList); addVariables(availableVariableList, Globals.getContext().ref.getConstructedCDOMObjects(Race.class)); addVariables(availableVariableList, Globals.getContext().ref.getConstructedCDOMObjects(Skill.class)); addVariables(availableVariableList, Globals.getContext().ref.getConstructedCDOMObjects(EquipmentModifier.class)); @@ -3133,16 +3122,10 @@ if (anEditType != EditorConstants.EDIT_CLASS) { - for (int i = 0, x = thisPObject.getVariableCount(); i < x; ++i) + for (VariableKey vk : thisPObject.getVariableKeys()) { - String aString = thisPObject.getVariableDefinition(i); - - if (aString.startsWith("-9|")) - { - aString = aString.substring(3); - } - - selectedList.add("DEFINE:" + aString); + selectedList.add("DEFINE:" + vk.toString() + "|" + + thisPObject.get(vk)); } } Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/DefineLst.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/DefineLst.java 2008-08-04 22:58:20 UTC (rev 7339) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/DefineLst.java 2008-08-04 23:05:30 UTC (rev 7340) @@ -4,64 +4,158 @@ */ package plugin.lsttokens; -import java.util.StringTokenizer; +import java.util.Set; +import java.util.TreeSet; -import pcgen.core.PObject; -import pcgen.persistence.lst.GlobalLstToken; +import pcgen.base.formula.Formula; +import pcgen.cdom.base.CDOMObject; +import pcgen.cdom.base.Constants; +import pcgen.cdom.base.FormulaFactory; +import pcgen.cdom.enumeration.ListKey; +import pcgen.cdom.enumeration.VariableKey; +import pcgen.cdom.helper.StatLock; +import pcgen.core.PCStat; +import pcgen.rules.context.Changes; +import pcgen.rules.context.LoadContext; +import pcgen.rules.persistence.token.CDOMPrimaryToken; import pcgen.util.Logging; /** * @author djones4 - * + * */ -public class DefineLst implements GlobalLstToken +public class DefineLst implements CDOMPrimaryToken<CDOMObject> { - /* - * Note: Don't need to wait for Template's LevelToken before this can be converted - * as there is no level support in templates for this token - */ + public static Class<PCStat> PCSTAT_CLASS = PCStat.class; + public String getTokenName() { return "DEFINE"; } - public boolean parse(PObject obj, String value, int anInt) + public boolean parse(LoadContext context, CDOMObject obj, String value) { - final StringTokenizer tok = new StringTokenizer(value, "|"); - try + int barLoc = value.indexOf('|'); + if (barLoc != value.lastIndexOf('|')) { - String varName = tok.nextToken(); - String defineFormula; - if (varName.startsWith("UNLOCK.")) + Logging + .errorPrint(getTokenName() + + " must be of Format: varName|varFormula or LOCK.<stat>|value or UNLOCK.<stat>"); + return false; + } + if (barLoc == -1) + { + if (value.startsWith("UNLOCK.")) { - if (tok.hasMoreTokens()) - { - Logging - .log(Logging.LST_ERROR, - "Cannot provide a value with DEFINE:UNLOCK. : " - + value); - return false; - } - defineFormula = ""; + PCStat stat = context.ref.getAbbreviatedObject(PCSTAT_CLASS, + value.substring(7)); + context.obj.addToList(obj, ListKey.UNLOCKED_STATS, stat); + return true; } - else if (!tok.hasMoreTokens()) + else { - Logging.log(Logging.LST_ERROR, - "Non UNLOCK DEFINE missing value. Fomrat should be DEFINE:var|value : " - + value); + Logging.errorPrint(getTokenName() + " varName|varFormula" + + "or LOCK.<stat>|value syntax requires an argument"); return false; } + } + if (value.startsWith("UNLOCK.")) + { + Logging.errorPrint(getTokenName() + + " UNLOCK.<stat> does not allow an argument"); + return false; + } + String var = value.substring(0, barLoc); + if (var.length() == 0) + { + Logging.errorPrint("Empty Variable Name found in " + getTokenName() + + ": " + value); + return false; + } + try + { + Formula f = FormulaFactory.getFormulaFor(value + .substring(barLoc + 1)); + if (value.startsWith("LOCK.")) + { + PCStat stat = context.ref.getAbbreviatedObject(PCSTAT_CLASS, + value.substring(5, barLoc)); + context.getObjectContext().addToList(obj, ListKey.STAT_LOCKS, + new StatLock(stat, f)); + } else { - defineFormula = tok.nextToken(); + context.getObjectContext().put(obj, + VariableKey.getConstant(var), f); } - obj.addVariable(anInt, varName, defineFormula); + return true; } - catch (Exception e) + catch (IllegalArgumentException e) { + Logging.errorPrint("Illegal Formula found in " + getTokenName() + + ": " + value); return false; } - return true; } + + public String[] unparse(LoadContext context, CDOMObject obj) + { + Changes<StatLock> changes = context.getObjectContext().getListChanges( + obj, ListKey.STAT_LOCKS); + Changes<PCStat> ulchanges = context.getObjectContext().getListChanges( + obj, ListKey.UNLOCKED_STATS); + Set<VariableKey> keys = context.getObjectContext().getVariableKeys(obj); + TreeSet<String> set = new TreeSet<String>(); + if (keys != null && !keys.isEmpty()) + { + for (VariableKey key : keys) + { + set.add(key.toString() + Constants.PIPE + + context.getObjectContext().getVariable(obj, key)); + } + } + if (changes != null && !changes.isEmpty()) + { + if (changes.includesGlobalClear()) + { + context.addWriteMessage("DEFINE:LOCK does not support .CLEAR"); + return null; + } + if (changes.hasAddedItems()) + { + for (StatLock sl : changes.getAdded()) + { + set.add("LOCK." + sl.getLockedStat().getLSTformat() + "|" + + sl.getLockValue()); + } + } + } + if (ulchanges != null && !ulchanges.isEmpty()) + { + if (ulchanges.includesGlobalClear()) + { + context.addWriteMessage("DEFINE:UNLOCK " + + "does not support .CLEAR"); + return null; + } + if (ulchanges.hasAddedItems()) + { + for (PCStat st : ulchanges.getAdded()) + { + set.add("UNLOCK." + st.getLSTformat()); + } + } + } + if (set.isEmpty()) + { + return null; + } + return set.toArray(new String[set.size()]); + } + + public Class<CDOMObject> getTokenClass() + { + return CDOMObject.class; + } } Modified: Trunk/pcgen/code/src/test/pcgen/AbstractCharacterTestCase.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/AbstractCharacterTestCase.java 2008-08-04 22:58:20 UTC (rev 7339) +++ Trunk/pcgen/code/src/test/pcgen/AbstractCharacterTestCase.java 2008-08-04 23:05:30 UTC (rev 7340) @@ -8,6 +8,8 @@ import gmgen.pluginmgr.PluginLoader; import pcgen.cdom.base.Constants; +import pcgen.cdom.base.FormulaFactory; +import pcgen.cdom.enumeration.VariableKey; import pcgen.core.GameMode; import pcgen.core.Globals; import pcgen.core.PCAlignment; @@ -185,8 +187,8 @@ final PCStat stat = pc.getStatList().getStatAt(index); stat.setBaseScore(value); stat.setStatMod("floor(SCORE/2)-5"); - stat.addVariable(-9, "MAXLEVELSTAT=" + statName, statName - + "SCORE-10"); + stat.put(VariableKey.getConstant("MAXLEVELSTAT=" + statName), + FormulaFactory.getFormulaFor(statName + "SCORE-10")); } } } Modified: Trunk/pcgen/code/src/test/pcgen/core/DescriptionTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/DescriptionTest.java 2008-08-04 22:58:20 UTC (rev 7339) +++ Trunk/pcgen/code/src/test/pcgen/core/DescriptionTest.java 2008-08-04 23:05:30 UTC (rev 7340) @@ -28,6 +28,8 @@ import pcgen.AbstractCharacterTestCase; import pcgen.cdom.base.Constants; +import pcgen.cdom.base.FormulaFactory; +import pcgen.cdom.enumeration.VariableKey; import pcgen.core.prereq.Prerequisite; import pcgen.persistence.lst.prereq.PreParserFactory; @@ -118,7 +120,8 @@ public void testSimpleVariableReplacement() { final Race dummy = new Race(); - dummy.addVariable(-9, "TestVar", "2"); + dummy.put(VariableKey.getConstant("TestVar"), FormulaFactory + .getFormulaFor(2)); final Description desc = new Description("%1"); desc.addVariable("TestVar"); @@ -190,7 +193,8 @@ public void testComplexVariableReplacement() { final Race dummy = new Race(); - dummy.addVariable(-9, "TestVar", "2"); + dummy.put(VariableKey.getConstant("TestVar"), FormulaFactory + .getFormulaFor(2)); dummy.addAssociated("Associated 1"); dummy.addAssociated("Associated 2"); Modified: Trunk/pcgen/code/src/test/pcgen/core/PCClassTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/PCClassTest.java 2008-08-04 22:58:20 UTC (rev 7339) +++ Trunk/pcgen/code/src/test/pcgen/core/PCClassTest.java 2008-08-04 23:05:30 UTC (rev 7340) @@ -37,12 +37,16 @@ import junit.framework.TestSuite; import pcgen.AbstractCharacterTestCase; import pcgen.PCGenTestCase; +import pcgen.base.formula.Formula; import pcgen.base.lang.UnreachableError; +import pcgen.cdom.base.FormulaFactory; import pcgen.cdom.enumeration.FormulaKey; import pcgen.cdom.enumeration.IntegerKey; import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; +import pcgen.cdom.enumeration.VariableKey; import pcgen.cdom.formula.FixedSizeFormula; +import pcgen.cdom.inst.PCClassLevel; import pcgen.core.Ability.Nature; import pcgen.core.bonus.BonusObj; import pcgen.core.pclevelinfo.PCLevelInfo; @@ -122,20 +126,32 @@ myClass.setName("myClass"); myClass.setKeyName("KEY_myClass"); - myClass - .addVariable(2, "someVar", "(CL=KEY_myClass/2) + CL=KEY_myClass"); + PCClassLevel cl2 = myClass.getClassLevel(2); + cl2.put(VariableKey.getConstant("someVar"), FormulaFactory + .getFormulaFor("(CL=KEY_myClass/2) + CL=KEY_myClass")); - Variable var = myClass.getVariable(0); - assertEquals("someVar", var.getName()); - assertEquals(2, var.getLevel()); - assertEquals("(CL=KEY_myClass/2) + CL=KEY_myClass", var.getValue()); + assertEquals(1, cl2.getVariableKeys().size()); + assertEquals("someVar", cl2.getVariableKeys().iterator().next() + .toString()); + assertNotNull(cl2.get(VariableKey.getConstant("someVar"))); + assertEquals("(CL=KEY_myClass/2) + CL=KEY_myClass", cl2.get( + VariableKey.getConstant("someVar")).toString()); myClass.fireNameChanged("myClass", "someOtherClass"); - var = myClass.getVariable(0); - assertEquals("someVar", var.getName()); - assertEquals(2, var.getLevel()); - assertEquals("(CL=KEY_myClass/2) + CL=KEY_myClass", var.getValue()); + assertEquals(1, cl2.getVariableKeys().size()); + assertEquals("someVar", cl2.getVariableKeys().iterator().next() + .toString()); + assertEquals("(CL=KEY_myClass/2) + CL=KEY_myClass", cl2.get( + VariableKey.getConstant("someVar")).toString()); + + myClass.fireNameChanged("KEY_myClass", "someOtherClass"); + + assertEquals(1, cl2.getVariableKeys().size()); + assertEquals("someVar", cl2.getVariableKeys().iterator().next() + .toString()); + assertEquals("(CL=someOtherClass/2) + CL=someOtherClass", cl2.get( + VariableKey.getConstant("someVar")).toString()); } /** @@ -233,8 +249,9 @@ final PCClass aNqClass = new PCClass(); aNqClass.setName("NonQualClass"); aNqClass.setKeyName("KEY_NonQualClass"); - aNqClass.addVariable(0, "Foo", "1"); - aNqClass.addVariable(2, "Foo", "2"); + aNqClass.put(VariableKey.getConstant("Foo"), Formula.ONE); + aNqClass.getClassLevel(2).put(VariableKey.getConstant("Foo"), + FormulaFactory.getFormulaFor(2)); // Setup character without prereqs final PlayerCharacter character = getCharacter(); @@ -304,8 +321,9 @@ final PCClass aNqClass = new PCClass(); aNqClass.setName("NonQualClass"); aNqClass.setKeyName("KEY_NonQualClass"); - aNqClass.addVariable(0, "Foo", "1"); - aNqClass.addVariable(2, "Foo", "2"); + aNqClass.put(VariableKey.getConstant("Foo"), Formula.ONE); + aNqClass.getClassLevel(2).put(VariableKey.getConstant("Foo"), + FormulaFactory.getFormulaFor(2)); // Setup character without prereqs final PlayerCharacter character = getCharacter(); @@ -849,8 +867,8 @@ nqClass = new PCClass(); nqClass.setName("NonQualClass"); nqClass.setKeyName("KEY_NonQualClass"); - nqClass.addVariable(0, "Foo", "1"); - nqClass.addVariable(2, "Foo", "2"); - + nqClass.put(VariableKey.getConstant("Foo"), Formula.ONE); + nqClass.getClassLevel(2).put(VariableKey.getConstant("Foo"), + FormulaFactory.getFormulaFor(2)); } } Modified: Trunk/pcgen/code/src/test/pcgen/core/PCTemplateTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/PCTemplateTest.java 2008-08-04 22:58:20 UTC (rev 7339) +++ Trunk/pcgen/code/src/test/pcgen/core/PCTemplateTest.java 2008-08-04 23:05:30 UTC (rev 7340) @@ -34,6 +34,9 @@ import pcgen.AbstractCharacterTestCase; import pcgen.PCGenTestCase; import pcgen.base.lang.UnreachableError; +import pcgen.cdom.base.FormulaFactory; +import pcgen.cdom.enumeration.ListKey; +import pcgen.cdom.helper.StatLock; import pcgen.core.Ability.Nature; import pcgen.core.analysis.TemplateStat; import pcgen.persistence.PersistenceLayerException; @@ -351,11 +354,13 @@ { PCTemplate template = new PCTemplate(); template.setName("Test Template"); - int index = getCharacter().getStatList().getIndexOfStatFor("STR"); + StatList statList = getCharacter().getStatList(); + int index = statList.getIndexOfStatFor("STR"); + PCStat str = statList.getStatAt(index); assertEquals("Template has not been unlocked", false, TemplateStat.isUnlocked(template, index)); - template.addVariable(-9, "LOCK.STR", "12"); + template.addToListFor(ListKey.STAT_LOCKS, new StatLock(str, FormulaFactory.getFormulaFor(12))); assertEquals("Template has not been unlocked", false, TemplateStat.isUnlocked(template, index)); - template.addVariable(-9, "UNLOCK.STR", ""); + template.addToListFor(ListKey.UNLOCKED_STATS, str); assertEquals("Template has been unlocked", true, TemplateStat.isUnlocked(template, index)); } @@ -366,13 +371,15 @@ { PCTemplate template = new PCTemplate(); template.setName("Test Template"); - int index = getCharacter().getStatList().getIndexOfStatFor("STR"); + StatList statList = getCharacter().getStatList(); + int index = statList.getIndexOfStatFor("STR"); + PCStat str = statList.getStatAt(index); assertEquals("Template has not been locked to a nonability", false, TemplateStat.isNonAbility(template, index)); - template.addVariable(-9, "LOCK.STR", "12"); + template.addToListFor(ListKey.STAT_LOCKS, new StatLock(str, FormulaFactory.getFormulaFor(12))); assertEquals("Template has been locked to an ability", false, TemplateStat.isNonAbility(template, index)); - template.addVariable(-9, "LOCK.STR", "10"); + template.addToListFor(ListKey.STAT_LOCKS, new StatLock(str, FormulaFactory.getFormulaFor(10))); assertEquals("Template has been locked to a nonability", true, TemplateStat.isNonAbility(template, index)); - template.addVariable(-9, "UNLOCK.STR", ""); + template.addToListFor(ListKey.UNLOCKED_STATS, str); assertEquals("Template has been unlocked", false, TemplateStat.isNonAbility(template, index)); } Modified: Trunk/pcgen/code/src/test/pcgen/core/PlayerCharacterTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/PlayerCharacterTest.java 2008-08-04 22:58:20 UTC (rev 7339) +++ Trunk/pcgen/code/src/test/pcgen/core/PlayerCharacterTest.java 2008-08-04 23:05:30 UTC (rev 7340) @@ -39,11 +39,14 @@ import junit.framework.TestSuite; import junit.textui.TestRunner; import pcgen.AbstractCharacterTestCase; +import pcgen.base.formula.Formula; import pcgen.cdom.base.Constants; import pcgen.cdom.base.FormulaFactory; import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; import pcgen.cdom.enumeration.StringKey; +import pcgen.cdom.enumeration.VariableKey; +import pcgen.cdom.helper.StatLock; import pcgen.cdom.list.ClassSkillList; import pcgen.cdom.re... [truncated message content] |
From: <th...@us...> - 2008-08-04 23:24:21
|
Revision: 7341 http://pcgen.svn.sourceforge.net/pcgen/?rev=7341&view=rev Author: thpr Date: 2008-08-04 23:24:15 +0000 (Mon, 04 Aug 2008) Log Message: ----------- Equipment SIZE step 1 Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/Equipment.java Trunk/pcgen/code/src/java/pcgen/core/GameMode.java Trunk/pcgen/code/src/java/pcgen/core/Globals.java Trunk/pcgen/code/src/java/pcgen/core/character/WieldCategory.java Trunk/pcgen/code/src/java/pcgen/gui/EqBuilder.java Trunk/pcgen/code/src/java/pcgen/gui/filter/FilterFactory.java Trunk/pcgen/code/src/java/pcgen/io/exporttoken/EqToken.java Trunk/pcgen/code/src/java/pcgen/io/exporttoken/WeaponhToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/NaturalattacksLst.java Trunk/pcgen/code/src/java/plugin/lsttokens/equipment/SizeToken.java Trunk/pcgen/code/src/test/pcgen/core/EquipmentListTest.java Trunk/pcgen/code/src/test/pcgen/core/EquipmentTest.java Trunk/pcgen/code/src/test/pcgen/core/prereq/PreEquipBothTest.java Trunk/pcgen/code/src/test/pcgen/core/prereq/PreEquipPrimaryTest.java Trunk/pcgen/code/src/test/pcgen/core/prereq/PreEquipSecondaryTest.java Trunk/pcgen/code/src/test/pcgen/core/prereq/PreEquipTest.java Trunk/pcgen/code/src/test/pcgen/core/prereq/PreEquipTwoWeaponTest.java Trunk/pcgen/code/src/test/pcgen/io/exporttoken/WeaponTokenTest.java Modified: Trunk/pcgen/code/src/java/pcgen/core/Equipment.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Equipment.java 2008-08-04 23:05:30 UTC (rev 7340) +++ Trunk/pcgen/code/src/java/pcgen/core/Equipment.java 2008-08-04 23:24:15 UTC (rev 7341) @@ -229,9 +229,9 @@ private String noteString = ""; // How fast the weapon can be fired. - private String size = ""; + private SizeAdjustment size = null; - private String sizeBase = ""; + private SizeAdjustment sizeBase = null; private boolean automatic = false; @@ -264,7 +264,7 @@ final SizeAdjustment sizeAdj = SettingsHandler.getGame() .getDefaultSizeAdjustment(); if (sizeAdj != null) { - size = sizeAdj.getAbbreviation(); + setSize(sizeAdj); } } @@ -1235,8 +1235,8 @@ // // Put size in name if not the same as the base item // - final int iSize = Globals.sizeInt(getSize(), 4); - if (Globals.sizeInt(getBaseSize(), 4) != iSize) { + final int iSize = Globals.sizeInt(getSizeAdj()); + if (Globals.sizeInt(getBaseSize()) != iSize) { itemName.append((SettingsHandler.getGame() .getSizeAdjustmentAtIndex(iSize)).getDisplayName()); itemName.append('/'); @@ -1866,24 +1866,9 @@ return displayName; } - /** - * Sets the size attribute of the Equipment object - * - * @param sizeString - * The new size value - * @param bBase - * The new size value - */ - public void setSize(String sizeString, final boolean bBase) { - if (sizeString.length() > 1) { - sizeString = sizeString.toUpperCase().substring(0, 1); - } - - size = sizeString; - - if (bBase) { - sizeBase = sizeString; - } + public void setBaseSize(SizeAdjustment sa) + { + sizeBase = sa; } /** @@ -1892,6 +1877,10 @@ * @return The size value */ public String getSize() { + return size.getAbbreviation(); + } + + public SizeAdjustment getSizeAdj() { return size; } @@ -2884,7 +2873,7 @@ this.getKeyName()); } - if (!size.equals(base.getSize())) { + if (!size.equals(base.getSizeAdj())) { sbuf.append(sep).append("SIZE").append(endPart).append(size); } @@ -3047,7 +3036,7 @@ final String endPart, final PlayerCharacter aPC) { final StringTokenizer aTok = new StringTokenizer(aLine, sep); final int endPartLen = endPart.length(); - String newSize = size; + String newSize = size.getAbbreviation(); baseItem = getKeyName(); while (aTok.hasMoreTokens()) { @@ -3417,7 +3406,7 @@ * @return size as int */ public int sizeInt() { - return Globals.sizeInt(getSize()); + return Globals.sizeInt(getSizeAdj()); } /** @@ -3776,7 +3765,7 @@ * * @return The baseSize value */ - private String getBaseSize() { + private SizeAdjustment getBaseSize() { return sizeBase; } @@ -3825,8 +3814,7 @@ // final SizeAdjustment saSize = SettingsHandler.getGame() .getSizeAdjustmentNamed(aSize); - final SizeAdjustment saBase = SettingsHandler.getGame() - .getSizeAdjustmentNamed(getBaseSize()); + final SizeAdjustment saBase = getBaseSize(); if ((saSize == null) || (saBase == null)) { return c; @@ -3965,10 +3953,19 @@ * @param sizeString * The new size value */ - private void setSize(final String sizeString) { - setSize(sizeString, false); + private void setSize(String sizeString) { + if (sizeString.length() > 1) { + sizeString = sizeString.toUpperCase().substring(0, 1); + } + + setSize(SettingsHandler.getGame().getSizeAdjustmentNamed(sizeString)); } + public void setSize(SizeAdjustment sz) + { + size = sz; + } + /** * Gets the specialAbilityList attribute of the Equipment object * @@ -4129,8 +4126,7 @@ final SizeAdjustment newSA = SettingsHandler.getGame() .getSizeAdjustmentNamed(aSize); - final SizeAdjustment currSA = SettingsHandler.getGame() - .getSizeAdjustmentNamed(getSize()); + final SizeAdjustment currSA = getSizeAdj(); if ((newSA == null) || (currSA == null)) { return getBaseWeight(); @@ -4196,8 +4192,7 @@ double mult = 1.0; final SizeAdjustment newSA = SettingsHandler.getGame() .getSizeAdjustmentNamed(aSize); - final SizeAdjustment currSA = SettingsHandler.getGame() - .getSizeAdjustmentNamed(baseEq.getSize()); + final SizeAdjustment currSA = baseEq.getSizeAdj(); if ((newSA != null) && (currSA != null)) { mult = newSA.getBonusTo(aPC, "ACVALUE", baseEq.typeList(), 1.0) @@ -4978,7 +4973,7 @@ String thisSize = getSize(); // Get the full name of the current size - sa = SettingsHandler.getGame().getSizeAdjustmentNamed(thisSize); + sa = getSizeAdj(); thisSize = (sa == null) ? "Medium" : sa.getDisplayName(); String upThisSize = thisSize.toUpperCase(); Modified: Trunk/pcgen/code/src/java/pcgen/core/GameMode.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/GameMode.java 2008-08-04 23:05:30 UTC (rev 7340) +++ Trunk/pcgen/code/src/java/pcgen/core/GameMode.java 2008-08-04 23:24:15 UTC (rev 7341) @@ -3466,6 +3466,11 @@ return set != null && set.contains(type); } + public int sizeIndex(SizeAdjustment sz) + { + return sizeAdjustmentList.indexOf(sz); + } + /** * Gets the name of the currently selected experience table * Modified: Trunk/pcgen/code/src/java/pcgen/core/Globals.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Globals.java 2008-08-04 23:05:30 UTC (rev 7340) +++ Trunk/pcgen/code/src/java/pcgen/core/Globals.java 2008-08-04 23:24:15 UTC (rev 7341) @@ -2277,6 +2277,11 @@ return defaultValue; } + public static int sizeInt(SizeAdjustment sz) + { + return SettingsHandler.getGame().sizeIndex(sz); + } + /** * Sorts chooser lists using the appropriate method, based on the type of the first item in either list. * Not pretty, but it works. Modified: Trunk/pcgen/code/src/java/pcgen/core/character/WieldCategory.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/character/WieldCategory.java 2008-08-04 23:05:30 UTC (rev 7340) +++ Trunk/pcgen/code/src/java/pcgen/core/character/WieldCategory.java 2008-08-04 23:24:15 UTC (rev 7341) @@ -195,7 +195,7 @@ final int newSizeInt = eq.sizeInt() + aBump; final SizeAdjustment sadj = SettingsHandler.getGame(). getSizeAdjustmentAtIndex(newSizeInt); - eq.setSize(sadj.getAbbreviation(), false); + eq.setSize(sadj); } } final PrerequisiteParserInterface parser = PreParserFactory. @@ -233,7 +233,7 @@ Logging.errorPrint(ple.getMessage(), ple); } } - eq.setSize(oldEqSize, false); + eq.setSize(SettingsHandler.getGame().getSizeAdjustmentNamed(oldEqSize)); } catch (PersistenceLayerException ple) { Modified: Trunk/pcgen/code/src/java/pcgen/gui/EqBuilder.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/EqBuilder.java 2008-08-04 23:05:30 UTC (rev 7340) +++ Trunk/pcgen/code/src/java/pcgen/gui/EqBuilder.java 2008-08-04 23:24:15 UTC (rev 7341) @@ -78,6 +78,7 @@ import pcgen.core.PObject; import pcgen.core.PlayerCharacter; import pcgen.core.SettingsHandler; +import pcgen.core.SizeAdjustment; import pcgen.core.SpecialProperty; import pcgen.core.prereq.PrerequisiteUtilities; import pcgen.core.spell.Spell; @@ -363,10 +364,7 @@ jButtonDamage.setVisible(aEq.isWeapon()); - // Set item size - final String eqSize = aEq.getSize(); - final int iSize = Globals.sizeInt(eqSize); - setItemSize(SettingsHandler.getGame().getSizeAdjustmentAtIndex(iSize).getDisplayName()); + setItemSize(aEq.getSizeAdj().getDisplayName()); if (!bReloading) { Modified: Trunk/pcgen/code/src/java/pcgen/gui/filter/FilterFactory.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/filter/FilterFactory.java 2008-08-04 23:05:30 UTC (rev 7340) +++ Trunk/pcgen/code/src/java/pcgen/gui/filter/FilterFactory.java 2008-08-04 23:24:15 UTC (rev 7341) @@ -1670,8 +1670,8 @@ if (pObject instanceof Equipment) { - return ((Equipment) pObject).getSize().toUpperCase().equals(SettingsHandler.getGame().getSizeAdjustmentAtIndex( - aPC.sizeInt()).getAbbreviation()); + return ((Equipment) pObject).getSizeAdj().equals(SettingsHandler.getGame().getSizeAdjustmentAtIndex( + aPC.sizeInt())); } return true; @@ -2463,10 +2463,8 @@ if (pObject instanceof Equipment) { - final String aEquipSize = ((Equipment) pObject).getSize(); - - return aEquipSize.equals(SettingsHandler.getGame().getSizeAdjustmentAtIndex(size).getAbbreviation()) - || aEquipSize.equals(SettingsHandler.getGame().getSizeAdjustmentAtIndex(size).getDisplayName()); + return ((Equipment) pObject).getSizeAdj().equals( + SettingsHandler.getGame().getSizeAdjustmentAtIndex(size)); } else if (pObject instanceof Race) { Modified: Trunk/pcgen/code/src/java/pcgen/io/exporttoken/EqToken.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/exporttoken/EqToken.java 2008-08-04 23:05:30 UTC (rev 7340) +++ Trunk/pcgen/code/src/java/pcgen/io/exporttoken/EqToken.java 2008-08-04 23:24:15 UTC (rev 7341) @@ -854,8 +854,7 @@ */ public static String getSizeLongToken(Equipment eq) { - return SettingsHandler.getGame().getSizeAdjustmentAtIndex( - Globals.sizeInt(eq.getSize())).getDisplayName(); + return eq.getSizeAdj().getDisplayName(); } /** Modified: Trunk/pcgen/code/src/java/pcgen/io/exporttoken/WeaponhToken.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/exporttoken/WeaponhToken.java 2008-08-04 23:05:30 UTC (rev 7340) +++ Trunk/pcgen/code/src/java/pcgen/io/exporttoken/WeaponhToken.java 2008-08-04 23:24:15 UTC (rev 7341) @@ -37,6 +37,8 @@ import pcgen.core.Equipment; import pcgen.core.Globals; import pcgen.core.PlayerCharacter; +import pcgen.core.SettingsHandler; +import pcgen.core.SizeAdjustment; import pcgen.core.WeaponProf; import pcgen.core.character.WieldCategory; import pcgen.io.ExportHandler; @@ -134,7 +136,14 @@ head.put(IntegerKey.CRIT_MULT, 2); head.put(IntegerKey.CRIT_RANGE, 1); eq.put(ObjectKey.MOD_CONTROL, EqModControl.NO); - eq.setSize(pc.getSize(), true); + String sizeString = pc.getSize(); + if (sizeString.length() > 1) { + sizeString = sizeString.toUpperCase().substring(0, 1); + } + + SizeAdjustment sa = SettingsHandler.getGame().getSizeAdjustmentNamed(sizeString); + eq.setSize(sa); + eq.setBaseSize(sa); return eq; } Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/NaturalattacksLst.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/NaturalattacksLst.java 2008-08-04 23:05:30 UTC (rev 7340) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/NaturalattacksLst.java 2008-08-04 23:24:15 UTC (rev 7341) @@ -21,6 +21,8 @@ import pcgen.core.PCTemplate; import pcgen.core.PObject; import pcgen.core.Race; +import pcgen.core.SettingsHandler; +import pcgen.core.SizeAdjustment; import pcgen.core.WeaponProf; import pcgen.persistence.lst.GlobalLstToken; import pcgen.rules.context.AbstractReferenceContext; @@ -178,7 +180,13 @@ anEquip.setName(attackName); anEquip.setTypeInfo(profType); anEquip.put(ObjectKey.WEIGHT, BigDecimal.ZERO); - anEquip.setSize(aSize, true); + if (aSize.length() > 1) { + aSize = aSize.toUpperCase().substring(0, 1); + } + + SizeAdjustment sa = SettingsHandler.getGame().getSizeAdjustmentNamed(aSize); + anEquip.setSize(sa); + anEquip.setBaseSize(sa); String numAttacks = aTok.nextToken(); boolean attacksProgress = true; Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/equipment/SizeToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/equipment/SizeToken.java 2008-08-04 23:05:30 UTC (rev 7340) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/equipment/SizeToken.java 2008-08-04 23:24:15 UTC (rev 7341) @@ -1,6 +1,8 @@ package plugin.lsttokens.equipment; import pcgen.core.Equipment; +import pcgen.core.SettingsHandler; +import pcgen.core.SizeAdjustment; import pcgen.persistence.lst.EquipmentLstToken; /** @@ -16,7 +18,13 @@ public boolean parse(Equipment eq, String value) { - eq.setSize(value, true); + if (value.length() > 1) { + value = value.toUpperCase().substring(0, 1); + } + + SizeAdjustment sa = SettingsHandler.getGame().getSizeAdjustmentNamed(value); + eq.setSize(sa); + eq.setBaseSize(sa); return true; } } Modified: Trunk/pcgen/code/src/test/pcgen/core/EquipmentListTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/EquipmentListTest.java 2008-08-04 23:05:30 UTC (rev 7340) +++ Trunk/pcgen/code/src/test/pcgen/core/EquipmentListTest.java 2008-08-04 23:24:15 UTC (rev 7341) @@ -93,7 +93,9 @@ this.eq = new Equipment(); this.eq.setName("Dummy"); - this.eq.setSize("M", true); + SizeAdjustment sa = SettingsHandler.getGame().getSizeAdjustmentNamed("M"); + eq.setSize(sa); + eq.setBaseSize(sa); this.eq.setTypeInfo("WEAPON.MELEE.CHOCOLATE"); this.eq.setKeyName(originalKey); Modified: Trunk/pcgen/code/src/test/pcgen/core/EquipmentTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/EquipmentTest.java 2008-08-04 23:05:30 UTC (rev 7340) +++ Trunk/pcgen/code/src/test/pcgen/core/EquipmentTest.java 2008-08-04 23:24:15 UTC (rev 7341) @@ -94,7 +94,9 @@ this.eq = new Equipment(); this.eq.setName("Dummy"); - this.eq.setSize("M", true); + SizeAdjustment sa = SettingsHandler.getGame().getSizeAdjustmentNamed("M"); + eq.setSize(sa); + eq.setBaseSize(sa); this.eq.setKeyName(this.OriginalKey); } @@ -208,7 +210,7 @@ public void testcreateNameForAutoResize005() { String newKey = eq.createKeyForAutoResize("L"); - eq.setSize("Large", false); + eq.setSize(SettingsHandler.getGame().getSizeAdjustmentNamed("L")); eq.setName("Pointy Stick (Large)"); eq.setKeyName(newKey); @@ -229,7 +231,7 @@ public void testcreateNameForAutoResize006() { String newKey = eq.createKeyForAutoResize("L"); - eq.setSize("Large", false); + eq.setSize(SettingsHandler.getGame().getSizeAdjustmentNamed("L")); eq.setName("Pointy Stick (+1/Large)"); eq.setKeyName(newKey); @@ -250,7 +252,7 @@ public void testcreateNameForAutoResize007() { String newKey = eq.createKeyForAutoResize("L"); - eq.setSize("Large", false); + eq.setSize(SettingsHandler.getGame().getSizeAdjustmentNamed("L")); eq.setName("Pointy Stick (+1/Large/Speed)"); eq.setKeyName(newKey); @@ -270,7 +272,7 @@ public void testcreateNameForAutoResize008() { String newKey = eq.createKeyForAutoResize("L"); - eq.setSize("Large", false); + eq.setSize(SettingsHandler.getGame().getSizeAdjustmentNamed("L")); eq.setName("Pointy Stick (+1/Speed)"); eq.setKeyName(newKey); Modified: Trunk/pcgen/code/src/test/pcgen/core/prereq/PreEquipBothTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/prereq/PreEquipBothTest.java 2008-08-04 23:05:30 UTC (rev 7340) +++ Trunk/pcgen/code/src/test/pcgen/core/prereq/PreEquipBothTest.java 2008-08-04 23:24:15 UTC (rev 7341) @@ -28,6 +28,7 @@ import pcgen.core.PlayerCharacter; import pcgen.core.Race; import pcgen.core.SettingsHandler; +import pcgen.core.SizeAdjustment; import pcgen.core.character.WieldCategory; /** @@ -142,12 +143,16 @@ prereq.setOperator(PrerequisiteOperator.EQ); // Test 3.0 Style - longsword.setSize("M", true); + SizeAdjustment sa = SettingsHandler.getGame().getSizeAdjustmentNamed("M"); + longsword.setSize(sa); + longsword.setBaseSize(sa); assertTrue("Weapon is M therefore OneHanded", PrereqHandler.passes( prereq, character, null)); - longsword.setSize("L", true); + sa = SettingsHandler.getGame().getSizeAdjustmentNamed("L"); + longsword.setSize(sa); + longsword.setBaseSize(sa); assertFalse("Weapon is L therefore TwoHanded", PrereqHandler.passes( prereq, character, null)); Modified: Trunk/pcgen/code/src/test/pcgen/core/prereq/PreEquipPrimaryTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/prereq/PreEquipPrimaryTest.java 2008-08-04 23:05:30 UTC (rev 7340) +++ Trunk/pcgen/code/src/test/pcgen/core/prereq/PreEquipPrimaryTest.java 2008-08-04 23:24:15 UTC (rev 7341) @@ -28,6 +28,7 @@ import pcgen.core.PlayerCharacter; import pcgen.core.Race; import pcgen.core.SettingsHandler; +import pcgen.core.SizeAdjustment; import pcgen.core.character.WieldCategory; /** @@ -142,12 +143,16 @@ prereq.setOperator(PrerequisiteOperator.EQ); // Test 3.0 Style - longsword.setSize("M", true); + SizeAdjustment sa = SettingsHandler.getGame().getSizeAdjustmentNamed("M"); + longsword.setSize(sa); + longsword.setBaseSize(sa); assertTrue("Weapon is M therefore OneHanded", PrereqHandler.passes( prereq, character, null)); - longsword.setSize("L", true); + sa = SettingsHandler.getGame().getSizeAdjustmentNamed("L"); + longsword.setSize(sa); + longsword.setBaseSize(sa); assertFalse("Weapon is L therefore TwoHanded", PrereqHandler.passes( prereq, character, null)); Modified: Trunk/pcgen/code/src/test/pcgen/core/prereq/PreEquipSecondaryTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/prereq/PreEquipSecondaryTest.java 2008-08-04 23:05:30 UTC (rev 7340) +++ Trunk/pcgen/code/src/test/pcgen/core/prereq/PreEquipSecondaryTest.java 2008-08-04 23:24:15 UTC (rev 7341) @@ -28,6 +28,7 @@ import pcgen.core.PlayerCharacter; import pcgen.core.Race; import pcgen.core.SettingsHandler; +import pcgen.core.SizeAdjustment; import pcgen.core.character.WieldCategory; /** @@ -142,12 +143,16 @@ prereq.setOperator(PrerequisiteOperator.EQ); // Test 3.0 Style - longsword.setSize("S", true); + SizeAdjustment sa = SettingsHandler.getGame().getSizeAdjustmentNamed("S"); + longsword.setSize(sa); + longsword.setBaseSize(sa); assertTrue("Weapon is S therefore Light", PrereqHandler.passes(prereq, character, null)); - longsword.setSize("M", true); + sa = SettingsHandler.getGame().getSizeAdjustmentNamed("M"); + longsword.setSize(sa); + longsword.setBaseSize(sa); assertFalse("Weapon is M therefore OneHanded", PrereqHandler.passes( prereq, character, null)); Modified: Trunk/pcgen/code/src/test/pcgen/core/prereq/PreEquipTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/prereq/PreEquipTest.java 2008-08-04 23:05:30 UTC (rev 7340) +++ Trunk/pcgen/code/src/test/pcgen/core/prereq/PreEquipTest.java 2008-08-04 23:24:15 UTC (rev 7341) @@ -29,6 +29,7 @@ import pcgen.core.PlayerCharacter; import pcgen.core.Race; import pcgen.core.SettingsHandler; +import pcgen.core.SizeAdjustment; import pcgen.core.character.WieldCategory; import pcgen.persistence.lst.prereq.PreParserFactory; @@ -149,12 +150,16 @@ prereq.setOperator(PrerequisiteOperator.EQ); // Test 3.0 Style - longsword.setSize("M", true); + SizeAdjustment sa = SettingsHandler.getGame().getSizeAdjustmentNamed("M"); + longsword.setSize(sa); + longsword.setBaseSize(sa); assertTrue("Weapon is M therefore OneHanded", PrereqHandler.passes( prereq, character, null)); - longsword.setSize("L", true); + sa = SettingsHandler.getGame().getSizeAdjustmentNamed("L"); + longsword.setSize(sa); + longsword.setBaseSize(sa); assertFalse("Weapon is L therefore TwoHanded", PrereqHandler.passes( prereq, character, null)); Modified: Trunk/pcgen/code/src/test/pcgen/core/prereq/PreEquipTwoWeaponTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/prereq/PreEquipTwoWeaponTest.java 2008-08-04 23:05:30 UTC (rev 7340) +++ Trunk/pcgen/code/src/test/pcgen/core/prereq/PreEquipTwoWeaponTest.java 2008-08-04 23:24:15 UTC (rev 7341) @@ -28,6 +28,7 @@ import pcgen.core.PlayerCharacter; import pcgen.core.Race; import pcgen.core.SettingsHandler; +import pcgen.core.SizeAdjustment; import pcgen.core.character.WieldCategory; /** @@ -142,12 +143,16 @@ prereq.setOperator(PrerequisiteOperator.EQ); // Test 3.0 Style - longsword.setSize("M", true); + SizeAdjustment sa = SettingsHandler.getGame().getSizeAdjustmentNamed("M"); + longsword.setSize(sa); + longsword.setBaseSize(sa); assertTrue("Weapon is M therefore OneHanded", PrereqHandler.passes( prereq, character, null)); - longsword.setSize("L", true); + sa = SettingsHandler.getGame().getSizeAdjustmentNamed("L"); + longsword.setSize(sa); + longsword.setBaseSize(sa); assertFalse("Weapon is L therefore TwoHanded", PrereqHandler.passes( prereq, character, null)); Modified: Trunk/pcgen/code/src/test/pcgen/io/exporttoken/WeaponTokenTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/io/exporttoken/WeaponTokenTest.java 2008-08-04 23:05:30 UTC (rev 7340) +++ Trunk/pcgen/code/src/test/pcgen/io/exporttoken/WeaponTokenTest.java 2008-08-04 23:24:15 UTC (rev 7341) @@ -50,6 +50,7 @@ import pcgen.core.Race; import pcgen.core.RuleCheck; import pcgen.core.SettingsHandler; +import pcgen.core.SizeAdjustment; import pcgen.core.WeaponProf; import pcgen.core.bonus.Bonus; import pcgen.core.bonus.BonusObj; @@ -154,7 +155,9 @@ dblWpn.getEquipmentHead(2).put(IntegerKey.CRIT_RANGE, 1); dblWpn.put(IntegerKey.SLOTS, 2); dblWpn.put(ObjectKey.WIELD, WieldCategory.findByName("TwoHanded")); - dblWpn.setSize("M", true); + SizeAdjustment sam = SettingsHandler.getGame().getSizeAdjustmentNamed("M"); + dblWpn.setSize(sam); + dblWpn.setBaseSize(sam); character.addEquipment(dblWpn); EquipSet def = new EquipSet("0.1", "Default"); character.addEquipSet(def); @@ -186,7 +189,8 @@ bastardSword.getEquipmentHead(1).put(IntegerKey.CRIT_MULT, 2); bastardSword.getEquipmentHead(1).put(IntegerKey.CRIT_RANGE, 2); bastardSword.put(ObjectKey.WIELD, WieldCategory.findByName("TwoHanded")); - bastardSword.setSize("M", true); + bastardSword.setSize(sam); + bastardSword.setBaseSize(sam); wp = new WeaponProf(); wp.setName("Longsword"); @@ -205,7 +209,9 @@ largeSword.getEquipmentHead(1).put(IntegerKey.CRIT_MULT, 2); largeSword.getEquipmentHead(1).put(IntegerKey.CRIT_RANGE, 2); largeSword.put(ObjectKey.WIELD, WieldCategory.findByName("OneHanded")); - largeSword.setSize("L", true); + SizeAdjustment sal = SettingsHandler.getGame().getSizeAdjustmentNamed("L"); + largeSword.setSize(sal); + largeSword.setBaseSize(sal); fineSword = new Equipment(); fineSword.setName("Longsword (Fine)"); @@ -218,7 +224,8 @@ fineSword.getEquipmentHead(1).put(IntegerKey.CRIT_MULT, 2); fineSword.getEquipmentHead(1).put(IntegerKey.CRIT_RANGE, 2); fineSword.put(ObjectKey.WIELD, WieldCategory.findByName("OneHanded")); - fineSword.setSize("M", true); + fineSword.setSize(sam); + fineSword.setBaseSize(sam); longSpear = new Equipment(); longSpear.setName("Longspear"); @@ -229,7 +236,8 @@ longSpear.getEquipmentHead(1).put(IntegerKey.CRIT_MULT, 2); longSpear.getEquipmentHead(1).put(IntegerKey.CRIT_RANGE, 1); longSpear.put(ObjectKey.WIELD, WieldCategory.findByName("TwoHanded")); - longSpear.setSize("M", true); + longSpear.setSize(sam); + longSpear.setBaseSize(sam); longSpear.put(IntegerKey.REACH, 10); GameMode gm = SettingsHandler.getGame(); @@ -254,7 +262,8 @@ bite.put(StringKey.OUTPUT_NAME, "Silly Bite (For Test)"); bite.setTypeInfo("Weapon.Natural.Melee.Finesseable.Bludgeoning.Piercing.Slashing"); bite.put(ObjectKey.WEIGHT, BigDecimal.ZERO); - bite.setSize("M", true); + bite.setSize(sam); + bite.setBaseSize(sam); bite.addBonusList("WEAPON|ATTACKS|" + 7); bite.setOnlyNaturalWeapon(false); bite.put(IntegerKey.SLOTS, 0); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-08-04 23:28:36
|
Revision: 7342 http://pcgen.svn.sourceforge.net/pcgen/?rev=7342&view=rev Author: thpr Date: 2008-08-04 23:28:36 +0000 (Mon, 04 Aug 2008) Log Message: ----------- Equipment BASEITEM new Token Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ObjectKey.java Trunk/pcgen/code/src/java/pcgen/core/Equipment.java Trunk/pcgen/code/src/java/pcgen/gui/EqBuilder.java Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoGear.java Trunk/pcgen/code/src/java/plugin/lsttokens/equipment/BaseitemToken.java Trunk/pcgen/code/src/test/pcgen/core/EquipmentTest.java Modified: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ObjectKey.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ObjectKey.java 2008-08-04 23:24:15 UTC (rev 7341) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ObjectKey.java 2008-08-04 23:28:36 UTC (rev 7342) @@ -1,305 +1,308 @@ -/* - * Copyright 2005 (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 - * - * Created on June 18, 2005. - * - * Current Ver: $Revision: 513 $ - * Last Editor: $Author: soulcatcher $ - * Last Edited: $Date: 2006-03-29 12:17:43 -0500 (Wed, 29 Mar 2006) $ - */ -package pcgen.cdom.enumeration; - -import java.lang.reflect.Field; -import java.math.BigDecimal; -import java.net.URI; -import java.util.Collection; -import java.util.HashSet; -import java.util.Map; - -import pcgen.base.util.CaseInsensitiveMap; -import pcgen.cdom.base.CDOMListObject; -import pcgen.cdom.base.Category; -import pcgen.cdom.content.ChallengeRating; -import pcgen.cdom.content.HitDie; -import pcgen.cdom.content.Modifier; -import pcgen.cdom.content.TransitionChoice; -import pcgen.cdom.list.ClassSkillList; -import pcgen.cdom.list.ClassSpellList; -import pcgen.cdom.list.DomainSpellList; -import pcgen.cdom.reference.CDOMSingleRef; -import pcgen.core.Ability; -import pcgen.core.ArmorProf; -import pcgen.core.PCAlignment; -import pcgen.core.PCStat; -import pcgen.core.ShieldProf; -import pcgen.core.WeaponProf; -import pcgen.core.character.WieldCategory; -import pcgen.core.spell.Spell; -import pcgen.util.enumeration.Load; -import pcgen.util.enumeration.Visibility; - -/** - * @author Tom Parker <th...@us...> - * - * This is a Typesafe enumeration of legal Object Characteristics of an object. - * It is designed to act as an index to a specific Objects within a - * CDOMObject. - * - * ObjectKeys are designed to store items in a CDOMObject in a type-safe - * fashion. Note that it is possible to use the ObjectKey to cast the object to - * the type of object stored by the ObjectKey. (This assists with Generics) - * - * A "default value" (may be null) must be provided at object construction (the - * default is provided when getSafe(ObjectKey) is called in CDOMObject). This - * default value is especially useful for Boolean ObjectKeys. - * - * @param <T> - * The class of object stored by this ObjectKey. - */ -public final class ObjectKey<T> -{ - - public static final ObjectKey<Boolean> USE_UNTRAINED = new ObjectKey<Boolean>(Boolean.TRUE); - - public static final ObjectKey<Boolean> EXCLUSIVE = new ObjectKey<Boolean>(Boolean.FALSE); - - public static final ObjectKey<URI> SOURCE_URI = new ObjectKey<URI>(null); - - public static final ObjectKey<PCAlignment> ALIGNMENT = new ObjectKey<PCAlignment>(null); - - public static final ObjectKey<Boolean> READ_ONLY = new ObjectKey<Boolean>(Boolean.FALSE); - - public static final ObjectKey<PCStat> KEY_STAT = new ObjectKey<PCStat>(null); - - public static final ObjectKey<SkillArmorCheck> ARMOR_CHECK = new ObjectKey<SkillArmorCheck>(SkillArmorCheck.NONE); - - public static final ObjectKey<Visibility> VISIBILITY = new ObjectKey<Visibility>(Visibility.DEFAULT); - - public static final ObjectKey<Boolean> REMOVABLE = new ObjectKey<Boolean>(Boolean.TRUE); - - public static final ObjectKey<SubRegion> SUBREGION = new ObjectKey<SubRegion>(null); - - public static final ObjectKey<Region> REGION = new ObjectKey<Region>(null); - - public static final ObjectKey<Boolean> USETEMPLATENAMEFORSUBREGION = new ObjectKey<Boolean>(Boolean.FALSE); - - public static final ObjectKey<Boolean> USETEMPLATENAMEFORREGION = new ObjectKey<Boolean>(Boolean.FALSE); - - public static final ObjectKey<Gender> GENDER_LOCK = new ObjectKey<Gender>(null); - - public static final ObjectKey<BigDecimal> FACE_WIDTH = new ObjectKey<BigDecimal>(null); - - public static final ObjectKey<BigDecimal> FACE_HEIGHT = new ObjectKey<BigDecimal>(null); - - public static final ObjectKey<Boolean> USETEMPLATENAMEFORSUBRACE = new ObjectKey<Boolean>(Boolean.FALSE); - - public static final ObjectKey<SubRace> SUBRACE = new ObjectKey<SubRace>(null); - - public static final ObjectKey<BigDecimal> CR_MODIFIER = new ObjectKey<BigDecimal>(BigDecimal.ZERO); - - public static final ObjectKey<RaceType> RACETYPE = new ObjectKey<RaceType>(null); - - public static final ObjectKey<BigDecimal> COST = new ObjectKey<BigDecimal>(BigDecimal.ZERO); - - public static final ObjectKey<PCStat> SPELL_STAT = new ObjectKey<PCStat>(null); - - public static final ObjectKey<Boolean> COST_DOUBLE = new ObjectKey<Boolean>(null); - - public static final ObjectKey<Boolean> ASSIGN_TO_ALL = new ObjectKey<Boolean>(Boolean.FALSE); - - public static final ObjectKey<EqModNameOpt> NAME_OPT = new ObjectKey<EqModNameOpt>(EqModNameOpt.NORMAL); - - public static final ObjectKey<EqModFormatCat> FORMAT = new ObjectKey<EqModFormatCat>(EqModFormatCat.PARENS); - - public static final ObjectKey<Boolean> ATTACKS_PROGRESS = new ObjectKey<Boolean>(Boolean.TRUE); - - public static final ObjectKey<WieldCategory> WIELD = new ObjectKey<WieldCategory>(null); - - public static final ObjectKey<BigDecimal> WEIGHT = new ObjectKey<BigDecimal>(BigDecimal.ZERO); - - public static final ObjectKey<BigDecimal> WEIGHT_MOD = new ObjectKey<BigDecimal>(BigDecimal.ZERO); - - public static final ObjectKey<CDOMSingleRef<WeaponProf>> WEAPON_PROF = new ObjectKey<CDOMSingleRef<WeaponProf>>(null); - - public static final ObjectKey<CDOMSingleRef<ArmorProf>> ARMOR_PROF = new ObjectKey<CDOMSingleRef<ArmorProf>>(null); - - public static final ObjectKey<CDOMSingleRef<ShieldProf>> SHIELD_PROF = new ObjectKey<CDOMSingleRef<ShieldProf>>(null); - - public static final ObjectKey<EqModControl> MOD_CONTROL = new ObjectKey<EqModControl>(EqModControl.YES); - - public static final ObjectKey<BigDecimal> CURRENT_COST = new ObjectKey<BigDecimal>(null); - - /* - * This MUST Stay Object! Otherwise the code hierarchy ends up with circular - * references/tangles - */ - public static final ObjectKey<Object> PARENT = new ObjectKey<Object>(null); - - public static final ObjectKey<Modifier<HitDie>> HITDIE = new ObjectKey<Modifier<HitDie>>(null); - - public static final ObjectKey<ChallengeRating> CHALLENGE_RATING = new ObjectKey<ChallengeRating>(ChallengeRating.ZERO); - - public static final ObjectKey<Boolean> USE_SPELL_SPELL_STAT = new ObjectKey<Boolean>(Boolean.FALSE); - - public static final ObjectKey<Boolean> CASTER_WITHOUT_SPELL_STAT = new ObjectKey<Boolean>(Boolean.FALSE); - - public static final ObjectKey<Boolean> SPELLBOOK = new ObjectKey<Boolean>(Boolean.FALSE); - - public static final ObjectKey<Boolean> MOD_TO_SKILLS = new ObjectKey<Boolean>(Boolean.TRUE); - - public static final ObjectKey<Boolean> MEMORIZE_SPELLS = new ObjectKey<Boolean>(Boolean.TRUE); - - public static final ObjectKey<Boolean> IS_MONSTER = new ObjectKey<Boolean>(null); - - public static final ObjectKey<Boolean> ALLOWBASECLASS = new ObjectKey<Boolean>(Boolean.TRUE); - - public static final ObjectKey<Boolean> HAS_BONUS_SPELL_STAT = new ObjectKey<Boolean>(null); - - public static final ObjectKey<PCStat> BONUS_SPELL_STAT = new ObjectKey<PCStat>(null); - - public static final ObjectKey<HitDie> LEVEL_HITDIE = new ObjectKey<HitDie>(HitDie.ZERO); - - public static final ObjectKey<ClassSpellList> CLASS_SPELLLIST = new ObjectKey<ClassSpellList>(null); - - public static final ObjectKey<DomainSpellList> DOMAIN_SPELLLIST = new ObjectKey<DomainSpellList>(null); - - public static final ObjectKey<TransitionChoice<CDOMListObject<Spell>>> SPELLLIST_CHOICE = new ObjectKey<TransitionChoice<CDOMListObject<Spell>>>(null); - - public static final ObjectKey<TransitionChoice<ClassSkillList>> SKILLLIST_CHOICE = new ObjectKey<TransitionChoice<ClassSkillList>>(null); - - public static final ObjectKey<Boolean> STACKS = new ObjectKey<Boolean>(Boolean.FALSE); - - public static final ObjectKey<Boolean> MULTIPLE_ALLOWED = new ObjectKey<Boolean>(Boolean.FALSE); - - public static final ObjectKey<BigDecimal> SELECTION_COST = new ObjectKey<BigDecimal>(BigDecimal.ONE); - - public static final ObjectKey<Boolean> NAME_PI = new ObjectKey<Boolean>(Boolean.FALSE); - - public static final ObjectKey<Boolean> DESC_PI = new ObjectKey<Boolean>(Boolean.FALSE); - - public static final ObjectKey<Category<Ability>> ABILITY_CAT = new ObjectKey<Category<Ability>>(null); - - public static final ObjectKey<Load> UNENCUMBERED_LOAD = new ObjectKey<Load>(Load.LIGHT); - - public static final ObjectKey<Load> UNENCUMBERED_ARMOR = new ObjectKey<Load>(Load.LIGHT); - - private static CaseInsensitiveMap<ObjectKey<?>> map = null; - - private final T defaultValue; - - private ObjectKey(T def) - { - defaultValue = def; - } - - public T getDefault() - { - return defaultValue; - } - - public T cast(Object o) - { - return (T) o; - } - - public static <OT> ObjectKey<OT> getKeyFor(Class<OT> c, String s) - { - if (map == null) - { - buildMap(); - } - /* - * CONSIDER This is actually not type safe, there is a case of asking - * for a String a second time with a different Class that ObjectKey - * currently does not handle. Two solutions: One, store this in a - * Two-Key map and allow a String to map to more than one ObjectKey - * given different output types (considered confusing) or Two, store the - * Class and validate that with a an error message if a different class - * is requested. - */ - ObjectKey<OT> o = (ObjectKey<OT>) map.get(s); - if (o == null) - { - o = new ObjectKey<OT>(null); - map.put(s, o); - } - return o; - } - - private static void buildMap() - { - map = new CaseInsensitiveMap<ObjectKey<?>>(); - Field[] fields = ObjectKey.class.getDeclaredFields(); - for (int i = 0; i < fields.length; i++) - { - int mod = fields[i].getModifiers(); - - if (java.lang.reflect.Modifier.isStatic(mod) - && java.lang.reflect.Modifier.isFinal(mod) - && java.lang.reflect.Modifier.isPublic(mod)) - { - try - { - Object o = fields[i].get(null); - if (o instanceof ObjectKey) - { - map.put(fields[i].getName(), (ObjectKey<?>) o); - } - } - catch (IllegalArgumentException e) - { - throw new InternalError(); - } - catch (IllegalAccessException e) - { - throw new InternalError(); - } - } - } - } - - @Override - public String toString() - { - /* - * CONSIDER Should this find a way to do a Two-Way Map or something to - * that effect? - */ - if (map == null) - { - buildMap(); - } - for (Map.Entry<?, ObjectKey<?>> me : map.entrySet()) - { - if (me.getValue() == this) - { - return me.getKey().toString(); - } - } - // Error - return ""; - } - - public static Collection<ObjectKey<?>> getAllConstants() - { - if (map == null) - { - buildMap(); - } - return new HashSet<ObjectKey<?>>(map.values()); - } -} +/* + * Copyright 2005 (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 + * + * Created on June 18, 2005. + * + * Current Ver: $Revision: 513 $ + * Last Editor: $Author: soulcatcher $ + * Last Edited: $Date: 2006-03-29 12:17:43 -0500 (Wed, 29 Mar 2006) $ + */ +package pcgen.cdom.enumeration; + +import java.lang.reflect.Field; +import java.math.BigDecimal; +import java.net.URI; +import java.util.Collection; +import java.util.HashSet; +import java.util.Map; + +import pcgen.base.util.CaseInsensitiveMap; +import pcgen.cdom.base.CDOMListObject; +import pcgen.cdom.base.Category; +import pcgen.cdom.content.ChallengeRating; +import pcgen.cdom.content.HitDie; +import pcgen.cdom.content.Modifier; +import pcgen.cdom.content.TransitionChoice; +import pcgen.cdom.list.ClassSkillList; +import pcgen.cdom.list.ClassSpellList; +import pcgen.cdom.list.DomainSpellList; +import pcgen.cdom.reference.CDOMSingleRef; +import pcgen.core.Ability; +import pcgen.core.ArmorProf; +import pcgen.core.Equipment; +import pcgen.core.PCAlignment; +import pcgen.core.PCStat; +import pcgen.core.ShieldProf; +import pcgen.core.WeaponProf; +import pcgen.core.character.WieldCategory; +import pcgen.core.spell.Spell; +import pcgen.util.enumeration.Load; +import pcgen.util.enumeration.Visibility; + +/** + * @author Tom Parker <th...@us...> + * + * This is a Typesafe enumeration of legal Object Characteristics of an object. + * It is designed to act as an index to a specific Objects within a + * CDOMObject. + * + * ObjectKeys are designed to store items in a CDOMObject in a type-safe + * fashion. Note that it is possible to use the ObjectKey to cast the object to + * the type of object stored by the ObjectKey. (This assists with Generics) + * + * A "default value" (may be null) must be provided at object construction (the + * default is provided when getSafe(ObjectKey) is called in CDOMObject). This + * default value is especially useful for Boolean ObjectKeys. + * + * @param <T> + * The class of object stored by this ObjectKey. + */ +public final class ObjectKey<T> +{ + + public static final ObjectKey<Boolean> USE_UNTRAINED = new ObjectKey<Boolean>(Boolean.TRUE); + + public static final ObjectKey<Boolean> EXCLUSIVE = new ObjectKey<Boolean>(Boolean.FALSE); + + public static final ObjectKey<URI> SOURCE_URI = new ObjectKey<URI>(null); + + public static final ObjectKey<PCAlignment> ALIGNMENT = new ObjectKey<PCAlignment>(null); + + public static final ObjectKey<Boolean> READ_ONLY = new ObjectKey<Boolean>(Boolean.FALSE); + + public static final ObjectKey<PCStat> KEY_STAT = new ObjectKey<PCStat>(null); + + public static final ObjectKey<SkillArmorCheck> ARMOR_CHECK = new ObjectKey<SkillArmorCheck>(SkillArmorCheck.NONE); + + public static final ObjectKey<Visibility> VISIBILITY = new ObjectKey<Visibility>(Visibility.DEFAULT); + + public static final ObjectKey<Boolean> REMOVABLE = new ObjectKey<Boolean>(Boolean.TRUE); + + public static final ObjectKey<SubRegion> SUBREGION = new ObjectKey<SubRegion>(null); + + public static final ObjectKey<Region> REGION = new ObjectKey<Region>(null); + + public static final ObjectKey<Boolean> USETEMPLATENAMEFORSUBREGION = new ObjectKey<Boolean>(Boolean.FALSE); + + public static final ObjectKey<Boolean> USETEMPLATENAMEFORREGION = new ObjectKey<Boolean>(Boolean.FALSE); + + public static final ObjectKey<Gender> GENDER_LOCK = new ObjectKey<Gender>(null); + + public static final ObjectKey<BigDecimal> FACE_WIDTH = new ObjectKey<BigDecimal>(null); + + public static final ObjectKey<BigDecimal> FACE_HEIGHT = new ObjectKey<BigDecimal>(null); + + public static final ObjectKey<Boolean> USETEMPLATENAMEFORSUBRACE = new ObjectKey<Boolean>(Boolean.FALSE); + + public static final ObjectKey<SubRace> SUBRACE = new ObjectKey<SubRace>(null); + + public static final ObjectKey<BigDecimal> CR_MODIFIER = new ObjectKey<BigDecimal>(BigDecimal.ZERO); + + public static final ObjectKey<RaceType> RACETYPE = new ObjectKey<RaceType>(null); + + public static final ObjectKey<BigDecimal> COST = new ObjectKey<BigDecimal>(BigDecimal.ZERO); + + public static final ObjectKey<PCStat> SPELL_STAT = new ObjectKey<PCStat>(null); + + public static final ObjectKey<Boolean> COST_DOUBLE = new ObjectKey<Boolean>(null); + + public static final ObjectKey<Boolean> ASSIGN_TO_ALL = new ObjectKey<Boolean>(Boolean.FALSE); + + public static final ObjectKey<EqModNameOpt> NAME_OPT = new ObjectKey<EqModNameOpt>(EqModNameOpt.NORMAL); + + public static final ObjectKey<EqModFormatCat> FORMAT = new ObjectKey<EqModFormatCat>(EqModFormatCat.PARENS); + + public static final ObjectKey<Boolean> ATTACKS_PROGRESS = new ObjectKey<Boolean>(Boolean.TRUE); + + public static final ObjectKey<WieldCategory> WIELD = new ObjectKey<WieldCategory>(null); + + public static final ObjectKey<BigDecimal> WEIGHT = new ObjectKey<BigDecimal>(BigDecimal.ZERO); + + public static final ObjectKey<BigDecimal> WEIGHT_MOD = new ObjectKey<BigDecimal>(BigDecimal.ZERO); + + public static final ObjectKey<CDOMSingleRef<WeaponProf>> WEAPON_PROF = new ObjectKey<CDOMSingleRef<WeaponProf>>(null); + + public static final ObjectKey<CDOMSingleRef<ArmorProf>> ARMOR_PROF = new ObjectKey<CDOMSingleRef<ArmorProf>>(null); + + public static final ObjectKey<CDOMSingleRef<ShieldProf>> SHIELD_PROF = new ObjectKey<CDOMSingleRef<ShieldProf>>(null); + + public static final ObjectKey<EqModControl> MOD_CONTROL = new ObjectKey<EqModControl>(EqModControl.YES); + + public static final ObjectKey<BigDecimal> CURRENT_COST = new ObjectKey<BigDecimal>(null); + + /* + * This MUST Stay Object! Otherwise the code hierarchy ends up with circular + * references/tangles + */ + public static final ObjectKey<Object> PARENT = new ObjectKey<Object>(null); + + public static final ObjectKey<Modifier<HitDie>> HITDIE = new ObjectKey<Modifier<HitDie>>(null); + + public static final ObjectKey<ChallengeRating> CHALLENGE_RATING = new ObjectKey<ChallengeRating>(ChallengeRating.ZERO); + + public static final ObjectKey<Boolean> USE_SPELL_SPELL_STAT = new ObjectKey<Boolean>(Boolean.FALSE); + + public static final ObjectKey<Boolean> CASTER_WITHOUT_SPELL_STAT = new ObjectKey<Boolean>(Boolean.FALSE); + + public static final ObjectKey<Boolean> SPELLBOOK = new ObjectKey<Boolean>(Boolean.FALSE); + + public static final ObjectKey<Boolean> MOD_TO_SKILLS = new ObjectKey<Boolean>(Boolean.TRUE); + + public static final ObjectKey<Boolean> MEMORIZE_SPELLS = new ObjectKey<Boolean>(Boolean.TRUE); + + public static final ObjectKey<Boolean> IS_MONSTER = new ObjectKey<Boolean>(null); + + public static final ObjectKey<Boolean> ALLOWBASECLASS = new ObjectKey<Boolean>(Boolean.TRUE); + + public static final ObjectKey<Boolean> HAS_BONUS_SPELL_STAT = new ObjectKey<Boolean>(null); + + public static final ObjectKey<PCStat> BONUS_SPELL_STAT = new ObjectKey<PCStat>(null); + + public static final ObjectKey<HitDie> LEVEL_HITDIE = new ObjectKey<HitDie>(HitDie.ZERO); + + public static final ObjectKey<ClassSpellList> CLASS_SPELLLIST = new ObjectKey<ClassSpellList>(null); + + public static final ObjectKey<DomainSpellList> DOMAIN_SPELLLIST = new ObjectKey<DomainSpellList>(null); + + public static final ObjectKey<TransitionChoice<CDOMListObject<Spell>>> SPELLLIST_CHOICE = new ObjectKey<TransitionChoice<CDOMListObject<Spell>>>(null); + + public static final ObjectKey<TransitionChoice<ClassSkillList>> SKILLLIST_CHOICE = new ObjectKey<TransitionChoice<ClassSkillList>>(null); + + public static final ObjectKey<Boolean> STACKS = new ObjectKey<Boolean>(Boolean.FALSE); + + public static final ObjectKey<Boolean> MULTIPLE_ALLOWED = new ObjectKey<Boolean>(Boolean.FALSE); + + public static final ObjectKey<BigDecimal> SELECTION_COST = new ObjectKey<BigDecimal>(BigDecimal.ONE); + + public static final ObjectKey<Boolean> NAME_PI = new ObjectKey<Boolean>(Boolean.FALSE); + + public static final ObjectKey<Boolean> DESC_PI = new ObjectKey<Boolean>(Boolean.FALSE); + + public static final ObjectKey<Category<Ability>> ABILITY_CAT = new ObjectKey<Category<Ability>>(null); + + public static final ObjectKey<Load> UNENCUMBERED_LOAD = new ObjectKey<Load>(Load.LIGHT); + + public static final ObjectKey<Load> UNENCUMBERED_ARMOR = new ObjectKey<Load>(Load.LIGHT); + + public static final ObjectKey<CDOMSingleRef<Equipment>> BASE_ITEM = new ObjectKey<CDOMSingleRef<Equipment>>(null); + + private static CaseInsensitiveMap<ObjectKey<?>> map = null; + + private final T defaultValue; + + private ObjectKey(T def) + { + defaultValue = def; + } + + public T getDefault() + { + return defaultValue; + } + + public T cast(Object o) + { + return (T) o; + } + + public static <OT> ObjectKey<OT> getKeyFor(Class<OT> c, String s) + { + if (map == null) + { + buildMap(); + } + /* + * CONSIDER This is actually not type safe, there is a case of asking + * for a String a second time with a different Class that ObjectKey + * currently does not handle. Two solutions: One, store this in a + * Two-Key map and allow a String to map to more than one ObjectKey + * given different output types (considered confusing) or Two, store the + * Class and validate that with a an error message if a different class + * is requested. + */ + ObjectKey<OT> o = (ObjectKey<OT>) map.get(s); + if (o == null) + { + o = new ObjectKey<OT>(null); + map.put(s, o); + } + return o; + } + + private static void buildMap() + { + map = new CaseInsensitiveMap<ObjectKey<?>>(); + Field[] fields = ObjectKey.class.getDeclaredFields(); + for (int i = 0; i < fields.length; i++) + { + int mod = fields[i].getModifiers(); + + if (java.lang.reflect.Modifier.isStatic(mod) + && java.lang.reflect.Modifier.isFinal(mod) + && java.lang.reflect.Modifier.isPublic(mod)) + { + try + { + Object o = fields[i].get(null); + if (o instanceof ObjectKey) + { + map.put(fields[i].getName(), (ObjectKey<?>) o); + } + } + catch (IllegalArgumentException e) + { + throw new InternalError(); + } + catch (IllegalAccessException e) + { + throw new InternalError(); + } + } + } + } + + @Override + public String toString() + { + /* + * CONSIDER Should this find a way to do a Two-Way Map or something to + * that effect? + */ + if (map == null) + { + buildMap(); + } + for (Map.Entry<?, ObjectKey<?>> me : map.entrySet()) + { + if (me.getValue() == this) + { + return me.getKey().toString(); + } + } + // Error + return ""; + } + + public static Collection<ObjectKey<?>> getAllConstants() + { + if (map == null) + { + buildMap(); + } + return new HashSet<ObjectKey<?>>(map.values()); + } +} Modified: Trunk/pcgen/code/src/java/pcgen/core/Equipment.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Equipment.java 2008-08-04 23:24:15 UTC (rev 7341) +++ Trunk/pcgen/code/src/java/pcgen/core/Equipment.java 2008-08-04 23:28:36 UTC (rev 7342) @@ -173,8 +173,6 @@ private BigDecimal costMod = BigDecimal.ZERO; - private String baseItem = Constants.EMPTY_STRING; - private List<EquipmentModifier> eqModifierList = new ArrayList<EquipmentModifier>(); private List<SpecialProperty> specialPropertyList = new ArrayList<SpecialProperty>(); @@ -661,25 +659,16 @@ } /** - * Set the base item - * - * @param argBaseItem - */ - public void setBaseItem(final String argBaseItem) { - baseItem = argBaseItem; - } - - /** * Gets the baseItemName attribute of the Equipment object * * @return The baseItemName value */ public String getBaseItemName() { - if (baseItem.length() == 0) { + CDOMSingleRef<Equipment> baseItem = get(ObjectKey.BASE_ITEM); + if (baseItem == null) { return getKeyName(); } - - return baseItem; + return baseItem.resolvesTo().getKeyName(); } /** @@ -1131,7 +1120,9 @@ * @return item name based off the modifiers */ public String getItemNameFromModifiers() { - if (baseItem.length() == 0) { + CDOMSingleRef<Equipment> baseItem = get(ObjectKey.BASE_ITEM); + if (baseItem == null) + { return getName(); } @@ -1147,8 +1138,7 @@ final List<EquipmentModifier> altModListByFC[] = initSplitModList(); final List<EquipmentModifier> commonListByFC[] = initSplitModList(); - final Equipment baseEquipment = Globals.getContext().ref.silentlyGetConstructedCDOMObject( - Equipment.class, baseItem); + final Equipment baseEquipment = baseItem.resolvesTo(); // // Remove any modifiers on the base item so they don't confuse the // naming @@ -2849,15 +2839,15 @@ final Equipment base; - if (baseItem.length() != 0) { - base = Globals.getContext().ref.silentlyGetConstructedCDOMObject( - Equipment.class, baseItem); + CDOMSingleRef<Equipment> baseItem = get(ObjectKey.BASE_ITEM); + if (baseItem == null) { + base = this; + sbuf.append(getBaseItemName()); + } else { + base = baseItem.resolvesTo(); sbuf.append(baseItem); sbuf.append(sep).append("NAME").append(endPart).append( toString(false)); - } else { - base = this; - sbuf.append(getBaseItemName()); } if (base == null) { @@ -3037,7 +3027,6 @@ final StringTokenizer aTok = new StringTokenizer(aLine, sep); final int endPartLen = endPart.length(); String newSize = size.getAbbreviation(); - baseItem = getKeyName(); while (aTok.hasMoreTokens()) { final String aString = aTok.nextToken(); @@ -3319,81 +3308,100 @@ final int iOldSize = sizeInt(); int iNewSize = Globals.sizeInt(newSize); - if (iNewSize != iOldSize) { + if (iNewSize != iOldSize) + { setSize(newSize); - final Equipment eq = Globals.getContext().ref.silentlyGetConstructedCDOMObject( - Equipment.class, baseItem); + CDOMSingleRef<Equipment> baseItem = get(ObjectKey.BASE_ITEM); - if (eq != null) { - put(ObjectKey.CURRENT_COST, eq.getCostAdjustedForSize(aPC, newSize)); - put(ObjectKey.WEIGHT, eq.getWeightAdjustedForSize(aPC, newSize)); - adjustACForSize(aPC, eq, newSize); - String dam = eq.getDamageAdjustedForSize(newSize, true); - if (dam != null && dam.length() > 0) + Equipment eq; + if (baseItem == null) + { + eq = this; + } + else + { + eq = baseItem.resolvesTo(); + } + + put(ObjectKey.CURRENT_COST, eq.getCostAdjustedForSize(aPC, newSize)); + put(ObjectKey.WEIGHT, eq.getWeightAdjustedForSize(aPC, newSize)); + adjustACForSize(aPC, eq, newSize); + String dam = eq.getDamageAdjustedForSize(newSize, true); + if (dam != null && dam.length() > 0) + { + getEquipmentHead(1).put(StringKey.DAMAGE, dam); + } + String adam = eq.getDamageAdjustedForSize(newSize, false); + if (adam != null && adam.length() > 0) + { + getEquipmentHead(2).put(StringKey.DAMAGE, adam); + } + // + // Adjust the capacity of the container (if it is one) + // + if (containerCapacityString.length() > 0) + { + double mult = 1.0; + final SizeAdjustment newSA = + SettingsHandler.getGame().getSizeAdjustmentNamed( + newSize); + + if (newSA != null) { - getEquipmentHead(1).put(StringKey.DAMAGE, dam); + mult = + newSA.getBonusTo(aPC, "ITEMCAPACITY", + eq.typeList(), 1.0); } - String adam = eq.getDamageAdjustedForSize(newSize, false); - if (adam != null && adam.length() > 0) + + if (containerWeightCapacity.intValue() != -1) { - getEquipmentHead(2).put(StringKey.DAMAGE, adam); + containerWeightCapacity = + new Float(eq.containerWeightCapacity.doubleValue() + * mult); } - // - // Adjust the capacity of the container (if it is one) - // - if (containerCapacityString.length() > 0) { - double mult = 1.0; - final SizeAdjustment newSA = SettingsHandler.getGame() - .getSizeAdjustmentNamed(newSize); - if (newSA != null) { - mult = newSA.getBonusTo(aPC, "ITEMCAPACITY", eq - .typeList(), 1.0); - } + if (getAcceptsTypeCount() > 0) + { + for (String aString : eq.d_acceptsTypes.keySet()) + { + Float aWeight = eq.getAcceptsType(aString); - if (containerWeightCapacity.intValue() != -1) { - containerWeightCapacity = new Float( - eq.containerWeightCapacity.doubleValue() * mult); - } - - if (getAcceptsTypeCount() > 0) { - for (String aString : eq.d_acceptsTypes.keySet()) { - Float aWeight = eq.getAcceptsType(aString); - - if (aWeight.intValue() != -1) { - aWeight = new Float(aWeight.doubleValue() - * mult); - setAcceptsType(aString, aWeight); - } + if (aWeight.intValue() != -1) + { + aWeight = new Float(aWeight.doubleValue() * mult); + setAcceptsType(aString, aWeight); } } + } - updateContainerCapacityString(); - } + updateContainerCapacityString(); } + } - // - // Since we've just resized the item, we need to modify any PRESIZE - // prerequisites - // - if (hasPrerequisites()) + // + // Since we've just resized the item, we need to modify any PRESIZE + // prerequisites + // + if (hasPrerequisites()) + { + for (Prerequisite aBonus : getPrerequisiteList()) { - for (Prerequisite aBonus : getPrerequisiteList()) { - if ("SIZE".equalsIgnoreCase(aBonus.getKind())) { - final int iOldPre = Globals.sizeInt(aBonus.getOperand()); - iNewSize += (iOldPre - iOldSize); + if ("SIZE".equalsIgnoreCase(aBonus.getKind())) + { + final int iOldPre = Globals.sizeInt(aBonus.getOperand()); + iNewSize += (iOldPre - iOldSize); - if ((iNewSize >= 0) - && (iNewSize <= (SettingsHandler.getGame() - .getSizeAdjustmentListSize() - 1))) { - // Note: This actually impacts the Prereq in this - // Equipment, since it is returned - // by reference from the get above ... thus no need to - // perform a set - aBonus.setOperand(SettingsHandler.getGame() - .getSizeAdjustmentAtIndex(iNewSize) - .getAbbreviation()); - } + if ((iNewSize >= 0) + && (iNewSize <= (SettingsHandler.getGame() + .getSizeAdjustmentListSize() - 1))) + { + // Note: This actually impacts the Prereq in this + // Equipment, since it is returned + // by reference from the get above ... thus no need to + // perform a set + aBonus.setOperand(SettingsHandler.getGame() + .getSizeAdjustmentAtIndex(iNewSize) + .getAbbreviation()); } } } @@ -3706,16 +3714,13 @@ * @param aPC */ private void setBase(final PlayerCharacter aPC) { - if (baseItem.length() == 0) { - baseItem = getKeyName(); - } - + String prof = consolidatedProfName(); if (prof.length() == 0) { - final Equipment eq = Globals.getContext().ref.silentlyGetConstructedCDOMObject( - Equipment.class, baseItem); - - if (eq != null) { + CDOMSingleRef<Equipment> baseItem = get(ObjectKey.BASE_ITEM); + if (baseItem != null) + { + Equipment eq = baseItem.resolvesTo(); CDOMSingleRef<WeaponProf> wpRef = eq.get(ObjectKey.WEAPON_PROF); if (wpRef != null) { Modified: Trunk/pcgen/code/src/java/pcgen/gui/EqBuilder.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/EqBuilder.java 2008-08-04 23:24:15 UTC (rev 7341) +++ Trunk/pcgen/code/src/java/pcgen/gui/EqBuilder.java 2008-08-04 23:28:36 UTC (rev 7342) @@ -1196,7 +1196,7 @@ // if (aNewEq.getBaseItemName().toUpperCase().startsWith(Constants.s_GENERIC_ITEM.toUpperCase())) { - aNewEq.setBaseItem(""); + aNewEq.remove(ObjectKey.BASE_ITEM); } Globals.getContext().ref.importObject(aNewEq); @@ -1814,7 +1814,7 @@ // if (aNewEq.getBaseItemName().toUpperCase().startsWith(Constants.s_GENERIC_ITEM.toUpperCase())) { - aNewEq.setBaseItem(""); + aNewEq.remove(ObjectKey.BASE_ITEM); } setEquipment(aNewEq, true); Modified: Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoGear.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoGear.java 2008-08-04 23:24:15 UTC (rev 7341) +++ Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoGear.java 2008-08-04 23:28:36 UTC (rev 7342) @@ -94,6 +94,7 @@ import pcgen.cdom.enumeration.ObjectKey; import pcgen.cdom.enumeration.StringKey; import pcgen.cdom.helper.Quality; +import pcgen.cdom.reference.CDOMDirectSingleRef; import pcgen.core.AbilityCategory; import pcgen.core.Equipment; import pcgen.core.GameMode; @@ -1194,15 +1195,13 @@ } else { - final String existingName = selectedEquipment.getName(); final Equipment newEq = selectedEquipment.clone(); - // This may seem insane, but if the base item is not set, - // getBaseItemName returns the result of getName - if (newEq.getBaseItemName().equals(existingName)) + if (!newEq.containsKey(ObjectKey.BASE_ITEM)) { - newEq.setBaseItem(existingName); + newEq.put(ObjectKey.BASE_ITEM, CDOMDirectSingleRef + .getRef(selectedEquipment)); } newEq.setName(newName); Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/equipment/BaseitemToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/equipment/BaseitemToken.java 2008-08-04 23:24:15 UTC (rev 7341) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/equipment/BaseitemToken.java 2008-08-04 23:28:36 UTC (rev 7342) @@ -1,22 +1,50 @@ package plugin.lsttokens.equipment; +import pcgen.cdom.enumeration.ObjectKey; +import pcgen.cdom.reference.CDOMSingleRef; import pcgen.core.Equipment; -import pcgen.persistence.lst.EquipmentLstToken; +import pcgen.rules.context.LoadContext; +import pcgen.rules.persistence.token.AbstractToken; +import pcgen.rules.persistence.token.CDOMPrimaryToken; /** * Deals with BASEITEM token */ -public class BaseitemToken implements EquipmentLstToken +public class BaseitemToken extends AbstractToken implements + CDOMPrimaryToken<Equipment> { + private static final Class<Equipment> EQUIPMENT_CLASS = Equipment.class; + @Override public String getTokenName() { return "BASEITEM"; } - public boolean parse(Equipment eq, String value) + public boolean parse(LoadContext context, Equipment eq, String value) { - eq.setBaseItem(value); + if (isEmpty(value)) + { + return false; + } + context.getObjectContext().put(eq, ObjectKey.BASE_ITEM, + context.ref.getCDOMReference(EQUIPMENT_CLASS, value)); return true; } + + public String[] unparse(LoadContext context, Equipment eq) + { + CDOMSingleRef<Equipment> ref = + context.getObjectContext().getObject(eq, ObjectKey.BASE_ITEM); + if (ref == null) + { + return null; + } + return new String[]{ref.getLSTformat()}; + } + + public Class<Equipment> getTokenClass() + { + return Equipment.class; + } } Modified: Trunk/pcgen/code/src/test/pcgen/core/EquipmentTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/EquipmentTest.java 2008-08-04 23:24:15 UTC (rev 7341) +++ Trunk/pcgen/code/src/test/pcgen/core/EquipmentTest.java 2008-08-04 23:28:36 UTC (rev 7342) @@ -32,7 +32,9 @@ import pcgen.AbstractCharacterTestCase; import pcgen.PCGenTestCase; import pcgen.cdom.base.Constants; +import pcgen.cdom.enumeration.ObjectKey; import pcgen.cdom.enumeration.StringKey; +import pcgen.cdom.reference.CDOMDirectSingleRef; /** * Equipment Test @@ -297,7 +299,7 @@ // Create a base item Equipment custEq = eq.clone(); custEq.setKeyName("Custom"); - custEq.setBaseItem(eq.getKeyName()); + custEq.put(ObjectKey.BASE_ITEM, CDOMDirectSingleRef.getRef(eq)); Globals.getContext().ref.importObject(custEq); Globals.getContext().ref.importObject(eq); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-08-04 23:56:01
|
Revision: 7344 http://pcgen.svn.sourceforge.net/pcgen/?rev=7344&view=rev Author: thpr Date: 2008-08-04 23:55:57 +0000 (Mon, 04 Aug 2008) Log Message: ----------- Feat Tokens update Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/AssociationKey.java Trunk/pcgen/code/src/java/pcgen/cdom/reference/CategorizedReferenceManufacturer.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/GameMode.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/gui/editor/EditorMainForm.java Trunk/pcgen/code/src/java/plugin/lsttokens/AbilityLst.java Trunk/pcgen/code/src/java/plugin/lsttokens/VFeatLst.java Trunk/pcgen/code/src/java/plugin/lsttokens/domain/FeatToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/pcclass/VfeatToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/race/FeatToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/template/FeatToken.java Trunk/pcgen/code/src/test/pcgen/core/PCClassTest.java Trunk/pcgen/code/src/test/pcgen/core/PCTemplateTest.java Trunk/pcgen/code/src/test/pcgen/core/PObjectTest.java Trunk/pcgen/code/src/test/pcgen/core/PlayerCharacterTest.java Modified: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/AssociationKey.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/AssociationKey.java 2008-08-04 23:44:40 UTC (rev 7343) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/AssociationKey.java 2008-08-04 23:55:57 UTC (rev 7344) @@ -30,6 +30,8 @@ import pcgen.base.util.CaseInsensitiveMap; import pcgen.cdom.base.CDOMObject; +import pcgen.core.Ability; +import pcgen.core.AbilityCategory; /** * @author Tom Parker <th...@us...> @@ -61,6 +63,10 @@ public static final AssociationKey<List<String>> ASSOC_CHOICES = new AssociationKey<List<String>>(); + public static final AssociationKey<Ability.Nature> NATURE = new AssociationKey<Ability.Nature>(); + + public static final AssociationKey<AbilityCategory> CATEGORY = new AssociationKey<AbilityCategory>(); + private static CaseInsensitiveMap<AssociationKey<?>> map = null; private AssociationKey() Modified: Trunk/pcgen/code/src/java/pcgen/cdom/reference/CategorizedReferenceManufacturer.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/reference/CategorizedReferenceManufacturer.java 2008-08-04 23:44:40 UTC (rev 7343) +++ Trunk/pcgen/code/src/java/pcgen/cdom/reference/CategorizedReferenceManufacturer.java 2008-08-04 23:55:57 UTC (rev 7344) @@ -141,5 +141,11 @@ obj.setCDOMCategory(category); return obj; } + + @Override + public String toString() + { + return this.getClass().getName() + " [" + getReferenceClass() + " " + category + "]"; + } } \ No newline at end of file Modified: Trunk/pcgen/code/src/java/pcgen/core/Ability.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Ability.java 2008-08-04 23:44:40 UTC (rev 7343) +++ Trunk/pcgen/code/src/java/pcgen/core/Ability.java 2008-08-04 23:55:57 UTC (rev 7344) @@ -50,12 +50,16 @@ public final class Ability extends PObject implements Categorisable, CategorizedCDOMObject<Ability> { public static final CDOMReference<AbilityList> FEATLIST; + public static final CDOMReference<AbilityList> ABILITYLIST; static { AbilityList wpl = new AbilityList(); wpl.setName("*Feats"); FEATLIST = CDOMDirectSingleRef.getRef(wpl); + wpl = new AbilityList(); + wpl.setName("*Abilities"); + ABILITYLIST = CDOMDirectSingleRef.getRef(wpl); } /** An enum for the various types of ability options. */ Modified: Trunk/pcgen/code/src/java/pcgen/core/AbilityUtilities.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/AbilityUtilities.java 2008-08-04 23:44:40 UTC (rev 7343) +++ Trunk/pcgen/code/src/java/pcgen/core/AbilityUtilities.java 2008-08-04 23:55:57 UTC (rev 7344) @@ -84,6 +84,11 @@ { Ability newAbility = null; + /* + * TODO I believe this is a bug, but need to check. This implies that anything + * that is MULT:YES and is added virtually is added without cause for whether it stacks + * - thpr Jul 24 08 + */ if (anAbility != null && (anAbility.getSafe(ObjectKey.MULTIPLE_ALLOWED) || getAbilityFromList(addList, anAbility) == null)) { newAbility = anAbility.clone(); @@ -246,7 +251,6 @@ final boolean multFirst = getIsMultiples(first); final boolean multSecond = getIsMultiples(second); boolean nameCheck = false; - if (multFirst && multSecond) { /* * The are both Multiply applicable, so strip the decorations (parts @@ -298,28 +302,6 @@ } /** - * Do the strings passed in represent the same Ability object in the - * Category category? - * - * @param category - * @param first - * @param second - * @return true if the same object is represented - */ - public static boolean areSameAbility( - final String category, - final String first, - final String second) - { - if (category == null || first == null || second == null) { - return false; - } - final Categorisable newFirst = new AbilityInfo(category, first); - return areSameAbility(newFirst, second); - } - - - /** * If an ability in Global storage matches the category and name passed * in, then return a clone of that Ability. * @@ -521,10 +503,6 @@ final Categorisable abilityInfo, final Ability.Nature abilityType) { - if (anAbilityList.isEmpty()) { - return null; - } - for ( Ability ability : anAbilityList ) { if (AbilityUtilities.areSameAbility(ability, abilityInfo) && @@ -1195,4 +1173,34 @@ return abilityList; } + /** + * Clone anAbility, apply choices and add it to the addList, provided the + * Ability allows it (if not isMultiples check if it's already there before + * adding it). + * + * @param anAbility + * @param choices + * @param addList + * @return the Ability added, or null if Ability was not added to the list. + */ + public static Ability addAbilityToListwithChoices( + final Ability anAbility, + final List<String> choices, + final List<Ability> addList) + { + Ability abil = getAbilityFromList(addList, anAbility); + if (abil == null) + { + abil = anAbility.clone(); + addList.add(abil); + } + + if (choices != null) + { + addChoicesToAbility(abil, choices); + } + + return abil; + } + } Modified: Trunk/pcgen/code/src/java/pcgen/core/GameMode.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/GameMode.java 2008-08-04 23:44:40 UTC (rev 7343) +++ Trunk/pcgen/code/src/java/pcgen/core/GameMode.java 2008-08-04 23:55:57 UTC (rev 7344) @@ -3125,6 +3125,7 @@ // (all Category) getch if (aKey == null || (ac == null && aKey.length() > 0)) { + Thread.dumpStack(); Logging.errorPrint("Attempt to fetch AbilityCategory: " + aKey + "... but it does not exist"); } Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-08-04 23:44:40 UTC (rev 7343) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-08-04 23:55:57 UTC (rev 7344) @@ -61,6 +61,7 @@ import pcgen.cdom.base.AssociatedPrereqObject; import pcgen.cdom.base.CDOMObject; import pcgen.cdom.base.CDOMReference; +import pcgen.cdom.base.Category; import pcgen.cdom.base.Constants; import pcgen.cdom.content.ChallengeRating; import pcgen.cdom.content.HitDie; @@ -12560,7 +12561,7 @@ } for (PCClass cl : classList) { - for (int i = 0; i < cl.getLevel(); i++) + for (int i = 1; i <= cl.getLevel(); i++) { PCClassLevel classLevel = cl.getClassLevel(i); list.add(classLevel); @@ -15970,6 +15971,7 @@ } return list; } + public List<Ability> getRealAbilitiesList(final AbilityCategory aCategory) { List<Ability> abilities = @@ -17154,6 +17156,59 @@ i++; List<PCTemplate> templateList = new ArrayList<PCTemplate>(); List<Equipment> naturalWeaponsList = new ArrayList<Equipment>(); + for (CDOMObject cdo : getCDOMObjectList()) + { + for (CDOMReference<Ability> ref : cdo + .getSafeListMods(Ability.FEATLIST)) { + Collection<AssociatedPrereqObject> assoc = cdo + .getListAssociations(Ability.FEATLIST, ref); + for (Ability ab : ref.getContainedObjects()) { + for (AssociatedPrereqObject apo : assoc) { + List<String> choices = apo + .getAssociation(AssociationKey.ASSOC_CHOICES); + if (choices == null) { + choices = Collections.emptyList(); + } + Nature nature = apo + .getAssociation(AssociationKey.NATURE); + List<Ability> abilities = theAbilities.get( + AbilityCategory.FEAT, nature); + Ability added = AbilityUtilities + .addAbilityToListwithChoices(ab, choices, + abilities); + if (added != null) { + added.setFeatType(nature); + } + } + } + } + for (CDOMReference<Ability> ref : cdo + .getSafeListMods(Ability.ABILITYLIST)) { + Collection<AssociatedPrereqObject> assoc = cdo + .getListAssociations(Ability.ABILITYLIST, ref); + for (Ability ab : ref.getContainedObjects()) { + for (AssociatedPrereqObject apo : assoc) { + List<String> choices = apo + .getAssociation(AssociationKey.ASSOC_CHOICES); + if (choices == null) { + choices = Collections.emptyList(); + } + Nature nature = apo + .getAssociation(AssociationKey.NATURE); + AbilityCategory cat = apo + .getAssociation(AssociationKey.CATEGORY); + List<Ability> abilities = theAbilities.get( + cat, nature); + Ability added = AbilityUtilities + .addAbilityToListwithChoices(ab, choices, + abilities); + if (added != null) { + added.setFeatType(nature); + } + } + } + } + } addNonAbilityAutoFeats(theAbilities.get(AbilityCategory.FEAT, Ability.Nature.AUTOMATIC)); List<PObject> pobjectList = getConditionalTemplateObjects(); @@ -17249,23 +17304,6 @@ // if (getRace() != null) { - final StringTokenizer aTok = - new StringTokenizer(getRace().getFeatList(), - Constants.PIPE); - - while (aTok.hasMoreTokens()) - { - Ability added = - AbilityUtilities - .addCloneOfGlobalAbilityToListWithChoices( - abilities, Constants.FEAT_CATEGORY, aTok - .nextToken()); - if (added != null) - { - added.setFeatType(Ability.Nature.AUTOMATIC); - } - } - addAutoProfsToList(getRace().getSafeListFor( ListKey.SELECTED_WEAPON_PROF_BONUS), abilities); } @@ -17368,7 +17406,7 @@ choices = Collections.emptyList(); } Ability added = AbilityUtilities - .addCloneOfAbilityToListwithChoices(ab, + .addAbilityToListwithChoices(ab, choices, abilities); if (added != null) { Modified: Trunk/pcgen/code/src/java/pcgen/core/Race.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Race.java 2008-08-04 23:44:40 UTC (rev 7343) +++ Trunk/pcgen/code/src/java/pcgen/core/Race.java 2008-08-04 23:55:57 UTC (rev 7344) @@ -49,8 +49,6 @@ public final class Race extends PObject { private String favoredClass = Constants.EMPTY_STRING; - // TODO - ABILITYOBJECT - Remove this. - private String featList = Constants.EMPTY_STRING; private String monsterClass = null; private int monsterClassLevels = 0; @@ -120,16 +118,6 @@ return favoredClass; } - public void setFeatList(final String featList) - { - this.featList = featList; - } - - public String getFeatList() - { - return featList; - } - public void setMonsterClass(final String string) { monsterClass = string; @@ -308,11 +296,6 @@ txt.append(':').append(monsterClassLevels); } - if ((featList != null) && (featList.length() > 0)) - { - txt.append("\tFEAT:").append(featList); - } - return txt.toString(); } @@ -325,8 +308,6 @@ { aRace = (Race) super.clone(); aRace.favoredClass = favoredClass; - - aRace.featList = featList; } catch (CloneNotSupportedException exc) { Modified: Trunk/pcgen/code/src/java/pcgen/gui/editor/EditorMainForm.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/editor/EditorMainForm.java 2008-08-04 23:44:40 UTC (rev 7343) +++ Trunk/pcgen/code/src/java/pcgen/gui/editor/EditorMainForm.java 2008-08-04 23:55:57 UTC (rev 7344) @@ -770,18 +770,12 @@ // Save feats // sel = pnlFeats.getSelectedList(); - aString = EditUtil.delimitArray(sel, '|'); - thisRace.setFeatList(aString); + for (Object o : sel) + { + context.unconditionallyProcess(thisRace, "FEAT", o.toString()); + } // - // Save virtual feats - // - /* - sel = pnlVFeats.getSelectedList(); - aString = EditUtil.delimitArray(sel, '|'); - thisRace.setVFeatList(aString); - */ - // // Save bonus languages // thisRace.removeAllFromList(Language.STARTING_LIST); @@ -1508,7 +1502,6 @@ // List<String> availableRaceFeatList = new ArrayList<String>(); List<String> selectedRaceFeatList = new ArrayList<String>(); - List<String> selectedRaceFeatList2 = new ArrayList<String>(); for (Iterator<Categorisable> e = Globals.getAbilityKeyIterator("FEAT"); e.hasNext();) { @@ -1516,17 +1509,13 @@ availableRaceFeatList.add(anAbility.getKeyName()); } - aString = ((Race) thisPObject).getFeatList(); - aTok = new StringTokenizer(aString, "|", false); - - while (aTok.hasMoreTokens()) + for (CDOMReference<Ability> ref : thisPObject.getSafeListMods(Ability.FEATLIST)) { - String featName = aTok.nextToken(); - - if (!selectedRaceFeatList.contains(featName)) + String lst = ref.getLSTformat(); + if (!selectedRaceFeatList.contains(lst)) { - availableRaceFeatList.remove(featName); - selectedRaceFeatList.add(featName); + availableRaceFeatList.remove(lst); + selectedRaceFeatList.add(lst); } } Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/AbilityLst.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/AbilityLst.java 2008-08-04 23:44:40 UTC (rev 7343) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/AbilityLst.java 2008-08-04 23:55:57 UTC (rev 7344) @@ -23,23 +23,29 @@ package plugin.lsttokens; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.StringTokenizer; +import pcgen.base.util.MapToList; +import pcgen.cdom.base.AssociatedPrereqObject; +import pcgen.cdom.base.CDOMObject; +import pcgen.cdom.base.CDOMReference; import pcgen.cdom.base.Constants; +import pcgen.cdom.enumeration.AssociationKey; +import pcgen.cdom.reference.ReferenceUtilities; import pcgen.core.Ability; import pcgen.core.AbilityCategory; -import pcgen.core.PCClass; -import pcgen.core.PObject; -import pcgen.core.QualifiedObject; +import pcgen.core.AbilityUtilities; import pcgen.core.SettingsHandler; -import pcgen.core.QualifiedObject.LevelAwareQualifiedObject; import pcgen.core.prereq.Prerequisite; import pcgen.persistence.PersistenceLayerException; -import pcgen.persistence.lst.GlobalLstToken; -import pcgen.persistence.lst.prereq.PreParserFactory; +import pcgen.rules.context.AssociatedChanges; +import pcgen.rules.context.LoadContext; +import pcgen.rules.persistence.TokenUtilities; +import pcgen.rules.persistence.token.AbstractToken; +import pcgen.rules.persistence.token.CDOMPrimaryToken; import pcgen.util.Logging; -import pcgen.util.PropertyFactory; /** * Implements the ABILITY: global LST token. @@ -86,151 +92,172 @@ * @since 5.11.1 * */ -public class AbilityLst implements GlobalLstToken -{ +public class AbilityLst extends AbstractToken implements + CDOMPrimaryToken<CDOMObject> { - /* - * Template's LevelToken handled in rebuildAggregateAbilityListWorker() - * - * TODO rebuildAggregateAbilityListWorker needs to be updated to use - * getCDOMObjects() once this is new token (due to class levels) - */ - /** - * @see pcgen.persistence.lst.GlobalLstToken#parse(pcgen.core.PObject, java.lang.String, int) - */ - public boolean parse(PObject anObj, String aValue, int anInt) - throws PersistenceLayerException + private static final Class<Ability> ABILITY_CLASS = Ability.class; + + @Override + public String getTokenName() { - final StringTokenizer tok = new StringTokenizer(aValue, Constants.PIPE); + return "ABILITY"; + } - final String cat = tok.nextToken(); - final AbilityCategory category = - SettingsHandler.getGame().getAbilityCategory(cat); + public boolean parse(LoadContext context, CDOMObject obj, String value) throws PersistenceLayerException + { + if (isEmpty(value) || hasIllegalSeparator('|', value)) + { + return false; + } + + StringTokenizer tok = new StringTokenizer(value, Constants.PIPE); + String cat = tok.nextToken(); + final AbilityCategory category = SettingsHandler.getGame() + .getAbilityCategory(cat); if (category == null) { - throw new PersistenceLayerException(PropertyFactory.getFormattedString( - "Errors.LstTokens.ValueNotFound", //$NON-NLS-1$ - getClass().getName(), "Ability Category", cat)); + Logging.errorPrint(getTokenName() + + " refers to invalid Ability Category: " + cat); + return false; } + if (!tok.hasMoreTokens()) + { - if (tok.hasMoreTokens()) + Logging.errorPrint(getTokenName() + " must have a Nature, " + + "Format is: CATEGORY|NATURE|AbilityName: " + value); + return false; + } + final String natureKey = tok.nextToken(); + final Ability.Nature nature = Ability.Nature.valueOf(natureKey); + if (nature == null) { - final String natureKey = tok.nextToken(); - final Ability.Nature nature = Ability.Nature.valueOf(natureKey); - if (nature == null) + Logging.errorPrint(getTokenName() + + " refers to invalid Ability Nature: " + natureKey); + return false; + } + if (!tok.hasMoreTokens()) + { + Logging.errorPrint(getTokenName() + + " must have abilities, Format is: " + + "CATEGORY|NATURE|AbilityName: " + value); + return false; + } + + String token = tok.nextToken(); + + if (token.startsWith("PRE") || token.startsWith("!PRE")) + { + Logging.errorPrint("Cannot have only PRExxx subtoken in " + + getTokenName() + ": " + value); + return false; + } + + ArrayList<AssociatedPrereqObject> edgeList = new ArrayList<AssociatedPrereqObject>(); + + while (true) + { + CDOMReference<Ability> ability = TokenUtilities.getTypeOrPrimitive( + context, ABILITY_CLASS, category, token); + if (ability == null) { - throw new PersistenceLayerException(PropertyFactory.getFormattedString( - "Errors.LstTokens.ValueNotFound", //$NON-NLS-1$ - getClass().getName(), "Ability Nature", cat)); + return false; } + AssociatedPrereqObject assoc = context.getListContext().addToList( + getTokenName(), obj, Ability.ABILITYLIST, ability); + assoc.setAssociation(AssociationKey.NATURE, nature); + assoc.setAssociation(AssociationKey.CATEGORY, category); + if (token.indexOf('(') != -1) + { + List<String> choices = new ArrayList<String>(); + AbilityUtilities.getUndecoratedName(token, choices); + assoc.setAssociation(AssociationKey.ASSOC_CHOICES, choices); + } + edgeList.add(assoc); - ArrayList<Prerequisite> preReqs = - new ArrayList<Prerequisite>(); - if (anInt > -9) + if (!tok.hasMoreTokens()) { - try - { - PreParserFactory factory = - PreParserFactory.getInstance(); - String preLevelString = "PRELEVEL:MIN=" + anInt; //$NON-NLS-1$ - if (anObj instanceof PCClass) - { - // Classes handle this differently - preLevelString = - "PRECLASS:1," + anObj.getKeyName() + "=" + anInt; //$NON-NLS-1$ //$NON-NLS-2$ - } - Prerequisite r = factory.parse(preLevelString); - preReqs.add(r); - } - catch (PersistenceLayerException notUsed) - { - return false; - } + // No prereqs, so we're done + return true; } - final List<String> abilityList = new ArrayList<String>(); - boolean isPre = false; - boolean isFirst = true; - while (tok.hasMoreTokens()) + token = tok.nextToken(); + if (token.startsWith("PRE") || token.startsWith("!PRE")) { - final String key = tok.nextToken(); - if (PreParserFactory.isPreReqString(key)) - { - isPre = true; - final PreParserFactory factory = - PreParserFactory.getInstance(); - final Prerequisite r = factory.parse(key); - preReqs.add(r); - } - else - { - if (isPre) - { - Logging.errorPrint("Invalid " + getTokenName() + ": " + aValue); - Logging.errorPrint(" PRExxx must be at the END of the Token"); - isPre = false; - } - if (".CLEAR".equals(key)) - { - if (isFirst) - { - for (QualifiedObject<String> ab : new ArrayList<QualifiedObject<String>>( - anObj.getRawAbilityObjects(category, nature))) - { - QualifiedObject.LevelAwareQualifiedObject<String> aqo = (LevelAwareQualifiedObject<String>) ab; - if (aqo.level == anInt) - { - anObj.removeAbility(category, nature, ab); - } - } - } - else - { - Logging.errorPrint("Invalid " + getTokenName() - + ": .CLEAR non-sensical unless it appears first"); - return false; - } - } - else if (key.startsWith(".CLEAR.")) - { - String abil = key.substring(7); - for (QualifiedObject<String> ab : new ArrayList<QualifiedObject<String>>( - anObj.getRawAbilityObjects(category, nature))) - { - QualifiedObject.LevelAwareQualifiedObject<String> aqo = (LevelAwareQualifiedObject<String>) ab; - if (abil.equalsIgnoreCase(ab.getObject(null)) - && aqo.level == anInt) - { - anObj.removeAbility(category, nature, ab); - } - } - } - else - { - abilityList.add(key); - } - } - isFirst = false; + break; } - for (final String ability : abilityList) + } + + while (true) + { + Prerequisite prereq = getPrerequisite(token); + if (prereq == null) { - anObj.addAbility(category, nature, - new QualifiedObject.LevelAwareQualifiedObject<String>(anInt, - ability, preReqs)); + Logging.errorPrint(" (Did you put feats after the " + + "PRExxx tags in " + getTokenName() + ":?)"); + return false; } - return true; + for (AssociatedPrereqObject edge : edgeList) + { + edge.addPrerequisite(prereq); + } + if (!tok.hasMoreTokens()) + { + break; + } + token = tok.nextToken(); } - throw new PersistenceLayerException(PropertyFactory.getFormattedString( - "Errors.LstTokens.InvalidTokenFormat", //$NON-NLS-1$ - getClass().getName(), aValue)); + return true; } - /** - * @see pcgen.persistence.lst.LstToken#getTokenName() - */ - public String getTokenName() + public String[] unparse(LoadContext context, CDOMObject obj) { - return "ABILITY"; //$NON-NLS-1$ + AssociatedChanges<CDOMReference<Ability>> changes = context + .getListContext().getChangesInList(getTokenName(), obj, + Ability.ABILITYLIST); + MapToList<CDOMReference<Ability>, AssociatedPrereqObject> mtl = changes + .getAddedAssociations(); + if (mtl == null || mtl.isEmpty()) + { + // Zero indicates no Token + return null; + } + Collection<CDOMReference<Ability>> added = changes.getAdded(); + Collection<CDOMReference<Ability>> removedItems = changes.getRemoved(); + StringBuilder sb = new StringBuilder(); + if (changes.includesGlobalClear()) + { + if (removedItems != null && !removedItems.isEmpty()) + { + context.addWriteMessage("Non-sensical relationship in " + + getTokenName() + + ": global .CLEAR and local .CLEAR. performed"); + return null; + } + sb.append(Constants.LST_DOT_CLEAR); + } + else if (removedItems != null && !removedItems.isEmpty()) + { + context.addWriteMessage(getTokenName() + " does not support " + + Constants.LST_DOT_CLEAR_DOT); + return null; + } + if (added != null && !added.isEmpty()) + { + if (sb.length() != 0) + { + sb.append(Constants.PIPE); + } + sb.append(ReferenceUtilities.joinLstFormat(added, Constants.PIPE)); + } + if (sb.length() == 0) + { + return null; + } + return new String[] { sb.toString() }; } + public Class<CDOMObject> getTokenClass() + { + return CDOMObject.class; + } } Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/VFeatLst.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/VFeatLst.java 2008-08-04 23:44:40 UTC (rev 7343) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/VFeatLst.java 2008-08-04 23:55:57 UTC (rev 7344) @@ -1,34 +1,186 @@ package plugin.lsttokens; +import java.util.ArrayList; +import java.util.Collection; import java.util.List; +import java.util.StringTokenizer; +import pcgen.base.util.MapToList; +import pcgen.cdom.base.AssociatedPrereqObject; +import pcgen.cdom.base.CDOMObject; +import pcgen.cdom.base.CDOMReference; +import pcgen.cdom.base.Constants; +import pcgen.cdom.enumeration.AssociationKey; +import pcgen.cdom.list.AbilityList; +import pcgen.cdom.reference.ReferenceUtilities; import pcgen.core.Ability; import pcgen.core.AbilityCategory; -import pcgen.core.PObject; -import pcgen.core.QualifiedObject; -import pcgen.persistence.PersistenceLayerException; -import pcgen.persistence.lst.GlobalLstToken; -import pcgen.persistence.lst.utils.FeatParser; +import pcgen.core.AbilityUtilities; +import pcgen.core.Ability.Nature; +import pcgen.core.prereq.Prerequisite; +import pcgen.rules.context.AssociatedChanges; +import pcgen.rules.context.LoadContext; +import pcgen.rules.persistence.TokenUtilities; +import pcgen.rules.persistence.token.AbstractToken; +import pcgen.rules.persistence.token.CDOMPrimaryToken; +import pcgen.util.Logging; -public class VFeatLst implements GlobalLstToken +public class VFeatLst extends AbstractToken implements + CDOMPrimaryToken<CDOMObject> { + public static final Class<Ability> ABILITY_CLASS = Ability.class; + + @Override public String getTokenName() { return "VFEAT"; } - public boolean parse(PObject obj, String value, int anInt) - throws PersistenceLayerException + public boolean parse(LoadContext context, CDOMObject obj, String value) { - List<QualifiedObject<String>> vfeatList = - FeatParser.parseVirtualFeatListToQualObj(value); - for (final QualifiedObject<String> ability : vfeatList) + if (isEmpty(value) || hasIllegalSeparator('|', value)) { - obj.addAbility(AbilityCategory.FEAT, Ability.Nature.VIRTUAL, - ability); + return false; } + + StringTokenizer tok = new StringTokenizer(value, Constants.PIPE); + + String token = tok.nextToken(); + + if (token.startsWith("PRE") || token.startsWith("!PRE")) + { + Logging.errorPrint("Cannot have only PRExxx subtoken in " + + getTokenName() + ": " + value); + return false; + } + + ArrayList<AssociatedPrereqObject> edgeList = new ArrayList<AssociatedPrereqObject>(); + boolean first = true; + + AbilityCategory category = AbilityCategory.FEAT; + Nature nature = Ability.Nature.VIRTUAL; + CDOMReference<AbilityList> list = Ability.ABILITYLIST; + while (true) + { + if (token.equals(Constants.LST_DOT_CLEAR)) + { + if (!first) + { + Logging.errorPrint(" Non-sensical " + getTokenName() + + ": .CLEAR was not the first list item: " + value); + return false; + } + context.getListContext().removeAllFromList(getTokenName(), obj, + Ability.FEATLIST); + } + else + { + CDOMReference<Ability> ability = TokenUtilities + .getTypeOrPrimitive(context, ABILITY_CLASS, category, + token); + if (ability == null) + { + return false; + } + AssociatedPrereqObject assoc = context.getListContext() + .addToList(getTokenName(), obj, list, ability); + assoc.setAssociation(AssociationKey.NATURE, nature); + assoc.setAssociation(AssociationKey.CATEGORY, category); + if (token.indexOf('(') != -1) + { + List<String> choices = new ArrayList<String>(); + AbilityUtilities.getUndecoratedName(token, choices); + assoc.setAssociation(AssociationKey.ASSOC_CHOICES, choices); + } + edgeList.add(assoc); + } + + first = false; + if (!tok.hasMoreTokens()) + { + // No prereqs, so we're done + return true; + } + token = tok.nextToken(); + if (token.startsWith("PRE") || token.startsWith("!PRE")) + { + break; + } + } + + while (true) + { + Prerequisite prereq = getPrerequisite(token); + if (prereq == null) + { + Logging.errorPrint(" (Did you put feats after the " + + "PRExxx tags in " + getTokenName() + ":?)"); + return false; + } + for (AssociatedPrereqObject edge : edgeList) + { + edge.addPrerequisite(prereq); + } + if (!tok.hasMoreTokens()) + { + break; + } + token = tok.nextToken(); + } + return true; } + public String[] unparse(LoadContext context, CDOMObject obj) + { + AssociatedChanges<CDOMReference<Ability>> changes = context + .getListContext().getChangesInList(getTokenName(), obj, + Ability.FEATLIST); + MapToList<CDOMReference<Ability>, AssociatedPrereqObject> mtl = changes + .getAddedAssociations(); + if (mtl == null || mtl.isEmpty()) + { + // Zero indicates no Token + return null; + } + Collection<CDOMReference<Ability>> added = changes.getAdded(); + Collection<CDOMReference<Ability>> removedItems = changes.getRemoved(); + StringBuilder sb = new StringBuilder(); + if (changes.includesGlobalClear()) + { + if (removedItems != null && !removedItems.isEmpty()) + { + context.addWriteMessage("Non-sensical relationship in " + + getTokenName() + + ": global .CLEAR and local .CLEAR. performed"); + return null; + } + sb.append(Constants.LST_DOT_CLEAR); + } + else if (removedItems != null && !removedItems.isEmpty()) + { + context.addWriteMessage(getTokenName() + " does not support " + + Constants.LST_DOT_CLEAR_DOT); + return null; + } + if (added != null && !added.isEmpty()) + { + if (sb.length() != 0) + { + sb.append(Constants.PIPE); + } + sb.append(ReferenceUtilities.joinLstFormat(added, Constants.PIPE)); + } + if (sb.length() == 0) + { + return null; + } + return new String[] { sb.toString() }; + } + + public Class<CDOMObject> getTokenClass() + { + return CDOMObject.class; + } } Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/domain/FeatToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/domain/FeatToken.java 2008-08-04 23:44:40 UTC (rev 7343) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/domain/FeatToken.java 2008-08-04 23:55:57 UTC (rev 7344) @@ -79,6 +79,7 @@ AssociatedPrereqObject assoc = context.getListContext() .addToList(getTokenName(), obj, Ability.FEATLIST, ability); + assoc.setAssociation(AssociationKey.NATURE, Ability.Nature.AUTOMATIC); if (token.indexOf('(') != -1) { List<String> choices = new ArrayList<String>(); Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/pcclass/VfeatToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/pcclass/VfeatToken.java 2008-08-04 23:44:40 UTC (rev 7343) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/pcclass/VfeatToken.java 2008-08-04 23:55:57 UTC (rev 7344) @@ -19,6 +19,10 @@ public class VfeatToken implements PCClassLstToken { + /* + * No need to convert this to a new token - only difference from global token is the PRExxx + */ + public String getTokenName() { return "VFEAT"; Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/race/FeatToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/race/FeatToken.java 2008-08-04 23:44:40 UTC (rev 7343) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/race/FeatToken.java 2008-08-04 23:55:57 UTC (rev 7344) @@ -1,22 +1,124 @@ package plugin.lsttokens.race; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.StringTokenizer; + +import pcgen.base.util.MapToList; +import pcgen.cdom.base.AssociatedPrereqObject; +import pcgen.cdom.base.CDOMObject; +import pcgen.cdom.base.CDOMReference; +import pcgen.cdom.base.Constants; +import pcgen.cdom.enumeration.AssociationKey; +import pcgen.cdom.reference.ReferenceUtilities; +import pcgen.core.Ability; +import pcgen.core.AbilityCategory; +import pcgen.core.AbilityUtilities; import pcgen.core.Race; -import pcgen.persistence.lst.RaceLstToken; +import pcgen.rules.context.AssociatedChanges; +import pcgen.rules.context.LoadContext; +import pcgen.rules.persistence.TokenUtilities; +import pcgen.rules.persistence.token.AbstractToken; +import pcgen.rules.persistence.token.CDOMPrimaryToken; +import pcgen.util.Logging; /** * Class deals with FEAT Token */ -public class FeatToken implements RaceLstToken -{ +public class FeatToken extends AbstractToken implements CDOMPrimaryToken<Race> { + public static final Class<Ability> ABILITY_CLASS = Ability.class; - public String getTokenName() - { + @Override + public String getTokenName() { return "FEAT"; } - public boolean parse(Race race, String value) - { - race.setFeatList(value); + public boolean parse(LoadContext context, Race pct, String value) { + return parseFeat(context, pct, value); + } + + public boolean parseFeat(LoadContext context, CDOMObject obj, String value) { + if (isEmpty(value) || hasIllegalSeparator('|', value)) { + return false; + } + + StringTokenizer tok = new StringTokenizer(value, Constants.PIPE); + + boolean first = true; + + while (tok.hasMoreTokens()) { + String token = tok.nextToken(); + if (Constants.LST_DOT_CLEAR.equals(token)) { + if (!first) { + Logging.errorPrint(" Non-sensical " + getTokenName() + + ": .CLEAR was not the first list item: " + value); + return false; + } + context.getListContext().removeAllFromList(getTokenName(), obj, + Ability.FEATLIST); + } else { + CDOMReference<Ability> ability = TokenUtilities + .getTypeOrPrimitive(context, ABILITY_CLASS, + AbilityCategory.FEAT, token); + if (ability == null) { + return false; + } + AssociatedPrereqObject assoc = context.getListContext() + .addToList(getTokenName(), obj, Ability.FEATLIST, + ability); + assoc.setAssociation(AssociationKey.NATURE, Ability.Nature.AUTOMATIC); + if (token.indexOf('(') != -1) { + List<String> choices = new ArrayList<String>(); + AbilityUtilities.getUndecoratedName(token, choices); + assoc.setAssociation(AssociationKey.ASSOC_CHOICES, choices); + } + } + first = false; + } return true; } + + public String[] unparse(LoadContext context, Race pct) { + AssociatedChanges<CDOMReference<Ability>> changes = context + .getListContext().getChangesInList(getTokenName(), pct, + Ability.FEATLIST); + MapToList<CDOMReference<Ability>, AssociatedPrereqObject> mtl = changes + .getAddedAssociations(); + if (mtl == null || mtl.isEmpty()) { + // Zero indicates no Token + return null; + } + Collection<CDOMReference<Ability>> added = changes.getAdded(); + Collection<CDOMReference<Ability>> removedItems = changes.getRemoved(); + StringBuilder sb = new StringBuilder(); + if (changes.includesGlobalClear()) { + if (removedItems != null && !removedItems.isEmpty()) { + context.addWriteMessage("Non-sensical relationship in " + + getTokenName() + + ": global .CLEAR and local .CLEAR. performed"); + return null; + } + sb.append(Constants.LST_DOT_CLEAR); + } else if (removedItems != null && !removedItems.isEmpty()) { + context.addWriteMessage(getTokenName() + " does not support " + + Constants.LST_DOT_CLEAR_DOT); + return null; + } + if (added != null && !added.isEmpty()) { + if (sb.length() != 0) { + sb.append(Constants.PIPE); + } + sb.append(ReferenceUtilities.joinLstFormat(added, Constants.PIPE)); + } + if (sb.length() == 0) { + return null; + } + return new String[] { sb.toString() }; + } + + public Class<Race> getTokenClass() { + return Race.class; + } + } Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/template/FeatToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/template/FeatToken.java 2008-08-04 23:44:40 UTC (rev 7343) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/template/FeatToken.java 2008-08-04 23:55:57 UTC (rev 7344) @@ -79,6 +79,7 @@ AssociatedPrereqObject assoc = context.getListContext() .addToList(getTokenName(), obj, Ability.FEATLIST, ability); + assoc.setAssociation(AssociationKey.NATURE, Ability.Nature.AUTOMATIC); if (token.indexOf('(') != -1) { List<String> choices = new ArrayList<String>(); Modified: Trunk/pcgen/code/src/test/pcgen/core/PCClassTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/PCClassTest.java 2008-08-04 23:44:40 UTC (rev 7343) +++ Trunk/pcgen/code/src/test/pcgen/core/PCClassTest.java 2008-08-04 23:55:57 UTC (rev 7344) @@ -30,6 +30,7 @@ import java.net.URI; import java.net.URISyntaxException; +import java.util.Collection; import java.util.List; import java.util.StringTokenizer; @@ -39,6 +40,8 @@ import pcgen.PCGenTestCase; import pcgen.base.formula.Formula; import pcgen.base.lang.UnreachableError; +import pcgen.cdom.base.AssociatedPrereqObject; +import pcgen.cdom.base.CDOMReference; import pcgen.cdom.base.FormulaFactory; import pcgen.cdom.enumeration.FormulaKey; import pcgen.cdom.enumeration.IntegerKey; @@ -644,10 +647,30 @@ + "CLASS:Cleric STARTSKILLPTS:2 CSKILL:Concentration|TYPE.Craft\n" + "2 ABILITY:TestCat|AUTOMATIC|Ability2"; PCClass pcclass = parsePCClassText(classPCCText, source); - List<String> keys = pcclass.getAbilityKeys(null, cat, Nature.AUTOMATIC); - assertEquals(2, keys.size()); - assertEquals(ab1.getKeyName(), keys.get(0)); - assertEquals(ab2.getKeyName(), keys.get(1)); + LoadContext context = Globals.getContext(); + ab1.setCDOMCategory(cat); + ab2.setCDOMCategory(cat); + context.ref.importObject(ab1); + context.ref.importObject(ab2); + context.resolveReferences(); + Collection<CDOMReference<Ability>> mods = pcclass.getListMods(Ability.ABILITYLIST); + assertEquals(1, mods.size()); + CDOMReference<Ability> ref = mods.iterator().next(); + Collection<Ability> abilities = ref.getContainedObjects(); + assertEquals(1, abilities.size()); + assertEquals(ab1, abilities.iterator().next()); + Collection<AssociatedPrereqObject> assocs = pcclass.getListAssociations(Ability.ABILITYLIST, ref); + assertEquals(1, assocs.size()); + + PCClassLevel level = pcclass.getClassLevel(2); + mods = level.getListMods(Ability.ABILITYLIST); + assertEquals(1, mods.size()); + ref = mods.iterator().next(); + abilities = ref.getContainedObjects(); + assertEquals(1, abilities.size()); + assertEquals(ab2, abilities.iterator().next()); + assocs = level.getListAssociations(Ability.ABILITYLIST, ref); + assertEquals(1, assocs.size()); // Add the class to the character PlayerCharacter pc = getCharacter(); Modified: Trunk/pcgen/code/src/test/pcgen/core/PCTemplateTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/PCTemplateTest.java 2008-08-04 23:44:40 UTC (rev 7343) +++ Trunk/pcgen/code/src/test/pcgen/core/PCTemplateTest.java 2008-08-04 23:55:57 UTC (rev 7344) @@ -26,7 +26,8 @@ import java.net.MalformedURLException; import java.net.URI; import java.net.URISyntaxException; -import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; import java.util.List; import junit.framework.Test; @@ -34,7 +35,9 @@ import pcgen.AbstractCharacterTestCase; import pcgen.PCGenTestCase; import pcgen.base.lang.UnreachableError; +import pcgen.cdom.base.CDOMReference; import pcgen.cdom.base.FormulaFactory; +import pcgen.cdom.enumeration.IntegerKey; import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.helper.StatLock; import pcgen.core.Ability.Nature; @@ -42,9 +45,7 @@ import pcgen.persistence.PersistenceLayerException; import pcgen.persistence.lst.CampaignSourceEntry; import pcgen.persistence.lst.PCTemplateLoader; -import pcgen.rules.context.ConsolidatedListCommitStrategy; -import pcgen.rules.context.ReferenceContext; -import pcgen.rules.context.RuntimeLoadContext; +import pcgen.rules.context.LoadContext; /** * <code>PCTemplateTest</code> tests the fucntion of the PCTemplate class. @@ -92,7 +93,7 @@ } /** - * Returns all the test methods in this class. + * Returns all the test methasVFeatshods in this class. * @return A <tt>TestSuite</tt> */ public static Test suite() @@ -109,14 +110,16 @@ public void testAddAbility() throws PersistenceLayerException, MalformedURLException { // Create some abilities to be added + AbilityCategory cat = new AbilityCategory("TestCat"); + SettingsHandler.getGame().addAbilityCategory(cat); Ability ab1 = new Ability(); ab1.setName("Ability1"); ab1.setCategory("TestCat"); + ab1.setCDOMCategory(cat); Ability ab2 = new Ability(); ab2.setName("Ability2"); ab2.setCategory("TestCat"); - AbilityCategory cat = new AbilityCategory("TestCat"); - SettingsHandler.getGame().addAbilityCategory(cat); + ab2.setCDOMCategory(cat); Globals.addAbility(ab1); Globals.addAbility(ab2); @@ -134,15 +137,26 @@ { throw new UnreachableError(e); } + LoadContext context = Globals.getContext(); loader .parseLine( - new RuntimeLoadContext(new ReferenceContext(), new ConsolidatedListCommitStrategy()), + context, template, "Template1 ABILITY:TestCat|AUTOMATIC|Ability1 ABILITY:TestCat|AUTOMATIC|Ability2", source); - List<String> keys = template.getAbilityKeys(null, cat, Nature.AUTOMATIC); - assertEquals(2, keys.size()); - assertEquals(ab1.getKeyName(), keys.get(0)); - assertEquals(ab2.getKeyName(), keys.get(1)); + context.ref.importObject(ab1); + context.ref.importObject(ab2); + context.resolveReferences(); + Collection<CDOMReference<Ability>> listMods = template.getListMods(Ability.ABILITYLIST); + assertEquals(2, listMods.size()); + Iterator<CDOMReference<Ability>> iterator = listMods.iterator(); + CDOMReference<Ability> ref1 = iterator.next(); + CDOMReference<Ability> ref2 = iterator.next(); + Collection<Ability> contained1 = ref1.getContainedObjects(); + Collection<Ability> contained2 = ref2.getContainedObjects(); + assertEquals(1, contained1.size()); + assertEquals(1, contained2.size()); + assertTrue(contained1.contains(ab1) || contained2.contains(ab1)); + assertTrue(contained1.contains(ab2) || contained2.contains(ab2)); // Add the template to the character PlayerCharacter pc = getCharacter(); @@ -166,9 +180,11 @@ Ability ab1 = new Ability(); ab1.setName("Ability1"); ab1.setCategory(AbilityCategory.FEAT.getKeyName()); + ab1.setCDOMCategory(AbilityCategory.FEAT); Ability ab2 = new Ability(); ab2.setName("Ability2"); ab2.setCategory(AbilityCategory.FEAT.getKeyName()); + ab2.setCDOMCategory(AbilityCategory.FEAT); Globals.addAbility(ab1); Globals.addAbility(ab2); @@ -184,15 +200,26 @@ { throw new UnreachableError(e); } + LoadContext context = Globals.getContext(); loader .parseLine( - new RuntimeLoadContext(new ReferenceContext(), new ConsolidatedListCommitStrategy()), + context, template, "Template1 ABILITY:FEAT|AUTOMATIC|Ability1 ABILITY:FEAT|AUTOMATIC|Ability2", source); - List<String> keys = template.getAbilityKeys(null, AbilityCategory.FEAT, Nature.AUTOMATIC); - assertEquals(2, keys.size()); - assertEquals(ab1.getKeyName(), keys.get(0)); - assertEquals(ab2.getKeyName(), keys.get(1)); + Globals.getContext().ref.importObject(ab1); + Globals.getContext().ref.importObject(ab2); + Globals.getContext().resolveReferences(); + Collection<CDOMReference<Ability>> listMods = template.getListMods(Ability.ABILITYLIST); + assertEquals(2, listMods.size()); + Iterator<CDOMReference<Ability>> iterator = listMods.iterator(); + CDOMReference<Ability> ref1 = iterator.next(); + CDOMReference<Ability> ref2 = iterator.next(); + Collection<Ability> contained1 = ref1.getContainedObjects(); + Collection<Ability> contained2 = ref2.getContainedObjects(); + assertEquals(1, contained1.size()); + assertEquals(1, contained2.size()); + assertTrue(contained1.contains(ab1) || contained2.contains(ab1)); + assertTrue(contained1.contains(ab2) || contained2.contains(ab2)); // Add the template to the character PlayerCharacter pc = getCharacter(); @@ -212,15 +239,17 @@ */ public void testAddLevelAbility() throws PersistenceLayerException, MalformedURLException { + AbilityCategory cat = new AbilityCategory("TestCat"); + SettingsHandler.getGame().addAbilityCategory(cat); // Create some abilities to be added Ability ab1 = new Ability(); ab1.setName("Ability1"); ab1.setCategory("TestCat"); + ab1.setCDOMCategory(cat); Ability ab2 = new Ability(); ab2.setName("Ability2"); ab2.setCategory("TestCat"); - AbilityCategory cat = new AbilityCategory("TestCat"); - SettingsHandler.getGame().addAbilityCategory(cat); + ab2.setCDOMCategory(cat); Globals.addAbility(ab1); Globals.addAbility(ab2); @@ -236,22 +265,36 @@ { throw new UnreachableError(e); } + LoadContext context = Globals.getContext(); loader .parseLine( - new RuntimeLoadContext(new ReferenceContext(), new ConsolidatedListCommitStrategy()), + context, template, "Template1 LEVEL:2:ABILITY:TestCat|AUTOMATIC|Ability1 ABILITY:TestCat|AUTOMATIC|Ability2", source); - List<String> keys = template.getAbilityKeys(null, cat, Nature.AUTOMATIC); - assertEquals(1, keys.size()); - assertEquals(ab2.getKeyName(), keys.get(0)); - List<PCTemplate> list = new ArrayList<PCTemplate>(); - template.getConditionalTemplates(2, 0, list); - assertEquals(1, list.size()); - PCTemplate level2 = list.get(0); - keys = level2.getAbilityKeys(null, cat, Nature.AUTOMATIC); - assertEquals(1, keys.size()); - assertEquals(ab1.getKeyName(), keys.get(0)); + context.ref.importObject(ab1); + context.ref.importObject(ab2); + context.resolveReferences(); + Collection<CDOMReference<Ability>> listMods = template.getListMods(Ability.ABILITYLIST); + assertEquals(1, listMods.size()); + Iterator<CDOMReference<Ability>> iterator = listMods.iterator(); + CDOMReference<Ability> ref1 = iterator.next(); + Collection<Ability> contained1 = ref1.getContainedObjects(); + assertEquals(1, contained1.size()); + assertTrue(contained1.contains(ab2)); + List<PCTemplate> lvlTemplates = template.getSafeListFor(ListKey.LEVEL_TEMPLATES); + assertEquals(1, lvlTemplates.size()); + PCTemplate lvl2 = lvlTemplates.get(0); + assertEquals(2, lvl2.get(IntegerKey.LEVEL).intValue()); + + listMods = lvl2.getListMods(Ability.ABILITYLIST); + assertEquals(1, listMods.size()); + iterator = listMods.iterator(); + ref1 = iterator.next(); + contained1 = ref1.getContainedObjects(); + assertEquals(1, contained1.size()); + assertTrue(contained1.contains(ab1)); + // Add the template to the character PlayerCharacter pc = getCharacter(); pc.addTemplate(template); @@ -288,9 +331,11 @@ Ability ab1 = new Ability(); ab1.setName("Ability1"); ab1.setCategory(AbilityCategory.FEAT.getKeyName()); + ab1.setCDOMCategory(AbilityCategory.FEAT); Ability ab2 = new Ability(); ab2.setName("Ability2"); ab2.setCategory(AbilityCategory.FEAT.getKeyName()); + ab2.setCDOMCategory(AbilityCategory.FEAT); Globals.addAbility(ab1); Globals.addAbility(ab2); @@ -306,22 +351,36 @@ { throw new UnreachableError(e); } + LoadContext context = Globals.getContext(); loader .parseLine( - new RuntimeLoadContext(new ReferenceContext(), new ConsolidatedListCommitStrategy()), + context, template, "Template1 LEVEL:2:ABILITY:Feat|AUTOMATIC|Ability1 ABILITY:Feat|AUTOMATIC|Ability2", source); - List<String> keys = template.getAbilityKeys(null, AbilityCategory.FEAT, Nature.AUTOMATIC); - assertEquals(1, keys.size()); - assertEquals(ab2.getKeyName(), keys.get(0)); - List<PCTemplate> list = new ArrayList<PCTemplate>(); - template.getConditionalTemplates(2, 0, list); - assertEquals(1, list.size()); - PCTemplate level2 = list.get(0); - keys = level2.getAbilityKeys(null, AbilityCategory.FEAT, Nature.AUTOMATIC); - assertEquals(1, keys.size()); - assertEquals(ab1.getKeyName(), keys.get(0)); + context.ref.importObject(ab1); + context.ref.importObject(ab2); + context.resolveReferences(); + Collection<CDOMReference<Ability>> listMods = template.getListMods(Ability.ABILITYLIST); + assertEquals(1, listMods.size()); + Iterator<CDOMReference<Ability>> iterator = listMods.iterator(); + CDOMReference<Ability> ref1 = iterator.next(); + Collection<Ability> contained1 = ref1.getContainedObjects(); + assertEquals(1, contained1.size()); + assertTrue(contained1.contains(ab2)); + List<PCTemplate> lvlTemplates = template.getSafeListFor(ListKey.LEVEL_TEMPLATES); + assertEquals(1, lvlTemplates.size()); + PCTemplate lvl2 = lvlTemplates.get(0); + assertEquals(2, lvl2.get(IntegerKey.LEVEL).intValue()); + + listMods = lvl2.getListMods(Ability.ABILITYLIST); + assertEquals(1, listMods.size()); + iterator = listMods.iterator(); + ref1 = iterator.next(); + contained1 = ref1.getContainedObjects(); + assertEquals(1, contained1.size()); + assertTrue(contained1.contains(ab1)); + // Add the template to the character PlayerCharacter pc = getCharacter(); pc.addTemplate(template); Modified: Trunk/pcgen/code/src/test/pcgen/core/PObjectTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/PObjectTest.java 2008-08-04 23:44:40 UTC (rev 7343) +++ Trunk/pcgen/code/src/test/pcgen/core/PObjectTest.java 2008-08-04 23:55:57 UTC (rev 7344) @@ -25,18 +25,23 @@ import java.net.URI; import java.net.URISyntaxException; -import java.util.List; +import java.util.Collection; +import java.util.Iterator; import junit.framework.Test; import junit.framework.TestSuite; import pcgen.AbstractCharacterTestCase; import pcgen.PCGenTestCase; import pcgen.base.lang.UnreachableError; +import pcgen.cdom.base.CDOMReference; import pcgen.cdom.content.ChallengeRating; import pcgen.cdom.enumeration.ObjectKey; +import pcgen.cdom.reference.CDOMSingleRef; +import pcgen.cdom.reference.ReferenceManufacturer; import pcgen.core.Ability.Nature; import pcgen.core.bonus.BonusObj; import pcgen.persistence.PersistenceLayerException; +import pcgen.persistence.lst.AbilityCategoryLoader; import pcgen.persistence.lst.AbilityLoader; import pcgen.persistence.lst.CampaignSourceEntry; import pcgen.persistence.lst.PCClassLoader; @@ -339,14 +344,17 @@ public void testAddAbility() throws PersistenceLayerException { // Create some abilities to be added + AbilityCategory cat = new AbilityCategory("TestCat"); + SettingsHandler.getGame().addAbilityCategory(cat); + new AbilityCategoryLoader().parseLine(Globals.getContext(), "TestCat\tCATEGORY:TestCat", null); Ability ab1 = new Ability(); ab1.setName("Ability1"); + ab1.setCDOMCategory(SettingsHandler.getGame().getAbilityCategory("TestCat")); ab1.setCategory("TestCat"); Ability ab2 = new Ability(); ab2.setName("Ability2"); ab2.setCategory("TestCat"); - AbilityCategory cat = new AbilityCategory("TestCat"); - SettingsHandler.getGame().addAbilityCategory(cat); + ab2.setCDOMCategory(SettingsHandler.getGame().getAbilityCategory("TestCat")); Globals.addAbility(ab1); Globals.addAbility(ab2); @@ -368,10 +376,20 @@ Globals.getContext(), race, "Race1 ABILITY:TestCat|AUTOMATIC|Ability1 ABILITY:TestCat|AUTOMATIC|Ability2", source); - List<String> keys = race.getAbilityKeys(null, cat, Nature.AUTOMATIC); - assertEquals(2, keys.size()); - assertEquals(ab1.getKeyName(), keys.get(0)); - assertEquals(ab2.getKeyName(), keys.get(1)); + Globals.getContext().ref.importObject(ab1); + Globals.getContext().ref.importObject(ab2); + Globals.getContext().resolveReferences(); + Collection<CDOMReference<Ability>> listMods = race.getListMods(Ability.ABILITYLIST); + assertEquals(2, listMods.size()); + Iterator<CDOMReference<Ability>> iterator = listMods.iterator(); + CDOMReference<Ability> ref1 = iterator.next(); + CDOMReference<Ability> ref2 = iterator.next(); + Collection<Ability> contained1 = ref1.getContainedObjects(); + Collection<Ability> contained2 = ref2.getContainedObjects(); + assertEquals(1, contained1.size()); + assertEquals(1, contained2.size()); + assertTrue(contained1.contains(ab1) || contained2.contains(ab1)); + assertTrue(contained1.contains(ab2) || contained2.contains(ab2)); // Add the template to the character PlayerCharacter pc = getCharacter(); Modified: Trunk/pcgen/code/src/test/pcgen/core/PlayerCharacterTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/PlayerCharacterTest.java 2008-08-04 23:44:40 UTC (rev 7343) +++ Trunk/pcgen/code/src/test/pcgen/core/PlayerCharacterTest.java 2008-08-04 23:55:57 UTC (rev 7344) @@ -47,6 +47,7 @@ import pcgen.cdom.enumeration.StringKey; import pcgen.cdom.enumeration.VariableKey; import pcgen.cdom.helper.StatLock; +import pcgen.cdom.inst.PCClassLevel; import pcgen.cdom.list.ClassSkillList; import pcgen.cdom.reference.CDOMDirectSingleRef; import pcgen.core.bonus.Bonus; @@ -57,12 +58,11 @@ import pcgen.core.spell.Spell; import pcgen.gui.utils.SwingChooser; import pcgen.io.exporttoken.StatToken; -import pcgen.persistence.PersistenceLayerException; +import pcgen.rules.context.LoadContext; import pcgen.util.Logging; import pcgen.util.TestHelper; import pcgen.util.chooser.ChooserFactory; import pcgen.util.enumeration.Visibility; -import plugin.lsttokens.AbilityLst; /** * @author wardc @@ -668,7 +668,8 @@ arClass.setName("AbilityRichClass"); arClass.setSpellType("ARCANE"); - Globals.getContext().ref.importObject(arClass); + LoadContext context = Globals.getContext(); + context.ref.importObject(arClass); TestHelper.makeAbilityFromString( "TestARc01\tCATEGORY:FEAT\tMULT:YES\tSTACK:YES\tVISIBLE:YES\tCHOOSE:NOCHOICE"); @@ -681,21 +682,14 @@ TestHelper.makeAbilityFromString( "TestARc05\tCATEGORY:FEAT\tMULT:YES\tSTACK:YES\tVISIBLE:YES\tCHOOSE:NOCHOICE"); - AbilityLst abl = new AbilityLst(); - - - try - { - abl.parse(arClass, "FEAT|NORMAL|TestARc01", 1); - abl.parse(arClass, "FEAT|AUTOMATIC|TestARc02", 1); - abl.parse(arClass, "FEAT|VIRTUAL|TestARc03", 2); - abl.parse(arClass, "FEAT|AUTOMATIC|TestARc04", 3); - abl.parse(arClass, "FEAT|AUTOMATIC|TestARc05", 3); - } - catch (PersistenceLayerException e) - { - Logging.errorPrint("Oops, Parse exception" + e); - } + PCClassLevel lvl1 = arClass.getClassLevel(1); + context.unconditionallyProcess(lvl1, "ABILITY", "FEAT|NORMAL|TestARc01"); + context.unconditionallyProcess(lvl1, "ABILITY", "FEAT|AUTOMATIC|TestARc02"); + context.unconditionallyProcess(arClass.getClassLevel(2), "ABILITY", "FEAT|VIRTUAL|TestARc03"); + PCClassLevel lvl3 = arClass.getClassLevel(3); + context.unconditionallyProcess(lvl3, "ABILITY", "FEAT|AUTOMATIC|TestARc04"); + context.unconditionallyProcess(lvl3, "ABILITY", "FEAT|AUTOMATIC|TestARc05"); + context.resolveReferences(); final PlayerCharacter pc = new PlayerCharacter(); @@ -706,33 +700,33 @@ pc.incrementClassLevel(1, arClass, true); map = pc.getAbilitiesSet(); - - is(map.get(Ability.Nature.NORMAL).size(), eq(1), "First Level human with class AbilityRichClass has 1 normal feat"); - is(map.get(Ability.Nature.AUTOMATIC).size(), eq(1), "First Level human with class AbilityRichClass has 1 automatic feat"); - is(map.get(Ability.Nature.VIRTUAL).size(), eq(0), "First Level human with class AbilityRichClass has 0 virtual feats"); + + assertEquals(map.get(Ability.Nature.NORMAL).size(), 1);//"First Level human with class AbilityRichClass has 1 normal feat"); + assertEquals(map.get(Ability.Nature.AUTOMATIC).size(), 1);// "First Level human with class AbilityRichClass has 1 automatic feat"); + assertEquals(map.get(Ability.Nature.VIRTUAL).size(), 0);// "First Level human with class AbilityRichClass has 0 virtual feats"); pc.incrementClassLevel(1, arClass, true); map = pc.getAbilitiesSet(); - is(map.get(Ability.Nature.NORMAL).size(), eq(1), "Second Level human with class AbilityRichClass has 1 normal feat"); - is(map.get(Ability.Nature.AUTOMATIC).size(), eq(1), "Second Level human with class AbilityRichClass has 1 automatic feat"); - is(map.get(Ability.Nature.VIRTUAL).size(), eq(1), "Second Level human with class AbilityRichClass has 1 virtual feat"); + assertEquals(map.get(Ability.Nature.NORMAL).size(), 1);//, "Second Level human with class AbilityRichClass has 1 normal feat"); + assertEquals(map.get(Ability.Nature.AUTOMATIC).size(), 1);//, "Second Level human with class AbilityRichClass has 1 automatic feat"); + assertEquals(map.get(Ability.Nature.VIRTUAL).size(), 1);//, "Second Level human with class AbilityRichClass has 1 virtual feat"); pc.incrementClassLevel(1, arClass, true); map = pc.getAbilitiesSet(); - is(map.get(Ability.Nature.NORMAL).size(), eq(1), "Third Level human with class AbilityRichClass has 1 normal feat"); - is(map.get(Ability.Nature.AUTOMATIC).size(), eq(3), "Third Level human with class AbilityRichClass has 3 automatic feats"); - is(map.get(Ability.Nature.VIRTUAL).size(), eq(1), "Third Level human with class AbilityRichClass has 1 virtual feat"); + assertEquals(map.get(Ability.Nature.NORMAL).size(), 1);//, "Third Level human with class AbilityRichClass has 1 normal feat"); + assertEquals(map.get(Ability.Nature.AUTOMATIC).size(), 3);//, "Third Level human with class AbilityRichClass has 3 automatic feats"); + assertEquals(map.get(Ability.Nature.VIRTUAL).size(), 1);//, "Third Level human with class AbilityRichClass has 1 virtual feat"); GameMode gm = SettingsHandler.getGame(); AbilityCategory ac = gm.getAbilityCategory("FEAT"); Logging.errorPrint("Real abilities: " + pc.getRealAbilitiesList(ac).size()); } - + public void testIsNonAbility() { PlayerCharacter pc = getCharacter(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-08-05 00:22:22
|
Revision: 7345 http://pcgen.svn.sourceforge.net/pcgen/?rev=7345&view=rev Author: thpr Date: 2008-08-05 00:22:24 +0000 (Tue, 05 Aug 2008) Log Message: ----------- Equipment SIZE step 2 Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ObjectKey.java Trunk/pcgen/code/src/java/pcgen/core/Equipment.java Trunk/pcgen/code/src/java/pcgen/core/character/WieldCategory.java Trunk/pcgen/code/src/java/pcgen/gui/EqBuilder.java Trunk/pcgen/code/src/java/pcgen/gui/filter/FilterFactory.java Trunk/pcgen/code/src/java/pcgen/io/exporttoken/EqToken.java Trunk/pcgen/code/src/java/pcgen/io/exporttoken/WeaponhToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/NaturalattacksLst.java Trunk/pcgen/code/src/java/plugin/lsttokens/equipment/SizeToken.java Trunk/pcgen/code/src/test/pcgen/core/EquipmentListTest.java Trunk/pcgen/code/src/test/pcgen/core/EquipmentTest.java Trunk/pcgen/code/src/test/pcgen/core/prereq/PreEquipBothTest.java Trunk/pcgen/code/src/test/pcgen/core/prereq/PreEquipPrimaryTest.java Trunk/pcgen/code/src/test/pcgen/core/prereq/PreEquipSecondaryTest.java Trunk/pcgen/code/src/test/pcgen/core/prereq/PreEquipTest.java Trunk/pcgen/code/src/test/pcgen/core/prereq/PreEquipTwoWeaponTest.java Trunk/pcgen/code/src/test/pcgen/core/prereq/PreSizeTest.java Trunk/pcgen/code/src/test/pcgen/io/exporttoken/WeaponTokenTest.java Modified: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ObjectKey.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ObjectKey.java 2008-08-04 23:55:57 UTC (rev 7344) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ObjectKey.java 2008-08-05 00:22:24 UTC (rev 7345) @@ -1,308 +1,343 @@ -/* - * Copyright 2005 (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 - * - * Created on June 18, 2005. - * - * Current Ver: $Revision: 513 $ - * Last Editor: $Author: soulcatcher $ - * Last Edited: $Date: 2006-03-29 12:17:43 -0500 (Wed, 29 Mar 2006) $ - */ -package pcgen.cdom.enumeration; - -import java.lang.reflect.Field; -import java.math.BigDecimal; -import java.net.URI; -import java.util.Collection; -import java.util.HashSet; -import java.util.Map; - -import pcgen.base.util.CaseInsensitiveMap; -import pcgen.cdom.base.CDOMListObject; -import pcgen.cdom.base.Category; -import pcgen.cdom.content.ChallengeRating; -import pcgen.cdom.content.HitDie; -import pcgen.cdom.content.Modifier; -import pcgen.cdom.content.TransitionChoice; -import pcgen.cdom.list.ClassSkillList; -import pcgen.cdom.list.ClassSpellList; -import pcgen.cdom.list.DomainSpellList; -import pcgen.cdom.reference.CDOMSingleRef; -import pcgen.core.Ability; -import pcgen.core.ArmorProf; -import pcgen.core.Equipment; -import pcgen.core.PCAlignment; -import pcgen.core.PCStat; -import pcgen.core.ShieldProf; -import pcgen.core.WeaponProf; -import pcgen.core.character.WieldCategory; -import pcgen.core.spell.Spell; -import pcgen.util.enumeration.Load; -import pcgen.util.enumeration.Visibility; - -/** - * @author Tom Parker <th...@us...> - * - * This is a Typesafe enumeration of legal Object Characteristics of an object. - * It is designed to act as an index to a specific Objects within a - * CDOMObject. - * - * ObjectKeys are designed to store items in a CDOMObject in a type-safe - * fashion. Note that it is possible to use the ObjectKey to cast the object to - * the type of object stored by the ObjectKey. (This assists with Generics) - * - * A "default value" (may be null) must be provided at object construction (the - * default is provided when getSafe(ObjectKey) is called in CDOMObject). This - * default value is especially useful for Boolean ObjectKeys. - * - * @param <T> - * The class of object stored by this ObjectKey. - */ -public final class ObjectKey<T> -{ - - public static final ObjectKey<Boolean> USE_UNTRAINED = new ObjectKey<Boolean>(Boolean.TRUE); - - public static final ObjectKey<Boolean> EXCLUSIVE = new ObjectKey<Boolean>(Boolean.FALSE); - - public static final ObjectKey<URI> SOURCE_URI = new ObjectKey<URI>(null); - - public static final ObjectKey<PCAlignment> ALIGNMENT = new ObjectKey<PCAlignment>(null); - - public static final ObjectKey<Boolean> READ_ONLY = new ObjectKey<Boolean>(Boolean.FALSE); - - public static final ObjectKey<PCStat> KEY_STAT = new ObjectKey<PCStat>(null); - - public static final ObjectKey<SkillArmorCheck> ARMOR_CHECK = new ObjectKey<SkillArmorCheck>(SkillArmorCheck.NONE); - - public static final ObjectKey<Visibility> VISIBILITY = new ObjectKey<Visibility>(Visibility.DEFAULT); - - public static final ObjectKey<Boolean> REMOVABLE = new ObjectKey<Boolean>(Boolean.TRUE); - - public static final ObjectKey<SubRegion> SUBREGION = new ObjectKey<SubRegion>(null); - - public static final ObjectKey<Region> REGION = new ObjectKey<Region>(null); - - public static final ObjectKey<Boolean> USETEMPLATENAMEFORSUBREGION = new ObjectKey<Boolean>(Boolean.FALSE); - - public static final ObjectKey<Boolean> USETEMPLATENAMEFORREGION = new ObjectKey<Boolean>(Boolean.FALSE); - - public static final ObjectKey<Gender> GENDER_LOCK = new ObjectKey<Gender>(null); - - public static final ObjectKey<BigDecimal> FACE_WIDTH = new ObjectKey<BigDecimal>(null); - - public static final ObjectKey<BigDecimal> FACE_HEIGHT = new ObjectKey<BigDecimal>(null); - - public static final ObjectKey<Boolean> USETEMPLATENAMEFORSUBRACE = new ObjectKey<Boolean>(Boolean.FALSE); - - public static final ObjectKey<SubRace> SUBRACE = new ObjectKey<SubRace>(null); - - public static final ObjectKey<BigDecimal> CR_MODIFIER = new ObjectKey<BigDecimal>(BigDecimal.ZERO); - - public static final ObjectKey<RaceType> RACETYPE = new ObjectKey<RaceType>(null); - - public static final ObjectKey<BigDecimal> COST = new ObjectKey<BigDecimal>(BigDecimal.ZERO); - - public static final ObjectKey<PCStat> SPELL_STAT = new ObjectKey<PCStat>(null); - - public static final ObjectKey<Boolean> COST_DOUBLE = new ObjectKey<Boolean>(null); - - public static final ObjectKey<Boolean> ASSIGN_TO_ALL = new ObjectKey<Boolean>(Boolean.FALSE); - - public static final ObjectKey<EqModNameOpt> NAME_OPT = new ObjectKey<EqModNameOpt>(EqModNameOpt.NORMAL); - - public static final ObjectKey<EqModFormatCat> FORMAT = new ObjectKey<EqModFormatCat>(EqModFormatCat.PARENS); - - public static final ObjectKey<Boolean> ATTACKS_PROGRESS = new ObjectKey<Boolean>(Boolean.TRUE); - - public static final ObjectKey<WieldCategory> WIELD = new ObjectKey<WieldCategory>(null); - - public static final ObjectKey<BigDecimal> WEIGHT = new ObjectKey<BigDecimal>(BigDecimal.ZERO); - - public static final ObjectKey<BigDecimal> WEIGHT_MOD = new ObjectKey<BigDecimal>(BigDecimal.ZERO); - - public static final ObjectKey<CDOMSingleRef<WeaponProf>> WEAPON_PROF = new ObjectKey<CDOMSingleRef<WeaponProf>>(null); - - public static final ObjectKey<CDOMSingleRef<ArmorProf>> ARMOR_PROF = new ObjectKey<CDOMSingleRef<ArmorProf>>(null); - - public static final ObjectKey<CDOMSingleRef<ShieldProf>> SHIELD_PROF = new ObjectKey<CDOMSingleRef<ShieldProf>>(null); - - public static final ObjectKey<EqModControl> MOD_CONTROL = new ObjectKey<EqModControl>(EqModControl.YES); - - public static final ObjectKey<BigDecimal> CURRENT_COST = new ObjectKey<BigDecimal>(null); - - /* - * This MUST Stay Object! Otherwise the code hierarchy ends up with circular - * references/tangles - */ - public static final ObjectKey<Object> PARENT = new ObjectKey<Object>(null); - - public static final ObjectKey<Modifier<HitDie>> HITDIE = new ObjectKey<Modifier<HitDie>>(null); - - public static final ObjectKey<ChallengeRating> CHALLENGE_RATING = new ObjectKey<ChallengeRating>(ChallengeRating.ZERO); - - public static final ObjectKey<Boolean> USE_SPELL_SPELL_STAT = new ObjectKey<Boolean>(Boolean.FALSE); - - public static final ObjectKey<Boolean> CASTER_WITHOUT_SPELL_STAT = new ObjectKey<Boolean>(Boolean.FALSE); - - public static final ObjectKey<Boolean> SPELLBOOK = new ObjectKey<Boolean>(Boolean.FALSE); - - public static final ObjectKey<Boolean> MOD_TO_SKILLS = new ObjectKey<Boolean>(Boolean.TRUE); - - public static final ObjectKey<Boolean> MEMORIZE_SPELLS = new ObjectKey<Boolean>(Boolean.TRUE); - - public static final ObjectKey<Boolean> IS_MONSTER = new ObjectKey<Boolean>(null); - - public static final ObjectKey<Boolean> ALLOWBASECLASS = new ObjectKey<Boolean>(Boolean.TRUE); - - public static final ObjectKey<Boolean> HAS_BONUS_SPELL_STAT = new ObjectKey<Boolean>(null); - - public static final ObjectKey<PCStat> BONUS_SPELL_STAT = new ObjectKey<PCStat>(null); - - public static final ObjectKey<HitDie> LEVEL_HITDIE = new ObjectKey<HitDie>(HitDie.ZERO); - - public static final ObjectKey<ClassSpellList> CLASS_SPELLLIST = new ObjectKey<ClassSpellList>(null); - - public static final ObjectKey<DomainSpellList> DOMAIN_SPELLLIST = new ObjectKey<DomainSpellList>(null); - - public static final ObjectKey<TransitionChoice<CDOMListObject<Spell>>> SPELLLIST_CHOICE = new ObjectKey<TransitionChoice<CDOMListObject<Spell>>>(null); - - public static final ObjectKey<TransitionChoice<ClassSkillList>> SKILLLIST_CHOICE = new ObjectKey<TransitionChoice<ClassSkillList>>(null); - - public static final ObjectKey<Boolean> STACKS = new ObjectKey<Boolean>(Boolean.FALSE); - - public static final ObjectKey<Boolean> MULTIPLE_ALLOWED = new ObjectKey<Boolean>(Boolean.FALSE); - - public static final ObjectKey<BigDecimal> SELECTION_COST = new ObjectKey<BigDecimal>(BigDecimal.ONE); - - public static final ObjectKey<Boolean> NAME_PI = new ObjectKey<Boolean>(Boolean.FALSE); - - public static final ObjectKey<Boolean> DESC_PI = new ObjectKey<Boolean>(Boolean.FALSE); - - public static final ObjectKey<Category<Ability>> ABILITY_CAT = new ObjectKey<Category<Ability>>(null); - - public static final ObjectKey<Load> UNENCUMBERED_LOAD = new ObjectKey<Load>(Load.LIGHT); - - public static final ObjectKey<Load> UNENCUMBERED_ARMOR = new ObjectKey<Load>(Load.LIGHT); - - public static final ObjectKey<CDOMSingleRef<Equipment>> BASE_ITEM = new ObjectKey<CDOMSingleRef<Equipment>>(null); - - private static CaseInsensitiveMap<ObjectKey<?>> map = null; - - private final T defaultValue; - - private ObjectKey(T def) - { - defaultValue = def; - } - - public T getDefault() - { - return defaultValue; - } - - public T cast(Object o) - { - return (T) o; - } - - public static <OT> ObjectKey<OT> getKeyFor(Class<OT> c, String s) - { - if (map == null) - { - buildMap(); - } - /* - * CONSIDER This is actually not type safe, there is a case of asking - * for a String a second time with a different Class that ObjectKey - * currently does not handle. Two solutions: One, store this in a - * Two-Key map and allow a String to map to more than one ObjectKey - * given different output types (considered confusing) or Two, store the - * Class and validate that with a an error message if a different class - * is requested. - */ - ObjectKey<OT> o = (ObjectKey<OT>) map.get(s); - if (o == null) - { - o = new ObjectKey<OT>(null); - map.put(s, o); - } - return o; - } - - private static void buildMap() - { - map = new CaseInsensitiveMap<ObjectKey<?>>(); - Field[] fields = ObjectKey.class.getDeclaredFields(); - for (int i = 0; i < fields.length; i++) - { - int mod = fields[i].getModifiers(); - - if (java.lang.reflect.Modifier.isStatic(mod) - && java.lang.reflect.Modifier.isFinal(mod) - && java.lang.reflect.Modifier.isPublic(mod)) - { - try - { - Object o = fields[i].get(null); - if (o instanceof ObjectKey) - { - map.put(fields[i].getName(), (ObjectKey<?>) o); - } - } - catch (IllegalArgumentException e) - { - throw new InternalError(); - } - catch (IllegalAccessException e) - { - throw new InternalError(); - } - } - } - } - - @Override - public String toString() - { - /* - * CONSIDER Should this find a way to do a Two-Way Map or something to - * that effect? - */ - if (map == null) - { - buildMap(); - } - for (Map.Entry<?, ObjectKey<?>> me : map.entrySet()) - { - if (me.getValue() == this) - { - return me.getKey().toString(); - } - } - // Error - return ""; - } - - public static Collection<ObjectKey<?>> getAllConstants() - { - if (map == null) - { - buildMap(); - } - return new HashSet<ObjectKey<?>>(map.values()); - } -} +/* + * Copyright 2005 (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 + * + * Created on June 18, 2005. + * + * Current Ver: $Revision: 513 $ + * Last Editor: $Author: soulcatcher $ + * Last Edited: $Date: 2006-03-29 12:17:43 -0500 (Wed, 29 Mar 2006) $ + */ +package pcgen.cdom.enumeration; + +import java.lang.reflect.Field; +import java.math.BigDecimal; +import java.net.URI; +import java.util.Collection; +import java.util.HashSet; +import java.util.Map; + +import pcgen.base.util.CaseInsensitiveMap; +import pcgen.cdom.base.CDOMListObject; +import pcgen.cdom.base.Category; +import pcgen.cdom.content.ChallengeRating; +import pcgen.cdom.content.HitDie; +import pcgen.cdom.content.Modifier; +import pcgen.cdom.content.TransitionChoice; +import pcgen.cdom.list.ClassSkillList; +import pcgen.cdom.list.ClassSpellList; +import pcgen.cdom.list.DomainSpellList; +import pcgen.cdom.reference.CDOMSingleRef; +import pcgen.core.Ability; +import pcgen.core.ArmorProf; +import pcgen.core.Equipment; +import pcgen.core.PCAlignment; +import pcgen.core.PCStat; +import pcgen.core.SettingsHandler; +import pcgen.core.ShieldProf; +import pcgen.core.SizeAdjustment; +import pcgen.core.WeaponProf; +import pcgen.core.character.WieldCategory; +import pcgen.core.spell.Spell; +import pcgen.util.enumeration.Load; +import pcgen.util.enumeration.Visibility; + +/** + * @author Tom Parker <th...@us...> + * + * This is a Typesafe enumeration of legal Object Characteristics of an object. + * It is designed to act as an index to a specific Objects within a + * CDOMObject. + * + * ObjectKeys are designed to store items in a CDOMObject in a type-safe + * fashion. Note that it is possible to use the ObjectKey to cast the object to + * the type of object stored by the ObjectKey. (This assists with Generics) + * + * A "default value" (may be null) must be provided at object construction (the + * default is provided when getSafe(ObjectKey) is called in CDOMObject). This + * default value is especially useful for Boolean ObjectKeys. + * + * @param <T> + * The class of object stored by this ObjectKey. + */ +public class ObjectKey<T> +{ + + private static CaseInsensitiveMap<ObjectKey<?>> map = null; + + public static final ObjectKey<Boolean> USE_UNTRAINED = new ObjectKey<Boolean>(Boolean.TRUE); + + public static final ObjectKey<Boolean> EXCLUSIVE = new ObjectKey<Boolean>(Boolean.FALSE); + + public static final ObjectKey<URI> SOURCE_URI = new ObjectKey<URI>(null); + + public static final ObjectKey<PCAlignment> ALIGNMENT = new ObjectKey<PCAlignment>(null); + + public static final ObjectKey<Boolean> READ_ONLY = new ObjectKey<Boolean>(Boolean.FALSE); + + public static final ObjectKey<PCStat> KEY_STAT = new ObjectKey<PCStat>(null); + + public static final ObjectKey<SkillArmorCheck> ARMOR_CHECK = new ObjectKey<SkillArmorCheck>(SkillArmorCheck.NONE); + + public static final ObjectKey<Visibility> VISIBILITY = new ObjectKey<Visibility>(Visibility.DEFAULT); + + public static final ObjectKey<Boolean> REMOVABLE = new ObjectKey<Boolean>(Boolean.TRUE); + + public static final ObjectKey<SubRegion> SUBREGION = new ObjectKey<SubRegion>(null); + + public static final ObjectKey<Region> REGION = new ObjectKey<Region>(null); + + public static final ObjectKey<Boolean> USETEMPLATENAMEFORSUBREGION = new ObjectKey<Boolean>(Boolean.FALSE); + + public static final ObjectKey<Boolean> USETEMPLATENAMEFORREGION = new ObjectKey<Boolean>(Boolean.FALSE); + + public static final ObjectKey<Gender> GENDER_LOCK = new ObjectKey<Gender>(null); + + public static final ObjectKey<BigDecimal> FACE_WIDTH = new ObjectKey<BigDecimal>(null); + + public static final ObjectKey<BigDecimal> FACE_HEIGHT = new ObjectKey<BigDecimal>(null); + + public static final ObjectKey<Boolean> USETEMPLATENAMEFORSUBRACE = new ObjectKey<Boolean>(Boolean.FALSE); + + public static final ObjectKey<SubRace> SUBRACE = new ObjectKey<SubRace>(null); + + public static final ObjectKey<BigDecimal> CR_MODIFIER = new ObjectKey<BigDecimal>(BigDecimal.ZERO); + + public static final ObjectKey<RaceType> RACETYPE = new ObjectKey<RaceType>(null); + + public static final ObjectKey<BigDecimal> COST = new ObjectKey<BigDecimal>(BigDecimal.ZERO); + + public static final ObjectKey<PCStat> SPELL_STAT = new ObjectKey<PCStat>(null); + + public static final ObjectKey<Boolean> COST_DOUBLE = new ObjectKey<Boolean>(null); + + public static final ObjectKey<Boolean> ASSIGN_TO_ALL = new ObjectKey<Boolean>(Boolean.FALSE); + + public static final ObjectKey<EqModNameOpt> NAME_OPT = new ObjectKey<EqModNameOpt>(EqModNameOpt.NORMAL); + + public static final ObjectKey<EqModFormatCat> FORMAT = new ObjectKey<EqModFormatCat>(EqModFormatCat.PARENS); + + public static final ObjectKey<Boolean> ATTACKS_PROGRESS = new ObjectKey<Boolean>(Boolean.TRUE); + + public static final ObjectKey<WieldCategory> WIELD = new ObjectKey<WieldCategory>(null); + + public static final ObjectKey<BigDecimal> WEIGHT = new ObjectKey<BigDecimal>(BigDecimal.ZERO); + + public static final ObjectKey<BigDecimal> WEIGHT_MOD = new ObjectKey<BigDecimal>(BigDecimal.ZERO); + + public static final ObjectKey<CDOMSingleRef<WeaponProf>> WEAPON_PROF = new ObjectKey<CDOMSingleRef<WeaponProf>>(null); + + public static final ObjectKey<CDOMSingleRef<ArmorProf>> ARMOR_PROF = new ObjectKey<CDOMSingleRef<ArmorProf>>(null); + + public static final ObjectKey<CDOMSingleRef<ShieldProf>> SHIELD_PROF = new ObjectKey<CDOMSingleRef<ShieldProf>>(null); + + public static final ObjectKey<EqModControl> MOD_CONTROL = new ObjectKey<EqModControl>(EqModControl.YES); + + public static final ObjectKey<BigDecimal> CURRENT_COST = new ObjectKey<BigDecimal>(null); + + /* + * This MUST Stay Object! Otherwise the code hierarchy ends up with circular + * references/tangles + */ + public static final ObjectKey<Object> PARENT = new ObjectKey<Object>(null); + + public static final ObjectKey<Modifier<HitDie>> HITDIE = new ObjectKey<Modifier<HitDie>>(null); + + public static final ObjectKey<ChallengeRating> CHALLENGE_RATING = new ObjectKey<ChallengeRating>(ChallengeRating.ZERO); + + public static final ObjectKey<Boolean> USE_SPELL_SPELL_STAT = new ObjectKey<Boolean>(Boolean.FALSE); + + public static final ObjectKey<Boolean> CASTER_WITHOUT_SPELL_STAT = new ObjectKey<Boolean>(Boolean.FALSE); + + public static final ObjectKey<Boolean> SPELLBOOK = new ObjectKey<Boolean>(Boolean.FALSE); + + public static final ObjectKey<Boolean> MOD_TO_SKILLS = new ObjectKey<Boolean>(Boolean.TRUE); + + public static final ObjectKey<Boolean> MEMORIZE_SPELLS = new ObjectKey<Boolean>(Boolean.TRUE); + + public static final ObjectKey<Boolean> IS_MONSTER = new ObjectKey<Boolean>(null); + + public static final ObjectKey<Boolean> ALLOWBASECLASS = new ObjectKey<Boolean>(Boolean.TRUE); + + public static final ObjectKey<Boolean> HAS_BONUS_SPELL_STAT = new ObjectKey<Boolean>(null); + + public static final ObjectKey<PCStat> BONUS_SPELL_STAT = new ObjectKey<PCStat>(null); + + public static final ObjectKey<HitDie> LEVEL_HITDIE = new ObjectKey<HitDie>(HitDie.ZERO); + + public static final ObjectKey<ClassSpellList> CLASS_SPELLLIST = new ObjectKey<ClassSpellList>(null); + + public static final ObjectKey<DomainSpellList> DOMAIN_SPELLLIST = new ObjectKey<DomainSpellList>(null); + + public static final ObjectKey<TransitionChoice<CDOMListObject<Spell>>> SPELLLIST_CHOICE = new ObjectKey<TransitionChoice<CDOMListObject<Spell>>>(null); + + public static final ObjectKey<TransitionChoice<ClassSkillList>> SKILLLIST_CHOICE = new ObjectKey<TransitionChoice<ClassSkillList>>(null); + + public static final ObjectKey<Boolean> STACKS = new ObjectKey<Boolean>(Boolean.FALSE); + + public static final ObjectKey<Boolean> MULTIPLE_ALLOWED = new ObjectKey<Boolean>(Boolean.FALSE); + + public static final ObjectKey<BigDecimal> SELECTION_COST = new ObjectKey<BigDecimal>(BigDecimal.ONE); + + public static final ObjectKey<Boolean> NAME_PI = new ObjectKey<Boolean>(Boolean.FALSE); + + public static final ObjectKey<Boolean> DESC_PI = new ObjectKey<Boolean>(Boolean.FALSE); + + public static final ObjectKey<Category<Ability>> ABILITY_CAT = new ObjectKey<Category<Ability>>(null); + + public static final ObjectKey<Load> UNENCUMBERED_LOAD = new ObjectKey<Load>(Load.LIGHT); + + public static final ObjectKey<Load> UNENCUMBERED_ARMOR = new ObjectKey<Load>(Load.LIGHT); + + public static final ObjectKey<CDOMSingleRef<Equipment>> BASE_ITEM = new ObjectKey<CDOMSingleRef<Equipment>>(null); + + public static final ObjectKey<SizeAdjustment> BASESIZE; + + public static final ObjectKey<SizeAdjustment> SIZE; + + /* + * TODO Okay, this is a hack. + */ + + static + { + buildMap(); + BASESIZE = new ObjectKey<SizeAdjustment>(null) + { + @Override + public SizeAdjustment getDefault() + { + return SettingsHandler.getGame().getDefaultSizeAdjustment(); + } + + }; + map.put(BASESIZE.toString(), BASESIZE); + SIZE = new ObjectKey<SizeAdjustment>(null) + { + @Override + public SizeAdjustment getDefault() + { + return SettingsHandler.getGame().getDefaultSizeAdjustment(); + } + + }; + map.put(SIZE.toString(), SIZE); + } + + private final T defaultValue; + + private ObjectKey(T def) + { + defaultValue = def; + } + + public T getDefault() + { + return defaultValue; + } + + public T cast(Object o) + { + return (T) o; + } + + public static <OT> ObjectKey<OT> getKeyFor(Class<OT> c, String s) + { + if (map == null) + { + buildMap(); + } + /* + * CONSIDER This is actually not type safe, there is a case of asking + * for a String a second time with a different Class that ObjectKey + * currently does not handle. Two solutions: One, store this in a + * Two-Key map and allow a String to map to more than one ObjectKey + * given different output types (considered confusing) or Two, store the + * Class and validate that with a an error message if a different class + * is requested. + */ + ObjectKey<OT> o = (ObjectKey<OT>) map.get(s); + if (o == null) + { + o = new ObjectKey<OT>(null); + map.put(s, o); + } + return o; + } + + private static void buildMap() + { + map = new CaseInsensitiveMap<ObjectKey<?>>(); + Field[] fields = ObjectKey.class.getDeclaredFields(); + for (int i = 0; i < fields.length; i++) + { + int mod = fields[i].getModifiers(); + + if (java.lang.reflect.Modifier.isStatic(mod) + && java.lang.reflect.Modifier.isFinal(mod) + && java.lang.reflect.Modifier.isPublic(mod)) + { + try + { + Object o = fields[i].get(null); + if (o instanceof ObjectKey) + { + map.put(fields[i].getName(), (ObjectKey<?>) o); + } + } + catch (IllegalArgumentException e) + { + throw new InternalError(); + } + catch (IllegalAccessException e) + { + throw new InternalError(); + } + } + } + } + + @Override + public String toString() + { + /* + * CONSIDER Should this find a way to do a Two-Way Map or something to + * that effect? + */ + if (map == null) + { + buildMap(); + } + for (Map.Entry<?, ObjectKey<?>> me : map.entrySet()) + { + if (me.getValue() == this) + { + return me.getKey().toString(); + } + } + // Error + return ""; + } + + public static Collection<ObjectKey<?>> getAllConstants() + { + if (map == null) + { + buildMap(); + } + return new HashSet<ObjectKey<?>>(map.values()); + } +} Modified: Trunk/pcgen/code/src/java/pcgen/core/Equipment.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Equipment.java 2008-08-04 23:55:57 UTC (rev 7344) +++ Trunk/pcgen/code/src/java/pcgen/core/Equipment.java 2008-08-05 00:22:24 UTC (rev 7345) @@ -226,11 +226,6 @@ // player added note private String noteString = ""; - // How fast the weapon can be fired. - private SizeAdjustment size = null; - - private SizeAdjustment sizeBase = null; - private boolean automatic = false; private boolean bonusPrimary = true; @@ -262,7 +257,7 @@ final SizeAdjustment sizeAdj = SettingsHandler.getGame() .getDefaultSizeAdjustment(); if (sizeAdj != null) { - setSize(sizeAdj); + put(ObjectKey.SIZE, sizeAdj); } } @@ -1225,10 +1220,9 @@ // // Put size in name if not the same as the base item // - final int iSize = Globals.sizeInt(getSizeAdj()); - if (Globals.sizeInt(getBaseSize()) != iSize) { - itemName.append((SettingsHandler.getGame() - .getSizeAdjustmentAtIndex(iSize)).getDisplayName()); + SizeAdjustment thisSize = getSafe(ObjectKey.SIZE); + if (!getSafe(ObjectKey.BASESIZE).equals(thisSize)) { + itemName.append(thisSize.getDisplayName()); itemName.append('/'); } @@ -1856,24 +1850,15 @@ return displayName; } - public void setBaseSize(SizeAdjustment sa) - { - sizeBase = sa; - } - /** * Gets the size attribute of the Equipment object * * @return The size value */ public String getSize() { - return size.getAbbreviation(); + return getSafe(ObjectKey.SIZE).getAbbreviation(); } - public SizeAdjustment getSizeAdj() { - return size; - } - /** * The number of "Slots" that this item requires The slot type is derived * from system/special/equipmentslot.lst @@ -2863,8 +2848,9 @@ this.getKeyName()); } - if (!size.equals(base.getSizeAdj())) { - sbuf.append(sep).append("SIZE").append(endPart).append(size); + SizeAdjustment thisSize = getSafe(ObjectKey.SIZE); + if (!thisSize.equals(base.getSafe(ObjectKey.SIZE))) { + sbuf.append(sep).append("SIZE").append(endPart).append(thisSize); } String aString = getEqModifierString(true); // key1.key2|assoc1|assoc2.key3.key4 @@ -3026,7 +3012,7 @@ final String endPart, final PlayerCharacter aPC) { final StringTokenizer aTok = new StringTokenizer(aLine, sep); final int endPartLen = endPart.length(); - String newSize = size.getAbbreviation(); + String newSize = getSize(); while (aTok.hasMoreTokens()) { final String aString = aTok.nextToken(); @@ -3414,7 +3400,7 @@ * @return size as int */ public int sizeInt() { - return Globals.sizeInt(getSizeAdj()); + return Globals.sizeInt(getSafe(ObjectKey.SIZE)); } /** @@ -3766,15 +3752,6 @@ } /** - * Gets the baseSize attribute of the Equipment object - * - * @return The baseSize value - */ - private SizeAdjustment getBaseSize() { - return sizeBase; - } - - /** * Gets the acceptsTypes attribute of the Equipment object * * @param aString @@ -3819,7 +3796,7 @@ // final SizeAdjustment saSize = SettingsHandler.getGame() .getSizeAdjustmentNamed(aSize); - final SizeAdjustment saBase = getBaseSize(); + final SizeAdjustment saBase = get(ObjectKey.BASESIZE); if ((saSize == null) || (saBase == null)) { return c; @@ -3963,14 +3940,9 @@ sizeString = sizeString.toUpperCase().substring(0, 1); } - setSize(SettingsHandler.getGame().getSizeAdjustmentNamed(sizeString)); + put(ObjectKey.SIZE, SettingsHandler.getGame().getSizeAdjustmentNamed(sizeString)); } - public void setSize(SizeAdjustment sz) - { - size = sz; - } - /** * Gets the specialAbilityList attribute of the Equipment object * @@ -4131,7 +4103,7 @@ final SizeAdjustment newSA = SettingsHandler.getGame() .getSizeAdjustmentNamed(aSize); - final SizeAdjustment currSA = getSizeAdj(); + final SizeAdjustment currSA = getSafe(ObjectKey.SIZE); if ((newSA == null) || (currSA == null)) { return getBaseWeight(); @@ -4197,7 +4169,7 @@ double mult = 1.0; final SizeAdjustment newSA = SettingsHandler.getGame() .getSizeAdjustmentNamed(aSize); - final SizeAdjustment currSA = baseEq.getSizeAdj(); + final SizeAdjustment currSA = baseEq.getSafe(ObjectKey.SIZE); if ((newSA != null) && (currSA != null)) { mult = newSA.getBonusTo(aPC, "ACVALUE", baseEq.typeList(), 1.0) @@ -4975,12 +4947,9 @@ String thisName = getName(); String upName = thisName.toUpperCase(); - String thisSize = getSize(); - // Get the full name of the current size - sa = getSizeAdj(); - thisSize = (sa == null) ? "Medium" : sa.getDisplayName(); - String upThisSize = thisSize.toUpperCase(); + sa = getSafe(ObjectKey.SIZE); + String upThisSize = sa.getDisplayName().toUpperCase(); int start = upName.indexOf(upThisSize); int end = start + upThisSize.length(); Modified: Trunk/pcgen/code/src/java/pcgen/core/character/WieldCategory.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/character/WieldCategory.java 2008-08-04 23:55:57 UTC (rev 7344) +++ Trunk/pcgen/code/src/java/pcgen/core/character/WieldCategory.java 2008-08-05 00:22:24 UTC (rev 7345) @@ -195,7 +195,7 @@ final int newSizeInt = eq.sizeInt() + aBump; final SizeAdjustment sadj = SettingsHandler.getGame(). getSizeAdjustmentAtIndex(newSizeInt); - eq.setSize(sadj); + eq.put(ObjectKey.SIZE, sadj); } } final PrerequisiteParserInterface parser = PreParserFactory. @@ -233,7 +233,7 @@ Logging.errorPrint(ple.getMessage(), ple); } } - eq.setSize(SettingsHandler.getGame().getSizeAdjustmentNamed(oldEqSize)); + eq.put(ObjectKey.SIZE, SettingsHandler.getGame().getSizeAdjustmentNamed(oldEqSize)); } catch (PersistenceLayerException ple) { Modified: Trunk/pcgen/code/src/java/pcgen/gui/EqBuilder.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/EqBuilder.java 2008-08-04 23:55:57 UTC (rev 7344) +++ Trunk/pcgen/code/src/java/pcgen/gui/EqBuilder.java 2008-08-05 00:22:24 UTC (rev 7345) @@ -78,7 +78,6 @@ import pcgen.core.PObject; import pcgen.core.PlayerCharacter; import pcgen.core.SettingsHandler; -import pcgen.core.SizeAdjustment; import pcgen.core.SpecialProperty; import pcgen.core.prereq.PrerequisiteUtilities; import pcgen.core.spell.Spell; @@ -364,7 +363,7 @@ jButtonDamage.setVisible(aEq.isWeapon()); - setItemSize(aEq.getSizeAdj().getDisplayName()); + setItemSize(aEq.getSafe(ObjectKey.SIZE).getDisplayName()); if (!bReloading) { Modified: Trunk/pcgen/code/src/java/pcgen/gui/filter/FilterFactory.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/filter/FilterFactory.java 2008-08-04 23:55:57 UTC (rev 7344) +++ Trunk/pcgen/code/src/java/pcgen/gui/filter/FilterFactory.java 2008-08-05 00:22:24 UTC (rev 7345) @@ -1670,7 +1670,7 @@ if (pObject instanceof Equipment) { - return ((Equipment) pObject).getSizeAdj().equals(SettingsHandler.getGame().getSizeAdjustmentAtIndex( + return ((Equipment) pObject).getSafe(ObjectKey.SIZE).equals(SettingsHandler.getGame().getSizeAdjustmentAtIndex( aPC.sizeInt())); } @@ -2463,7 +2463,7 @@ if (pObject instanceof Equipment) { - return ((Equipment) pObject).getSizeAdj().equals( + return ((Equipment) pObject).getSafe(ObjectKey.SIZE).equals( SettingsHandler.getGame().getSizeAdjustmentAtIndex(size)); } else if (pObject instanceof Race) Modified: Trunk/pcgen/code/src/java/pcgen/io/exporttoken/EqToken.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/exporttoken/EqToken.java 2008-08-04 23:55:57 UTC (rev 7344) +++ Trunk/pcgen/code/src/java/pcgen/io/exporttoken/EqToken.java 2008-08-05 00:22:24 UTC (rev 7345) @@ -33,6 +33,7 @@ import pcgen.cdom.base.Constants; import pcgen.cdom.enumeration.IntegerKey; import pcgen.cdom.enumeration.ListKey; +import pcgen.cdom.enumeration.ObjectKey; import pcgen.cdom.helper.Quality; import pcgen.core.Equipment; import pcgen.core.EquipmentUtilities; @@ -854,7 +855,7 @@ */ public static String getSizeLongToken(Equipment eq) { - return eq.getSizeAdj().getDisplayName(); + return eq.getSafe(ObjectKey.SIZE).getDisplayName(); } /** Modified: Trunk/pcgen/code/src/java/pcgen/io/exporttoken/WeaponhToken.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/exporttoken/WeaponhToken.java 2008-08-04 23:55:57 UTC (rev 7344) +++ Trunk/pcgen/code/src/java/pcgen/io/exporttoken/WeaponhToken.java 2008-08-05 00:22:24 UTC (rev 7345) @@ -142,8 +142,8 @@ } SizeAdjustment sa = SettingsHandler.getGame().getSizeAdjustmentNamed(sizeString); - eq.setSize(sa); - eq.setBaseSize(sa); + eq.put(ObjectKey.SIZE, sa); + eq.put(ObjectKey.BASESIZE, sa); return eq; } Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/NaturalattacksLst.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/NaturalattacksLst.java 2008-08-04 23:55:57 UTC (rev 7344) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/NaturalattacksLst.java 2008-08-05 00:22:24 UTC (rev 7345) @@ -185,8 +185,8 @@ } SizeAdjustment sa = SettingsHandler.getGame().getSizeAdjustmentNamed(aSize); - anEquip.setSize(sa); - anEquip.setBaseSize(sa); + anEquip.put(ObjectKey.SIZE, sa); + anEquip.put(ObjectKey.BASESIZE, sa); String numAttacks = aTok.nextToken(); boolean attacksProgress = true; Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/equipment/SizeToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/equipment/SizeToken.java 2008-08-04 23:55:57 UTC (rev 7344) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/equipment/SizeToken.java 2008-08-05 00:22:24 UTC (rev 7345) @@ -1,14 +1,16 @@ package plugin.lsttokens.equipment; +import pcgen.cdom.enumeration.ObjectKey; import pcgen.core.Equipment; -import pcgen.core.SettingsHandler; import pcgen.core.SizeAdjustment; -import pcgen.persistence.lst.EquipmentLstToken; +import pcgen.rules.context.LoadContext; +import pcgen.rules.persistence.token.CDOMPrimaryToken; +import pcgen.util.Logging; /** * Deals with SIZE token */ -public class SizeToken implements EquipmentLstToken +public class SizeToken implements CDOMPrimaryToken<Equipment> { public String getTokenName() @@ -16,15 +18,35 @@ return "SIZE"; } - public boolean parse(Equipment eq, String value) + public boolean parse(LoadContext context, Equipment eq, String value) { - if (value.length() > 1) { - value = value.toUpperCase().substring(0, 1); + SizeAdjustment size = + context.ref.getAbbreviatedObject(SizeAdjustment.class, + value); + if (size == null) + { + Logging.errorPrint("Unable to find Size: " + value); + return false; } - - SizeAdjustment sa = SettingsHandler.getGame().getSizeAdjustmentNamed(value); - eq.setSize(sa); - eq.setBaseSize(sa); + context.getObjectContext().put(eq, ObjectKey.BASESIZE, size); + context.getObjectContext().put(eq, ObjectKey.SIZE, size); return true; } + + public String[] unparse(LoadContext context, Equipment eq) + { + SizeAdjustment res = context.getObjectContext().getObject(eq, + ObjectKey.BASESIZE); + if (res == null) + { + return null; + } + return new String[]{res.getAbbreviation()}; + } + + public Class<Equipment> getTokenClass() + { + return Equipment.class; + } + } Modified: Trunk/pcgen/code/src/test/pcgen/core/EquipmentListTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/EquipmentListTest.java 2008-08-04 23:55:57 UTC (rev 7344) +++ Trunk/pcgen/code/src/test/pcgen/core/EquipmentListTest.java 2008-08-05 00:22:24 UTC (rev 7345) @@ -27,6 +27,7 @@ import junit.framework.Test; import junit.framework.TestSuite; import pcgen.PCGenTestCase; +import pcgen.cdom.enumeration.ObjectKey; import pcgen.util.TestHelper; /** @@ -94,8 +95,8 @@ this.eq = new Equipment(); this.eq.setName("Dummy"); SizeAdjustment sa = SettingsHandler.getGame().getSizeAdjustmentNamed("M"); - eq.setSize(sa); - eq.setBaseSize(sa); + eq.put(ObjectKey.SIZE, sa); + eq.put(ObjectKey.BASESIZE, sa); this.eq.setTypeInfo("WEAPON.MELEE.CHOCOLATE"); this.eq.setKeyName(originalKey); Modified: Trunk/pcgen/code/src/test/pcgen/core/EquipmentTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/EquipmentTest.java 2008-08-04 23:55:57 UTC (rev 7344) +++ Trunk/pcgen/code/src/test/pcgen/core/EquipmentTest.java 2008-08-05 00:22:24 UTC (rev 7345) @@ -97,8 +97,8 @@ this.eq = new Equipment(); this.eq.setName("Dummy"); SizeAdjustment sa = SettingsHandler.getGame().getSizeAdjustmentNamed("M"); - eq.setSize(sa); - eq.setBaseSize(sa); + eq.put(ObjectKey.SIZE, sa); + eq.put(ObjectKey.BASESIZE, sa); this.eq.setKeyName(this.OriginalKey); } @@ -212,7 +212,7 @@ public void testcreateNameForAutoResize005() { String newKey = eq.createKeyForAutoResize("L"); - eq.setSize(SettingsHandler.getGame().getSizeAdjustmentNamed("L")); + eq.put(ObjectKey.SIZE, SettingsHandler.getGame().getSizeAdjustmentNamed("L")); eq.setName("Pointy Stick (Large)"); eq.setKeyName(newKey); @@ -233,7 +233,9 @@ public void testcreateNameForAutoResize006() { String newKey = eq.createKeyForAutoResize("L"); - eq.setSize(SettingsHandler.getGame().getSizeAdjustmentNamed("L")); + SizeAdjustment sal = SettingsHandler.getGame().getSizeAdjustmentNamed("L"); + eq.put(ObjectKey.SIZE, sal); + eq.put(ObjectKey.BASESIZE, sal); eq.setName("Pointy Stick (+1/Large)"); eq.setKeyName(newKey); @@ -254,7 +256,7 @@ public void testcreateNameForAutoResize007() { String newKey = eq.createKeyForAutoResize("L"); - eq.setSize(SettingsHandler.getGame().getSizeAdjustmentNamed("L")); + eq.put(ObjectKey.SIZE, SettingsHandler.getGame().getSizeAdjustmentNamed("L")); eq.setName("Pointy Stick (+1/Large/Speed)"); eq.setKeyName(newKey); @@ -274,7 +276,7 @@ public void testcreateNameForAutoResize008() { String newKey = eq.createKeyForAutoResize("L"); - eq.setSize(SettingsHandler.getGame().getSizeAdjustmentNamed("L")); + eq.put(ObjectKey.SIZE, SettingsHandler.getGame().getSizeAdjustmentNamed("L")); eq.setName("Pointy Stick (+1/Speed)"); eq.setKeyName(newKey); Modified: Trunk/pcgen/code/src/test/pcgen/core/prereq/PreEquipBothTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/prereq/PreEquipBothTest.java 2008-08-04 23:55:57 UTC (rev 7344) +++ Trunk/pcgen/code/src/test/pcgen/core/prereq/PreEquipBothTest.java 2008-08-05 00:22:24 UTC (rev 7345) @@ -144,15 +144,15 @@ // Test 3.0 Style SizeAdjustment sa = SettingsHandler.getGame().getSizeAdjustmentNamed("M"); - longsword.setSize(sa); - longsword.setBaseSize(sa); + longsword.put(ObjectKey.SIZE, sa); + longsword.put(ObjectKey.BASESIZE, sa); assertTrue("Weapon is M therefore OneHanded", PrereqHandler.passes( prereq, character, null)); sa = SettingsHandler.getGame().getSizeAdjustmentNamed("L"); - longsword.setSize(sa); - longsword.setBaseSize(sa); + longsword.put(ObjectKey.SIZE, sa); + longsword.put(ObjectKey.BASESIZE, sa); assertFalse("Weapon is L therefore TwoHanded", PrereqHandler.passes( prereq, character, null)); Modified: Trunk/pcgen/code/src/test/pcgen/core/prereq/PreEquipPrimaryTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/prereq/PreEquipPrimaryTest.java 2008-08-04 23:55:57 UTC (rev 7344) +++ Trunk/pcgen/code/src/test/pcgen/core/prereq/PreEquipPrimaryTest.java 2008-08-05 00:22:24 UTC (rev 7345) @@ -144,15 +144,15 @@ // Test 3.0 Style SizeAdjustment sa = SettingsHandler.getGame().getSizeAdjustmentNamed("M"); - longsword.setSize(sa); - longsword.setBaseSize(sa); + longsword.put(ObjectKey.SIZE, sa); + longsword.put(ObjectKey.BASESIZE, sa); assertTrue("Weapon is M therefore OneHanded", PrereqHandler.passes( prereq, character, null)); sa = SettingsHandler.getGame().getSizeAdjustmentNamed("L"); - longsword.setSize(sa); - longsword.setBaseSize(sa); + longsword.put(ObjectKey.SIZE, sa); + longsword.put(ObjectKey.BASESIZE, sa); assertFalse("Weapon is L therefore TwoHanded", PrereqHandler.passes( prereq, character, null)); Modified: Trunk/pcgen/code/src/test/pcgen/core/prereq/PreEquipSecondaryTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/prereq/PreEquipSecondaryTest.java 2008-08-04 23:55:57 UTC (rev 7344) +++ Trunk/pcgen/code/src/test/pcgen/core/prereq/PreEquipSecondaryTest.java 2008-08-05 00:22:24 UTC (rev 7345) @@ -144,15 +144,15 @@ // Test 3.0 Style SizeAdjustment sa = SettingsHandler.getGame().getSizeAdjustmentNamed("S"); - longsword.setSize(sa); - longsword.setBaseSize(sa); + longsword.put(ObjectKey.SIZE, sa); + longsword.put(ObjectKey.BASESIZE, sa); assertTrue("Weapon is S therefore Light", PrereqHandler.passes(prereq, character, null)); sa = SettingsHandler.getGame().getSizeAdjustmentNamed("M"); - longsword.setSize(sa); - longsword.setBaseSize(sa); + longsword.put(ObjectKey.SIZE, sa); + longsword.put(ObjectKey.BASESIZE, sa); assertFalse("Weapon is M therefore OneHanded", PrereqHandler.passes( prereq, character, null)); Modified: Trunk/pcgen/code/src/test/pcgen/core/prereq/PreEquipTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/prereq/PreEquipTest.java 2008-08-04 23:55:57 UTC (rev 7344) +++ Trunk/pcgen/code/src/test/pcgen/core/prereq/PreEquipTest.java 2008-08-05 00:22:24 UTC (rev 7345) @@ -151,15 +151,15 @@ // Test 3.0 Style SizeAdjustment sa = SettingsHandler.getGame().getSizeAdjustmentNamed("M"); - longsword.setSize(sa); - longsword.setBaseSize(sa); + longsword.put(ObjectKey.SIZE, sa); + longsword.put(ObjectKey.BASESIZE, sa); assertTrue("Weapon is M therefore OneHanded", PrereqHandler.passes( prereq, character, null)); sa = SettingsHandler.getGame().getSizeAdjustmentNamed("L"); - longsword.setSize(sa); - longsword.setBaseSize(sa); + longsword.put(ObjectKey.SIZE, sa); + longsword.put(ObjectKey.BASESIZE, sa); assertFalse("Weapon is L therefore TwoHanded", PrereqHandler.passes( prereq, character, null)); Modified: Trunk/pcgen/code/src/test/pcgen/core/prereq/PreEquipTwoWeaponTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/prereq/PreEquipTwoWeaponTest.java 2008-08-04 23:55:57 UTC (rev 7344) +++ Trunk/pcgen/code/src/test/pcgen/core/prereq/PreEquipTwoWeaponTest.java 2008-08-05 00:22:24 UTC (rev 7345) @@ -144,15 +144,15 @@ // Test 3.0 Style SizeAdjustment sa = SettingsHandler.getGame().getSizeAdjustmentNamed("M"); - longsword.setSize(sa); - longsword.setBaseSize(sa); + longsword.put(ObjectKey.SIZE, sa); + longsword.put(ObjectKey.BASESIZE, sa); assertTrue("Weapon is M therefore OneHanded", PrereqHandler.passes( prereq, character, null)); sa = SettingsHandler.getGame().getSizeAdjustmentNamed("L"); - longsword.setSize(sa); - longsword.setBaseSize(sa); + longsword.put(ObjectKey.SIZE, sa); + longsword.put(ObjectKey.BASESIZE, sa); assertFalse("Weapon is L therefore TwoHanded", PrereqHandler.passes( prereq, character, null)); Modified: Trunk/pcgen/code/src/test/pcgen/core/prereq/PreSizeTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/prereq/PreSizeTest.java 2008-08-04 23:55:57 UTC (rev 7344) +++ Trunk/pcgen/code/src/test/pcgen/core/prereq/PreSizeTest.java 2008-08-05 00:22:24 UTC (rev 7345) @@ -29,9 +29,13 @@ import pcgen.AbstractCharacterTestCase; import pcgen.core.Equipment; import pcgen.core.EquipmentList; +import pcgen.core.Globals; import pcgen.core.PlayerCharacter; import pcgen.core.Race; +import pcgen.core.SettingsHandler; +import pcgen.core.SizeAdjustment; import pcgen.persistence.lst.prereq.PreParserFactory; +import pcgen.rules.context.LoadContext; import pcgen.util.TestHelper; public class PreSizeTest extends AbstractCharacterTestCase @@ -46,6 +50,12 @@ super.setUp(); final PlayerCharacter character = getCharacter(); + LoadContext context = Globals.getContext(); + for (SizeAdjustment sz : SettingsHandler.getGame() + .getUnmodifiableSizeAdjustmentList()) + { + context.ref.registerAbbreviation(sz, sz.getAbbreviation()); + } TestHelper.makeEquipment("Item One\tTYPE:Goods.Magic\tSIZE:S"); TestHelper.makeEquipment("Item Two\tTYPE:Goods.General\tSIZE:M"); Modified: Trunk/pcgen/code/src/test/pcgen/io/exporttoken/WeaponTokenTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/io/exporttoken/WeaponTokenTest.java 2008-08-04 23:55:57 UTC (rev 7344) +++ Trunk/pcgen/code/src/test/pcgen/io/exporttoken/WeaponTokenTest.java 2008-08-05 00:22:24 UTC (rev 7345) @@ -156,8 +156,8 @@ dblWpn.put(IntegerKey.SLOTS, 2); dblWpn.put(ObjectKey.WIELD, WieldCategory.findByName("TwoHanded")); SizeAdjustment sam = SettingsHandler.getGame().getSizeAdjustmentNamed("M"); - dblWpn.setSize(sam); - dblWpn.setBaseSize(sam); + dblWpn.put(ObjectKey.SIZE, sam); + dblWpn.put(ObjectKey.BASESIZE, sam); character.addEquipment(dblWpn); EquipSet def = new EquipSet("0.1", "Default"); character.addEquipSet(def); @@ -189,8 +189,8 @@ bastardSword.getEquipmentHead(1).put(IntegerKey.CRIT_MULT, 2); bastardSword.getEquipmentHead(1).put(IntegerKey.CRIT_RANGE, 2); bastardSword.put(ObjectKey.WIELD, WieldCategory.findByName("TwoHanded")); - bastardSword.setSize(sam); - bastardSword.setBaseSize(sam); + bastardSword.put(ObjectKey.SIZE, sam); + bastardSword.put(ObjectKey.BASESIZE, sam); wp = new WeaponProf(); wp.setName("Longsword"); @@ -210,8 +210,8 @@ largeSword.getEquipmentHead(1).put(IntegerKey.CRIT_RANGE, 2); largeSword.put(ObjectKey.WIELD, WieldCategory.findByName("OneHanded")); SizeAdjustment sal = SettingsHandler.getGame().getSizeAdjustmentNamed("L"); - largeSword.setSize(sal); - largeSword.setBaseSize(sal); + largeSword.put(ObjectKey.SIZE, sal); + largeSword.put(ObjectKey.BASESIZE, sal); fineSword = new Equipment(); fineSword.setName("Longsword (Fine)"); @@ -224,8 +224,8 @@ fineSword.getEquipmentHead(1).put(IntegerKey.CRIT_MULT, 2); fineSword.getEquipmentHead(1).put(IntegerKey.CRIT_RANGE, 2); fineSword.put(ObjectKey.WIELD, WieldCategory.findByName("OneHanded")); - fineSword.setSize(sam); - fineSword.setBaseSize(sam); + fineSword.put(ObjectKey.SIZE, sam); + fineSword.put(ObjectKey.BASESIZE, sam); longSpear = new Equipment(); longSpear.setName("Longspear"); @@ -236,8 +236,8 @@ longSpear.getEquipmentHead(1).put(IntegerKey.CRIT_MULT, 2); longSpear.getEquipmentHead(1).put(IntegerKey.CRIT_RANGE, 1); longSpear.put(ObjectKey.WIELD, WieldCategory.findByName("TwoHanded")); - longSpear.setSize(sam); - longSpear.setBaseSize(sam); + longSpear.put(ObjectKey.SIZE, sam); + longSpear.put(ObjectKey.BASESIZE, sam); longSpear.put(IntegerKey.REACH, 10); GameMode gm = SettingsHandler.getGame(); @@ -262,8 +262,8 @@ bite.put(StringKey.OUTPUT_NAME, "Silly Bite (For Test)"); bite.setTypeInfo("Weapon.Natural.Melee.Finesseable.Bludgeoning.Piercing.Slashing"); bite.put(ObjectKey.WEIGHT, BigDecimal.ZERO); - bite.setSize(sam); - bite.setBaseSize(sam); + bite.put(ObjectKey.SIZE, sam); + bite.put(ObjectKey.BASESIZE, sam); bite.addBonusList("WEAPON|ATTACKS|" + 7); bite.setOnlyNaturalWeapon(false); bite.put(IntegerKey.SLOTS, 0); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-08-05 02:07:06
|
Revision: 7347 http://pcgen.svn.sourceforge.net/pcgen/?rev=7347&view=rev Author: thpr Date: 2008-08-05 02:07:09 +0000 (Tue, 05 Aug 2008) Log Message: ----------- Equipment SIZE step 3 Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/Equipment.java Trunk/pcgen/code/src/java/pcgen/core/EquipmentList.java Trunk/pcgen/code/src/java/pcgen/core/kit/KitGear.java Trunk/pcgen/code/src/java/pcgen/core/npcgen/EquipmentItem.java Trunk/pcgen/code/src/java/pcgen/gui/EqBuilder.java Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoGear.java Trunk/pcgen/code/src/java/pcgen/gui/tabs/TabUtils.java Trunk/pcgen/code/src/java/pcgen/io/PCGVer0Parser.java Trunk/pcgen/code/src/test/pcgen/core/EquipmentTest.java Modified: Trunk/pcgen/code/src/java/pcgen/core/Equipment.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Equipment.java 2008-08-05 00:58:45 UTC (rev 7346) +++ Trunk/pcgen/code/src/java/pcgen/core/Equipment.java 2008-08-05 02:07:09 UTC (rev 7347) @@ -3012,7 +3012,7 @@ final String endPart, final PlayerCharacter aPC) { final StringTokenizer aTok = new StringTokenizer(aLine, sep); final int endPartLen = endPart.length(); - String newSize = getSize(); + SizeAdjustment newSize = getSafe(ObjectKey.SIZE); while (aTok.hasMoreTokens()) { final String aString = aTok.nextToken(); @@ -3022,7 +3022,8 @@ } else if (aString.startsWith("KEY" + endPart)) { setKeyName(aString.substring(3 + endPartLen)); } else if (aString.startsWith("SIZE" + endPart)) { - newSize = aString.substring(4 + endPartLen); + newSize = SettingsHandler.getGame().getSizeAdjustmentNamed( + aString.substring(4 + endPartLen)); } else if (aString.startsWith("EQMOD" + endPart)) { addEqModifiers(aString.substring(5 + endPartLen), true, true); } else if (aString.startsWith("ALTEQMOD" + endPart)) { @@ -3288,7 +3289,7 @@ * @param newSize * the new size for the item */ - public void resizeItem(final PlayerCharacter aPC, final String newSize) { + public void resizeItem(final PlayerCharacter aPC, SizeAdjustment newSize) { setBase(aPC); final int iOldSize = sizeInt(); @@ -3296,7 +3297,7 @@ if (iNewSize != iOldSize) { - setSize(newSize); + put(ObjectKey.SIZE, newSize); CDOMSingleRef<Equipment> baseItem = get(ObjectKey.BASE_ITEM); Equipment eq; @@ -3328,9 +3329,7 @@ if (containerCapacityString.length() > 0) { double mult = 1.0; - final SizeAdjustment newSA = - SettingsHandler.getGame().getSizeAdjustmentNamed( - newSize); + final SizeAdjustment newSA = newSize; if (newSA != null) { @@ -3345,7 +3344,6 @@ new Float(eq.containerWeightCapacity.doubleValue() * mult); } - if (getAcceptsTypeCount() > 0) { for (String aString : eq.d_acceptsTypes.keySet()) @@ -3724,10 +3722,6 @@ } } } - - if (getSize().length() == 0) { - setSize("M"); - } } public String consolidatedProfName() @@ -3788,14 +3782,12 @@ * @return The costAdjustedForSize value */ private BigDecimal getCostAdjustedForSize(final PlayerCharacter aPC, - final String aSize) { + final SizeAdjustment saSize) { BigDecimal c = getSafe(ObjectKey.COST); // // Scale everything to medium before conversion // - final SizeAdjustment saSize = SettingsHandler.getGame() - .getSizeAdjustmentNamed(aSize); final SizeAdjustment saBase = get(ObjectKey.BASESIZE); if ((saSize == null) || (saBase == null)) { @@ -4096,13 +4088,11 @@ * @return The weightAdjustedForSize value */ private BigDecimal getWeightAdjustedForSize(final PlayerCharacter aPC, - final String aSize) { + final SizeAdjustment newSA) { if (this.isVirtual()) { return BigDecimal.ZERO; } - final SizeAdjustment newSA = SettingsHandler.getGame() - .getSizeAdjustmentNamed(aSize); final SizeAdjustment currSA = getSafe(ObjectKey.SIZE); if ((newSA == null) || (currSA == null)) { @@ -4164,11 +4154,9 @@ * The size to adjust for */ private void adjustACForSize(final PlayerCharacter aPC, - final Equipment baseEq, final String aSize) { + final Equipment baseEq, final SizeAdjustment newSA) { if ((getBonusList() != null) && isArmor()) { double mult = 1.0; - final SizeAdjustment newSA = SettingsHandler.getGame() - .getSizeAdjustmentNamed(aSize); final SizeAdjustment currSA = baseEq.getSafe(ObjectKey.SIZE); if ((newSA != null) && (currSA != null)) { @@ -5331,13 +5319,7 @@ iMod = SettingsHandler.getGame().getSizeAdjustmentListSize() - 1; } - final SizeAdjustment sadj = SettingsHandler.getGame().getSizeAdjustmentAtIndex(iMod); - String adjAbbrev = ""; - if (sadj != null) - { - adjAbbrev = sadj.getAbbreviation(); - } - return adjustDamage(dam, adjAbbrev); + return adjustDamage(dam, SettingsHandler.getGame().getSizeAdjustmentAtIndex(iMod)); } /** @@ -5896,7 +5878,7 @@ * @param aSize The size to adjust for * @return The adjusted damage */ - private String adjustDamage(final String aDamage, final String aSize) + private String adjustDamage(final String aDamage, final SizeAdjustment aSize) { if (aDamage == null) { @@ -5904,7 +5886,7 @@ } if (!"special".equalsIgnoreCase(aDamage) && !"-".equals(aDamage)) { - return Globals.adjustDamage(aDamage, getSize(), aSize); + return Globals.adjustDamage(aDamage, getSize(), aSize.getAbbreviation()); } return aDamage; @@ -5917,7 +5899,7 @@ * @param bPrimary * @return The damageAdjustedForSize value */ - private String getDamageAdjustedForSize(final String aSize, final boolean bPrimary) + private String getDamageAdjustedForSize(final SizeAdjustment aSize, final boolean bPrimary) { int headnum = bPrimary ? 1 : 2; EquipmentHead head = getEquipmentHeadReference(headnum); Modified: Trunk/pcgen/code/src/java/pcgen/core/EquipmentList.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/EquipmentList.java 2008-08-05 00:58:45 UTC (rev 7346) +++ Trunk/pcgen/code/src/java/pcgen/core/EquipmentList.java 2008-08-05 02:07:09 UTC (rev 7347) @@ -291,7 +291,10 @@ if (bError) { return null; } if (sizList.size() != 0) { - eq.resizeItem(aPC, sizList.get(0)); + /* + * CONSIDER This size can be further optimized by changing sizList + */ + eq.resizeItem(aPC, SettingsHandler.getGame().getSizeAdjustmentNamed(sizList.get(0))); bModified = true; if (sizList.size() > 1) { @@ -682,7 +685,7 @@ } if ((iSize >= 0) && (iSize <= (SettingsHandler.getGame().getSizeAdjustmentListSize() - 1))) { - eq.resizeItem(aPC, SettingsHandler.getGame().getSizeAdjustmentAtIndex(iSize).getDisplayName()); + eq.resizeItem(aPC, SettingsHandler.getGame().getSizeAdjustmentAtIndex(iSize)); } // Modified: Trunk/pcgen/code/src/java/pcgen/core/kit/KitGear.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/kit/KitGear.java 2008-08-05 00:58:45 UTC (rev 7346) +++ Trunk/pcgen/code/src/java/pcgen/core/kit/KitGear.java 2008-08-05 02:07:09 UTC (rev 7347) @@ -22,6 +22,7 @@ */ package pcgen.core.kit; +import pcgen.cdom.enumeration.ObjectKey; import pcgen.core.*; import pcgen.core.character.EquipSet; import pcgen.util.Logging; @@ -326,8 +327,8 @@ // natural (weapon) boolean tryResize = false; - String sizeToSet = SettingsHandler.getGame().getSizeAdjustmentAtIndex( - aPC.sizeInt()).getAbbreviation(); + SizeAdjustment sizeToSet = SettingsHandler.getGame().getSizeAdjustmentAtIndex( + aPC.sizeInt()); if (getSize() == null) { @@ -345,7 +346,7 @@ } else { - sizeToSet = getSize(); + sizeToSet = SettingsHandler.getGame().getSizeAdjustmentNamed(getSize()); tryResize = true; } } @@ -358,7 +359,7 @@ { // We need setBase() called. The only way to do that is to resize. // We will set the size to itself. - theEquipment.resizeItem(aPC, theEquipment.getSize()); + theEquipment.resizeItem(aPC, theEquipment.getSafe(ObjectKey.SIZE)); } // Modified: Trunk/pcgen/code/src/java/pcgen/core/npcgen/EquipmentItem.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/npcgen/EquipmentItem.java 2008-08-05 00:58:45 UTC (rev 7346) +++ Trunk/pcgen/code/src/java/pcgen/core/npcgen/EquipmentItem.java 2008-08-05 02:07:09 UTC (rev 7347) @@ -4,6 +4,7 @@ import java.util.List; import pcgen.base.util.WeightedCollection; +import pcgen.cdom.enumeration.ObjectKey; import pcgen.core.Equipment; import pcgen.core.Globals; import pcgen.util.Logging; @@ -85,7 +86,7 @@ } // We need setBase() called. The only way to do that is to resize. // We will set the size to itself. - eq.resizeItem(null, eq.getSize()); + eq.resizeItem(null, eq.getSafe(ObjectKey.SIZE)); eq.nameItemFromModifiers(null); } } Modified: Trunk/pcgen/code/src/java/pcgen/gui/EqBuilder.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/EqBuilder.java 2008-08-05 00:58:45 UTC (rev 7346) +++ Trunk/pcgen/code/src/java/pcgen/gui/EqBuilder.java 2008-08-05 02:07:09 UTC (rev 7347) @@ -78,6 +78,7 @@ import pcgen.core.PObject; import pcgen.core.PlayerCharacter; import pcgen.core.SettingsHandler; +import pcgen.core.SizeAdjustment; import pcgen.core.SpecialProperty; import pcgen.core.prereq.PrerequisiteUtilities; import pcgen.core.spell.Spell; @@ -1138,7 +1139,7 @@ aNewEq.addSpecialProperty(SpecialProperty.createFromLst(oldName.toString())); } - final String aSize = SettingsHandler.getGame().getSizeAdjustmentAtIndex(getItemSize()).getAbbreviation(); + final SizeAdjustment aSize = SettingsHandler.getGame().getSizeAdjustmentAtIndex(getItemSize()); aNewEq.resizeItem(aPC, aSize); showItemInfo(aPC); } @@ -1246,7 +1247,7 @@ aNewEq.addSpecialProperty(SpecialProperty.createFromLst(aString)); } - final String aSize = SettingsHandler.getGame().getSizeAdjustmentAtIndex(getItemSize()).getAbbreviation(); + final SizeAdjustment aSize = SettingsHandler.getGame().getSizeAdjustmentAtIndex(getItemSize()); aNewEq.resizeItem(aPC, aSize); showItemInfo(aPC); } @@ -1465,7 +1466,7 @@ { if (aNewEq != null) { - final String aSize = SettingsHandler.getGame().getSizeAdjustmentAtIndex(getItemSize()).getAbbreviation(); + final SizeAdjustment aSize = SettingsHandler.getGame().getSizeAdjustmentAtIndex(getItemSize()); aNewEq.resizeItem(aPC, aSize); showItemInfo(aPC); } Modified: Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoGear.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoGear.java 2008-08-05 00:58:45 UTC (rev 7346) +++ Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoGear.java 2008-08-05 02:07:09 UTC (rev 7347) @@ -1207,7 +1207,7 @@ newEq.setName(newName); newEq.put(StringKey.OUTPUT_NAME, newName); newEq.setKeyName(newKey); - newEq.resizeItem(pc, newSize); + newEq.resizeItem(pc, SettingsHandler.getGame().getSizeAdjustmentNamed(newSize)); newEq.removeType("AUTO_GEN"); newEq.removeType("STANDARD"); if (!newEq.isType(Constants.s_CUSTOM)) Modified: Trunk/pcgen/code/src/java/pcgen/gui/tabs/TabUtils.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/tabs/TabUtils.java 2008-08-05 00:58:45 UTC (rev 7346) +++ Trunk/pcgen/code/src/java/pcgen/gui/tabs/TabUtils.java 2008-08-05 02:07:09 UTC (rev 7347) @@ -8,6 +8,7 @@ import pcgen.core.Globals; import pcgen.core.PlayerCharacter; import pcgen.core.RuleConstants; +import pcgen.core.SettingsHandler; import pcgen.core.utils.CoreUtility; import pcgen.util.Logging; import pcgen.util.PropertyFactory; @@ -87,7 +88,7 @@ // if (!pcSize.equals(eq.getSize())) { - eq.resizeItem(aPC, pcSize); + eq.resizeItem(aPC, SettingsHandler.getGame().getSizeAdjustmentNamed(pcSize)); } eq.setCostMod('-' + eq.getCost(aPC).toString()); // make cost 0 Modified: Trunk/pcgen/code/src/java/pcgen/io/PCGVer0Parser.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/PCGVer0Parser.java 2008-08-05 00:58:45 UTC (rev 7346) +++ Trunk/pcgen/code/src/java/pcgen/io/PCGVer0Parser.java 2008-08-05 02:07:09 UTC (rev 7347) @@ -51,6 +51,7 @@ import pcgen.core.PlayerCharacter; import pcgen.core.Race; import pcgen.core.SettingsHandler; +import pcgen.core.SizeAdjustment; import pcgen.core.Skill; import pcgen.core.SpecialAbility; import pcgen.core.SpecialProperty; @@ -950,12 +951,17 @@ .getEqModifierList(false).size()) != 0) || (customProp.length() != 0)) { + SizeAdjustment sz; if (sized.length() == 0) { - sized = eq.getSize(); + sz = eq.getSafe(ObjectKey.SIZE); } + else + { + sz = SettingsHandler.getGame().getSizeAdjustmentNamed(sized); + } - eq.resizeItem(aPC, sized); + eq.resizeItem(aPC, sz); eq.nameItemFromModifiers(aPC); } Modified: Trunk/pcgen/code/src/test/pcgen/core/EquipmentTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/EquipmentTest.java 2008-08-05 00:58:45 UTC (rev 7346) +++ Trunk/pcgen/code/src/test/pcgen/core/EquipmentTest.java 2008-08-05 02:07:09 UTC (rev 7347) @@ -313,13 +313,15 @@ is(custEq.getSize(), eq("M"), "starting size"); is(custEq.getDamage(getCharacter()), eq("1d6"), "starting size"); + final GameMode gamemode = SettingsHandler.getGame(); + // Drop the size - custEq.resizeItem(getCharacter(), "S"); + custEq.resizeItem(getCharacter(), gamemode.getSizeAdjustmentNamed("S")); is(custEq.getSize(), eq("S"), "reduce size size"); is(custEq.getDamage(getCharacter()), eq("1d4"), "reduce size damage"); // Increase the size - custEq.resizeItem(getCharacter(), "L"); + custEq.resizeItem(getCharacter(), gamemode.getSizeAdjustmentNamed("L")); is(custEq.getSize(), eq("L"), "reduce size size"); is(custEq.getDamage(getCharacter()), eq("1d8"), "reduce size damage"); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-08-05 02:14:57
|
Revision: 7348 http://pcgen.svn.sourceforge.net/pcgen/?rev=7348&view=rev Author: thpr Date: 2008-08-05 02:14:51 +0000 (Tue, 05 Aug 2008) Log Message: ----------- Class SPELLTYPE token update Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/StringKey.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/PlayerCharacter.java Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorPC.java Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilitySpellCaster.java Trunk/pcgen/code/src/java/pcgen/core/npcgen/NPCGenerator.java Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassAbilityPanel.java Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoClasses.java Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoTempMod.java Trunk/pcgen/code/src/java/pcgen/gui/tabs/spells/SpellModel.java Trunk/pcgen/code/src/java/plugin/lsttokens/pcclass/SpelltypeToken.java Trunk/pcgen/code/src/java/plugin/pretokens/test/PreSpellDescriptorTester.java Trunk/pcgen/code/src/java/plugin/pretokens/test/PreSpellSchoolSubTester.java Trunk/pcgen/code/src/java/plugin/pretokens/test/PreSpellSchoolTester.java Trunk/pcgen/code/src/java/plugin/pretokens/test/PreSpellTester.java Trunk/pcgen/code/src/test/pcgen/core/PCClassTest.java Trunk/pcgen/code/src/test/pcgen/core/PObjectUtilitiesTest.java Trunk/pcgen/code/src/test/pcgen/core/PlayerCharacterTest.java Trunk/pcgen/code/src/test/pcgen/core/prereq/PreClassTest.java Trunk/pcgen/code/src/test/pcgen/core/prereq/PreMultTest.java Trunk/pcgen/code/src/test/pcgen/core/prereq/PreSubClassTest.java Trunk/pcgen/code/src/test/pcgen/io/exporttoken/SpellMemTokenTest.java Trunk/pcgen/code/src/test/plugin/exporttokens/SpellListTokenTest.java Trunk/pcgen/code/src/test/plugin/jepcommands/ClassLevelCommandTest.java Removed Paths: ------------- Trunk/pcgen/code/src/java/pcgen/core/SpellProgressionInfo.java Trunk/pcgen/code/src/test/pcgen/core/SpellProgressionInfoTest.java Modified: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/StringKey.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/StringKey.java 2008-08-05 02:07:09 UTC (rev 7347) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/StringKey.java 2008-08-05 02:14:51 UTC (rev 7348) @@ -33,5 +33,5 @@ */ public enum StringKey { - NAME, KEY_NAME, WORSHIPPERS, TITLE, HOLY_ITEM, MASTER_HP_FORMULA, MASTER_CHECK_FORMULA, MASTER_BAB_FORMULA, BIRTHPLACE, BIRTHDAY, CATEGORY, BOOK_TYPE, CHOICE_STRING, DESTINATION, PAGE_USAGE, MINDEVVER, MINVER, ADD, BIO, DESCRIPTION, GENRE, HELP, APPEARANCE, CATCH_PHRASE, OUTPUT_NAME, INFO_TEXT, CHOICE_TO_MODIFY, PUB_NAME_LONG, COST, PUB_NAME_SHORT, CURRENT_EQUIP_SET_NAME, REGION, PUB_NAME_WEB, SETTING, SR_FORMULA, TEMP_DESCRIPTION, TRAIT2, TRAIT1, SKIN_COLOR, HAIR_COLOR, RACIAL_FAVORED_CLASS, SUB_REGION, SPEECH_TENDENCY, PHOBIAS, INTERESTS, RESIDENCE, SPELLBOOK_AUTO_ADD_KNOWN, PLAYERS_NAME, HANDED, HAIR_STYLE, PORTRAIT_PATH, EYE_COLOR, LOCATION, FILE_NAME, ABB, TARGET_AREA, NAME_TEXT, DAMAGE, DAMAGE_OVERRIDE, RATE_OF_FIRE, FUMBLE_RANGE, LISTTYPE + NAME, KEY_NAME, WORSHIPPERS, TITLE, HOLY_ITEM, MASTER_HP_FORMULA, MASTER_CHECK_FORMULA, MASTER_BAB_FORMULA, BIRTHPLACE, BIRTHDAY, CATEGORY, BOOK_TYPE, CHOICE_STRING, DESTINATION, PAGE_USAGE, MINDEVVER, MINVER, ADD, BIO, DESCRIPTION, GENRE, HELP, APPEARANCE, CATCH_PHRASE, OUTPUT_NAME, INFO_TEXT, CHOICE_TO_MODIFY, PUB_NAME_LONG, COST, PUB_NAME_SHORT, CURRENT_EQUIP_SET_NAME, REGION, PUB_NAME_WEB, SETTING, SR_FORMULA, TEMP_DESCRIPTION, TRAIT2, TRAIT1, SKIN_COLOR, HAIR_COLOR, RACIAL_FAVORED_CLASS, SUB_REGION, SPEECH_TENDENCY, PHOBIAS, INTERESTS, RESIDENCE, SPELLBOOK_AUTO_ADD_KNOWN, PLAYERS_NAME, HANDED, HAIR_STYLE, PORTRAIT_PATH, EYE_COLOR, LOCATION, FILE_NAME, ABB, TARGET_AREA, NAME_TEXT, DAMAGE, DAMAGE_OVERRIDE, RATE_OF_FIRE, FUMBLE_RANGE, LISTTYPE, SPELLTYPE } Modified: Trunk/pcgen/code/src/java/pcgen/core/Globals.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Globals.java 2008-08-05 02:07:09 UTC (rev 7347) +++ Trunk/pcgen/code/src/java/pcgen/core/Globals.java 2008-08-05 02:14:51 UTC (rev 7348) @@ -1534,27 +1534,17 @@ { final List<Spell> aList = new ArrayList<Spell>(); final StringBuffer aBuf = new StringBuffer(); - String spellType = Constants.EMPTY_STRING; if (classKey.length() > 0) { - final PCClass aClass; - if (classKey.indexOf('|') < 0) { - aClass = getContext().ref.silentlyGetConstructedCDOMObject(PCClass.class, classKey); aBuf.append("CLASS|").append(classKey); } else { - aClass = getContext().ref.silentlyGetConstructedCDOMObject(PCClass.class, classKey.substring(classKey.indexOf(Constants.PIPE) + 1)); aBuf.append(classKey); } - - if (aClass != null) - { - spellType = aClass.getSpellType(); - } } if (domainKey.length() > 0) @@ -1572,8 +1562,6 @@ { aBuf.append(domainKey); } - - spellType = "DIVINE"; } for (String aKey : spellMap.keySet()) { Modified: Trunk/pcgen/code/src/java/pcgen/core/PCClass.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-08-05 02:07:09 UTC (rev 7347) +++ Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-08-05 02:14:51 UTC (rev 7348) @@ -383,7 +383,6 @@ */ protected int level = 0; // TODO - This should be moved. - private SpellProgressionInfo castInfo = null; private SpellProgressionCache spellCache = null; private boolean spellCacheValid = false; @@ -723,7 +722,7 @@ // Assume no null check on castInfo requried, because // getNumFromCastList above would have returned -1 if ((ix > 0) - && "DIVINE".equalsIgnoreCase(castInfo.getSpellType())) + && "DIVINE".equalsIgnoreCase(getSpellType())) { for (CharacterDomain cd : aPC.getCharacterDomainList()) { @@ -1251,26 +1250,13 @@ } /* - * FINALPCCLASSANDLEVEL This is required in PCClassLevel and PCClass since - * it is a Tag - */ - public final void setSpellType(final String newType) - { - if (castInfo == null && Constants.s_NONE.equals(newType)) - { - //Don't create a SpellProgressionInfo to set to default!! - return; - } - getConstructingSpellProgressionInfo().setSpellType(newType); - } - - /* * FINALPCCLASSANDLEVEL This is required in PCClassLevel and should be present in * PCClass for PCClassLevel creation (in the factory) */ public final String getSpellType() { - return castInfo == null ? Constants.s_NONE : castInfo.getSpellType(); + String castInfo = get(StringKey.SPELLTYPE); + return castInfo == null ? Constants.s_NONE : castInfo; } /* @@ -1475,7 +1461,7 @@ // if the spelllevel is >0 and this class has a characterdomain // associated with it, return +1 - if ((spellLevel > 0) && "DIVINE".equalsIgnoreCase(getSpellType())) + if ((spellLevel > 0) && "DIVINE".equalsIgnoreCase(get(StringKey.SPELLTYPE))) { for (CharacterDomain cd : aPC.getCharacterDomainList()) { @@ -2312,12 +2298,6 @@ pccTxt.append(StringUtil.join(prohibitedSchools, ",")); } - if (castInfo != null) - { - checkAdd(pccTxt, Constants.s_NONE, "SPELLTYPE:", castInfo - .getSpellType()); - } - if (itemCreationMultiplier.length() != 0) { pccTxt.append("\tITEMCREATE:").append(itemCreationMultiplier); @@ -2611,15 +2591,6 @@ substitutionClassList.add(sClass); } - private SpellProgressionInfo getConstructingSpellProgressionInfo() - { - if (castInfo == null) - { - castInfo = new SpellProgressionInfo(); - } - return castInfo; - } - /** * Add a level of this class to the character. Note this call is assumed to * only be used when loading characters, and some behaviour is tailored for @@ -2876,10 +2847,6 @@ aClass.prohibitedSchools = new ArrayList<String>(prohibitedSchools); } - if (castInfo != null) - { - aClass.castInfo = castInfo.clone(); - } spellCache = null; spellCacheValid = false; if (vFeatList != null) Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-08-05 02:07:09 UTC (rev 7347) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-08-05 02:14:51 UTC (rev 7348) @@ -6604,7 +6604,7 @@ { for (PCClass pcClass : classList) { - if (!pcClass.getSpellType().equalsIgnoreCase(Constants.s_NONE) + if (pcClass.get(StringKey.SPELLTYPE) != null && (pcClass.getLevel() <= maxLevel)) { return true; @@ -8394,27 +8394,14 @@ setDirty(true); } - public List<Spell> aggregateSpellList(final String aType, - final String school, final String subschool, final String descriptor, - final int minLevel, final int maxLevel) + public List<Spell> aggregateSpellList(final String school, + final String subschool, final String descriptor, final int minLevel, + final int maxLevel) { final List<Spell> retList = new ArrayList<Spell>(); - final boolean isAny = "Any".equalsIgnoreCase(aType); for (PObject pObj : getSpellClassList()) { - String cName = pObj.getKeyName(); - String spellType = ""; - if (pObj instanceof PCClass) - { - PCClass pcClass = (PCClass) pObj; - spellType = pcClass.getSpellType(); - } - - if (isAny - || aType.equalsIgnoreCase(spellType) - || aType.equalsIgnoreCase(cName)) - { for (int a = minLevel; a <= maxLevel; a++) { final List<CharacterSpell> aList = @@ -8434,7 +8421,6 @@ { retList.add(aSpell); } - } } } } @@ -8916,12 +8902,10 @@ { for (PCClass aClass : classList) { - String classSpellType = aClass.getSpellType(); - // Check for Constants.s_NONE just in case - // a programmer sends in a "" string - if (("Any".equalsIgnoreCase(spellType) || classSpellType - .equalsIgnoreCase(spellType)) - && !classSpellType.equalsIgnoreCase(Constants.s_NONE)) + String classSpellType = aClass.get(StringKey.SPELLTYPE); + if (classSpellType != null + && ("Any".equalsIgnoreCase(spellType) || classSpellType + .equalsIgnoreCase(spellType))) { // Get the number of known spells for the level int knownForLevel = aClass.getKnownForLevel(spellLevel, this); @@ -12805,7 +12789,7 @@ { boolean available = false; final boolean isDivine = - ("Divine".equalsIgnoreCase(aClass.getSpellType())); + ("Divine".equalsIgnoreCase(aClass.get(StringKey.SPELLTYPE))); final boolean canUseHigher = knownLearned ? getUseHigherKnownSlots() : getUseHigherPreppedSlots(); @@ -13626,7 +13610,7 @@ for (PCClass pcClass : classList) { - if (!pcClass.getSpellType().equalsIgnoreCase(Constants.s_NONE)) + if (pcClass.get(StringKey.SPELLTYPE) != null) { aList.add(pcClass); } Deleted: Trunk/pcgen/code/src/java/pcgen/core/SpellProgressionInfo.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/SpellProgressionInfo.java 2008-08-05 02:07:09 UTC (rev 7347) +++ Trunk/pcgen/code/src/java/pcgen/core/SpellProgressionInfo.java 2008-08-05 02:14:51 UTC (rev 7348) @@ -1,104 +0,0 @@ -/* - * PCLevelCastingInfo.java - * Copyright 2006 (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 - * - * Created: November 8, 2006 - * - * $Id: PCClass.java 1605 2006-11-08 02:14:21Z thpr $ - */ -package pcgen.core; - -import pcgen.cdom.base.Constants; - -/** - * SpellProgressionInfo contains information about Spell Progression in support - * of a PCClass. - * - * @author Tom Parker <th...@us...> - */ -public class SpellProgressionInfo implements Cloneable { - - /* - * FUTURETYPESAFETY This should NOT be a String, as Spell Types are a - * specific set of items... This, however is NON Trivial, since Spell Types - * are used WIDELY through the code base. It will be a nice thing to make - * type safe, but it is best done by itself in a checkin specifically - * focused on making Spell Types type safe. - * - * In the future it would be nice to have this in SpellProgressionInfo, but - * that is not possible today because this defaults to 'None' and SOOO much - * of the code actually depends on this being non-null. This should be one - * of the implicit tasks (moving this) which is part of the project to make - * Spell Types Type Safe. - */ - private String spellType = null; - - /** - * Sets the Spell Type for this Spell Progression. The type cannot be null - * or an empty String. To "unset" the Spell Type, the Spell Type should be - * set to Constants.s_NONE - * - * @param type - * The type of Spell in this Spell Progression - */ - public void setSpellType(String type) { - if (type == null) { - throw new IllegalArgumentException("Spell type cannot be null"); - } - if (type.trim().length() == 0) { - throw new IllegalArgumentException( - "Spell type cannot be empty string"); - } - spellType = type.trim(); - } - - /** - * Returns the type of spell in this Spell Progression. Will not return - * null. Constants.s_NONE is used to indicate that no Spell Type exists in - * this Spell Progression. - * - * @return The type of spell in this Spell Progression - */ - public String getSpellType() { - if (spellType == null) { - return Constants.s_NONE; - } - return spellType; - } - - /** - * Clones this SpellProgressionInfo object. A semi-deep (or semi-shallow, - * depending on one's point of view) clone is performed, under the - * assumption that the cloned object should be allowed to have any of the - * SpellProgressionInfo.set* method called without allowing either the - * original or the cloned SpellProgressionInfo object to accidentally modify - * the other. - * - * There is the assumption, however, that the Lists contained within the - * SpellProgressionInfo object are never modified, and violation of that - * semantic rule either within SpellProgressionInfo or by other objects - * which call the reference-semantic methods of SpellProgressionInfo can - * render this clone insufficient. - * - * @return A semi-shallow Clone of this SpellProgressionInfo object. - * @throws CloneNotSupportedException - */ - @Override - public SpellProgressionInfo clone() throws CloneNotSupportedException { - return (SpellProgressionInfo) super.clone(); - } -} Modified: Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorPC.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorPC.java 2008-08-05 02:07:09 UTC (rev 7347) +++ Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorPC.java 2008-08-05 02:14:51 UTC (rev 7348) @@ -29,6 +29,7 @@ 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.character.Follower; @@ -398,11 +399,11 @@ for ( PCClass pcClass : getPc().getClassList() ) { - if (!pcClass.getSpellType().equals(Constants.s_NONE)) + String spellType = pcClass.get(StringKey.SPELLTYPE); + if (spellType != null) { final String classKey = pcClass.getKeyName(); final int pcBonusLevel = (int) getPc().getTotalBonusTo("PCLEVEL", classKey); - String spellType = pcClass.getSpellType(); if (CoreUtility.doublesEqual(getPc().getTotalBonusTo("CASTERLEVEL", classKey), 0.0)) { @@ -432,7 +433,7 @@ final PCClass spClass = Globals.getContext().ref.silentlyGetConstructedCDOMObject(PCClass.class, classKey); String spellType = Constants.s_NONE; - if ((spClass != null) && (!spClass.getSpellType().equals(Constants.s_NONE))) + if ((spClass != null) && (spClass.get(StringKey.SPELLTYPE) != null)) { spellType = spClass.getSpellType(); } Modified: Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilitySpellCaster.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilitySpellCaster.java 2008-08-05 02:07:09 UTC (rev 7347) +++ Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilitySpellCaster.java 2008-08-05 02:14:51 UTC (rev 7348) @@ -25,6 +25,7 @@ package pcgen.core.levelability; import pcgen.cdom.base.Constants; +import pcgen.cdom.enumeration.StringKey; import pcgen.core.*; import pcgen.core.pclevelinfo.PCLevelInfo; import pcgen.util.Logging; @@ -182,15 +183,14 @@ // if the class has a valid spelltype and the class is not the owning // class else if ( - !"".equals(aClass.getSpellType()) && - !(Constants.s_NONE.equals(aClass.getSpellType())) && + aClass.get(StringKey.SPELLTYPE) != null && !aClass.getKeyName().equals(owner.getKeyName())) { // if the string is ANY or if the string matches the class' spell // type if ( (token.equalsIgnoreCase("ANY")) || - (token.equalsIgnoreCase(aClass.getSpellType()))) + (token.equalsIgnoreCase(aClass.get(StringKey.SPELLTYPE)))) { anArrayList.add(aClass.getKeyName()); } Modified: Trunk/pcgen/code/src/java/pcgen/core/npcgen/NPCGenerator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/npcgen/NPCGenerator.java 2008-08-05 02:07:09 UTC (rev 7347) +++ Trunk/pcgen/code/src/java/pcgen/core/npcgen/NPCGenerator.java 2008-08-05 02:14:51 UTC (rev 7348) @@ -29,6 +29,7 @@ import pcgen.base.util.WeightedCollection; import pcgen.cdom.base.Constants; import pcgen.cdom.enumeration.ObjectKey; +import pcgen.cdom.enumeration.StringKey; import pcgen.core.Ability; import pcgen.core.AbilityCategory; import pcgen.core.AbilityUtilities; @@ -687,7 +688,7 @@ selectDomains( aPC, pcClass ); - if ( !pcClass.getSpellType().equals( Constants.s_NONE ) ) + if (pcClass.get(StringKey.SPELLTYPE) != null) { // This is a spellcasting class. We may have to select // spells of some sort (known or prepared). Modified: Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassAbilityPanel.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassAbilityPanel.java 2008-08-05 02:07:09 UTC (rev 7347) +++ Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassAbilityPanel.java 2008-08-05 02:14:51 UTC (rev 7348) @@ -44,6 +44,7 @@ import pcgen.cdom.enumeration.IntegerKey; import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; +import pcgen.cdom.enumeration.StringKey; import pcgen.core.Globals; import pcgen.core.PCClass; import pcgen.core.PCStat; @@ -184,12 +185,12 @@ * * Ditto SpellBaseStat above... */ - obj.setSpellType(Constants.s_NONE); + obj.remove(StringKey.SPELLTYPE); a = (String) spellType.getSelectedItem(); - if ((a != null) && (a.length() > 0)) + if ((a != null) && (a.length() > 0) && !a.equalsIgnoreCase(Constants.LST_NONE)) { - obj.setSpellType(a); + obj.put(StringKey.SPELLTYPE, a); } a = maxLevel.getText().trim(); Modified: Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoClasses.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoClasses.java 2008-08-05 02:07:09 UTC (rev 7347) +++ Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoClasses.java 2008-08-05 02:14:51 UTC (rev 7348) @@ -77,6 +77,7 @@ import pcgen.cdom.content.HitDie; import pcgen.cdom.enumeration.IntegerKey; import pcgen.cdom.enumeration.ObjectKey; +import pcgen.cdom.enumeration.StringKey; import pcgen.core.GameMode; import pcgen.core.Globals; import pcgen.core.PCClass; @@ -416,11 +417,9 @@ if (Globals.getGameModeShowSpellTab()) { - aString = aClass.getSpellType(); + aString = aClass.get(StringKey.SPELLTYPE); - if (isSubClass - && ((aString.length() == 0) || aString - .equalsIgnoreCase(Constants.s_NONE))) + if (isSubClass && aString == null) { aString = lastClass.getSpellType(); } Modified: Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoTempMod.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoTempMod.java 2008-08-05 02:07:09 UTC (rev 7347) +++ Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoTempMod.java 2008-08-05 02:14:51 UTC (rev 7348) @@ -2448,8 +2448,7 @@ // // Do all the PC's spells - for (Spell aSpell : pc.aggregateSpellList("Any", "", "", "", 0, - 9)) + for (Spell aSpell : pc.aggregateSpellList("", "", "", 0, 9)) { if (aSpell == null) { Modified: Trunk/pcgen/code/src/java/pcgen/gui/tabs/spells/SpellModel.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/tabs/spells/SpellModel.java 2008-08-05 02:07:09 UTC (rev 7347) +++ Trunk/pcgen/code/src/java/pcgen/gui/tabs/spells/SpellModel.java 2008-08-05 02:14:51 UTC (rev 7348) @@ -32,6 +32,7 @@ import pcgen.cdom.base.Constants; import pcgen.cdom.enumeration.IntegerKey; import pcgen.cdom.enumeration.ListKey; +import pcgen.cdom.enumeration.StringKey; import pcgen.core.CharacterDomain; import pcgen.core.Domain; import pcgen.core.Globals; @@ -1115,7 +1116,7 @@ for (PCClass aClass : classes) { - if (!aClass.getSpellType().equals(Constants.s_NONE)) + if (aClass.get(StringKey.SPELLTYPE) != null) { if (aClass.zeroCastSpells() && !aClass.hasKnownList()) { Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/pcclass/SpelltypeToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/pcclass/SpelltypeToken.java 2008-08-05 02:07:09 UTC (rev 7347) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/pcclass/SpelltypeToken.java 2008-08-05 02:14:51 UTC (rev 7348) @@ -1,12 +1,15 @@ package plugin.lsttokens.pcclass; +import pcgen.cdom.base.Constants; +import pcgen.cdom.enumeration.StringKey; import pcgen.core.PCClass; -import pcgen.persistence.lst.PCClassLstToken; +import pcgen.rules.context.LoadContext; +import pcgen.rules.persistence.token.CDOMPrimaryToken; /** * Class deals with SPELLTYPE Token */ -public class SpelltypeToken implements PCClassLstToken +public class SpelltypeToken implements CDOMPrimaryToken<PCClass> { public String getTokenName() @@ -14,13 +17,36 @@ return "SPELLTYPE"; } - public boolean parse(PCClass pcclass, String value, int level) + public boolean parse(LoadContext context, PCClass pcc, String value) { - /* - * CONSIDER In the future it may be useful here to check for "" or - * "None" and filter those out (never set the spell type) - thpr 11/9/06 - */ - pcclass.setSpellType(value); + if (value == null || value.length() == 0) + { + // CONSIDER Deprecate this behavior + return true; + } + if (value.equalsIgnoreCase(Constants.LST_NONE)) + { + // CONSIDER Deprecate this behavior + return true; + } + context.getObjectContext().put(pcc, StringKey.SPELLTYPE, value); return true; } + + public String[] unparse(LoadContext context, PCClass pcc) + { + String target = context.getObjectContext().getString(pcc, + StringKey.SPELLTYPE); + if (target == null) + { + return null; + } + return new String[] { target }; + } + + public Class<PCClass> getTokenClass() + { + return PCClass.class; + } + } Modified: Trunk/pcgen/code/src/java/plugin/pretokens/test/PreSpellDescriptorTester.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/pretokens/test/PreSpellDescriptorTester.java 2008-08-05 02:07:09 UTC (rev 7347) +++ Trunk/pcgen/code/src/java/plugin/pretokens/test/PreSpellDescriptorTester.java 2008-08-05 02:14:51 UTC (rev 7348) @@ -54,7 +54,7 @@ final List<Spell> aArrayList = character.aggregateSpellList( - "Any", "No-Match", "A", descriptor, requiredLevel, 20); //$NON-NLS-1$ //$NON-NLS-2$ + "No-Match", "A", descriptor, requiredLevel, 20); //$NON-NLS-1$ //$NON-NLS-2$ final int runningTotal = prereq.getOperator().compare(aArrayList.size(), requiredNumber); Modified: Trunk/pcgen/code/src/java/plugin/pretokens/test/PreSpellSchoolSubTester.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/pretokens/test/PreSpellSchoolSubTester.java 2008-08-05 02:07:09 UTC (rev 7347) +++ Trunk/pcgen/code/src/java/plugin/pretokens/test/PreSpellSchoolSubTester.java 2008-08-05 02:14:51 UTC (rev 7348) @@ -56,7 +56,7 @@ final List<Spell> aArrayList = character .aggregateSpellList( - "Any", "No-Match", subSchool, "No-Match", requiredLevel, 20); //$NON-NLS-1$ //$NON-NLS-2$ + "No-Match", subSchool, "No-Match", requiredLevel, 20); //$NON-NLS-1$ //$NON-NLS-2$ final int runningTotal = prereq.getOperator().compare(aArrayList.size(), requiredNumber); Modified: Trunk/pcgen/code/src/java/plugin/pretokens/test/PreSpellSchoolTester.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/pretokens/test/PreSpellSchoolTester.java 2008-08-05 02:07:09 UTC (rev 7347) +++ Trunk/pcgen/code/src/java/plugin/pretokens/test/PreSpellSchoolTester.java 2008-08-05 02:14:51 UTC (rev 7348) @@ -55,7 +55,7 @@ final List<Spell> aArrayList = character.aggregateSpellList( - "Any", school, "A", "No-Match", requiredLevel, 20); //$NON-NLS-1$ //$NON-NLS-2$ + school, "A", "No-Match", requiredLevel, 20); //$NON-NLS-1$ //$NON-NLS-2$ final int runningTotal = prereq.getOperator().compare(aArrayList.size(), requiredNumber); Modified: Trunk/pcgen/code/src/java/plugin/pretokens/test/PreSpellTester.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/pretokens/test/PreSpellTester.java 2008-08-05 02:07:09 UTC (rev 7347) +++ Trunk/pcgen/code/src/java/plugin/pretokens/test/PreSpellTester.java 2008-08-05 02:14:51 UTC (rev 7348) @@ -67,7 +67,7 @@ // Build a list of all possible spells final List<Spell> aArrayList = - character.aggregateSpellList("Any", "", "", "", 0, 20); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ + character.aggregateSpellList("", "", "", 0, 20); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //Needs to add domain spells as well for (CharacterDomain aCD : character.getCharacterDomainList()) Modified: Trunk/pcgen/code/src/test/pcgen/core/PCClassTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/PCClassTest.java 2008-08-05 02:07:09 UTC (rev 7347) +++ Trunk/pcgen/code/src/test/pcgen/core/PCClassTest.java 2008-08-05 02:14:51 UTC (rev 7348) @@ -47,6 +47,7 @@ import pcgen.cdom.enumeration.IntegerKey; import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; +import pcgen.cdom.enumeration.StringKey; import pcgen.cdom.enumeration.VariableKey; import pcgen.cdom.formula.FixedSizeFormula; import pcgen.cdom.inst.PCClassLevel; @@ -474,7 +475,7 @@ LoadContext context = Globals.getContext(); PCClass megaCasterClass = new PCClass(); megaCasterClass.setName("MegaCaster"); - megaCasterClass.setSpellType("ARCANE"); + megaCasterClass.put(StringKey.SPELLTYPE, "ARCANE"); context.unconditionallyProcess(megaCasterClass, "SPELLSTAT", "CHA"); megaCasterClass.put(ObjectKey.SPELLBOOK, false); megaCasterClass.put(ObjectKey.MEMORIZE_SPELLS, false); @@ -545,7 +546,7 @@ LoadContext context = Globals.getContext(); PCClass megaCasterClass = new PCClass(); megaCasterClass.setName("MegaCaster"); - megaCasterClass.setSpellType("ARCANE"); + megaCasterClass.put(StringKey.SPELLTYPE, "ARCANE"); context.unconditionallyProcess(megaCasterClass, "SPELLSTAT", "CHA"); megaCasterClass.put(ObjectKey.SPELLBOOK, false); megaCasterClass.put(ObjectKey.MEMORIZE_SPELLS, false); Modified: Trunk/pcgen/code/src/test/pcgen/core/PObjectUtilitiesTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/PObjectUtilitiesTest.java 2008-08-05 02:07:09 UTC (rev 7347) +++ Trunk/pcgen/code/src/test/pcgen/core/PObjectUtilitiesTest.java 2008-08-05 02:14:51 UTC (rev 7348) @@ -25,6 +25,7 @@ import pcgen.AbstractCharacterTestCase; import pcgen.cdom.enumeration.ObjectKey; +import pcgen.cdom.enumeration.StringKey; import pcgen.rules.context.LoadContext; /** @@ -61,7 +62,7 @@ LoadContext context = Globals.getContext(); arcaneClass = new PCClass(); arcaneClass.setName("TestArcane"); - arcaneClass.setSpellType("ARCANE"); + arcaneClass.put(StringKey.SPELLTYPE, "ARCANE"); context.unconditionallyProcess(arcaneClass, "SPELLSTAT", "CHA"); arcaneClass.put(ObjectKey.SPELLBOOK, false); arcaneClass.put(ObjectKey.MEMORIZE_SPELLS, false); @@ -75,7 +76,7 @@ divineClass = new PCClass(); divineClass.setName("TestDivine"); - divineClass.setSpellType("DIVINE"); + divineClass.put(StringKey.SPELLTYPE, "DIVINE"); context.unconditionallyProcess(divineClass, "SPELLSTAT", "WIS"); divineClass.put(ObjectKey.SPELLBOOK, false); divineClass.put(ObjectKey.MEMORIZE_SPELLS, true); @@ -84,7 +85,7 @@ psionicClass = new PCClass(); psionicClass.setName("TestPsion"); - psionicClass.setSpellType("PSIONIC"); + psionicClass.put(StringKey.SPELLTYPE, "PSIONIC"); context.unconditionallyProcess(psionicClass, "SPELLSTAT", "CHA"); psionicClass.put(ObjectKey.SPELLBOOK, false); psionicClass.put(ObjectKey.MEMORIZE_SPELLS, false); Modified: Trunk/pcgen/code/src/test/pcgen/core/PlayerCharacterTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/PlayerCharacterTest.java 2008-08-05 02:07:09 UTC (rev 7347) +++ Trunk/pcgen/code/src/test/pcgen/core/PlayerCharacterTest.java 2008-08-05 02:14:51 UTC (rev 7348) @@ -137,7 +137,7 @@ pcClass = new PCClass(); pcClass.setName("MyClass"); - pcClass.setSpellType("ARCANE"); + pcClass.put(StringKey.SPELLTYPE, "ARCANE"); Globals.getContext().ref.importObject(pcClass); classWarmind = new PCClass(); @@ -666,7 +666,7 @@ // do so setup that is specific to testing this method arClass = new PCClass(); arClass.setName("AbilityRichClass"); - arClass.setSpellType("ARCANE"); + arClass.put(StringKey.SPELLTYPE, "ARCANE"); LoadContext context = Globals.getContext(); context.ref.importObject(arClass); Deleted: Trunk/pcgen/code/src/test/pcgen/core/SpellProgressionInfoTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/SpellProgressionInfoTest.java 2008-08-05 02:07:09 UTC (rev 7347) +++ Trunk/pcgen/code/src/test/pcgen/core/SpellProgressionInfoTest.java 2008-08-05 02:14:51 UTC (rev 7348) @@ -1,51 +0,0 @@ -package pcgen.core; - -import junit.framework.TestCase; -import pcgen.cdom.base.Constants; - -public class SpellProgressionInfoTest extends TestCase -{ - - public SpellProgressionInfo spi; - - @Override - protected void setUp() throws Exception - { - super.setUp(); - spi = new SpellProgressionInfo(); - } - - public void testSpellType() - { - try - { - spi.setSpellType(null); - fail(); - } - catch (IllegalArgumentException e) - { - // OK - } - try - { - spi.setSpellType(""); - fail(); - } - catch (IllegalArgumentException e) - { - // OK - } - try - { - spi.setSpellType(" "); - fail(); - } - catch (IllegalArgumentException e) - { - // OK - } - assertEquals(Constants.s_NONE, spi.getSpellType()); - spi.setSpellType("DIVINE"); - assertEquals("DIVINE", spi.getSpellType()); - } -} Modified: Trunk/pcgen/code/src/test/pcgen/core/prereq/PreClassTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/prereq/PreClassTest.java 2008-08-05 02:07:09 UTC (rev 7347) +++ Trunk/pcgen/code/src/test/pcgen/core/prereq/PreClassTest.java 2008-08-05 02:14:51 UTC (rev 7348) @@ -32,6 +32,7 @@ import junit.framework.TestSuite; import junit.textui.TestRunner; import pcgen.AbstractCharacterTestCase; +import pcgen.cdom.enumeration.StringKey; import pcgen.core.Globals; import pcgen.core.PCClass; import pcgen.core.PlayerCharacter; @@ -71,7 +72,7 @@ { final PCClass pcClass = new PCClass(); pcClass.setName("MyClass"); - pcClass.setSpellType("ARCANE"); + pcClass.put(StringKey.SPELLTYPE, "ARCANE"); final PlayerCharacter character = getCharacter(); character.incrementClassLevel(3, pcClass); @@ -125,7 +126,7 @@ { final PCClass pcClass = new PCClass(); pcClass.setName("MyClass"); - pcClass.setSpellType("ARCANE"); + pcClass.put(StringKey.SPELLTYPE, "ARCANE"); final PlayerCharacter character = getCharacter(); character.incrementClassLevel(1, pcClass); @@ -151,7 +152,7 @@ { final PCClass pcClass = new PCClass(); pcClass.setName("MyClass"); - pcClass.setSpellType("ARCANE"); + pcClass.put(StringKey.SPELLTYPE, "ARCANE"); final PCClass pcClass2 = new PCClass(); pcClass2.setName("Other Class"); @@ -183,13 +184,13 @@ final PCClass pcClass = new PCClass(); pcClass.setName("MyClass"); context.unconditionallyProcess(pcClass, "SPELLSTAT", "CHA"); - pcClass.setSpellType("ARCANE"); + pcClass.put(StringKey.SPELLTYPE, "ARCANE"); context.unconditionallyProcess(pcClass.getClassLevel(1), "CAST", "5,4"); final PCClass pcClass2 = new PCClass(); pcClass2.setName("Other Class"); context.unconditionallyProcess(pcClass2, "SPELLSTAT", "INT"); - pcClass2.setSpellType("ARCANE"); + pcClass2.put(StringKey.SPELLTYPE, "ARCANE"); context.unconditionallyProcess(pcClass2.getClassLevel(1), "CAST", "5,4"); final PlayerCharacter character = getCharacter(); @@ -220,13 +221,13 @@ final PCClass pcClass = new PCClass(); pcClass.setName("MyClass"); context.unconditionallyProcess(pcClass, "SPELLSTAT", "CHA"); - pcClass.setSpellType("ARCANE"); + pcClass.put(StringKey.SPELLTYPE, "ARCANE"); context.unconditionallyProcess(pcClass.getClassLevel(1), "CAST", "5,4"); final PCClass pcClass2 = new PCClass(); pcClass2.setName("Other Class"); context.unconditionallyProcess(pcClass2, "SPELLSTAT", "INT"); - pcClass2.setSpellType("ARCANE"); + pcClass2.put(StringKey.SPELLTYPE, "ARCANE"); context.unconditionallyProcess(pcClass2.getClassLevel(1), "CAST", "5,4"); final PlayerCharacter character = getCharacter(); @@ -258,13 +259,13 @@ final PCClass pcClass = new PCClass(); pcClass.setName("MyClass"); context.unconditionallyProcess(pcClass, "SPELLSTAT", "CHA"); - pcClass.setSpellType("ARCANE"); + pcClass.put(StringKey.SPELLTYPE, "ARCANE"); context.unconditionallyProcess(pcClass.getClassLevel(1), "CAST", "5,4"); final PCClass pcClass2 = new PCClass(); pcClass2.setName("Other Class"); context.unconditionallyProcess(pcClass2, "SPELLSTAT", "INT"); - pcClass2.setSpellType("ARCANE"); + pcClass2.put(StringKey.SPELLTYPE, "ARCANE"); context.unconditionallyProcess(pcClass2.getClassLevel(1), "CAST", "5,4"); final PlayerCharacter character = getCharacter(); @@ -292,7 +293,7 @@ { final PCClass pcClass = new PCClass(); pcClass.setName("MyClass"); - pcClass.setSpellType("ARCANE"); + pcClass.put(StringKey.SPELLTYPE, "ARCANE"); final PlayerCharacter character = getCharacter(); character.incrementClassLevel(1, pcClass); @@ -362,7 +363,7 @@ { LoadContext context = Globals.getContext(); final PCClass pcClass = new PCClass(); - pcClass.setSpellType("ARCANE"); + pcClass.put(StringKey.SPELLTYPE, "ARCANE"); context.unconditionallyProcess(pcClass.getClassLevel(1), "CAST", "5,4"); context.unconditionallyProcess(pcClass, "SPELLSTAT", "CHA"); @@ -388,7 +389,7 @@ public void testSpellcasterTypeFail() throws Exception { final PCClass pcClass = new PCClass(); - pcClass.setSpellType("ARCANE"); + pcClass.put(StringKey.SPELLTYPE, "ARCANE"); final PlayerCharacter character = getCharacter(); character.incrementClassLevel(1, pcClass); @@ -414,7 +415,7 @@ { LoadContext context = Globals.getContext(); final PCClass pcClass = new PCClass(); - pcClass.setSpellType("ARCANE"); + pcClass.put(StringKey.SPELLTYPE, "ARCANE"); context.unconditionallyProcess(pcClass.getClassLevel(1), "CAST", "5,4"); context.unconditionallyProcess(pcClass, "SPELLSTAT", "CHA"); @@ -440,7 +441,7 @@ { LoadContext context = Globals.getContext(); final PCClass pcClass = new PCClass(); - pcClass.setSpellType("ARCANE"); + pcClass.put(StringKey.SPELLTYPE, "ARCANE"); context.unconditionallyProcess(pcClass.getClassLevel(1), "CAST", "5,4"); context.unconditionallyProcess(pcClass, "SPELLSTAT", "CHA"); @@ -542,7 +543,7 @@ { final PCClass pcClass = new PCClass(); pcClass.setName("MyClass"); - pcClass.setSpellType("ARCANE"); + pcClass.put(StringKey.SPELLTYPE, "ARCANE"); final PlayerCharacter character = getCharacter(); character.incrementClassLevel(1, pcClass); @@ -564,11 +565,11 @@ { final PCClass pcClass = new PCClass(); pcClass.setName("MyClass"); - pcClass.setSpellType("ARCANE"); + pcClass.put(StringKey.SPELLTYPE, "ARCANE"); final PCClass pcClass2 = new PCClass(); pcClass2.setName("MyClass2"); - pcClass2.setSpellType("DIVINE"); + pcClass2.put(StringKey.SPELLTYPE, "DIVINE"); final PlayerCharacter character = getCharacter(); character.incrementClassLevel(1, pcClass); @@ -594,11 +595,11 @@ { final PCClass pcClass = new PCClass(); pcClass.setName("MyClass"); - pcClass.setSpellType("ARCANE"); + pcClass.put(StringKey.SPELLTYPE, "ARCANE"); final PCClass pcClass2 = new PCClass(); pcClass2.setName("MyClass2"); - pcClass2.setSpellType("DIVINE"); + pcClass2.put(StringKey.SPELLTYPE, "DIVINE"); final PlayerCharacter character = getCharacter(); character.incrementClassLevel(1, pcClass); @@ -619,11 +620,11 @@ { final PCClass pcClass = new PCClass(); pcClass.setName("MyClass"); - pcClass.setSpellType("ARCANE"); + pcClass.put(StringKey.SPELLTYPE, "ARCANE"); final PCClass pcClass2 = new PCClass(); pcClass2.setName("MyClass2"); - pcClass2.setSpellType("DIVINE"); + pcClass2.put(StringKey.SPELLTYPE, "DIVINE"); final PlayerCharacter character = getCharacter(); @@ -642,11 +643,11 @@ { final PCClass pcClass = new PCClass(); pcClass.setName("MyClass"); - pcClass.setSpellType("ARCANE"); + pcClass.put(StringKey.SPELLTYPE, "ARCANE"); final PCClass pcClass2 = new PCClass(); pcClass2.setName("MyClass2"); - pcClass2.setSpellType("DIVINE"); + pcClass2.put(StringKey.SPELLTYPE, "DIVINE"); final PlayerCharacter character = getCharacter(); @@ -667,12 +668,12 @@ { final PCClass pcClass = new PCClass(); pcClass.setName("MyClass"); - pcClass.setSpellType("ARCANE"); + pcClass.put(StringKey.SPELLTYPE, "ARCANE"); pcClass.addBonusList("0|CASTERLEVEL|MyClass|CL"); final PCClass pcClass2 = new PCClass(); pcClass2.setName("MyClass2"); - pcClass2.setSpellType("DIVINE"); + pcClass2.put(StringKey.SPELLTYPE, "DIVINE"); pcClass.addBonusList("0|CASTERLEVEL|MyClass2|CL"); final PlayerCharacter character = getCharacter(); @@ -691,12 +692,12 @@ { final PCClass pcClass = new PCClass(); pcClass.setName("MyClass"); - pcClass.setSpellType("ARCANE"); + pcClass.put(StringKey.SPELLTYPE, "ARCANE"); pcClass.addBonusList("0|CASTERLEVEL|MyClass|CL"); final PCClass pcClass2 = new PCClass(); pcClass2.setName("MyClass2"); - pcClass2.setSpellType("ARCANE"); + pcClass2.put(StringKey.SPELLTYPE, "ARCANE"); pcClass.addBonusList("0|CASTERLEVEL|MyClass2|CL"); final PlayerCharacter character = getCharacter(); Modified: Trunk/pcgen/code/src/test/pcgen/core/prereq/PreMultTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/prereq/PreMultTest.java 2008-08-05 02:07:09 UTC (rev 7347) +++ Trunk/pcgen/code/src/test/pcgen/core/prereq/PreMultTest.java 2008-08-05 02:14:51 UTC (rev 7348) @@ -116,13 +116,13 @@ final PCClass pcClass = new PCClass(); pcClass.setName("MyClass"); context.unconditionallyProcess(pcClass, "SPELLSTAT", "CHA"); - pcClass.setSpellType("ARCANE"); + pcClass.put(StringKey.SPELLTYPE, "ARCANE"); context.unconditionallyProcess(pcClass.getClassLevel(1), "CAST", "5,4"); final PCClass pcClass2 = new PCClass(); pcClass2.setName("Other Class"); context.unconditionallyProcess(pcClass2, "SPELLSTAT", "INT"); - pcClass2.setSpellType("ARCANE"); + pcClass2.put(StringKey.SPELLTYPE, "ARCANE"); context.unconditionallyProcess(pcClass2.getClassLevel(1), "CAST", "5,4"); final PlayerCharacter character = getCharacter(); Modified: Trunk/pcgen/code/src/test/pcgen/core/prereq/PreSubClassTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/prereq/PreSubClassTest.java 2008-08-05 02:07:09 UTC (rev 7347) +++ Trunk/pcgen/code/src/test/pcgen/core/prereq/PreSubClassTest.java 2008-08-05 02:14:51 UTC (rev 7348) @@ -32,6 +32,7 @@ import junit.framework.TestSuite; import junit.textui.TestRunner; import pcgen.AbstractCharacterTestCase; +import pcgen.cdom.enumeration.StringKey; import pcgen.core.PCClass; import pcgen.core.PlayerCharacter; import plugin.pretokens.test.PreSubClassTester; @@ -72,7 +73,7 @@ final PCClass pcClass = new PCClass(); pcClass.setName("MyClass"); pcClass.setKeyName("KEY_MyClass"); - pcClass.setSpellType("ARCANE"); + pcClass.put(StringKey.SPELLTYPE, "ARCANE"); pcClass.setSubClassKey("MySubClass"); final PlayerCharacter character = getCharacter(); @@ -97,7 +98,7 @@ { final PCClass pcClass = new PCClass(); pcClass.setName("MyClass"); - pcClass.setSpellType("ARCANE"); + pcClass.put(StringKey.SPELLTYPE, "ARCANE"); final PCClass pcClass2 = new PCClass(); pcClass2.setName("Other Class"); @@ -126,7 +127,7 @@ { final PCClass pcClass = new PCClass(); pcClass.setName("MyClass"); - pcClass.setSpellType("ARCANE"); + pcClass.put(StringKey.SPELLTYPE, "ARCANE"); pcClass.setSubClassKey("MySubClass"); final PCClass pcClass2 = new PCClass(); @@ -156,7 +157,7 @@ { final PCClass pcClass = new PCClass(); pcClass.setName("MyClass"); - pcClass.setSpellType("ARCANE"); + pcClass.put(StringKey.SPELLTYPE, "ARCANE"); final PlayerCharacter character = getCharacter(); character.incrementClassLevel(1, pcClass); @@ -180,7 +181,7 @@ { final PCClass pcClass = new PCClass(); pcClass.setName("MyClass"); - pcClass.setSpellType("ARCANE"); + pcClass.put(StringKey.SPELLTYPE, "ARCANE"); pcClass.setSubClassKey("MySubClass"); final PlayerCharacter character = getCharacter(); Modified: Trunk/pcgen/code/src/test/pcgen/io/exporttoken/SpellMemTokenTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/io/exporttoken/SpellMemTokenTest.java 2008-08-05 02:07:09 UTC (rev 7347) +++ Trunk/pcgen/code/src/test/pcgen/io/exporttoken/SpellMemTokenTest.java 2008-08-05 02:14:51 UTC (rev 7348) @@ -29,6 +29,7 @@ import junit.framework.TestSuite; import pcgen.AbstractCharacterTestCase; import pcgen.cdom.enumeration.ObjectKey; +import pcgen.cdom.enumeration.StringKey; import pcgen.core.Globals; import pcgen.core.PCClass; import pcgen.core.PlayerCharacter; @@ -100,7 +101,7 @@ arcaneClass = new PCClass(); arcaneClass.setName("TestArcane"); arcaneClass.setKeyName("KEY_TEST_ARCANE"); - arcaneClass.setSpellType("ARCANE"); + arcaneClass.put(StringKey.SPELLTYPE, "ARCANE"); context.unconditionallyProcess(arcaneClass, "SPELLSTAT", "CHA"); arcaneClass.put(ObjectKey.SPELLBOOK, false); arcaneClass.put(ObjectKey.MEMORIZE_SPELLS, false); @@ -115,7 +116,7 @@ divineClass = new PCClass(); divineClass.setName("TestDivine"); divineClass.setKeyName("KEY_TEST_DIVINE"); - divineClass.setSpellType("DIVINE"); + divineClass.put(StringKey.SPELLTYPE, "DIVINE"); context.unconditionallyProcess(divineClass, "SPELLSTAT", "WIS"); divineClass.put(ObjectKey.SPELLBOOK, false); divineClass.put(ObjectKey.MEMORIZE_SPELLS, true); Modified: Trunk/pcgen/code/src/test/plugin/exporttokens/SpellListTokenTest.java =================================================================== --- Trunk/pcgen/code/src/test/plugin/exporttokens/SpellListTokenTest.java 2008-08-05 02:07:09 UTC (rev 7347) +++ Trunk/pcgen/code/src/test/plugin/exporttokens/SpellListTokenTest.java 2008-08-05 02:14:51 UTC (rev 7348) @@ -32,6 +32,7 @@ import pcgen.AbstractCharacterTestCase; import pcgen.base.lang.UnreachableError; import pcgen.cdom.enumeration.ObjectKey; +import pcgen.cdom.enumeration.StringKey; import pcgen.core.Globals; import pcgen.core.PCClass; import pcgen.core.PlayerCharacter; @@ -109,7 +110,7 @@ arcaneClass = new PCClass(); arcaneClass.setName("TestArcane"); - arcaneClass.setSpellType("ARCANE"); + arcaneClass.put(StringKey.SPELLTYPE, "ARCANE"); context.unconditionallyProcess(arcaneClass, "SPELLSTAT", "CHA"); arcaneClass.put(ObjectKey.SPELLBOOK, false); arcaneClass.put(ObjectKey.MEMORIZE_SPELLS, false); @@ -119,7 +120,7 @@ divineClass = new PCClass(); divineClass.setName("TestDivine"); - divineClass.setSpellType("DIVINE"); + divineClass.put(StringKey.SPELLTYPE, "DIVINE"); context.unconditionallyProcess(divineClass, "SPELLSTAT", "WIS"); divineClass.put(ObjectKey.SPELLBOOK, false); divineClass.put(ObjectKey.MEMORIZE_SPELLS, true); Modified: Trunk/pcgen/code/src/test/plugin/jepcommands/ClassLevelCommandTest.java =================================================================== --- Trunk/pcgen/code/src/test/plugin/jepcommands/ClassLevelCommandTest.java 2008-08-05 02:07:09 UTC (rev 7347) +++ Trunk/pcgen/code/src/test/plugin/jepcommands/ClassLevelCommandTest.java 2008-08-05 02:14:51 UTC (rev 7348) @@ -29,6 +29,7 @@ import pcgen.cdom.enumeration.FormulaKey; import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; +import pcgen.cdom.enumeration.StringKey; import pcgen.cdom.formula.FixedSizeFormula; import pcgen.core.Campaign; import pcgen.core.Description; @@ -106,7 +107,7 @@ megaCasterClass = new PCClass(); megaCasterClass.setName("MegaCaster"); - megaCasterClass.setSpellType("ARCANE"); + megaCasterClass.put(StringKey.SPELLTYPE, "ARCANE"); Globals.getContext().unconditionallyProcess(megaCasterClass, "SPELLSTAT", "CHA"); megaCasterClass.put(ObjectKey.SPELLBOOK, false); megaCasterClass.put(ObjectKey.MEMORIZE_SPELLS, false); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-08-05 02:23:21
|
Revision: 7349 http://pcgen.svn.sourceforge.net/pcgen/?rev=7349&view=rev Author: thpr Date: 2008-08-05 02:23:23 +0000 (Tue, 05 Aug 2008) Log Message: ----------- Global DR Token Update Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java Trunk/pcgen/code/src/java/pcgen/cdom/inst/PCClassLevel.java Trunk/pcgen/code/src/java/pcgen/core/DamageReduction.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/SubstitutionClass.java Trunk/pcgen/code/src/java/pcgen/core/analysis/TemplateModifier.java Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassLevelPanel.java Trunk/pcgen/code/src/java/pcgen/gui/editor/EditorMainForm.java Trunk/pcgen/code/src/java/plugin/lsttokens/DrLst.java Trunk/pcgen/code/src/test/pcgen/core/PObjectTest.java Trunk/pcgen/code/src/test/pcgen/core/prereq/PreDRTest.java Modified: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java 2008-08-05 02:14:51 UTC (rev 7348) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java 2008-08-05 02:23:23 UTC (rev 7349) @@ -38,6 +38,7 @@ import pcgen.cdom.modifier.ChangeArmorType; import pcgen.cdom.reference.CDOMSingleRef; import pcgen.core.Ability; +import pcgen.core.DamageReduction; import pcgen.core.Deity; import pcgen.core.Description; import pcgen.core.Domain; @@ -205,6 +206,7 @@ public static final ListKey<CDOMReference<PCTemplate>> REMOVE_TEMPLATES = new ListKey<CDOMReference<PCTemplate>>(); public static final ListKey<Vision> VISION_CACHE = new ListKey<Vision>(); public static final ListKey<TransitionChoice<?>> ADD = new ListKey<TransitionChoice<?>>(); + public static final ListKey<DamageReduction> DAMAGE_REDUCTION = new ListKey<DamageReduction>(); public static final ListKey<PCStat> UNLOCKED_STATS = new ListKey<PCStat>(); public static final ListKey<StatLock> STAT_LOCKS = new ListKey<StatLock>(); public static final ListKey<TransitionChoice<Kit>> KIT_CHOICE = new ListKey<TransitionChoice<Kit>>(); Modified: Trunk/pcgen/code/src/java/pcgen/cdom/inst/PCClassLevel.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/inst/PCClassLevel.java 2008-08-05 02:14:51 UTC (rev 7348) +++ Trunk/pcgen/code/src/java/pcgen/cdom/inst/PCClassLevel.java 2008-08-05 02:23:23 UTC (rev 7349) @@ -23,7 +23,7 @@ * A PCClassLevel is a CDOMObject that represents items gained in a specific * level of a PCClass. */ -public final class PCClassLevel extends CDOMObject +public final class PCClassLevel extends CDOMObject implements Cloneable { /** @@ -66,4 +66,10 @@ { return false; } + + @Override + public PCClassLevel clone() throws CloneNotSupportedException + { + return (PCClassLevel) super.clone(); + } } Modified: Trunk/pcgen/code/src/java/pcgen/core/DamageReduction.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/DamageReduction.java 2008-08-05 02:14:51 UTC (rev 7348) +++ Trunk/pcgen/code/src/java/pcgen/core/DamageReduction.java 2008-08-05 02:23:23 UTC (rev 7349) @@ -24,7 +24,6 @@ */ package pcgen.core; -import java.io.StringWriter; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -35,9 +34,6 @@ import java.util.StringTokenizer; import pcgen.cdom.base.ConcretePrereqObject; -import pcgen.core.prereq.Prerequisite; -import pcgen.persistence.PersistenceLayerException; -import pcgen.persistence.lst.output.prereq.PrerequisiteWriter; /** * Encapsulates a single DR entity. @@ -49,7 +45,7 @@ * @author boomer70 * */ -public class DamageReduction extends ConcretePrereqObject implements Comparable<DamageReduction>, Cloneable +public class DamageReduction extends ConcretePrereqObject implements Comparable<DamageReduction> { private String theReduction = "0"; private String theBypass = "-"; @@ -679,94 +675,12 @@ return buffer.toString(); } - /** - * @see java.lang.Object#clone() - */ - @Override - public DamageReduction clone() throws CloneNotSupportedException + public String getLSTformat() { - DamageReduction clone = (DamageReduction) super.clone(); - //Have to do deep clone of Prereqs to match previous behavior :/ - if (hasPrerequisites()) { - clone.clearPrerequisiteList(); - for (Prerequisite prereq : getPrerequisiteList()) - { - clone.addPrerequisite(prereq.clone()); - } - } - return clone; - } - - /** - * Generate the text to be included in a LST file to represent this DR object. - * - * @param includeLevel Should level prereqs be included? - * @return The LST code for the DR. - */ - public String getPCCText(boolean includeLevel) - { - StringBuffer result = new StringBuffer("DR:"); + StringBuffer result = new StringBuffer(); result.append(theReduction); result.append("/"); result.append(theBypass); - - final StringWriter writer = new StringWriter(); - for (Prerequisite prereq : getPrerequisiteList()) - { - if (!includeLevel && "class".equals(prereq.getKind())) - { - continue; - } - final PrerequisiteWriter prereqWriter = new PrerequisiteWriter(); - try - { - writer.write("|"); - prereqWriter.write(writer, prereq); - } - catch (PersistenceLayerException e1) - { - e1.printStackTrace(); - } - result.append(writer); - } - return result.toString(); } - - /** - * Determine if this damage reduction object is associated with a - * level of a class. - * - * @param keyName The key nameof the PCClass. - * @return true if it is associated with a level of the class, false otherwise. - */ - public boolean isForClassLevel(String keyName) - { - for (Prerequisite prereq : getPrerequisiteList()) - { - if (DamageReduction.isPrereqForClassLevel(prereq, keyName)) - { - return true; - } - } - return false; - } - - /** - * Determine if this damage reduction object is associated with a - * level of a class. - * - * @param prereq The prerequisite to check. - * @param keyName The key nameof the PCClass. - * @return true if it is associated with a level of the class, false otherwise. - */ - public static boolean isPrereqForClassLevel(Prerequisite prereq, - String keyName) - { - if (prereq.getKind().equals("class") && prereq.getKey().equals(keyName)) - { - return true; - } - return false; - } } Modified: Trunk/pcgen/code/src/java/pcgen/core/PCClass.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-08-05 02:14:51 UTC (rev 7348) +++ Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-08-05 02:23:23 UTC (rev 7349) @@ -2324,19 +2324,6 @@ .unparse(me.getValue()), "\t")); } - // Output the level based DR only - for (DamageReduction reduction : getDRList()) - { - for (Prerequisite prereq : reduction.getPrerequisiteList()) - { - if (DamageReduction.isPrereqForClassLevel(prereq, getKeyName())) - { - pccTxt.append(lineSep).append(prereq.getOperand()).append( - "\t").append(reduction.getPCCText(false)); - } - } - } - if (SR != null) { for (LevelProperty<String> lp : SR) @@ -2904,6 +2891,12 @@ aClass.naturalWeapons = new ArrayList<LevelProperty<Equipment>>(naturalWeapons); } + + levelMap = new TreeMap<Integer, PCClassLevel>(); + for (Map.Entry<Integer, PCClassLevel> me : aClass.levelMap.entrySet()) + { + levelMap.put(me.getKey(), me.getValue().clone()); + } } catch (CloneNotSupportedException exc) { @@ -4138,21 +4131,6 @@ } } } - - // - // Go through the damage reduction list (DR) and adjust the class to the - // new name - // - for (DamageReduction reduction : getDRList()) - { - for (Prerequisite prereq : reduction.getPrerequisiteList()) - { - if (DamageReduction.isPrereqForClassLevel(prereq, oldClass)) - { - prereq.setKey(newClass); - } - } - } } @Override @@ -5170,21 +5148,8 @@ } } - if (!otherClass.getDRList().isEmpty()) - { - for (DamageReduction dr : otherClass.getDRList()) - { - try - { - addDR(dr.clone()); - } - catch (CloneNotSupportedException e) - { - Logging.errorPrint("Failed to clone DR for PCClass " - + keyName + ".", e); - } - } - } + addAllToListFor(ListKey.DAMAGE_REDUCTION, otherClass + .getListFor(ListKey.DAMAGE_REDUCTION)); if (otherClass.SR != null) { @@ -5478,32 +5443,6 @@ } } } - /** - * Remove the level based DR. Used by Substitution class levels - * @param level - */ - public void removeLevelDR(int level) - { - List<DamageReduction> newDR = new ArrayList<DamageReduction>(); - for (DamageReduction reduction : getDRList()) - { - for (Prerequisite prereq : reduction.getPrerequisiteList()) - { - if (!DamageReduction.isPrereqForClassLevel(prereq, getKeyName()) - && !prereq.getOperand().equals(Integer.toString(level)) - ) - { - newDR.add(reduction); - } - } - } - clearDR(); - for (DamageReduction reduction : newDR) - { - addDR(reduction); - } - - } // public void removeAutoAbilities(final AbilityCategory aCategory, final int aLevel) // { @@ -5541,6 +5480,11 @@ return levelMap.size(); } + public void resetClassLevel(int lvl) + { + levelMap.remove(lvl); + } + public Collection<PCClassLevel> getClassLevelCollection() { return Collections.unmodifiableCollection(levelMap.values()); Modified: Trunk/pcgen/code/src/java/pcgen/core/PObject.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-08-05 02:14:51 UTC (rev 7348) +++ Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-08-05 02:23:23 UTC (rev 7349) @@ -1001,16 +1001,6 @@ retVal.ownBonuses(); } - if (drList != null) - { - retVal.drList = new ArrayList<DamageReduction>(); - for (DamageReduction orig : drList) - { - retVal.drList.add(orig.clone()); - - } - } - if (bonusMap != null) { retVal.bonusMap = new HashMap<String, String>(bonusMap); @@ -1116,19 +1106,9 @@ ChooserUtilities.getChoices(this, aChoice, availableList, selectedList, aPC); } - public void addDR(DamageReduction aDR) - { - drList.add(aDR); - } - - public void clearDR() - { - drList.clear(); - } - public List<DamageReduction> getDRList() { - return Collections.unmodifiableList(drList); + return getListFor(ListKey.DAMAGE_REDUCTION); } /** @@ -2342,19 +2322,6 @@ txt.append("\tCHOOSE:").append(aString); } - for (DamageReduction reduction : getDRList()) - { - boolean levelBased = false; - if (this instanceof PCClass) - { - levelBased = reduction.isForClassLevel(getKeyName()); - } - if (!levelBased) - { - txt.append("\t").append(reduction.getPCCText(true)); - } - } - if (hasPrerequisites()) { final StringWriter writer = new StringWriter(); Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-08-05 02:14:51 UTC (rev 7348) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-08-05 02:23:23 UTC (rev 7349) @@ -8757,18 +8757,15 @@ public List<DamageReduction> getDRList() { List<DamageReduction> drList = new ArrayList<DamageReduction>(); - for (PObject obj : getPObjectList()) + for (CDOMObject obj : getCDOMObjectList()) { - if (obj != null) + List<DamageReduction> objList = obj + .getListFor(ListKey.DAMAGE_REDUCTION); + if (objList != null) { - drList.addAll(obj.getDRList()); + drList.addAll(objList); } } - for (PObject obj : getConditionalTemplateObjects()) - { - drList.addAll(obj.getDRList()); - } - //TODO need to use getCDOMObject once DR: is converted to new token syntax return DamageReduction.getDRList(this, drList); } Modified: Trunk/pcgen/code/src/java/pcgen/core/SubstitutionClass.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/SubstitutionClass.java 2008-08-05 02:14:51 UTC (rev 7348) +++ Trunk/pcgen/code/src/java/pcgen/core/SubstitutionClass.java 2008-08-05 02:23:23 UTC (rev 7349) @@ -104,16 +104,13 @@ if (newLevels.size() >1) { // remove all stuff from the original level + aClass.resetClassLevel(aLevel); aClass.removeAllBonuses(aLevel); aClass.removeAllAutoAbilites(aLevel); aClass.removeAllVirtualAbilites(aLevel); aClass.removeAllLevelAbilities(aLevel); - aClass.getClassLevel(aLevel).removeListFor(ListKey.ADD); aClass.clearSABList(aLevel); - aClass.removeLevelDR(aLevel); - aClass.getClassLevel(aLevel).removeAllVariables(); - - + // Now add in each new level line in turn. for (String theLine: newLevels) { Modified: Trunk/pcgen/code/src/java/pcgen/core/analysis/TemplateModifier.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/analysis/TemplateModifier.java 2008-08-05 02:14:51 UTC (rev 7348) +++ Trunk/pcgen/code/src/java/pcgen/core/analysis/TemplateModifier.java 2008-08-05 02:23:23 UTC (rev 7349) @@ -1,10 +1,9 @@ package pcgen.core.analysis; -import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; -import pcgen.cdom.enumeration.ObjectKey; +import pcgen.cdom.enumeration.ListKey; import pcgen.core.DamageReduction; import pcgen.core.PCTemplate; import pcgen.core.PlayerCharacter; @@ -54,37 +53,18 @@ pct.getConditionalTemplates(totalLevels, totalHitDice, templList); for (PCTemplate subt : templList) { - drList.addAll(subt.getDRList()); + List<DamageReduction> tList = subt + .getListFor(ListKey.DAMAGE_REDUCTION); + if (tList != null) + { + drList.addAll(tList); + } } if (drList.size() != 0) { mods.append("DR:").append(DamageReduction.getDRString(aPC, drList)); } - if (aPC == null) - { - BigDecimal cr = pct.get(ObjectKey.CR_MODIFIER); - - if (cr != null) - { - mods.append("CR:").append(cr).append(' '); - } - - String srf = pct.getSRFormula(); - - if (srf != null) - { - mods.append("SR:").append(srf).append(' '); - } - - // if ((getDR() != null) && !"".equals(getDR())) - // { - // mods.append("DR:").append(getDR()).append(' '); - // } - - return mods.toString(); - } - int nat = (int) pct.bonusTo("COMBAT", "AC", aPC, aPC); if (nat != 0) Modified: Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassLevelPanel.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassLevelPanel.java 2008-08-05 02:14:51 UTC (rev 7348) +++ Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassLevelPanel.java 2008-08-05 02:23:23 UTC (rev 7349) @@ -71,7 +71,6 @@ import pcgen.core.SpecialAbility; import pcgen.core.bonus.BonusObj; import pcgen.core.levelability.LevelAbility; -import pcgen.core.prereq.Prerequisite; import pcgen.core.utils.MessageType; import pcgen.core.utils.ShowMessageDelegate; import pcgen.gui.utils.JComboBoxEx; @@ -218,6 +217,13 @@ } } } + for (DamageReduction dr : pcl.getSafeListFor(ListKey.DAMAGE_REDUCTION)) + { + String src = dr.getReduction() + "/" + dr.getBypass(); + LevelTag lt = new LevelTag(pcl.getSafe(IntegerKey.LEVEL), + LevelTag.TAG_DR, src); + levelTagList.add(lt); + } for (VariableKey vk : pcl.getVariableKeys()) { LevelTag lt = new LevelTag(lvl, LevelTag.TAG_DEFINE, vk.toString() @@ -287,25 +293,6 @@ } - List<DamageReduction> drList = obj.getDRList(); - for (Iterator<DamageReduction> i = drList.iterator(); i.hasNext();) - { - DamageReduction dr = i.next(); - List<Prerequisite> preList = dr.getPrerequisiteList(); - for (Iterator<Prerequisite> j = preList.iterator(); j.hasNext();) - { - Prerequisite prereq = j.next(); - if (DamageReduction.isPrereqForClassLevel(prereq, obj - .getKeyName())) - { - String src = dr.getReduction() + "/" + dr.getBypass(); - LevelTag lt = new LevelTag(prereq.getOperand(), - LevelTag.TAG_DR, src); - levelTagList.add(lt); - } - } - } - List<SpecialAbility> saList = new ArrayList<SpecialAbility>(); obj.addSABToList(saList, null); Modified: Trunk/pcgen/code/src/java/pcgen/gui/editor/EditorMainForm.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/editor/EditorMainForm.java 2008-08-05 02:14:51 UTC (rev 7348) +++ Trunk/pcgen/code/src/java/pcgen/gui/editor/EditorMainForm.java 2008-08-05 02:23:23 UTC (rev 7349) @@ -67,7 +67,6 @@ import pcgen.cdom.reference.CDOMDirectSingleRef; import pcgen.core.Ability; import pcgen.core.Categorisable; -import pcgen.core.DamageReduction; import pcgen.core.Deity; import pcgen.core.Domain; import pcgen.core.Equipment; @@ -618,8 +617,7 @@ thisPObject.getBonusList().clear(); thisPObject.removeAllVariables(); -// thisPObject.setDR(".CLEAR"); - thisPObject.clearDR(); + thisPObject.removeListFor(ListKey.DAMAGE_REDUCTION); thisPObject.clearPrerequisiteList(); thisPObject.clearAllSABLists(); thisPObject.clearSRList(); @@ -3139,21 +3137,14 @@ } } + String[] drs = Globals.getContext().unparse(thisPObject, "DR"); - // Add only those DR entries that are not level based. - List<DamageReduction> drList = thisPObject.getDRList(); - for (Iterator<DamageReduction> i = drList.iterator(); i.hasNext();) + if (drs != null) { - DamageReduction dr = i.next(); - boolean levelBased = false; - if (anEditType == EditorConstants.EDIT_CLASS) + for (String dr : drs) { - levelBased = dr.isForClassLevel(thisPObject.getKeyName()); + selectedList.add("DR:" + dr); } - if (!levelBased) - { - selectedList.add(dr.getPCCText(true)); - } } if (anEditType != EditorConstants.EDIT_CLASS) Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/DrLst.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/DrLst.java 2008-08-05 02:14:51 UTC (rev 7348) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/DrLst.java 2008-08-05 02:23:23 UTC (rev 7349) @@ -4,95 +4,126 @@ */ package plugin.lsttokens; -import pcgen.core.PCClass; -import pcgen.core.PObject; -import pcgen.persistence.lst.GlobalLstToken; -import pcgen.core.prereq.Prerequisite; -import pcgen.persistence.lst.prereq.PreParserFactory; -import pcgen.core.DamageReduction; -import pcgen.persistence.PersistenceLayerException; - import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Set; import java.util.StringTokenizer; +import java.util.TreeSet; +import pcgen.cdom.base.CDOMObject; +import pcgen.cdom.base.Constants; +import pcgen.cdom.enumeration.ListKey; +import pcgen.core.DamageReduction; +import pcgen.core.prereq.Prerequisite; +import pcgen.rules.context.Changes; +import pcgen.rules.context.LoadContext; +import pcgen.rules.persistence.token.AbstractToken; +import pcgen.rules.persistence.token.CDOMPrimaryToken; +import pcgen.util.Logging; + /** * @author djones4 - * + * */ -public class DrLst implements GlobalLstToken +public class DrLst extends AbstractToken implements + CDOMPrimaryToken<CDOMObject> { - /* - * Template's LevelToken adjustment effectively completed by altering getDRList in PlayerCharacter. - */ - /* - * TODO When this is converted to the new sytnax, getDRList in - * PlayerCharacter needs to be converted to look at class levels (use - * getCDOMObjects()) - */ - + @Override public String getTokenName() { return "DR"; } - public boolean parse(PObject obj, String value, int anInt) + public boolean parse(LoadContext context, CDOMObject obj, String value) { - ArrayList<Prerequisite> preReqs = new ArrayList<Prerequisite>(); - if (anInt > -9) + if (".CLEAR".equals(value)) { - try + context.getObjectContext() + .removeList(obj, ListKey.DAMAGE_REDUCTION); + return true; + } + + StringTokenizer tok = new StringTokenizer(value, "|"); + DamageReduction dr; + try + { + String[] values = tok.nextToken().split("/"); + if (values.length != 2) { - PreParserFactory factory = PreParserFactory.getInstance(); - String preLevelString = "PRELEVEL:MIN=" + anInt; - if (obj instanceof PCClass) - { - // Classes handle this differently - preLevelString = - "PRECLASS:1," + obj.getKeyName() + "=" + anInt; - } - Prerequisite r = factory.parse(preLevelString); - preReqs.add(r); + Logging.errorPrint(getTokenName() + + " failed to build DamageReduction with value " + + value); + Logging + .errorPrint(" ...expected a String with one / as a separator"); + return false; } - catch (PersistenceLayerException notUsed) + if (values[0].length() == 0) { + Logging.errorPrint("Amount of Reduction in " + getTokenName() + + " cannot be empty"); return false; } + if (values[1].length() == 0) + { + Logging.errorPrint("Damage Type in " + getTokenName() + + " cannot be empty"); + return false; + } + dr = new DamageReduction(values[0], values[1]); } - - if (".CLEAR".equals(value)) + catch (IllegalArgumentException iae) { - obj.clearDR(); - return true; - } - - StringTokenizer tok = new StringTokenizer(value, "|"); - String[] values = tok.nextToken().split("/"); - if (values.length != 2) - { + Logging.errorPrint(getTokenName() + + " failed to build DamageReduction with value " + value + + " ... " + iae.getLocalizedMessage()); return false; } - DamageReduction dr = new DamageReduction(values[0], values[1]); if (tok.hasMoreTokens()) { - try + String currentToken = tok.nextToken(); + Prerequisite prereq = getPrerequisite(currentToken); + if (prereq == null) { - PreParserFactory factory = PreParserFactory.getInstance(); - Prerequisite r = factory.parse(tok.nextToken()); - preReqs.add(r); - } - catch (PersistenceLayerException notUsed) - { return false; } + dr.addPrerequisite(prereq); } - for (Prerequisite prereq : preReqs) + context.getObjectContext().addToList(obj, ListKey.DAMAGE_REDUCTION, dr); + return true; + } + + public String[] unparse(LoadContext context, CDOMObject obj) + { + Changes<DamageReduction> changes = context.getObjectContext() + .getListChanges(obj, ListKey.DAMAGE_REDUCTION); + Collection<DamageReduction> added = changes.getAdded(); + List<String> list = new ArrayList<String>(); + if (changes.includesGlobalClear()) { - dr.addPrerequisite(prereq); + list.add(Constants.LST_DOT_CLEAR); } + else if (added == null || added.isEmpty()) + { + // Zero indicates no Token (and no global clear, so nothing to do) + return null; + } + Set<String> set = new TreeSet<String>(); + if (added != null) + { + for (DamageReduction lw : added) + { + set.add(lw.getLSTformat()); + } + } + list.addAll(set); + return list.toArray(new String[list.size()]); + } - obj.addDR(dr); - return true; + public Class<CDOMObject> getTokenClass() + { + return CDOMObject.class; } } Modified: Trunk/pcgen/code/src/test/pcgen/core/PObjectTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/PObjectTest.java 2008-08-05 02:14:51 UTC (rev 7348) +++ Trunk/pcgen/code/src/test/pcgen/core/PObjectTest.java 2008-08-05 02:23:23 UTC (rev 7349) @@ -35,6 +35,7 @@ import pcgen.base.lang.UnreachableError; import pcgen.cdom.base.CDOMReference; import pcgen.cdom.content.ChallengeRating; +import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; import pcgen.cdom.reference.CDOMSingleRef; import pcgen.cdom.reference.ReferenceManufacturer; @@ -110,17 +111,17 @@ race.setName("Template"); // race.setDR("5/Good"); - race.addDR(new DamageReduction("5", "Good")); + race.addToListFor(ListKey.DAMAGE_REDUCTION, new DamageReduction("5", "Good")); assertEquals("Basic DR set.", "5/Good", race.getDRList().get(0) .toString()); - race.clearDR(); + race.removeListFor(ListKey.DAMAGE_REDUCTION); // race.setDR("0/-"); - race.addDR(new DamageReduction("0", "-")); + race.addToListFor(ListKey.DAMAGE_REDUCTION, new DamageReduction("0", "-")); assertEquals("Basic DR set.", "0/-", race.getDRList().get(0).toString()); // template.setDR("0/-"); - template.addDR(new DamageReduction("0", "-")); + template.addToListFor(ListKey.DAMAGE_REDUCTION, new DamageReduction("0", "-")); template.addBonusList("DR|-|1"); PlayerCharacter pc = getCharacter(); pc.setRace(race); Modified: Trunk/pcgen/code/src/test/pcgen/core/prereq/PreDRTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/prereq/PreDRTest.java 2008-08-05 02:14:51 UTC (rev 7348) +++ Trunk/pcgen/code/src/test/pcgen/core/prereq/PreDRTest.java 2008-08-05 02:23:23 UTC (rev 7349) @@ -25,6 +25,7 @@ import junit.framework.TestSuite; import junit.textui.TestRunner; import pcgen.AbstractCharacterTestCase; +import pcgen.cdom.enumeration.ListKey; import pcgen.core.DamageReduction; import pcgen.core.PlayerCharacter; import pcgen.core.Race; @@ -75,14 +76,14 @@ assertFalse("Character has no DR", PrereqHandler.passes(prereq, character, null)); - race.addDR(drPlus1); + race.addToListFor(ListKey.DAMAGE_REDUCTION, drPlus1); character.setRace(race); assertFalse("Character DR not 10", PrereqHandler.passes(prereq, character, null)); DamageReduction drPlus1_10 = new DamageReduction("10", "+1"); - race.addDR(drPlus1_10); + race.addToListFor(ListKey.DAMAGE_REDUCTION, drPlus1_10); character.setRace(race); assertTrue("Character has DR 10/+1", PrereqHandler.passes(prereq, @@ -106,14 +107,14 @@ assertFalse("Character has no DR", PrereqHandler.passes(prereq, character, null)); - race.addDR(drPlus1); + race.addToListFor(ListKey.DAMAGE_REDUCTION, drPlus1); character.setRace(race); assertFalse("Character DR not 10", PrereqHandler.passes(prereq, character, null)); DamageReduction drPlus2_5 = new DamageReduction("5", "+2"); - race.addDR(drPlus2_5); + race.addToListFor(ListKey.DAMAGE_REDUCTION, drPlus2_5); character.setRace(race); assertTrue("Character has DR 5/+2", PrereqHandler.passes(prereq, @@ -133,21 +134,21 @@ assertFalse("Character has no DR", PrereqHandler.passes(prereq, character, null)); - race.addDR(drPlus1); + race.addToListFor(ListKey.DAMAGE_REDUCTION, drPlus1); character.setRace(race); assertFalse("Character DR not 10", PrereqHandler.passes(prereq, character, null)); DamageReduction drPlus2_5 = new DamageReduction("5", "+2"); - race.addDR(drPlus2_5); + race.addToListFor(ListKey.DAMAGE_REDUCTION, drPlus2_5); character.setRace(race); assertFalse("Character has DR 5/+2", PrereqHandler.passes(prereq, character, null)); DamageReduction drPlus1_10 = new DamageReduction("10", "+1"); - race.addDR(drPlus1_10); + race.addToListFor(ListKey.DAMAGE_REDUCTION, drPlus1_10); character.setRace(race); assertTrue("Character has DR 10/+1 and 5/+2", PrereqHandler.passes( This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-08-05 02:32:51
|
Revision: 7350 http://pcgen.svn.sourceforge.net/pcgen/?rev=7350&view=rev Author: thpr Date: 2008-08-05 02:32:54 +0000 (Tue, 05 Aug 2008) Log Message: ----------- Global Qualify Token Update Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.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/gui/editor/ClassBasePanel.java Trunk/pcgen/code/src/java/pcgen/util/StringPClassUtil.java Trunk/pcgen/code/src/java/plugin/lsttokens/QualifyToken.java Trunk/pcgen/code/src/test/pcgen/core/PCClassTest.java Added Paths: ----------- Trunk/pcgen/code/src/java/pcgen/cdom/helper/Qualifier.java Modified: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java 2008-08-05 02:23:23 UTC (rev 7349) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java 2008-08-05 02:32:54 UTC (rev 7350) @@ -32,6 +32,7 @@ import pcgen.cdom.content.TransitionChoice; import pcgen.cdom.helper.AttackCycle; import pcgen.cdom.helper.PointCost; +import pcgen.cdom.helper.Qualifier; import pcgen.cdom.helper.Quality; import pcgen.cdom.helper.StatLock; import pcgen.cdom.list.ClassSkillList; @@ -206,6 +207,7 @@ public static final ListKey<CDOMReference<PCTemplate>> REMOVE_TEMPLATES = new ListKey<CDOMReference<PCTemplate>>(); public static final ListKey<Vision> VISION_CACHE = new ListKey<Vision>(); public static final ListKey<TransitionChoice<?>> ADD = new ListKey<TransitionChoice<?>>(); + public static final ListKey<Qualifier> QUALIFY = new ListKey<Qualifier>(); public static final ListKey<DamageReduction> DAMAGE_REDUCTION = new ListKey<DamageReduction>(); public static final ListKey<PCStat> UNLOCKED_STATS = new ListKey<PCStat>(); public static final ListKey<StatLock> STAT_LOCKS = new ListKey<StatLock>(); Added: Trunk/pcgen/code/src/java/pcgen/cdom/helper/Qualifier.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/helper/Qualifier.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/cdom/helper/Qualifier.java 2008-08-05 02:32:54 UTC (rev 7350) @@ -0,0 +1,54 @@ +package pcgen.cdom.helper; + +import pcgen.cdom.base.CDOMObject; +import pcgen.cdom.base.CDOMReference; + +public class Qualifier +{ + + private final Class<? extends CDOMObject> qualClass; + private final CDOMReference<? extends CDOMObject> qualRef; + + public Qualifier(Class<? extends CDOMObject> cl, + CDOMReference<? extends CDOMObject> ref) + { + if (cl == null) + { + throw new IllegalArgumentException("Class cannot be null"); + } + if (ref == null) + { + throw new IllegalArgumentException("Reference cannot be null"); + } + qualClass = cl; + qualRef = ref; + } + + public Class<? extends CDOMObject> getQualifiedClass() + { + return qualClass; + } + + public CDOMReference<? extends CDOMObject> getQualifiedReference() + { + return qualRef; + } + + @Override + public int hashCode() + { + return qualClass.hashCode() * 29 + qualRef.hashCode(); + } + + @Override + public boolean equals(Object o) + { + if (o instanceof Qualifier) + { + Qualifier other = (Qualifier) o; + return qualClass.equals(other.qualClass) && qualRef.equals(other.qualRef); + } + return false; + } + +} Modified: Trunk/pcgen/code/src/java/pcgen/core/PObject.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-08-05 02:23:23 UTC (rev 7349) +++ Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-08-05 02:32:54 UTC (rev 7350) @@ -72,7 +72,6 @@ import pcgen.persistence.lst.prereq.PreParserFactory; import pcgen.rules.context.AbstractReferenceContext; import pcgen.util.Logging; -import pcgen.util.StringPClassUtil; import pcgen.util.chooser.ChooserFactory; import pcgen.util.chooser.ChooserInterface; @@ -135,7 +134,6 @@ private List<Description> theDescriptions = null; - private DoubleKeyMap<Class, String, List<String>> qualifyKeys = null; private HashMap<String,List<String>> servesAsList =null; private URI sourceURI = null; @@ -1220,53 +1218,6 @@ } /** - * Clear all qualify entries for the object. - */ - public void clearQualify() - { - qualifyKeys = new DoubleKeyMap<Class, String, List<String>>(); - } - - /** - * Set the qualify string - */ - public void putQualifyString(Class cl, String category, String key) { - if (qualifyKeys == null) - { - qualifyKeys = new DoubleKeyMap<Class, String, List<String>>(); - } - List<String> list = qualifyKeys.get(cl, category); - if (list == null) { - list = new ArrayList<String>(); - qualifyKeys.put(cl, category, list); - } - list.add(key); - //No need to put list back in qualifyKeys, it is fetched by reference - } - - public final boolean grantsQualify(CDOMObject qualTestObject) - { - if (qualifyKeys == null) { - return false; - } - Class<? extends CDOMObject> cl = qualTestObject.getClass(); - String key = qualTestObject.getKeyName(); - String category = Ability.class.equals(cl) ? ((Ability) qualTestObject) - .getCategory() : null; - List<String> directList = qualifyKeys.get(cl, category); - List<String> oldSyntaxList = qualifyKeys - .get(Object.class, category); - return (directList != null && directList.contains(key)) - || (oldSyntaxList != null && oldSyntaxList.contains(key)); - } - - //TODO This exposes internal structure - be careful. - public final DoubleKeyMap<Class, String, List<String>> getQualifyMap() - { - return qualifyKeys; - } - - /** * Set the SR * @param newSR */ @@ -2351,40 +2302,6 @@ } } - DoubleKeyMap<Class, String, List<String>> dkm = getQualifyMap(); - if (dkm != null) - { - for (Class cl : dkm.getKeySet()) - { - String s = StringPClassUtil.getStringFor(cl); - for (String category : dkm.getSecondaryKeySet(cl)) - { - List<String> l = dkm.get(cl, category); - if (l != null) { - boolean started = false; - for (String key : l) { - if (!"alwaysValid".equals(key) && !"".equals(key)) { - if (started) { - txt.append(Constants.PIPE); - } else { - txt.append("\tQUALIFY:"); - if (s != null && s.length() > 0) { - txt.append(s); - } - if (category != null) { - txt.append('=').append(category); - } - txt.append(Constants.PIPE); - started = true; - } - txt.append(key); - } - } - } - } - } - } - if (!(this instanceof PCClass)) { for (PCSpell s : getSpellList()) Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-08-05 02:23:23 UTC (rev 7349) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-08-05 02:32:54 UTC (rev 7350) @@ -61,7 +61,6 @@ import pcgen.cdom.base.AssociatedPrereqObject; import pcgen.cdom.base.CDOMObject; import pcgen.cdom.base.CDOMReference; -import pcgen.cdom.base.Category; import pcgen.cdom.base.Constants; import pcgen.cdom.content.ChallengeRating; import pcgen.cdom.content.HitDie; @@ -79,6 +78,7 @@ import pcgen.cdom.enumeration.SkillCost; import pcgen.cdom.enumeration.StringKey; import pcgen.cdom.enumeration.VariableKey; +import pcgen.cdom.helper.Qualifier; import pcgen.cdom.helper.StatLock; import pcgen.cdom.inst.EquipmentHead; import pcgen.cdom.inst.ObjectCache; @@ -4281,22 +4281,45 @@ * for the 5.10.* format of Qualify - which is "allow anything all at once" * - Tom Parker 1/17/07 */ - // Try all possible POBjects - for (PObject pObj : getPObjectList()) + // Try all possible CDOMOjects + for (CDOMObject cdo : getCDOMObjectList()) { - if (pObj == null) + if (grantsQualify(cdo, testQualObj)) { - continue; + return true; } + } + return false; + } - if (pObj.grantsQualify(testQualObj)) + public final boolean grantsQualify(CDOMObject owner, CDOMObject qualTestObject) + { + List<Qualifier> qualList = owner.getListFor(ListKey.QUALIFY); + if (qualList == null) + { + return false; + } + Class<? extends CDOMObject> cl = qualTestObject.getClass(); + for (Qualifier qual : qualList) + { + if (cl.equals(qual.getQualifiedClass())) { - return true; + CDOMReference qRef = qual.getQualifiedReference(); + if (checkRef(qRef, qualTestObject)) + { + return true; + } } } return false; } + + private <T extends CDOMObject> boolean checkRef(CDOMReference<T> ref, T qualTestObject) + { + return ref.contains(qualTestObject); + } + /** * Checks to see if this PC has the weapon proficiency key aKey * Modified: Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassBasePanel.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassBasePanel.java 2008-08-05 02:23:23 UTC (rev 7349) +++ Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassBasePanel.java 2008-08-05 02:32:54 UTC (rev 7350) @@ -34,12 +34,17 @@ import pcgen.base.formula.Formula; import pcgen.base.lang.StringUtil; -import pcgen.base.util.DoubleKeyMap; +import pcgen.cdom.base.CDOMObject; +import pcgen.cdom.base.CDOMReference; +import pcgen.cdom.base.Category; import pcgen.cdom.base.Constants; import pcgen.cdom.base.FormulaFactory; import pcgen.cdom.enumeration.FormulaKey; +import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; import pcgen.cdom.enumeration.StringKey; +import pcgen.cdom.helper.Qualifier; +import pcgen.cdom.reference.CategorizedCDOMReference; import pcgen.core.Globals; import pcgen.core.PCClass; import pcgen.core.PObject; @@ -48,6 +53,7 @@ import pcgen.persistence.lst.TokenStore; import pcgen.util.Logging; import pcgen.util.PropertyFactory; +import pcgen.util.StringPClassUtil; import pcgen.util.enumeration.Visibility; /** @@ -120,7 +126,7 @@ Formula f = FormulaFactory.getFormulaFor(form); obj.put(FormulaKey.START_SKILL_POINTS, f); } - obj.clearQualify(); + obj.removeListFor(ListKey.QUALIFY); if (qualify.getText().trim().length() > 0) { GlobalLstToken token = @@ -194,14 +200,23 @@ exchangeLevel.setText(obj.getLevelExchange()); Formula spf = obj.get(FormulaKey.START_SKILL_POINTS); startSkillPoints.setText(spf == null ? "" : spf.toString()); - DoubleKeyMap<Class, String, List<String>> dkm = obj.getQualifyMap(); - if (dkm != null) + List<Qualifier> qualList = obj.getListFor(ListKey.QUALIFY); + if (qualList != null) { - List<String> ol = dkm.get(Object.class, null); - if (ol != null && !ol.isEmpty()) + List<String> ol = new ArrayList<String>(); + for (Qualifier qual : qualList) { - qualify.setText(StringUtil.join(ol, "|")); + String cl = StringPClassUtil.getStringFor(qual.getQualifiedClass()); + CDOMReference<? extends CDOMObject> ref = qual.getQualifiedReference(); + if (ref instanceof CategorizedCDOMReference) + { + Category<?> cat = + ((CategorizedCDOMReference<?>) ref).getCDOMCategory(); + cl += '=' + cat.toString(); + } + ol.add(cl + "|" + ref.getLSTformat()); } + qualify.setText(StringUtil.join(ol, "|")); } exClass.setText(obj.getExClass()); hasSubClass.setSelected(obj.hasSubClass()); Modified: Trunk/pcgen/code/src/java/pcgen/util/StringPClassUtil.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/util/StringPClassUtil.java 2008-08-05 02:23:23 UTC (rev 7349) +++ Trunk/pcgen/code/src/java/pcgen/util/StringPClassUtil.java 2008-08-05 02:32:54 UTC (rev 7350) @@ -4,6 +4,9 @@ import java.util.Map; import java.util.Set; +import pcgen.cdom.base.CDOMObject; +import pcgen.cdom.base.CategorizedCDOMObject; +import pcgen.cdom.base.Category; import pcgen.core.Ability; import pcgen.core.Deity; import pcgen.core.Domain; @@ -14,19 +17,22 @@ import pcgen.core.PCTemplate; import pcgen.core.PObject; import pcgen.core.Race; +import pcgen.core.SettingsHandler; import pcgen.core.Skill; import pcgen.core.WeaponProf; import pcgen.core.spell.Spell; -public class StringPClassUtil { +public class StringPClassUtil +{ private static Map<String, Class<? extends PObject>> classMap; private static Map<Class<? extends PObject>, String> stringMap; - - static { + + static + { classMap = new HashMap<String, Class<? extends PObject>>(); stringMap = new HashMap<Class<? extends PObject>, String>(); - + classMap.put("DEITY", Deity.class); classMap.put("DOMAIN", Domain.class); classMap.put("EQUIPMENT", Equipment.class); @@ -39,7 +45,7 @@ classMap.put("SKILL", Skill.class); classMap.put("TEMPLATE", PCTemplate.class); classMap.put("WEAPONPROF", WeaponProf.class); - + stringMap.put(Deity.class, "DEITY"); stringMap.put(Domain.class, "DOMAIN"); stringMap.put(Equipment.class, "EQUIPMENT"); @@ -53,17 +59,33 @@ stringMap.put(PCTemplate.class, "TEMPLATE"); stringMap.put(WeaponProf.class, "WEAPONPROF"); } - - public static Class<? extends PObject> getClassFor(String key) { + + public static Class<? extends PObject> getClassFor(String key) + { return classMap.get(key); } - - public static Set<String> getValidStrings() { + + public static Set<String> getValidStrings() + { return classMap.keySet(); } - public static String getStringFor(Class<?> cl) { + public static String getStringFor(Class<?> cl) + { return stringMap.get(cl); } + public static <T extends CDOMObject & CategorizedCDOMObject<T>> Category<T> getCategoryFor( + Class<T> cl, String s) + { + if (cl.equals(Ability.class)) + { + return (Category) SettingsHandler.getGame().silentlyGetAbilityCategory(s); + } + else + { + return null; + } + } + } Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/QualifyToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/QualifyToken.java 2008-08-05 02:23:23 UTC (rev 7349) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/QualifyToken.java 2008-08-05 02:32:54 UTC (rev 7350) @@ -1,84 +1,208 @@ package plugin.lsttokens; import java.util.Arrays; +import java.util.Collection; import java.util.List; +import java.util.Set; import java.util.StringTokenizer; +import java.util.TreeSet; +import pcgen.base.util.HashMapToList; +import pcgen.cdom.base.CDOMObject; +import pcgen.cdom.base.CDOMReference; +import pcgen.cdom.base.CategorizedCDOMObject; +import pcgen.cdom.base.Category; import pcgen.cdom.base.Constants; +import pcgen.cdom.enumeration.ListKey; +import pcgen.cdom.helper.Qualifier; +import pcgen.cdom.inst.PCClassLevel; +import pcgen.cdom.reference.CategorizedCDOMReference; +import pcgen.cdom.reference.ReferenceManufacturer; +import pcgen.cdom.reference.ReferenceUtilities; import pcgen.core.Ability; import pcgen.core.Deity; import pcgen.core.Domain; import pcgen.core.Equipment; import pcgen.core.PCClass; import pcgen.core.PCTemplate; -import pcgen.core.PObject; import pcgen.core.Race; import pcgen.core.Skill; import pcgen.core.WeaponProf; import pcgen.core.spell.Spell; -import pcgen.persistence.lst.GlobalLstToken; +import pcgen.rules.context.Changes; +import pcgen.rules.context.LoadContext; +import pcgen.rules.persistence.TokenUtilities; +import pcgen.rules.persistence.token.AbstractToken; +import pcgen.rules.persistence.token.CDOMPrimaryToken; import pcgen.util.Logging; import pcgen.util.StringPClassUtil; /** * Deals with the QUALIFY token for Abilities */ -public class QualifyToken implements GlobalLstToken +public class QualifyToken extends AbstractToken implements + CDOMPrimaryToken<CDOMObject> { + @Override public String getTokenName() { return "QUALIFY"; } - public boolean parse(PObject obj, String value, int anInt) + public List<Class<? extends CDOMObject>> getLegalTypes() { - if (!getLegalTypes().contains(obj.getClass())) { + return Arrays.asList(PCClassLevel.class, Ability.class, Deity.class, + Domain.class, Equipment.class, PCClass.class, Race.class, + Skill.class, Spell.class, PCTemplate.class, WeaponProf.class); + } + + public boolean parse(LoadContext context, CDOMObject obj, String value) + { + if (!getLegalTypes().contains(obj.getClass())) + { Logging.errorPrint("Cannot use QUALIFY on a " + obj.getClass()); return false; } + if (isEmpty(value) || hasIllegalSeparator('|', value)) + { + return false; + } + + if (value.indexOf("|") == -1) + { + Logging.errorPrint(getTokenName() + + " requires at least two arguments, QualifyType and Key: " + + value); + return false; + } StringTokenizer st = new StringTokenizer(value, Constants.PIPE); - String key = st.hasMoreTokens() ? st.nextToken() : ""; - Class c; - String category = null; - int equalLoc = key.indexOf('='); - if (equalLoc == -1) { - if ("ABILITY".equals(key)) { - Logging.errorPrint("Invalid use of ABILITY in QUALIFY " - + "(requires ABILITY=<category>): " + key); + String firstToken = st.nextToken(); + int equalLoc = firstToken.indexOf('='); + String className; + String categoryName; + if (equalLoc != firstToken.lastIndexOf('=')) + { + Logging.errorPrint(" Error encountered parsing " + getTokenName()); + Logging.errorPrint(" Found second = in QualifyType=Category"); + Logging + .errorPrint(" Format is: QualifyType[=Category]|Key[|Key] value was: " + + value); + Logging.errorPrint(" Valid QualifyTypes are: " + + StringPClassUtil.getValidStrings()); + return false; + } + else if (equalLoc == -1) + { + className = firstToken; + categoryName = null; + } + else + { + className = firstToken.substring(0, equalLoc); + categoryName = firstToken.substring(equalLoc + 1); + } + Class<? extends CDOMObject> c = StringPClassUtil.getClassFor(className); + ReferenceManufacturer<? extends CDOMObject, ?> rm; + if (CategorizedCDOMObject.class.isAssignableFrom(c)) + { + if (categoryName == null) + { + Logging.errorPrint(" Error encountered parsing " + + getTokenName()); + Logging + .errorPrint(" Found Categorized Type without =Category"); + Logging + .errorPrint(" Format is: QualifyType[=Category]|Key[|Key] value was: " + + value); + Logging.errorPrint(" Valid QualifyTypes are: " + + StringPClassUtil.getValidStrings()); return false; } - c = StringPClassUtil.getClassFor(key); - } else { - if (!"ABILITY".equals(key.substring(0, equalLoc))) { - Logging.errorPrint("Invalid use of = in QUALIFY " - + "(only valid for ABILITY): " + key); + rm = foo(context, (Class) c, categoryName); + } + else + { + if (categoryName != null) + { + Logging.errorPrint(" Error encountered parsing " + + getTokenName()); + Logging + .errorPrint(" Found Non-Categorized Type with =Category"); + Logging + .errorPrint(" Format is: QualifyType[=Category]|Key[|Key] value was: " + + value); + Logging.errorPrint(" Valid QualifyTypes are: " + + StringPClassUtil.getValidStrings()); return false; } - c = Ability.class; - category = key.substring(equalLoc + 1); + rm = context.ref.getManufacturer(c); } - if (c == null) { - Logging.errorPrint(getTokenName() + " expecting a POBJECT Type, found: " + key); - return false; - } else { - key = st.nextToken(); + + while (st.hasMoreTokens()) + { + CDOMReference<? extends CDOMObject> ref = + rm.getReference(st.nextToken()); + context.obj.addToList(obj, ListKey.QUALIFY, new Qualifier(rm + .getReferenceClass(), ref)); } - - while (true) { - obj.putQualifyString(c, category, key); - if (!st.hasMoreTokens()) { - break; + + return true; + } + + private <T extends CDOMObject & CategorizedCDOMObject<T>> ReferenceManufacturer<? extends CDOMObject, ?> foo( + LoadContext context, Class<T> c, String categoryName) + { + Category<T> cat = StringPClassUtil.getCategoryFor(c, categoryName); + if (cat == null) + { + return null; + } + return context.ref.getManufacturer(c, cat); + } + + public String[] unparse(LoadContext context, CDOMObject obj) + { + Changes<Qualifier> changes = + context.getObjectContext().getListChanges(obj, ListKey.QUALIFY); + if (changes == null || changes.isEmpty()) + { + return null; + } + Collection<Qualifier> quals = changes.getAdded(); + HashMapToList<String, CDOMReference<?>> map = + new HashMapToList<String, CDOMReference<?>>(); + for (Qualifier qual : quals) + { + Class<? extends CDOMObject> cl = qual.getQualifiedClass(); + String s = StringPClassUtil.getStringFor(cl); + CDOMReference<?> ref = qual.getQualifiedReference(); + String key = s; + if (ref instanceof CategorizedCDOMReference) + { + Category<?> cat = + ((CategorizedCDOMReference<?>) ref).getCDOMCategory(); + key += '=' + cat.toString(); } - key = st.nextToken(); + map.addToListFor(key, ref); } - - return true; + Set<CDOMReference<?>> set = + new TreeSet<CDOMReference<?>>(TokenUtilities.REFERENCE_SORTER); + Set<String> returnSet = new TreeSet<String>(); + for (String key : map.getKeySet()) + { + set.clear(); + set.addAll(map.getListFor(key)); + StringBuilder sb = new StringBuilder(); + sb.append(key).append(Constants.PIPE).append( + ReferenceUtilities.joinLstFormat(set, Constants.PIPE)); + returnSet.add(sb.toString()); + } + return returnSet.toArray(new String[returnSet.size()]); } - - public List<Class<? extends PObject>> getLegalTypes() { - return Arrays.asList(Ability.class, Deity.class, Domain.class, - Equipment.class, PCClass.class, Race.class, Skill.class, - Spell.class, PCTemplate.class, WeaponProf.class); + + public Class<CDOMObject> getTokenClass() + { + return CDOMObject.class; } } Modified: Trunk/pcgen/code/src/test/pcgen/core/PCClassTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/PCClassTest.java 2008-08-05 02:23:23 UTC (rev 7349) +++ Trunk/pcgen/code/src/test/pcgen/core/PCClassTest.java 2008-08-05 02:32:54 UTC (rev 7350) @@ -50,6 +50,8 @@ import pcgen.cdom.enumeration.StringKey; import pcgen.cdom.enumeration.VariableKey; import pcgen.cdom.formula.FixedSizeFormula; +import pcgen.cdom.helper.Qualifier; +import pcgen.cdom.reference.CDOMDirectSingleRef; import pcgen.cdom.inst.PCClassLevel; import pcgen.core.Ability.Nature; import pcgen.core.bonus.BonusObj; @@ -247,7 +249,8 @@ final PCClass aQClass = new PCClass(); aQClass.setName("QualClass"); aQClass.setKeyName("KEY_QualClass"); - aQClass.putQualifyString(PCClass.class, null, "KEY_PreReqClass"); + CDOMDirectSingleRef<PCClass> ref = CDOMDirectSingleRef.getRef(aPrClass); + aQClass.addToListFor(ListKey.QUALIFY, new Qualifier(PCClass.class, ref)); //aQClass.setQualifyString("KEY_PreReqClass|PreReqVar"); final PCClass aNqClass = new PCClass(); @@ -319,8 +322,8 @@ final PCClass aQClass = new PCClass(); aQClass.setName("QualClass"); aQClass.setKeyName("KEY_QualClass"); - aQClass.putQualifyString(Object.class, null, "KEY_PreReqClass"); - aQClass.putQualifyString(Object.class, null, "PreReqVar"); + CDOMDirectSingleRef<PCClass> ref = CDOMDirectSingleRef.getRef(aPrClass); + aQClass.addToListFor(ListKey.QUALIFY, new Qualifier(PCClass.class, ref)); final PCClass aNqClass = new PCClass(); aNqClass.setName("NonQualClass"); @@ -886,8 +889,8 @@ qClass = new PCClass(); qClass.setName("QualClass"); qClass.setKeyName("KEY_QualClass"); - qClass.putQualifyString(PCClass.class, null, "KEY_PreReqClass"); - //qClass.setQualifyString("KEY_PreReqClass|PreReqVar"); + CDOMDirectSingleRef<PCClass> ref = CDOMDirectSingleRef.getRef(prClass); + qClass.addToListFor(ListKey.QUALIFY, new Qualifier(PCClass.class, ref)); nqClass = new PCClass(); nqClass.setName("NonQualClass"); nqClass.setKeyName("KEY_NonQualClass"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-08-05 03:02:31
|
Revision: 7352 http://pcgen.svn.sourceforge.net/pcgen/?rev=7352&view=rev Author: thpr Date: 2008-08-05 03:02:33 +0000 (Tue, 05 Aug 2008) Log Message: ----------- Race & Domain cleanup 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/PlayerCharacter.java Trunk/pcgen/code/src/java/pcgen/core/Race.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/editor/RaceBasePanel.java Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoDomain.java Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoRaces.java Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoSummary.java Trunk/pcgen/code/src/java/pcgen/gui/tabs/resources/AvailableFollowerModel.java Trunk/pcgen/code/src/java/pcgen/io/PCGVer0Parser.java Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Parser.java Trunk/pcgen/code/src/java/plugin/lsttokens/race/StartfeatsToken.java Trunk/pcgen/code/src/test/pcgen/core/PlayerCharacterTest.java Trunk/pcgen/code/src/test/pcgen/core/RaceTest.java Trunk/pcgen/code/src/test/pcgen/io/exporttoken/SpellMemTokenTest.java Trunk/pcgen/code/src/test/pcgen/util/TestHelper.java Trunk/pcgen/code/src/test/plugin/exporttokens/SpellListTokenTest.java Added Paths: ----------- Trunk/pcgen/code/src/java/pcgen/core/analysis/RaceStat.java Trunk/pcgen/code/src/java/pcgen/core/display/ Trunk/pcgen/code/src/java/pcgen/core/display/VisionDisplay.java Modified: Trunk/pcgen/code/src/java/pcgen/core/Domain.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Domain.java 2008-08-05 02:37:05 UTC (rev 7351) +++ Trunk/pcgen/code/src/java/pcgen/core/Domain.java 2008-08-05 03:02:33 UTC (rev 7352) @@ -45,34 +45,20 @@ */ public final class Domain extends PObject { - private boolean isLocked; - /** * Sets the locked flag on a PC - * @param aBool * @param pc */ - public void setIsLocked(final boolean aBool, final PlayerCharacter pc) + public void applyDomain(final PlayerCharacter pc) { - // The effect of this method is per character, so a global flag cannot be used for optimisation -// if (isLocked == aBool) -// { -// return; -// } - - isLocked = aBool; - - if (aBool) - { - final PlayerCharacter aPC = pc; - final CharacterDomain aCD = aPC.getCharacterDomainForDomain(keyName); + final CharacterDomain aCD = pc.getCharacterDomainForDomain(keyName); PCClass aClass = null; if (aCD != null) { if (aCD.isFromPCClass()) { - aClass = aPC.getClassKeyed(aCD.getObjectName()); + aClass = pc.getClassKeyed(aCD.getObjectName()); if (aClass != null) { @@ -80,7 +66,7 @@ for (maxLevel = 0; maxLevel < 10; maxLevel++) { - if (aClass.getCastForLevel(maxLevel, aPC) == 0) + if (aClass.getCastForLevel(maxLevel, pc) == 0) { break; } @@ -97,7 +83,7 @@ for ( Spell gcs : aList ) { - if (gcs.levelForKey("DOMAIN", keyName, aPC) < maxLevel) + if (gcs.levelForKey("DOMAIN", keyName, pc) < maxLevel) { if (aClass.getSafe(IntegerKey.KNOWN_SPELLS_FROM_SPECIALTY) == 0) { @@ -128,7 +114,7 @@ final String book = pcSpell.getSpellbook(); - if (PrereqHandler.passesAll(pcSpell.getPrerequisiteList(), aPC, this)) + if (PrereqHandler.passesAll(pcSpell.getPrerequisiteList(), pc, this)) { final List<CharacterSpell> aList = aClass.getSpellSupport() .getCharacterSpell(aSpell, book, -1); @@ -148,7 +134,7 @@ if ( (choiceString.length() > 0) && - !aPC.isImporting() && + !pc.isImporting() && !choiceString.startsWith("FEAT|")) { ChooserUtilities.modChoices( @@ -156,17 +142,16 @@ new ArrayList(), new ArrayList(), true, - aPC, + pc, true, null); } - if (!aPC.isImporting()) + if (!pc.isImporting()) { - globalChecks(aPC); - activateBonuses(aPC); + globalChecks(pc); + activateBonuses(pc); } - } } @Override @@ -183,7 +168,6 @@ try { aObj = (Domain) super.clone(); - aObj.isLocked = false; } catch (CloneNotSupportedException exc) { Modified: Trunk/pcgen/code/src/java/pcgen/core/PCClass.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-08-05 02:37:05 UTC (rev 7351) +++ Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-08-05 03:02:33 UTC (rev 7352) @@ -5244,7 +5244,7 @@ aCD.setDomain(aDomain, aPC); aPC.addCharacterDomain(aCD); aDomain = aCD.getDomain(); - aDomain.setIsLocked(true, aPC); + aDomain.applyDomain(aPC); } } else Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-08-05 02:37:05 UTC (rev 7351) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-08-05 03:02:33 UTC (rev 7352) @@ -85,6 +85,7 @@ import pcgen.cdom.inst.PCClassLevel; import pcgen.cdom.reference.CDOMSingleRef; import pcgen.core.Ability.Nature; +import pcgen.core.analysis.RaceStat; import pcgen.core.analysis.TemplateSR; import pcgen.core.analysis.TemplateSelect; import pcgen.core.analysis.TemplateStat; @@ -6175,7 +6176,7 @@ public boolean isNonAbility(final int i) { //Unlocked overrides any lock to a non ability so check for it first - if (race.isUnlocked(i)) + if (RaceStat.isUnlocked(i, race)) { return false; } @@ -6187,7 +6188,7 @@ } } - if (race.isNonAbility(i)) + if (RaceStat.isNonAbility(i, race)) { return true; } Modified: Trunk/pcgen/code/src/java/pcgen/core/Race.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Race.java 2008-08-05 02:37:05 UTC (rev 7351) +++ Trunk/pcgen/code/src/java/pcgen/core/Race.java 2008-08-05 03:02:33 UTC (rev 7352) @@ -24,17 +24,13 @@ import java.awt.geom.Point2D; import java.math.BigDecimal; -import java.util.Collection; import java.util.List; import pcgen.base.lang.StringUtil; -import pcgen.cdom.base.CDOMReference; import pcgen.cdom.base.Constants; import pcgen.cdom.enumeration.FormulaKey; import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; -import pcgen.cdom.helper.StatLock; -import pcgen.core.bonus.BonusObj; import pcgen.core.prereq.Prerequisite; import pcgen.core.utils.MessageType; import pcgen.core.utils.ShowMessageDelegate; @@ -64,39 +60,6 @@ || Integer.MAX_VALUE == hda.get(hda.size() - 1).intValue(); } - public void setBonusInitialFeats(final BonusObj bon) - { - addBonusList(bon); - } - - public String getDisplayVision(final PlayerCharacter aPC) - { - if (aPC == null) - { - return ""; - } - Collection<CDOMReference<Vision>> mods = getListMods(Vision.VISIONLIST); - if (mods == null) - { - return ""; - } - - StringBuilder visionString = new StringBuilder(25); - for (CDOMReference<Vision> ref : mods) - { - for (Vision v : ref.getContainedObjects()) - { - if (visionString.length() > 0) - { - visionString.append(';'); - } - visionString.append(v.toString(aPC)); - } - } - - return visionString.toString(); - } - public Point2D.Double getFace() { BigDecimal width = get(ObjectKey.FACE_WIDTH); @@ -138,61 +101,7 @@ return monsterClassLevels; } - public boolean isNonAbility(final int statIdx) - { - final List<PCStat> statList = - SettingsHandler.getGame().getUnmodifiableStatList(); - - if ((statIdx < 0) || (statIdx >= statList.size())) - { - return true; - } - - // An unlock will always override a lock, so check it first - if (isUnlocked(statIdx)) - { - return false; - } - - PCStat stat = statList.get(statIdx); - for (StatLock sl : getSafeListFor(ListKey.STAT_LOCKS)) - { - if (sl.getLockedStat().equals(stat)) - { - if (sl.getLockValue().toString().equals("10")) - { - return true; - } - } - } - - return false; - } - /** - * Takes an integer input which it uses to access Games mode's - * "statlist" array. Test if that stat has been unlocked via a - * DEFINE|UNLOCK - * - * @param statIdx - * index number of the stat in question - * - * @return Whether this has been unlocked - */ - public boolean isUnlocked(final int statIdx) - { - final List<PCStat> statList = - SettingsHandler.getGame().getUnmodifiableStatList(); - - if ((statIdx < 0) || (statIdx >= statList.size())) - { - return false; - } - - return containsInList(ListKey.UNLOCKED_STATS, statList.get(statIdx)); - } - - /** * Retrieve Unarmed Damage according to the Race * @return UDAM damage die (ie 1d3) */ Added: Trunk/pcgen/code/src/java/pcgen/core/analysis/RaceStat.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/analysis/RaceStat.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/core/analysis/RaceStat.java 2008-08-05 03:02:33 UTC (rev 7352) @@ -0,0 +1,58 @@ +package pcgen.core.analysis; + +import java.util.List; + +import pcgen.cdom.enumeration.ListKey; +import pcgen.cdom.helper.StatLock; +import pcgen.core.PCStat; +import pcgen.core.PObject; +import pcgen.core.SettingsHandler; + +public class RaceStat +{ + + public static boolean isUnlocked(final int statIdx, PObject po) + { + final List<PCStat> statList = SettingsHandler.getGame() + .getUnmodifiableStatList(); + + if ((statIdx < 0) || (statIdx >= statList.size())) + { + return false; + } + + return po.containsInList(ListKey.UNLOCKED_STATS, statList.get(statIdx)); + } + + public static boolean isNonAbility(final int statIdx, PObject po) + { + final List<PCStat> statList = SettingsHandler.getGame() + .getUnmodifiableStatList(); + + if ((statIdx < 0) || (statIdx >= statList.size())) + { + return true; + } + + // An unlock will always override a lock, so check it first + if (isUnlocked(statIdx, po)) + { + return false; + } + + PCStat stat = statList.get(statIdx); + for (StatLock sl : po.getSafeListFor(ListKey.STAT_LOCKS)) + { + if (sl.getLockedStat().equals(stat)) + { + if (sl.getLockValue().toString().equals("10")) + { + return true; + } + } + } + + return false; + } + +} Added: Trunk/pcgen/code/src/java/pcgen/core/display/VisionDisplay.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/display/VisionDisplay.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/core/display/VisionDisplay.java 2008-08-05 03:02:33 UTC (rev 7352) @@ -0,0 +1,41 @@ +package pcgen.core.display; + +import java.util.Collection; + +import pcgen.cdom.base.CDOMObject; +import pcgen.cdom.base.CDOMReference; +import pcgen.core.PlayerCharacter; +import pcgen.core.Vision; + +public class VisionDisplay +{ + + public static String getVision(final PlayerCharacter aPC, CDOMObject cdo) + { + if (aPC == null) + { + return ""; + } + Collection<CDOMReference<Vision>> mods = cdo.getListMods(Vision.VISIONLIST); + if (mods == null) + { + return ""; + } + + StringBuilder visionString = new StringBuilder(25); + for (CDOMReference<Vision> ref : mods) + { + for (Vision v : ref.getContainedObjects()) + { + if (visionString.length() > 0) + { + visionString.append(';'); + } + visionString.append(v.toString(aPC)); + } + } + + return visionString.toString(); + } + +} Modified: Trunk/pcgen/code/src/java/pcgen/core/kit/KitDeity.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/kit/KitDeity.java 2008-08-05 02:37:05 UTC (rev 7351) +++ Trunk/pcgen/code/src/java/pcgen/core/kit/KitDeity.java 2008-08-05 03:02:33 UTC (rev 7352) @@ -265,7 +265,7 @@ } domainsToAdd.add(domain); - domain.setIsLocked(true, aPC); + domain.applyDomain(aPC); aCD.setDomain(domain, aPC); aPC.addCharacterDomain(aCD); } @@ -305,7 +305,7 @@ // Shouldn't happen continue; } - domain.setIsLocked(true, aPC); + domain.applyDomain(aPC); 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-08-05 02:37:05 UTC (rev 7351) +++ Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbility.java 2008-08-05 03:02:33 UTC (rev 7352) @@ -389,7 +389,7 @@ classKey); aCD.setDomain(aDom, aPC); aPC.addCharacterDomain(aCD); - aDom.setIsLocked(true, aPC); + aDom.applyDomain(aPC); --dnum; } } Modified: Trunk/pcgen/code/src/java/pcgen/core/npcgen/NPCGenerator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/npcgen/NPCGenerator.java 2008-08-05 02:37:05 UTC (rev 7351) +++ Trunk/pcgen/code/src/java/pcgen/core/npcgen/NPCGenerator.java 2008-08-05 03:02:33 UTC (rev 7352) @@ -442,7 +442,7 @@ // space remains for another domain, so add it if (existingDomain == null) { - domain.setIsLocked(true, aPC); + domain.applyDomain(aPC); aCD.setDomain(domain, aPC); aPC.addCharacterDomain(aCD); Modified: Trunk/pcgen/code/src/java/pcgen/gui/editor/RaceBasePanel.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/editor/RaceBasePanel.java 2008-08-05 02:37:05 UTC (rev 7351) +++ Trunk/pcgen/code/src/java/pcgen/gui/editor/RaceBasePanel.java 2008-08-05 03:02:33 UTC (rev 7352) @@ -344,7 +344,7 @@ StringBuffer sb = new StringBuffer(); sb.append("FEAT|POOL|").append(getBonusFeats()); final BonusObj bon = Bonus.newBonus(sb.toString()); - thisRace.setBonusInitialFeats(bon); + thisRace.addBonusList(bon); thisRace.put(IntegerKey.SKILL_POINTS_PER_LEVEL, getBonusSkillPoints()); thisRace.put(ObjectKey.CHALLENGE_RATING, getCR()); Modified: Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoDomain.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoDomain.java 2008-08-05 02:37:05 UTC (rev 7351) +++ Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoDomain.java 2008-08-05 03:02:33 UTC (rev 7352) @@ -1407,9 +1407,9 @@ // space remains for another domain, so add it if (existingDomain == null) { + addedDomain.applyDomain(pc); aCD.setDomain(addedDomain, pc); pc.addCharacterDomain(aCD); - addedDomain.setIsLocked(true, pc); if (!selectedDomainList.contains(addedDomain)) { Modified: Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoRaces.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoRaces.java 2008-08-05 02:37:05 UTC (rev 7351) +++ Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoRaces.java 2008-08-05 03:02:33 UTC (rev 7352) @@ -81,6 +81,8 @@ import pcgen.core.PlayerCharacter; import pcgen.core.Race; import pcgen.core.SettingsHandler; +import pcgen.core.analysis.RaceStat; +import pcgen.core.display.VisionDisplay; import pcgen.core.prereq.PrerequisiteUtilities; import pcgen.gui.CharacterInfo; import pcgen.gui.GuiConstants; @@ -1118,7 +1120,7 @@ for (int i = 0; i < SettingsHandler.getGame().s_ATTRIBSHORT.length; i++) { - if (race.isNonAbility(i)) + if (RaceStat.isNonAbility(i, race)) { if (retString.length() > 0) { @@ -1190,7 +1192,7 @@ if (fn.getItem() instanceof Race) { Race race = (Race) fn.getItem(); - return race.getDisplayVision(getPc()); + return VisionDisplay.getVision(getPc(), race); } return null; } Modified: Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoSummary.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoSummary.java 2008-08-05 02:37:05 UTC (rev 7351) +++ Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoSummary.java 2008-08-05 03:02:33 UTC (rev 7352) @@ -90,6 +90,8 @@ import pcgen.core.RuleConstants; import pcgen.core.SettingsHandler; import pcgen.core.StatList; +import pcgen.core.analysis.RaceStat; +import pcgen.core.display.VisionDisplay; import pcgen.core.pclevelinfo.PCLevelInfo; import pcgen.core.prereq.PrereqHandler; import pcgen.core.prereq.PrerequisiteUtilities; @@ -879,7 +881,7 @@ for (int i = 0; i < SettingsHandler.getGame().s_ATTRIBSHORT.length; ++i) { - if (aRace.isNonAbility(i)) + if (RaceStat.isNonAbility(i, aRace)) { if (aString.length() > 0) { @@ -927,7 +929,7 @@ } b.appendSpacer(); - b.appendI18nElement("in_sumVision", aRace.getDisplayVision(pc)); //$NON-NLS-1 + b.appendI18nElement("in_sumVision", VisionDisplay.getVision(pc, aRace)); //$NON-NLS-1 if (aRace.getFavoredClass().length() != 0) { Modified: Trunk/pcgen/code/src/java/pcgen/gui/tabs/resources/AvailableFollowerModel.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/tabs/resources/AvailableFollowerModel.java 2008-08-05 02:37:05 UTC (rev 7351) +++ Trunk/pcgen/code/src/java/pcgen/gui/tabs/resources/AvailableFollowerModel.java 2008-08-05 03:02:33 UTC (rev 7352) @@ -22,6 +22,7 @@ import pcgen.core.Race; import pcgen.core.SettingsHandler; import pcgen.core.character.Follower; +import pcgen.core.display.VisionDisplay; import pcgen.core.prereq.PrerequisiteUtilities; import pcgen.core.utils.CoreUtility; import pcgen.gui.HTMLUtils; @@ -268,7 +269,7 @@ if (race != null) { - sRet = race.getDisplayVision(this.pc); + sRet = VisionDisplay.getVision(this.pc, race); } break; Modified: Trunk/pcgen/code/src/java/pcgen/io/PCGVer0Parser.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/PCGVer0Parser.java 2008-08-05 02:37:05 UTC (rev 7351) +++ Trunk/pcgen/code/src/java/pcgen/io/PCGVer0Parser.java 2008-08-05 03:02:33 UTC (rev 7352) @@ -714,7 +714,7 @@ } } - aDomain.setIsLocked(true, aPC); + aDomain.applyDomain(aPC); } else { Modified: Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Parser.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Parser.java 2008-08-05 02:37:05 UTC (rev 7351) +++ Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Parser.java 2008-08-05 03:02:33 UTC (rev 7352) @@ -2103,7 +2103,7 @@ } thePC.addCharacterDomain(aCharacterDomain); - aDomain.setIsLocked(true, thePC); + aDomain.applyDomain(thePC); // TODO // set associated list Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/race/StartfeatsToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/race/StartfeatsToken.java 2008-08-05 02:37:05 UTC (rev 7351) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/race/StartfeatsToken.java 2008-08-05 03:02:33 UTC (rev 7352) @@ -36,7 +36,7 @@ final Prerequisite prereq = factory.parse(buf.toString()); bon.addPrerequisite(prereq); - race.setBonusInitialFeats(bon); + race.addBonusList(bon); return true; } catch (NumberFormatException nfe) Modified: Trunk/pcgen/code/src/test/pcgen/core/PlayerCharacterTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/PlayerCharacterTest.java 2008-08-05 02:37:05 UTC (rev 7351) +++ Trunk/pcgen/code/src/test/pcgen/core/PlayerCharacterTest.java 2008-08-05 03:02:33 UTC (rev 7352) @@ -108,7 +108,7 @@ // Human human = new Race(); final BonusObj humanRaceFeatBonus = Bonus.newBonus("FEAT|POOL|2"); - human.setBonusInitialFeats(humanRaceFeatBonus); + human.addBonusList(humanRaceFeatBonus); // Giant Race giantRace = new Race(); @@ -119,7 +119,7 @@ final BonusObj giantRaceFeatBonus = Bonus.newBonus("FEAT|POOL|1"); - giantRace.setBonusInitialFeats(giantRaceFeatBonus); + giantRace.addBonusList(giantRaceFeatBonus); Globals.getContext().ref.importObject(giantRace); Modified: Trunk/pcgen/code/src/test/pcgen/core/RaceTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/RaceTest.java 2008-08-05 02:37:05 UTC (rev 7351) +++ Trunk/pcgen/code/src/test/pcgen/core/RaceTest.java 2008-08-05 03:02:33 UTC (rev 7352) @@ -23,6 +23,7 @@ package pcgen.core; import pcgen.AbstractCharacterTestCase; +import pcgen.core.analysis.RaceStat; import pcgen.cdom.base.FormulaFactory; import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.helper.StatLock; @@ -49,11 +50,11 @@ StatList statList = getCharacter().getStatList(); int index = statList.getIndexOfStatFor("STR"); PCStat str = statList.getStatAt(index); - assertEquals("Template has not been unlocked", false, race.isUnlocked(index)); + assertEquals("Template has not been unlocked", false, RaceStat.isUnlocked(index, race)); race.addToListFor(ListKey.STAT_LOCKS, new StatLock(str, FormulaFactory.getFormulaFor(12))); - assertEquals("Template has not been unlocked", false, race.isUnlocked(index)); + assertEquals("Template has not been unlocked", false, RaceStat.isUnlocked(index, race)); race.addToListFor(ListKey.UNLOCKED_STATS, str); - assertEquals("Template has been unlocked", true, race.isUnlocked(index)); + assertEquals("Template has been unlocked", true, RaceStat.isUnlocked(index, race)); } /** @@ -66,12 +67,12 @@ StatList statList = getCharacter().getStatList(); int index = statList.getIndexOfStatFor("STR"); PCStat str = statList.getStatAt(index); - assertEquals("Template has not been locked to a nonability", false, race.isNonAbility(index)); + assertEquals("Template has not been locked to a nonability", false, RaceStat.isNonAbility(index, race)); race.addToListFor(ListKey.STAT_LOCKS, new StatLock(str, FormulaFactory.getFormulaFor(12))); - assertEquals("Template has been locked to an ability", false, race.isNonAbility(index)); + assertEquals("Template has been locked to an ability", false, RaceStat.isNonAbility(index, race)); race.addToListFor(ListKey.STAT_LOCKS, new StatLock(str, FormulaFactory.getFormulaFor(10))); - assertEquals("Template has been locked to a nonability", true, race.isNonAbility(index)); + assertEquals("Template has been locked to a nonability", true, RaceStat.isNonAbility(index, race)); race.addToListFor(ListKey.UNLOCKED_STATS, str); - assertEquals("Template has been unlocked", false, race.isNonAbility(index)); + assertEquals("Template has been unlocked", false, RaceStat.isNonAbility(index, race)); } } Modified: Trunk/pcgen/code/src/test/pcgen/io/exporttoken/SpellMemTokenTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/io/exporttoken/SpellMemTokenTest.java 2008-08-05 02:37:05 UTC (rev 7351) +++ Trunk/pcgen/code/src/test/pcgen/io/exporttoken/SpellMemTokenTest.java 2008-08-05 03:02:33 UTC (rev 7352) @@ -88,7 +88,7 @@ // Human human = new Race(); final BonusObj bon = Bonus.newBonus("FEAT|POOL|2"); - human.setBonusInitialFeats(bon); + human.addBonusList(bon); testSpell = new Spell(); testSpell.setName("Test Spell"); Modified: Trunk/pcgen/code/src/test/pcgen/util/TestHelper.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/util/TestHelper.java 2008-08-05 02:37:05 UTC (rev 7351) +++ Trunk/pcgen/code/src/test/pcgen/util/TestHelper.java 2008-08-05 03:02:33 UTC (rev 7352) @@ -307,7 +307,7 @@ bon.addPrerequisite(prereq); bon.setCreatorObject(aRace); - aRace.setBonusInitialFeats(bon); + aRace.addBonusList(bon); } catch (PersistenceLayerException e) { Modified: Trunk/pcgen/code/src/test/plugin/exporttokens/SpellListTokenTest.java =================================================================== --- Trunk/pcgen/code/src/test/plugin/exporttokens/SpellListTokenTest.java 2008-08-05 02:37:05 UTC (rev 7351) +++ Trunk/pcgen/code/src/test/plugin/exporttokens/SpellListTokenTest.java 2008-08-05 03:02:33 UTC (rev 7352) @@ -106,7 +106,7 @@ human = new Race(); final BonusObj bon = Bonus.newBonus("FEAT|POOL|2"); - human.setBonusInitialFeats(bon); + human.addBonusList(bon); arcaneClass = new PCClass(); arcaneClass.setName("TestArcane"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-08-06 02:15:06
|
Revision: 7367 http://pcgen.svn.sourceforge.net/pcgen/?rev=7367&view=rev Author: thpr Date: 2008-08-06 02:15:01 +0000 (Wed, 06 Aug 2008) Log Message: ----------- Template/Race FAVCLASS and Race MONSTERCLASS Token update Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/cdom/base/CDOMObject.java Trunk/pcgen/code/src/java/pcgen/cdom/base/CDOMObjectUtilities.java Trunk/pcgen/code/src/java/pcgen/cdom/choiceset/ReferenceChoiceSet.java Trunk/pcgen/code/src/java/pcgen/cdom/choiceset/SpellReferenceChoiceSet.java Trunk/pcgen/code/src/java/pcgen/cdom/content/LevelCommandFactory.java Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ObjectKey.java Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/StringKey.java Trunk/pcgen/code/src/java/pcgen/cdom/reference/ReferenceUtilities.java Trunk/pcgen/code/src/java/pcgen/core/AbilityUtilities.java Trunk/pcgen/code/src/java/pcgen/core/BioSet.java Trunk/pcgen/code/src/java/pcgen/core/PCClass.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/SubClass.java Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassAbilityPanel.java Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassLevelPanel.java Trunk/pcgen/code/src/java/pcgen/gui/editor/EditorMainForm.java Trunk/pcgen/code/src/java/pcgen/gui/editor/RaceBasePanel.java Trunk/pcgen/code/src/java/pcgen/gui/filter/FilterFactory.java Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoRaces.java Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoSummary.java Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Creator.java Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Parser.java Trunk/pcgen/code/src/java/pcgen/persistence/lst/LstSystemLoader.java Trunk/pcgen/code/src/java/pcgen/persistence/lst/TokenStore.java Trunk/pcgen/code/src/java/pcgen/rules/context/AbstractReferenceContext.java Trunk/pcgen/code/src/java/pcgen/rules/context/ConsolidatedListCommitStrategy.java Trunk/pcgen/code/src/java/pcgen/rules/context/ListChanges.java Trunk/pcgen/code/src/java/pcgen/rules/context/ListContext.java Trunk/pcgen/code/src/java/pcgen/rules/persistence/TokenUtilities.java Trunk/pcgen/code/src/java/plugin/encounter/EncounterPlugin.java Trunk/pcgen/code/src/java/plugin/exporttokens/FavoredClassToken.java Trunk/pcgen/code/src/java/plugin/exporttokens/FavoredListToken.java Trunk/pcgen/code/src/java/plugin/exporttokens/RaceToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/KitLst.java Trunk/pcgen/code/src/java/plugin/lsttokens/QualifyToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/add/LanguageToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/add/TemplateToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/deity/DomainsToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/pcclass/KnownspellsToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/pcclass/SkilllistToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/pcclass/SpelllistToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/race/FavclassToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/race/MonsterclassToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/spell/ClassesToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/spell/DomainsToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/template/FavoredclassToken.java Trunk/pcgen/code/src/test/pcgen/core/PCClassTest.java Trunk/pcgen/code/src/test/pcgen/core/PCTemplateTest.java Trunk/pcgen/code/src/test/pcgen/core/PlayerCharacterTest.java Trunk/pcgen/code/src/test/pcgen/core/prereq/PreHDTest.java Trunk/pcgen/code/src/test/pcgen/core/prereq/PreLevelTest.java Added Paths: ----------- Trunk/pcgen/code/src/java/pcgen/cdom/base/ChoiceActor.java Trunk/pcgen/code/src/java/pcgen/cdom/base/TransitionChoice.java Trunk/pcgen/code/src/java/pcgen/cdom/choiceset/ClassReferenceChoiceSet.java Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/SubClassCategory.java Removed Paths: ------------- Trunk/pcgen/code/src/java/pcgen/cdom/content/ChoiceActor.java Trunk/pcgen/code/src/java/pcgen/cdom/content/TransitionChoice.java Trunk/pcgen/code/src/java/pcgen/persistence/lst/PCTemplateLoader.java Trunk/pcgen/code/src/java/pcgen/persistence/lst/PCTemplateLstToken.java Modified: Trunk/pcgen/code/src/java/pcgen/cdom/base/CDOMObject.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/base/CDOMObject.java 2008-08-06 01:04:47 UTC (rev 7366) +++ Trunk/pcgen/code/src/java/pcgen/cdom/base/CDOMObject.java 2008-08-06 02:15:01 UTC (rev 7367) @@ -28,7 +28,6 @@ import pcgen.base.formula.Formula; import pcgen.base.util.DoubleKeyMapToList; -import pcgen.cdom.content.TransitionChoice; import pcgen.cdom.enumeration.FormulaKey; import pcgen.cdom.enumeration.IntegerKey; import pcgen.cdom.enumeration.ListKey; Modified: Trunk/pcgen/code/src/java/pcgen/cdom/base/CDOMObjectUtilities.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/base/CDOMObjectUtilities.java 2008-08-06 01:04:47 UTC (rev 7366) +++ Trunk/pcgen/code/src/java/pcgen/cdom/base/CDOMObjectUtilities.java 2008-08-06 02:15:01 UTC (rev 7367) @@ -18,7 +18,9 @@ package pcgen.cdom.base; import java.util.Collection; +import java.util.Comparator; + /** * CDOMObjectUtilities is a utility class designed to provide utility methods * when working with pcgen.cdom.base.CDOMObject Objects @@ -26,6 +28,16 @@ public final class CDOMObjectUtilities { + public static final Comparator<CDOMObject> CDOM_SORTER = + new Comparator<CDOMObject>() + { + + public int compare(CDOMObject arg0, CDOMObject arg1) + { + return compareKeys(arg0, arg1); + } + }; + private CDOMObjectUtilities() { //Utility class should not be constructed @@ -73,4 +85,31 @@ return result.toString(); } + public static int compareKeys(CDOMObject arg0, CDOMObject arg1) + { + String base = arg0.getKeyName(); + if (base == null) + { + if (arg1.getKeyName() == null) + { + return 0; + } + else + { + return -1; + } + } + else + { + if (arg1.getKeyName() == null) + { + return 1; + } + else + { + return base.compareTo(arg1.getKeyName()); + } + } + } + } Copied: Trunk/pcgen/code/src/java/pcgen/cdom/base/ChoiceActor.java (from rev 7353, Trunk/pcgen/code/src/java/pcgen/cdom/content/ChoiceActor.java) =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/base/ChoiceActor.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/cdom/base/ChoiceActor.java 2008-08-06 02:15:01 UTC (rev 7367) @@ -0,0 +1,8 @@ +package pcgen.cdom.base; + +import pcgen.core.PlayerCharacter; + +public interface ChoiceActor<T> +{ + public void applyChoice(T choice, PlayerCharacter pc); +} Copied: Trunk/pcgen/code/src/java/pcgen/cdom/base/TransitionChoice.java (from rev 7353, Trunk/pcgen/code/src/java/pcgen/cdom/content/TransitionChoice.java) =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/base/TransitionChoice.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/cdom/base/TransitionChoice.java 2008-08-06 02:15:01 UTC (rev 7367) @@ -0,0 +1,148 @@ +/* + * Copyright 2007, 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 java.util.ArrayList; +import java.util.Collection; +import java.util.Set; + +import pcgen.base.formula.Formula; +import pcgen.core.PlayerCharacter; +import pcgen.util.StringPClassUtil; +import pcgen.util.chooser.ChooserFactory; +import pcgen.util.chooser.ChooserInterface; + +/** + * This is a transitional class from PCGen 5.15+ to the final CDOM core. It is + * provided as convenience to hold a set of choices and the number of choices + * allowed, prior to final implementation of the new choice system + * + * @param <T> + */ +public class TransitionChoice<T> +{ + + private final ChoiceSet<? extends T> choices; + private final Formula choiceCount; + private String title; + private boolean required = true; + private ChoiceActor<T> choiceActor; + + public TransitionChoice(ChoiceSet<? extends T> cs, Formula count) + { + choices = cs; + choiceCount = count; + } + + public ChoiceSet<? extends T> getChoices() + { + return choices; + } + + public Formula getCount() + { + return choiceCount; + } + + @Override + public boolean equals(Object obj) + { + if (obj instanceof TransitionChoice) + { + TransitionChoice<?> other = (TransitionChoice<?>) obj; + return choiceCount.equals(other.choiceCount) + && choices.equals(other.choices); + } + return false; + } + + @Override + public int hashCode() + { + return choiceCount.hashCode() * 29 + choices.hashCode(); + } + + public Collection<? extends T> driveChoice(PlayerCharacter pc) + { + ChooserInterface c = ChooserFactory.getChooserInstance(); + int intValue = choiceCount.resolve(pc, "").intValue(); + c.setPoolFlag(required); + if (intValue == Integer.MAX_VALUE) + { + c.setPickAll(true); + } + else + { + c.setTotalChoicesAvail(intValue); + } + if (title == null) + { + title = + "Choose a " + + StringPClassUtil.getStringFor(choices + .getChoiceClass()); + } + c.setTitle(title); + Set<? extends T> set = choices.getSet(pc); + if (c.pickAll() || intValue == set.size()) + { + return set; + } + else + { + c.setAvailableList(new ArrayList<T>(set)); + c.setVisible(true); + return c.getSelectedList(); + } + } + + public void setTitle(String string) + { + title = string; + } + + public void setRequired(boolean b) + { + required = b; + } + + public void setChoiceActor(ChoiceActor<T> ca) + { + choiceActor = ca; + } + + public void act(Collection<? extends T> driveChoice, PlayerCharacter apc) + { + if (choiceActor == null) + { + throw new IllegalStateException( + "Cannot act without a defined ChoiceActor"); + } + for (T choice : driveChoice) + { + choiceActor.applyChoice(choice, apc); + apc.addAssociation(this, choice); + } + } + + public T castChoice(Object o) + { + return (T) o; + } + +} Added: Trunk/pcgen/code/src/java/pcgen/cdom/choiceset/ClassReferenceChoiceSet.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/choiceset/ClassReferenceChoiceSet.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/cdom/choiceset/ClassReferenceChoiceSet.java 2008-08-06 02:15:01 UTC (rev 7367) @@ -0,0 +1,180 @@ +/* + * Copyright 2006 (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 + * + * Created on October 29, 2006. + * + * Current Ver: $Revision: 1111 $ Last Editor: $Author: boomer70 $ Last Edited: + * $Date: 2006-06-22 21:22:44 -0400 (Thu, 22 Jun 2006) $ + */ +package pcgen.cdom.choiceset; + +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; +import java.util.TreeSet; + +import pcgen.cdom.base.CDOMReference; +import pcgen.cdom.base.Constants; +import pcgen.cdom.base.PrimitiveChoiceSet; +import pcgen.cdom.reference.ReferenceUtilities; +import pcgen.core.PCClass; +import pcgen.core.PlayerCharacter; + +/** + * A ClassReferenceChoiceSet contains references to PCClass Objects. + * + * The contents of a ClassReferenceChoiceSet is defined at construction of the + * ClassReferenceChoiceSet. The contents of a ClassReferenceChoiceSet is fixed, + * and will not vary by the PlayerCharacter used to resolve the + * ClassReferenceChoiceSet. + * + * @param <T> + * The class of object this ReferenceChoiceSet contains. + */ +public class ClassReferenceChoiceSet implements PrimitiveChoiceSet<PCClass> +{ + + /** + * The underlying Set of CDOMReferences that contain the objects in this + * ClassReferenceChoiceSet + */ + private final Set<CDOMReference<? extends PCClass>> set; + + /** + * Constructs a new ClassReferenceChoiceSet which contains the Set of + * objects contained within the given CDOMReferences. The CDOMReferences do + * not need to be resolved at the time of construction of the + * ClassReferenceChoiceSet. + * + * This constructor is reference-semantic, meaning that ownership of the + * Collection provided to this constructor is not transferred. Modification + * of the Collection (after this constructor completes) does not result in + * modifying the ClassReferenceChoiceSet, and the ClassReferenceChoiceSet + * will not modify the given Collection. + * + * @param col + * A Collection of CDOMReferences which define the Set of objects + * contained within the ClassReferenceChoiceSet + * @throws IllegalArgumentException + * if the given Collection is null or empty. + */ + public ClassReferenceChoiceSet( + Collection<? extends CDOMReference<? extends PCClass>> col) + { + super(); + if (col == null) + { + throw new IllegalArgumentException( + "Choice Collection cannot be null"); + } + if (col.isEmpty()) + { + throw new IllegalArgumentException( + "Choice Collection cannot be empty"); + } + set = new HashSet<CDOMReference<? extends PCClass>>(col); + } + + /** + * Returns a representation of this ClassReferenceChoiceSet, suitable for + * storing in an LST file. + */ + public String getLSTformat() + { + Set<CDOMReference<?>> sortedSet = new TreeSet<CDOMReference<?>>( + ReferenceUtilities.REFERENCE_SORTER); + sortedSet.addAll(set); + return ReferenceUtilities.joinLstFormat(sortedSet, Constants.COMMA); + } + + /** + * The class of object this ClassReferenceChoiceSet contains. + * + * The behavior of this method is undefined if the CDOMReference objects + * provided during the construction of this ClassReferenceChoiceSet are not + * yet resolved. + * + * @return The class of object this ClassReferenceChoiceSet contains. + */ + public Class<PCClass> getChoiceClass() + { + return PCClass.class; + } + + /** + * Returns a Set containing the Objects which this ClassReferenceChoiceSet + * contains. The contents of a ClassReferenceChoiceSet is fixed, and will + * not vary by the PlayerCharacter used to resolve the + * ClassReferenceChoiceSet. + * + * The behavior of this method is undefined if the CDOMReference objects + * provided during the construction of this ClassReferenceChoiceSet are not + * yet resolved. + * + * This method is reference-semantic, meaning that ownership of the Set + * returned by this method will be transferred to the calling object. + * Modification of the returned Set should not result in modifying the + * ClassReferenceChoiceSet, and modifying the ClassReferenceChoiceSet after + * the Set is returned should not modify the Set. + * + * @return A Set containing the Objects which this ClassReferenceChoiceSet + * contains. + */ + public Set<PCClass> getSet(PlayerCharacter pc) + { + Set<PCClass> returnSet = new HashSet<PCClass>(); + for (CDOMReference<? extends PCClass> ref : set) + { + returnSet.addAll(ref.getContainedObjects()); + } + return returnSet; + } + + /** + * Returns the consistent-with-equals hashCode for this + * ClassReferenceChoiceSet + * + * @see java.lang.Object#hashCode() + */ + @Override + public int hashCode() + { + return set.size(); + } + + /** + * Returns true if this ClassReferenceChoiceSet is equal to the given + * Object. Equality is defined as being another ClassReferenceChoiceSet + * object with equal underlying contents. + * + * @see java.lang.Object#equals(java.lang.Object) + */ + @Override + public boolean equals(Object o) + { + if (o == this) + { + return true; + } + if (o instanceof ClassReferenceChoiceSet) + { + ClassReferenceChoiceSet other = (ClassReferenceChoiceSet) o; + return set.equals(other.set); + } + return false; + } +} Modified: Trunk/pcgen/code/src/java/pcgen/cdom/choiceset/ReferenceChoiceSet.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/choiceset/ReferenceChoiceSet.java 2008-08-06 01:04:47 UTC (rev 7366) +++ Trunk/pcgen/code/src/java/pcgen/cdom/choiceset/ReferenceChoiceSet.java 2008-08-06 02:15:01 UTC (rev 7367) @@ -33,7 +33,6 @@ import pcgen.cdom.base.PrimitiveChoiceSet; import pcgen.cdom.reference.ReferenceUtilities; import pcgen.core.PlayerCharacter; -import pcgen.rules.persistence.TokenUtilities; /** * A ReferenceChoiceSet contains references to Objects. Often these are @@ -96,7 +95,7 @@ public String getLSTformat() { Set<CDOMReference<?>> sortedSet = new TreeSet<CDOMReference<?>>( - TokenUtilities.REFERENCE_SORTER); + ReferenceUtilities.REFERENCE_SORTER); sortedSet.addAll(set); return ReferenceUtilities.joinLstFormat(sortedSet, Constants.COMMA); } Modified: Trunk/pcgen/code/src/java/pcgen/cdom/choiceset/SpellReferenceChoiceSet.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/choiceset/SpellReferenceChoiceSet.java 2008-08-06 01:04:47 UTC (rev 7366) +++ Trunk/pcgen/code/src/java/pcgen/cdom/choiceset/SpellReferenceChoiceSet.java 2008-08-06 02:15:01 UTC (rev 7367) @@ -29,9 +29,9 @@ import pcgen.cdom.base.Constants; import pcgen.cdom.base.PrimitiveChoiceSet; import pcgen.cdom.list.DomainSpellList; +import pcgen.cdom.reference.ReferenceUtilities; import pcgen.core.PlayerCharacter; import pcgen.core.spell.Spell; -import pcgen.rules.persistence.TokenUtilities; /** * A SpellReferenceChoiceSet contains references to CDOMListObjects. This is a @@ -93,7 +93,7 @@ public String getLSTformat() { Set<CDOMReference<?>> sortedSet = new TreeSet<CDOMReference<?>>( - TokenUtilities.REFERENCE_SORTER); + ReferenceUtilities.REFERENCE_SORTER); sortedSet.addAll(set); StringBuilder sb = new StringBuilder(); List<CDOMReference<?>> domainList = new ArrayList<CDOMReference<?>>(); Deleted: Trunk/pcgen/code/src/java/pcgen/cdom/content/ChoiceActor.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/content/ChoiceActor.java 2008-08-06 01:04:47 UTC (rev 7366) +++ Trunk/pcgen/code/src/java/pcgen/cdom/content/ChoiceActor.java 2008-08-06 02:15:01 UTC (rev 7367) @@ -1,8 +0,0 @@ -package pcgen.cdom.content; - -import pcgen.core.PlayerCharacter; - -public interface ChoiceActor<T> -{ - public void applyChoice(T choice, PlayerCharacter pc); -} Modified: Trunk/pcgen/code/src/java/pcgen/cdom/content/LevelCommandFactory.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/content/LevelCommandFactory.java 2008-08-06 01:04:47 UTC (rev 7366) +++ Trunk/pcgen/code/src/java/pcgen/cdom/content/LevelCommandFactory.java 2008-08-06 02:15:01 UTC (rev 7367) @@ -21,10 +21,10 @@ import pcgen.cdom.base.ConcretePrereqObject; import pcgen.cdom.base.Constants; import pcgen.cdom.reference.CDOMSingleRef; +import pcgen.cdom.reference.ReferenceUtilities; import pcgen.core.PCClass; import pcgen.core.PlayerCharacter; import pcgen.core.SettingsHandler; -import pcgen.rules.persistence.TokenUtilities; /** * A LevelCommandFactory is used to identify a PCClass which is to be applied @@ -159,7 +159,7 @@ */ public int compareTo(LevelCommandFactory other) { - int i = TokenUtilities.REFERENCE_SORTER.compare(pcClass, other.pcClass); + int i = ReferenceUtilities.REFERENCE_SORTER.compare(pcClass, other.pcClass); if (i == 0) { if (levels.equals(other.levels)) Deleted: Trunk/pcgen/code/src/java/pcgen/cdom/content/TransitionChoice.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/content/TransitionChoice.java 2008-08-06 01:04:47 UTC (rev 7366) +++ Trunk/pcgen/code/src/java/pcgen/cdom/content/TransitionChoice.java 2008-08-06 02:15:01 UTC (rev 7367) @@ -1,149 +0,0 @@ -/* - * Copyright 2007, 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.content; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Set; - -import pcgen.base.formula.Formula; -import pcgen.cdom.base.ChoiceSet; -import pcgen.core.PlayerCharacter; -import pcgen.util.StringPClassUtil; -import pcgen.util.chooser.ChooserFactory; -import pcgen.util.chooser.ChooserInterface; - -/** - * This is a transitional class from PCGen 5.15+ to the final CDOM core. It is - * provided as convenience to hold a set of choices and the number of choices - * allowed, prior to final implementation of the new choice system - * - * @param <T> - */ -public class TransitionChoice<T> -{ - - private final ChoiceSet<? extends T> choices; - private final Formula choiceCount; - private String title; - private boolean required = true; - private ChoiceActor<T> choiceActor; - - public TransitionChoice(ChoiceSet<? extends T> cs, Formula count) - { - choices = cs; - choiceCount = count; - } - - public ChoiceSet<? extends T> getChoices() - { - return choices; - } - - public Formula getCount() - { - return choiceCount; - } - - @Override - public boolean equals(Object obj) - { - if (obj instanceof TransitionChoice) - { - TransitionChoice<?> other = (TransitionChoice<?>) obj; - return choiceCount.equals(other.choiceCount) - && choices.equals(other.choices); - } - return false; - } - - @Override - public int hashCode() - { - return choiceCount.hashCode() * 29 + choices.hashCode(); - } - - public Collection<? extends T> driveChoice(PlayerCharacter pc) - { - ChooserInterface c = ChooserFactory.getChooserInstance(); - int intValue = choiceCount.resolve(pc, "").intValue(); - c.setPoolFlag(required); - if (intValue == Integer.MAX_VALUE) - { - c.setPickAll(true); - } - else - { - c.setTotalChoicesAvail(intValue); - } - if (title == null) - { - title = - "Choose a " - + StringPClassUtil.getStringFor(choices - .getChoiceClass()); - } - c.setTitle(title); - Set<? extends T> set = choices.getSet(pc); - if (c.pickAll() || intValue == set.size()) - { - return set; - } - else - { - c.setAvailableList(new ArrayList<T>(set)); - c.setVisible(true); - return c.getSelectedList(); - } - } - - public void setTitle(String string) - { - title = string; - } - - public void setRequired(boolean b) - { - required = b; - } - - public void setChoiceActor(ChoiceActor<T> ca) - { - choiceActor = ca; - } - - public void act(Collection<? extends T> driveChoice, PlayerCharacter apc) - { - if (choiceActor == null) - { - throw new IllegalStateException( - "Cannot act without a defined ChoiceActor"); - } - for (T choice : driveChoice) - { - choiceActor.applyChoice(choice, apc); - apc.addAssociation(this, choice); - } - } - - public T castChoice(Object o) - { - return (T) o; - } - -} Modified: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java 2008-08-06 01:04:47 UTC (rev 7366) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java 2008-08-06 02:15:01 UTC (rev 7367) @@ -27,9 +27,9 @@ import pcgen.base.formula.Formula; import pcgen.cdom.base.CDOMReference; +import pcgen.cdom.base.TransitionChoice; import pcgen.cdom.content.KnownSpellIdentifier; import pcgen.cdom.content.LevelCommandFactory; -import pcgen.cdom.content.TransitionChoice; import pcgen.cdom.helper.AttackCycle; import pcgen.cdom.helper.PointCost; import pcgen.cdom.helper.Qualifier; @@ -47,6 +47,7 @@ import pcgen.core.EquipmentModifier; import pcgen.core.Kit; import pcgen.core.Language; +import pcgen.core.PCClass; import pcgen.core.PCStat; import pcgen.core.Movement; import pcgen.core.PCTemplate; @@ -207,6 +208,7 @@ public static final ListKey<CDOMReference<PCTemplate>> REMOVE_TEMPLATES = new ListKey<CDOMReference<PCTemplate>>(); public static final ListKey<Vision> VISION_CACHE = new ListKey<Vision>(); public static final ListKey<TransitionChoice<?>> ADD = new ListKey<TransitionChoice<?>>(); + public static final ListKey<CDOMReference<? extends PCClass>> FAVORED_CLASS = new ListKey<CDOMReference<? extends PCClass>>(); public static final ListKey<Qualifier> QUALIFY = new ListKey<Qualifier>(); public static final ListKey<DamageReduction> DAMAGE_REDUCTION = new ListKey<DamageReduction>(); public static final ListKey<PCStat> UNLOCKED_STATS = new ListKey<PCStat>(); Modified: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ObjectKey.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ObjectKey.java 2008-08-06 01:04:47 UTC (rev 7366) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ObjectKey.java 2008-08-06 02:15:01 UTC (rev 7367) @@ -33,10 +33,11 @@ import pcgen.base.util.CaseInsensitiveMap; import pcgen.cdom.base.CDOMListObject; import pcgen.cdom.base.Category; +import pcgen.cdom.base.TransitionChoice; import pcgen.cdom.content.ChallengeRating; import pcgen.cdom.content.HitDie; +import pcgen.cdom.content.LevelCommandFactory; import pcgen.cdom.content.Modifier; -import pcgen.cdom.content.TransitionChoice; import pcgen.cdom.list.ClassSkillList; import pcgen.cdom.list.ClassSpellList; import pcgen.cdom.list.DomainSpellList; @@ -45,6 +46,7 @@ import pcgen.core.ArmorProf; import pcgen.core.Equipment; import pcgen.core.PCAlignment; +import pcgen.core.PCClass; import pcgen.core.PCStat; import pcgen.core.SettingsHandler; import pcgen.core.ShieldProf; @@ -202,6 +204,12 @@ public static final ObjectKey<Load> UNENCUMBERED_ARMOR = new ObjectKey<Load>(Load.LIGHT); + public static final ObjectKey<Boolean> ANY_FAVORED_CLASS = new ObjectKey<Boolean>(Boolean.FALSE); + + public static final ObjectKey<TransitionChoice<PCClass>> FAVCLASS_CHOICE = new ObjectKey<TransitionChoice<PCClass>>(null); + + public static final ObjectKey<LevelCommandFactory> MONSTER_CLASS = new ObjectKey<LevelCommandFactory>(null); + public static final ObjectKey<CDOMSingleRef<Equipment>> BASE_ITEM = new ObjectKey<CDOMSingleRef<Equipment>>(null); public static final ObjectKey<SizeAdjustment> BASESIZE; Modified: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/StringKey.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/StringKey.java 2008-08-06 01:04:47 UTC (rev 7366) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/StringKey.java 2008-08-06 02:15:01 UTC (rev 7367) @@ -33,5 +33,5 @@ */ public enum StringKey { - NAME, KEY_NAME, WORSHIPPERS, TITLE, HOLY_ITEM, MASTER_HP_FORMULA, MASTER_CHECK_FORMULA, MASTER_BAB_FORMULA, BIRTHPLACE, BIRTHDAY, CATEGORY, BOOK_TYPE, CHOICE_STRING, DESTINATION, PAGE_USAGE, MINDEVVER, MINVER, ADD, BIO, DESCRIPTION, GENRE, HELP, APPEARANCE, CATCH_PHRASE, OUTPUT_NAME, INFO_TEXT, CHOICE_TO_MODIFY, PUB_NAME_LONG, COST, PUB_NAME_SHORT, CURRENT_EQUIP_SET_NAME, REGION, PUB_NAME_WEB, SETTING, SR_FORMULA, TEMP_DESCRIPTION, TRAIT2, TRAIT1, SKIN_COLOR, HAIR_COLOR, RACIAL_FAVORED_CLASS, SUB_REGION, SPEECH_TENDENCY, PHOBIAS, INTERESTS, RESIDENCE, SPELLBOOK_AUTO_ADD_KNOWN, PLAYERS_NAME, HANDED, HAIR_STYLE, PORTRAIT_PATH, EYE_COLOR, LOCATION, FILE_NAME, ABB, TARGET_AREA, NAME_TEXT, DAMAGE, DAMAGE_OVERRIDE, RATE_OF_FIRE, FUMBLE_RANGE, LISTTYPE, SPELLTYPE + NAME, KEY_NAME, WORSHIPPERS, TITLE, HOLY_ITEM, MASTER_HP_FORMULA, MASTER_CHECK_FORMULA, MASTER_BAB_FORMULA, BIRTHPLACE, BIRTHDAY, CATEGORY, BOOK_TYPE, CHOICE_STRING, DESTINATION, PAGE_USAGE, MINDEVVER, MINVER, ADD, BIO, DESCRIPTION, GENRE, HELP, APPEARANCE, CATCH_PHRASE, OUTPUT_NAME, INFO_TEXT, CHOICE_TO_MODIFY, PUB_NAME_LONG, COST, PUB_NAME_SHORT, CURRENT_EQUIP_SET_NAME, REGION, PUB_NAME_WEB, SETTING, SR_FORMULA, TEMP_DESCRIPTION, TRAIT2, TRAIT1, SKIN_COLOR, HAIR_COLOR, SUB_REGION, SPEECH_TENDENCY, PHOBIAS, INTERESTS, RESIDENCE, SPELLBOOK_AUTO_ADD_KNOWN, PLAYERS_NAME, HANDED, HAIR_STYLE, PORTRAIT_PATH, EYE_COLOR, LOCATION, FILE_NAME, ABB, TARGET_AREA, NAME_TEXT, DAMAGE, DAMAGE_OVERRIDE, RATE_OF_FIRE, FUMBLE_RANGE, LISTTYPE, SPELLTYPE } Added: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/SubClassCategory.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/SubClassCategory.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/SubClassCategory.java 2008-08-06 02:15:01 UTC (rev 7367) @@ -0,0 +1,185 @@ +/* + * Copyright (c) 2006 Tom Parker <th...@us...> + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation; either version 2.1 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + * details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ +package pcgen.cdom.enumeration; + +import java.util.Collection; +import java.util.Collections; + +import pcgen.base.enumeration.TypeSafeConstant; +import pcgen.base.util.CaseInsensitiveMap; +import pcgen.cdom.base.Category; +import pcgen.core.SubClass; + +/** + * @author Tom Parker (thpr [at] yahoo.com) + * + * This Class is a Type Safe Constant. + */ +public final class SubClassCategory implements TypeSafeConstant, Category<SubClass> +{ + + /** + * This Map contains the mappings from Strings to the Type Safe Constant + */ + private static CaseInsensitiveMap<SubClassCategory> typeMap; + + /** + * This is used to provide a unique ordinal to each constant in this class + */ + private static int ordinalCount = 0; + + /** + * The name of this Constant + */ + private final String fieldName; + + /** + * The ordinal of this Constant + */ + private final transient int ordinal; + + private boolean defined = false; + + private SubClassCategory(String name) + { + ordinal = ordinalCount++; + fieldName = name; + } + + /** + * Converts this Constant to a String (returns the name of this Constant) + * + * @return The string representatin (name) of this Constant + */ + @Override + public String toString() + { + return fieldName; + } + + /** + * Gets the ordinal of this Constant + */ + public int getOrdinal() + { + return ordinal; + } + + public void define() + { + defined = true; + } + + public boolean isDefined() + { + return defined; + } + + /** + * Returns the constant for the given String (the search for the constant is + * case insensitive). If the constant does not already exist, a new Constant + * is created with the given String as the name of the Constant. + * + * @param s + * The name of the constant to be returned + * @return The Constant for the given name + */ + public static SubClassCategory getConstant(String s) + { + if (typeMap == null) + { + typeMap = new CaseInsensitiveMap<SubClassCategory>(); + } + String lookup = s.replace('_', ' '); + SubClassCategory o = typeMap.get(lookup); + if (o == null) + { + /* + * TODO FIXME Should .,| or other stuff be banned here? (probably) + */ + if (s.length() == 0) + { + throw new IllegalArgumentException( + "Type Name cannot be zero length"); + } + o = new SubClassCategory(lookup); + typeMap.put(lookup, o); + } + return o; + } + + /** + * Returns the constant for the given String (the search for the constant is + * case insensitive). If the constant does not already exist, an + * IllegalArgumentException is thrown. + * + * @param s + * The name of the constant to be returned + * @return The Constant for the given name + */ + public static SubClassCategory valueOf(String s) + { + if (typeMap == null) + { + typeMap = new CaseInsensitiveMap<SubClassCategory>(); + } + SubClassCategory o = typeMap.get(s); + if (o == null) + { + throw new IllegalArgumentException(s); + } + return o; + } + + /** + * Returns a Collection of all of the Constants in this Class. + * + * This collection maintains a reference to the Constants in this Class, so + * if a new Constant is created, the Collection returned by this method will + * be modified. (Beware of ConcurrentModificationExceptions) + * + * @return a Collection of all of the Constants in this Class. + */ + public static Collection<SubClassCategory> getAllConstants() + { + if (typeMap == null) + { + return null; + } + return Collections.unmodifiableCollection(typeMap.values()); + } + + /** + * Clears all of the Constants in this Class (forgetting the mapping from + * the String to the Constant). + */ + /* + * CONSIDER Need to consider the ramifications of this on TypeSafeMap, since + * this does not (and really cannot) reset the ordinal count... Does this + * method need to be renamed, such that it is clearConstantMap? - Tom + * Parker, Feb 28, 2007 + */ + public static void clearConstants() + { + if (typeMap != null) + { + typeMap.clear(); + } + } + +} Modified: Trunk/pcgen/code/src/java/pcgen/cdom/reference/ReferenceUtilities.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/reference/ReferenceUtilities.java 2008-08-06 01:04:47 UTC (rev 7366) +++ Trunk/pcgen/code/src/java/pcgen/cdom/reference/ReferenceUtilities.java 2008-08-06 02:15:01 UTC (rev 7367) @@ -18,6 +18,7 @@ package pcgen.cdom.reference; import java.util.Collection; +import java.util.Comparator; import java.util.Set; import java.util.TreeSet; @@ -32,6 +33,15 @@ public final class ReferenceUtilities { + public static final Comparator<CDOMReference<?>> REFERENCE_SORTER = new Comparator<CDOMReference<?>>() + { + + public int compare(CDOMReference<?> arg0, CDOMReference<?> arg1) + { + return compareRefs(arg0, arg1); + } + }; + private ReferenceUtilities() { // Cannot construct utility class @@ -121,4 +131,21 @@ return StringUtil.join(resultSet, separator); } + + public static int compareRefs(CDOMReference<?> arg0, CDOMReference<?> arg1) + { + if (arg0 instanceof CDOMSingleRef) + { + if (!(arg1 instanceof CDOMSingleRef)) + { + return -1; + } + return arg0.getName().compareTo(arg1.getName()); + } + if (arg1 instanceof CDOMSingleRef) + { + return 1; + } + return arg0.getName().compareTo(arg1.getName()); + } } Modified: Trunk/pcgen/code/src/java/pcgen/core/AbilityUtilities.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/AbilityUtilities.java 2008-08-06 01:04:47 UTC (rev 7366) +++ Trunk/pcgen/code/src/java/pcgen/core/AbilityUtilities.java 2008-08-06 02:15:01 UTC (rev 7367) @@ -24,7 +24,7 @@ package pcgen.core; import pcgen.cdom.base.CDOMReference; -import pcgen.cdom.content.TransitionChoice; +import pcgen.cdom.base.TransitionChoice; import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; import pcgen.core.pclevelinfo.PCLevelInfo; Modified: Trunk/pcgen/code/src/java/pcgen/core/BioSet.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/BioSet.java 2008-08-06 01:04:47 UTC (rev 7366) +++ Trunk/pcgen/code/src/java/pcgen/core/BioSet.java 2008-08-06 02:15:01 UTC (rev 7367) @@ -26,7 +26,7 @@ package pcgen.core; import pcgen.cdom.base.Constants; -import pcgen.cdom.content.TransitionChoice; +import pcgen.cdom.base.TransitionChoice; import pcgen.cdom.enumeration.ListKey; import pcgen.core.bonus.Bonus; import pcgen.core.bonus.BonusObj; Modified: Trunk/pcgen/code/src/java/pcgen/core/PCClass.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-08-06 01:04:47 UTC (rev 7366) +++ Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-08-06 02:15:01 UTC (rev 7367) @@ -45,10 +45,11 @@ import pcgen.cdom.base.CDOMReference; import pcgen.cdom.base.Constants; import pcgen.cdom.base.FormulaFactory; +import pcgen.cdom.base.TransitionChoice; import pcgen.cdom.content.HitDie; import pcgen.cdom.content.KnownSpellIdentifier; +import pcgen.cdom.content.LevelCommandFactory; import pcgen.cdom.content.Modifier; -import pcgen.cdom.content.TransitionChoice; import pcgen.cdom.enumeration.FormulaKey; import pcgen.cdom.enumeration.IntegerKey; import pcgen.cdom.enumeration.ListKey; @@ -1762,10 +1763,6 @@ { if (level > curLevel || aPC.isImporting()) { - final boolean isMonsterClass = - aPC.getRace().getMonsterClass() != null - && aPC.getRace().getMonsterClass() - .equalsIgnoreCase(this.getKeyName()); Integer mLevPerFeat = get(IntegerKey.LEVELS_PER_FEAT); int startLevel; int rangeLevel; @@ -3752,8 +3749,15 @@ // 4 levels of Giant, so it does not get a stat increase at // 4th level because that is already taken into account in // its racial stat modifiers, but it will get one at 8th - if (total <= aPC.getRace().getMonsterClassLevels()) + LevelCommandFactory lcf = aPC.getRace().get(ObjectKey.MONSTER_CLASS); + int monLevels = 0; + if (lcf != null) { + monLevels = lcf.getLevelCount().resolve(aPC, "").intValue(); + } + + if (total <= monLevels) + { processBonusStats = false; } } @@ -5556,4 +5560,9 @@ return spellCache != null; } + public String getFullKey() + { + return getKeyName(); + } + } Modified: Trunk/pcgen/code/src/java/pcgen/core/PCTemplate.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PCTemplate.java 2008-08-06 01:04:47 UTC (rev 7366) +++ Trunk/pcgen/code/src/java/pcgen/core/PCTemplate.java 2008-08-06 02:15:01 UTC (rev 7367) @@ -52,8 +52,6 @@ // Static properties // ///////////////////////////////////////////////////////////////////// - private String favoredClass = ""; - /** * Get the total adjustment to Challenge rating of a character at a given * level (Class and Hit Dice). This will include the absolute adjustment @@ -101,30 +99,6 @@ } /** - * Set the name of a favoured class to add to the Character this Template is - * applied to - * - * @param newClass - * the name of the class - */ - public void setFavoredClass(final String newClass) - { - favoredClass = newClass; - } - - /** - * Get a string that is the name of a single favoured class to be added to - * the character this Template is applied to. Each Template can only add a - * single favoured class. - * - * @return the name of the favoured class to add - */ - public String getFavoredClass() - { - return favoredClass; - } - - /** * Produce a tailored PCC output, used for saving custom templates. * * @return PCC Text @@ -145,11 +119,6 @@ txt.append("\tCHOOSE:LANGAUTO:").append(getChooseLanguageAutos()); } - if ((favoredClass != null) && (favoredClass.length() > 0)) - { - txt.append("\tFAVOREDCLASS:").append(favoredClass); - } - txt.append(super.getPCCText(false)); return txt.toString(); Modified: Trunk/pcgen/code/src/java/pcgen/core/PObject.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-08-06 01:04:47 UTC (rev 7366) +++ Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-08-06 02:15:01 UTC (rev 7367) @@ -48,7 +48,7 @@ import pcgen.cdom.base.CDOMObject; import pcgen.cdom.base.CDOMReference; import pcgen.cdom.base.Constants; -import pcgen.cdom.content.TransitionChoice; +import pcgen.cdom.base.TransitionChoice; import pcgen.cdom.enumeration.IntegerKey; import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-08-06 01:04:47 UTC (rev 7366) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-08-06 02:15:01 UTC (rev 7367) @@ -60,13 +60,14 @@ import pcgen.base.util.TreeMapToList; import pcgen.cdom.base.AssociatedPrereqObject; import pcgen.cdom.base.CDOMObject; +import pcgen.cdom.base.CDOMObjectUtilities; import pcgen.cdom.base.CDOMReference; import pcgen.cdom.base.Constants; +import pcgen.cdom.base.TransitionChoice; import pcgen.cdom.content.ChallengeRating; import pcgen.cdom.content.HitDie; import pcgen.cdom.content.LevelCommandFactory; import pcgen.cdom.content.Modifier; -import pcgen.cdom.content.TransitionChoice; import pcgen.cdom.enumeration.AssociationKey; import pcgen.cdom.enumeration.FormulaKey; import pcgen.cdom.enumeration.Gender; @@ -219,7 +220,7 @@ private Map<String, String> activeBonusMap = new TreeMap<String, String>(); private Race race = null; - private final SortedSet<String> favoredClasses = new TreeSet<String>(); + private PCClass selectedFavoredClass = null; private final StatList statList = new StatList(this); // List of Kit objects @@ -2268,21 +2269,17 @@ } } - // // Add additional HD if required - // newClass = Globals.getClassNamed(race.getType()); - PCClass aClass = - Globals.getContext().ref.silentlyGetConstructedCDOMObject(PCClass.class, race.getMonsterClass()); + LevelCommandFactory lcf = race.get(ObjectKey.MONSTER_CLASS); final int usedHD = followerMaster.getUsedHD(); addHD -= usedHD; // if ((newClass != null) && (addHD != 0)) - if ((aClass != null) && (addHD != 0)) + if ((lcf != null) && (addHD != 0)) { // set the new HD (but only do it once!) - // incrementClassLevel(addHD, newClass, true); - incrementClassLevel(addHD, aClass, true); + incrementClassLevel(addHD, lcf.getPCClass(), true); followerMaster.setUsedHD(addHD + usedHD); setDirty(true); } @@ -2308,7 +2305,7 @@ .intValue()) { // first zero current - fSkill.setZeroRanks(aClass, this); + fSkill.setZeroRanks(lcf == null ? null : lcf.getPCClass(), this); // We don't pass in a class here so that the real // skills can be distinguished from the ones from // the master. @@ -5766,21 +5763,37 @@ * * @author Thomas Behr 08-03-02 */ - public SortedSet<String> getFavoredClasses() + public SortedSet<PCClass> getFavoredClasses() { - final SortedSet<String> favored = new TreeSet<String>(favoredClasses); + /* + * CONSIDER Can this be cached? + */ + SortedSet<PCClass> favored = new TreeSet<PCClass>(CDOMObjectUtilities.CDOM_SORTER); + if (selectedFavoredClass != null) + { + favored.add(selectedFavoredClass); + } + + List<CDOMReference<? extends PCClass>> favClass = getRace().getListFor( + ListKey.FAVORED_CLASS); + if (favClass != null) + { + for (CDOMReference<? extends PCClass> ref : favClass) + { + favored.addAll(ref.getContainedObjects()); + } + } + for (PCTemplate template : templateList) { - StringTokenizer aTok = - new StringTokenizer(template.getFavoredClass(), "|"); - while (aTok.hasMoreTokens()) + List<CDOMReference<? extends PCClass>> fc = template + .getListFor(ListKey.FAVORED_CLASS); + if (fc != null) { - String favoredClass = aTok.nextToken(); - if ((favoredClass.length() != 0) - && !favored.contains(favoredClass)) + for (CDOMReference<? extends PCClass> ref : fc) { - favored.add(favoredClass); + favored.addAll(ref.getContainedObjects()); } } } @@ -5795,29 +5808,29 @@ */ public int getFavoredClassLevel() { + final SortedSet<PCClass> aList = getFavoredClasses(); int level = 0; - if (getRace().getFavoredClass().equalsIgnoreCase("ANY")) + int max = 0; + boolean isAny = getRace().getSafe(ObjectKey.ANY_FAVORED_CLASS); + + for (PCClass cl : aList) { for (PCClass pcClass : classList) { - if (pcClass.isType("Base")) + if (isAny) { - level = Math.max(level, pcClass.getLevel()); + max = Math.max(max, pcClass.getLevel()); } - } - } - else - { - for (PCClass pcClass : classList) - { - if (pcClass.getDisplayName().equals(getStringFor(StringKey.RACIAL_FAVORED_CLASS))) + if (cl.getKeyName().equals(pcClass.getKeyName())) { - level = pcClass.getLevel(); + level += pcClass.getLevel(); + break; } } } - return level; + return Math.max(level, max); } + /** * Calculates total bonus from Feats * @@ -6281,25 +6294,15 @@ cachedWeaponProfs = null; - if (stringChar.containsKey(StringKey.RACIAL_FAVORED_CLASS)) - { - removeFavoredClass(stringChar - .get(StringKey.RACIAL_FAVORED_CLASS)); - } - removeNaturalWeapons(race); removeTemplatesFrom(race); - if ((race.getMonsterClass() != null) - && (race.getMonsterClassLevels() != 0)) + selectedFavoredClass = null; + LevelCommandFactory lcf = race.get(ObjectKey.MONSTER_CLASS); + if (lcf != null) { - final PCClass mclass = - Globals.getContext().ref.silentlyGetConstructedCDOMObject(PCClass.class, race.getMonsterClass()); - - if (mclass != null) - { - incrementClassLevel(race.getMonsterClassLevels() * -1, + final PCClass mclass = lcf.getPCClass(); + incrementClassLevel(lcf.getLevelCount().resolve(this, "").intValue() * -1, mclass, true); - } } } @@ -6343,15 +6346,14 @@ new ArrayList<PCLevelInfo>(pcLevelInfo); pcLevelInfo.clear(); // Make sure monster classes are added first - if (!isImporting() && (race.getMonsterClass() != null) - && (race.getMonsterClassLevels() != 0)) + if (!isImporting()) { - final PCClass mclass = - Globals.getContext().ref.silentlyGetConstructedCDOMObject(PCClass.class, race.getMonsterClass()); - if (mclass != null) + LevelCommandFactory lcf = race.get(ObjectKey.MONSTER_CLASS); + if (lcf != null) { - incrementClassLevel(race.getMonsterClassLevels(), - mclass, true); + PCClass mclass = lcf.getPCClass(); + incrementClassLevel(lcf.getLevelCount().resolve(this, "") + .intValue(), mclass, true); } } @@ -6398,9 +6400,11 @@ addNaturalWeapons(race.getNaturalWeapons()); getAutoLanguages(); + if (!isImporting()) + { + selectRacialFavoredClass(); + } - getRacialFavoredClasses(isImporting()); - selectTemplates(race, isImporting()); // gets and adds templates race.chooseLanguageAutos(isImporting(), this); @@ -10278,8 +10282,8 @@ public double multiclassXPMultiplier() { final HashSet<PCClass> unfavoredClasses = new HashSet<PCClass>(); - final SortedSet<String> aList = getFavoredClasses(); - boolean hasAny = false; + final SortedSet<PCClass> aList = getFavoredClasses(); + boolean hasAny = hasAnyFavoredClass(); PCClass maxClass = null; PCClass secondClass = null; int maxClassLevel = 0; @@ -10287,57 +10291,20 @@ int xpPenalty = 0; double xpMultiplier = 1.0; - if (aList.contains("Any")) - { - hasAny = true; - } - for (PCClass pcClass : classList) { if (!pcClass.hasXPPenalty()) { continue; } - boolean found = false; - String classKey = pcClass.getKeyName(); String subClassKey = pcClass.getSubClassKey(); - if (subClassKey.equals("None")) + PCClass evalClass = pcClass; + if (!subClassKey.equals("None")) { - subClassKey = ""; + evalClass = pcClass.getSubClassKeyed(subClassKey); } - if (aList.contains(pcClass.getDisplayClassName())) + if (!aList.contains(evalClass)) { - //Old 5.x style match - found = true; - } - else if (aList.contains(pcClass.toString())) - { - //Old 5.x style match - found = true; - } - else - { - if (subClassKey.length() == 0) - { - if (aList.contains(classKey) - || aList.contains(classKey + "." + classKey)) - { - //6.x style match (key) - found = true; - } - } - else - { - //Sub Class or Subst Class - if (aList.contains(classKey + "." + subClassKey)) - { - //New 6.x style match - found = true; - } - } - } - if (!found) - { unfavoredClasses.add(pcClass); if (pcClass.getLevel() > maxClassLevel) @@ -10389,6 +10356,23 @@ return xpMultiplier; } + public boolean hasAnyFavoredClass() + { + if (getRace().getSafe(ObjectKey.ANY_FAVORED_CLASS)) + { + return true; + } + + for (PCTemplate template : templateList) + { + if (template.getSafe(ObjectKey.ANY_FAVORED_CLASS)) + { + return true; + } + } + return false; + } + public int naturalAC() { return calcACOfType("NaturalArmor"); @@ -11287,26 +11271,6 @@ return -1; } - public boolean addFavoredClass(final String aString) - { - if (aString.length() == 0) - { - return false; - } - StringTokenizer tok = new StringTokenizer(aString, Constants.PIPE); - while (tok.hasMoreTokens()) - { - String fc = tok.nextToken(); - if ((fc.length() != 0) && !favoredClasses.contains(fc)) - { - favoredClasses.add(fc); - setDirty(true); - } - } - - return true; - } - void addFreeLanguage(final Language aLang) { this.languages.add(aLang); @@ -11314,24 +11278,6 @@ setDirty(true); } - boolean removeFavoredClass(final String aString) - { - StringTokenizer tok = new StringTokenizer(aString, Constants.PIPE); - boolean mod = false; - while (tok.hasMoreTokens()) - { - String fc = tok.nextToken(); - if ((fc.length() != 0) && favoredClasses.contains(fc)) - { - favoredClasses.remove(fc); - setDirty(true); - mod = true; - } - } - - return mod; - } - void removeVariable(final String variableString) { for (Iterator<String> e = variableList.iterator(); e.hasNext();) @@ -12034,91 +11980,14 @@ return hasWeaponProfKeyed(wp.getKeyName()); } - private SortedSet<String> getRacialFavoredClasses(boolean isImporting) + private void selectRacialFavoredClass() { - String rfc = getRace().getFavoredClass(); - - if (!isImporting && rfc.startsWith("CHOOSE:")) + TransitionChoice<PCClass> fcChoice = getRace().get( + ObjectKey.FAVCLASS_CHOICE); + if (fcChoice != null) { - final List<PCClass> availableList = new ArrayList<PCClass>(); - - // 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")) - { - for (PCClass pcClass : Globals.getContext().ref.getConstructedCDOMObjects(PCClass.class)) - { - if (pcClass.isType("Base") && !pcClass.isType("Monster") && - pcClass.getSafe(ObjectKey.VISIBILITY).equals(Visibility.DEFAULT)) - { - if (pcClass.hasSubClass()) - { - if (pcClass.getSafe(ObjectKey.ALLOWBASECLASS)) - { - availableList.add(pcClass); - } - for (PCClass subClass : pcClass.getSubClassList()) - { - availableList.add(subClass); - } - } - else - { - availableList.add(pcClass); - } - } - } - } - else - { - final StringTokenizer tok = - new StringTokenizer(rfc.substring(7), "|"); - while (tok.hasMoreTokens()) - { - String cl = tok.nextToken(); - int dotLoc = cl.indexOf("."); - if (dotLoc == -1) - { - //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); - Globals.getChoiceFromList("Select favored class", availableList, - selectedList, 1, true); - rfc = selectedList.get(0).getKeyName(); + selectedFavoredClass = fcChoice.driveChoice(this).iterator().next(); } - - if (addFavoredClass(rfc)) - { - setStringFor(StringKey.RACIAL_FAVORED_CLASS, rfc); - } - else - { - removeStringFor(StringKey.RACIAL_FAVORED_CLASS); - } - - return favoredClasses; } private List<String> getSelectedArmorProfList() @@ -14846,7 +14715,7 @@ aClone.tempBonusList.addAll(tempBonusList); aClone.tempBonusFilters.addAll(tempBonusFilters); aClone.race = race; - aClone.favoredClasses.addAll(favoredClasses); + aClone.selectedFavoredClass = selectedFavoredClass; aClone.statList.clear(); for (PCStat stat : statList) @@ -18027,4 +17896,14 @@ return null; } + public PCClass getSelectedFavoredClass() + { + return selectedFavoredClass; + } + + public void setSelectedFavoredClass(PCClass sfc) + { + selectedFavoredClass = sfc; + } + } Modified: Trunk/pcgen/code/src/java/pcgen/core/Race.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Race.java 2008-08-06 01:04:47 UTC (rev 7366) +++ Trunk/pcgen/code/src/java/pcgen/core/Race.java 2008-08-06 02:15:01 UTC (rev 7367) @@ -44,9 +44,6 @@ */ public final class Race extends PObject { - private String favoredClass = Constants.EMPTY_STRING; - private String monsterClass = null; - private int monsterClassLevels = 0; /** * Checks if this race's advancement is limited. @@ -71,36 +68,6 @@ return new Point2D.Double(width.doubleValue(), height.doubleValue()); } - public void setFavoredClass(final String newClass) - { - favoredClass = newClass; - } - - public String getFavoredClass() - { - return favoredClass; - } - - public void setMonsterClass(final String string) - { - monsterClass = string; - } - - public String getMonsterClass() - { - return monsterClass; - } - - public void setMonsterClassLevels(final int num) - { - monsterClassLevels = num; - } - - public int getMonsterClassLevels() - { - return monsterClassLevels; - } - /** * Retrieve Unarmed Damage according to the Race * @return UDAM damage die (ie 1d3) @@ -138,11 +105,6 @@ this), "\t")); txt.append("\t"); - if ((favoredClass != null) && (favoredClass.length() > 0)) - { - txt.append("\tFAVCLASS:").append(favoredClass); - } - if ((getChooseLanguageAutos() != null) && (getChooseLanguageAutos().length() > 0)) { @@ -199,12 +161,6 @@ txt.append("\tNATURALATTACKS:").append(buffer.toString()); } - if (monsterClass != null && !"(None)".equals(monsterClass)) - { - txt.append("\tMONSTERCLASS:").append(monsterClass); - txt.append(':').append(monsterClassLevels); - } - return txt.toString(); } @@ -216,7 +172,6 @@ try { aRace = (Race) super.clone(); - aRace.favoredClass = favoredClass; } catch (CloneNotSupportedException exc) { Modified: Trunk/pcgen/code/src/java/pcgen/core/Skill.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Skill.java 2008-08-06 01:04:47 UTC (rev 7366) +++ Trunk/pcgen/code/src/java/pcgen/core/Skill.java 2008-08-06 02:15:01 UTC (rev 7367) @@ -28,7 +28,7 @@ import java.util.StringTokenizer; import pcgen.cdom.base.Constants; -import pcgen.cdom.content.TransitionChoice; +import pcgen.cdom.base.TransitionChoice; import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; import pcgen.cdom.enumeration.SkillCost; Modified: Trunk/pcgen/code/src/java/pcgen/core/SubClass.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/SubClass.java 2008-08-06 01:04:47 UTC (rev 7366) +++ Trunk/pcgen/code/src/java/pcgen/core/SubClass.java 2008-08-06 02:15:01 UTC (rev 7367) @@ -25,6 +25,8 @@ import java.util.ArrayList; import java.util.List; +import pcgen.cdom.base.CategorizedCDOMObject; +import pcgen.cdom.base.Category; import pcgen.cdom.enumeration.IntegerKey; import pcgen.persistence.PersistenceLayerException; import pcgen.persistence.lst.CampaignSourceEntry; @@ -37,7 +39,7 @@ * @author Bryan McRoberts <mer...@us...> * @version $Revision$ */ -public final class SubClass extends PCClass +public final class SubClass extends PCClass implements CategorizedCDOMObject<SubClass> { private List<String> levelArray = null; private String choice = null; @@ -195,4 +197,24 @@ } return displayInfo.toString(); } + + private Category<SubClass> category; + + public Category<SubClass> getCDOMCategory() + { + return category; + } + + public void setCDOMCategory(Category<SubClass> cat) + { + category = cat; + } + + @Override + public String getFullKey() + { + return category.toString() + "." + super.getFullKey(); + } + + } Modified: Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassAbilityPanel.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassAbilityPanel.java 2008-08-06 01:04:47 UTC (rev 7366) +++ Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassAbilityPanel.java 2008-08-06 02:15:01 UTC (rev 7367) @@ -39,8 +39,8 @@ import pcgen.base.lang.StringUtil; import pcgen.cdom.base.CDOMListObject; import pcgen.cdom.base.Constants; +import pcgen.cdom.base.TransitionChoice; import pcgen.cdom.content.HitDie; -import pcgen.cdom.content.TransitionChoice; import pcgen.cdom.enumeration.IntegerKey; import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; Modified: Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassLevelPanel.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassLevelPanel.java 2008-08-06 01:04... [truncated message content] |
From: <th...@us...> - 2008-08-06 21:35:21
|
Revision: 7395 http://pcgen.svn.sourceforge.net/pcgen/?rev=7395&view=rev Author: thpr Date: 2008-08-06 21:35:27 +0000 (Wed, 06 Aug 2008) Log Message: ----------- test Modified Paths: -------------- Trunk/pcgen/code/src/java/plugin/lsttokens/template/FavoredclassToken.java Added Paths: ----------- Trunk/pcgen/code/src/utest/plugin/lsttokens/template/FavoredClassTokenTest.java Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/template/FavoredclassToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/template/FavoredclassToken.java 2008-08-06 21:28:32 UTC (rev 7394) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/template/FavoredclassToken.java 2008-08-06 21:35:27 UTC (rev 7395) @@ -78,6 +78,10 @@ } else { + if (hasIllegalSeparator('.', token)) + { + return false; + } // SubClass String parent = token.substring(0, dotLoc); String subclass = token.substring(dotLoc + 1); Added: Trunk/pcgen/code/src/utest/plugin/lsttokens/template/FavoredClassTokenTest.java =================================================================== --- Trunk/pcgen/code/src/utest/plugin/lsttokens/template/FavoredClassTokenTest.java (rev 0) +++ Trunk/pcgen/code/src/utest/plugin/lsttokens/template/FavoredClassTokenTest.java 2008-08-06 21:35:27 UTC (rev 7395) @@ -0,0 +1,158 @@ +/* + * Copyright (c) 2007 Tom Parker <th...@us...> + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation; either version 2.1 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + * details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ +package plugin.lsttokens.template; + +import org.junit.Test; + +import pcgen.cdom.enumeration.SubClassCategory; +import pcgen.core.PCClass; +import pcgen.core.PCTemplate; +import pcgen.core.SubClass; +import pcgen.persistence.PersistenceLayerException; +import pcgen.rules.persistence.CDOMLoader; +import pcgen.rules.persistence.token.CDOMPrimaryToken; +import plugin.lsttokens.testsupport.AbstractListTokenTestCase; +import plugin.lsttokens.testsupport.CDOMTokenLoader; + +public class FavoredClassTokenTest extends + AbstractListTokenTestCase<PCTemplate, PCClass> +{ + + static FavoredclassToken token = new FavoredclassToken(); + static CDOMTokenLoader<PCTemplate> loader = new CDOMTokenLoader<PCTemplate>( + PCTemplate.class); + + @Override + public Class<PCTemplate> getCDOMClass() + { + return PCTemplate.class; + } + + @Override + public CDOMLoader<PCTemplate> getLoader() + { + return loader; + } + + @Override + public CDOMPrimaryToken<PCTemplate> getToken() + { + return token; + } + + @Override + public Class<PCClass> getTargetClass() + { + return PCClass.class; + } + + @Override + public boolean isTypeLegal() + { + return false; + } + + @Override + public boolean isAllLegal() + { + return true; + } + + @Override + public boolean isClearDotLegal() + { + return false; + } + + @Override + public boolean isClearLegal() + { + return false; + } + + @Override + public char getJoinCharacter() + { + return '|'; + } + + @Test + public void testInvalidInputSubClassNoSub() + throws PersistenceLayerException + { + construct(primaryContext, "TestWP1"); + assertFalse(parse("TestWP1.")); + assertNoSideEffects(); + } + + @Test + public void testInvalidInputSubClassNoClass() + throws PersistenceLayerException + { + assertFalse(parse(".TestWP1")); + assertNoSideEffects(); + } + + @Test + public void testInvalidInputSubDoubleSeparator() + throws PersistenceLayerException + { + construct(primaryContext, "TestWP1"); + assertFalse(parse("TestWP1..Two")); + assertNoSideEffects(); + } + + @Test + public void testCategorization() throws PersistenceLayerException + { + construct(primaryContext, "TestWP1"); + assertTrue(parse("TestWP1.Two")); + SubClass obj = primaryContext.ref.constructCDOMObject( + SubClass.class, "Two"); + SubClassCategory cat = SubClassCategory.getConstant("TestWP2"); + primaryContext.ref.reassociateCategory(cat, obj); + assertFalse(primaryContext.ref.validate()); + obj = primaryContext.ref.constructCDOMObject(SubClass.class, "Two"); + cat = SubClassCategory.getConstant("TestWP1"); + primaryContext.ref.reassociateCategory(cat, obj); + assertTrue(primaryContext.ref.validate()); + } + + @Test + public void testRoundRobinThreeSub() throws PersistenceLayerException + { + construct(primaryContext, "TestWP1"); + construct(primaryContext, "TestWP2"); + construct(primaryContext, "TestWP3"); + construct(secondaryContext, "TestWP1"); + construct(secondaryContext, "TestWP2"); + construct(secondaryContext, "TestWP3"); + SubClass obj = primaryContext.ref.constructCDOMObject( + SubClass.class, "Sub"); + SubClassCategory cat = SubClassCategory.getConstant("TestWP2"); + primaryContext.ref.reassociateCategory(cat, obj); + obj = secondaryContext.ref.constructCDOMObject(SubClass.class, + "Sub"); + secondaryContext.ref.reassociateCategory(cat, obj); + System.err.println("!"); + runRoundRobin("TestWP1" + getJoinCharacter() + "TestWP2.Sub" + + getJoinCharacter() + "TestWP3"); + System.err.println("!!"); + } + +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-08-06 21:48:03
|
Revision: 7402 http://pcgen.svn.sourceforge.net/pcgen/?rev=7402&view=rev Author: thpr Date: 2008-08-06 21:48:08 +0000 (Wed, 06 Aug 2008) Log Message: ----------- test Modified Paths: -------------- Trunk/pcgen/code/src/java/plugin/lsttokens/QualifyToken.java Added Paths: ----------- Trunk/pcgen/code/src/utest/plugin/lsttokens/QualifyTokenTest.java Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/QualifyToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/QualifyToken.java 2008-08-06 21:47:21 UTC (rev 7401) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/QualifyToken.java 2008-08-06 21:48:08 UTC (rev 7402) @@ -118,7 +118,15 @@ + StringPClassUtil.getValidStrings()); return false; } - rm = foo(context, (Class) c, categoryName); + rm = getReferenceManufacturer(context, (Class) c, categoryName); + if (rm == null) + { + Logging.errorPrint(" Error encountered parsing " + + getTokenName()); + Logging.errorPrint(" " + className + " Category: " + + categoryName + " not found"); + return false; + } } else { @@ -149,7 +157,7 @@ return true; } - private <T extends CDOMObject & CategorizedCDOMObject<T>> ReferenceManufacturer<? extends CDOMObject, ?> foo( + private <T extends CDOMObject & CategorizedCDOMObject<T>> ReferenceManufacturer<? extends CDOMObject, ?> getReferenceManufacturer( LoadContext context, Class<T> c, String categoryName) { Category<T> cat = StringPClassUtil.getCategoryFor(c, categoryName); Added: Trunk/pcgen/code/src/utest/plugin/lsttokens/QualifyTokenTest.java =================================================================== --- Trunk/pcgen/code/src/utest/plugin/lsttokens/QualifyTokenTest.java (rev 0) +++ Trunk/pcgen/code/src/utest/plugin/lsttokens/QualifyTokenTest.java 2008-08-06 21:48:08 UTC (rev 7402) @@ -0,0 +1,194 @@ +/* + * Copyright (c) 2007 Tom Parker <th...@us...> + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation; either version 2.1 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + * details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ +package plugin.lsttokens; + +import java.net.URISyntaxException; + +import org.junit.Before; +import org.junit.Test; + +import pcgen.cdom.base.CDOMObject; +import pcgen.core.Ability; +import pcgen.core.AbilityCategory; +import pcgen.core.PCTemplate; +import pcgen.core.spell.Spell; +import pcgen.persistence.PersistenceLayerException; +import pcgen.rules.persistence.CDOMLoader; +import pcgen.rules.persistence.token.CDOMPrimaryToken; +import plugin.lsttokens.testsupport.AbstractGlobalTokenTestCase; +import plugin.lsttokens.testsupport.CDOMTokenLoader; + +public class QualifyTokenTest extends AbstractGlobalTokenTestCase +{ + + static CDOMPrimaryToken<CDOMObject> token = new QualifyToken(); + static CDOMTokenLoader<PCTemplate> loader = new CDOMTokenLoader<PCTemplate>( + PCTemplate.class); + + @Override + @Before + public void setUp() throws PersistenceLayerException, URISyntaxException + { + super.setUp(); + } + + @Override + public CDOMLoader<PCTemplate> getLoader() + { + return loader; + } + + @Override + public Class<PCTemplate> getCDOMClass() + { + return PCTemplate.class; + } + + @Override + public CDOMPrimaryToken<CDOMObject> getToken() + { + return token; + } + + @Test + public void testInvalidEmpty() throws PersistenceLayerException + { + assertFalse(parse("")); + assertNoSideEffects(); + } + + @Test + public void testInvalidTypeOnly() throws PersistenceLayerException + { + assertFalse(parse("SPELL")); + assertNoSideEffects(); + } + + @Test + public void testInvalidTypeBarOnly() throws PersistenceLayerException + { + assertFalse(parse("SPELL|")); + assertNoSideEffects(); + } + + @Test + public void testInvalidEmptyType() throws PersistenceLayerException + { + assertFalse(parse("|Fireball")); + assertNoSideEffects(); + } + + @Test + public void testInvalidCatTypeNoEqual() throws PersistenceLayerException + { + assertFalse(parse("ABILITY|Abil")); + assertNoSideEffects(); + } + + @Test + public void testInvalidNonCatTypeEquals() throws PersistenceLayerException + { + assertFalse(parse("SPELL=Arcane|Fireball")); + assertNoSideEffects(); + } + + @Test + public void testInvalidDoubleEquals() throws PersistenceLayerException + { + assertFalse(parse("ABILITY=FEAT=Mutation|Fireball")); + assertNoSideEffects(); + } + + @Test + public void testInvalidUnbuiltCategory() throws PersistenceLayerException + { + try + { + assertFalse(parse("ABILITY=Crazy|Fireball")); + } + catch (IllegalArgumentException e) + { + //OK as well + } + assertNoSideEffects(); + } + + @Test + public void testInvalidSpellbookAndSpellBarOnly() + throws PersistenceLayerException + { + assertFalse(parse("SPELL|Fireball|")); + assertNoSideEffects(); + } + + @Test + public void testInvalidSpellBarStarting() throws PersistenceLayerException + { + assertFalse(parse("SPELL||Fireball")); + assertNoSideEffects(); + } + + @Test + public void testRoundRobinJustSpell() throws PersistenceLayerException + { + primaryContext.ref.constructCDOMObject(Spell.class, "Fireball"); + secondaryContext.ref.constructCDOMObject(Spell.class, "Fireball"); + runRoundRobin("SPELL|Fireball"); + } + + @Test + public void testRoundRobinJustAbility() throws PersistenceLayerException + { + Ability a = primaryContext.ref.constructCDOMObject( + Ability.class, "My Feat"); + primaryContext.ref.reassociateCategory(AbilityCategory.FEAT, a); + a = secondaryContext.ref.constructCDOMObject(Ability.class, + "My Feat"); + secondaryContext.ref.reassociateCategory(AbilityCategory.FEAT, a); + runRoundRobin("ABILITY=Feat|My Feat"); + } + + @Test + public void testRoundRobinTwoSpell() throws PersistenceLayerException + { + primaryContext.ref.constructCDOMObject(Spell.class, "Fireball"); + secondaryContext.ref.constructCDOMObject(Spell.class, "Fireball"); + primaryContext.ref.constructCDOMObject(Spell.class, + "Lightning Bolt"); + secondaryContext.ref.constructCDOMObject(Spell.class, + "Lightning Bolt"); + runRoundRobin("SPELL|Fireball|Lightning Bolt"); + } + + @Test + public void testRoundRobinTwoBooksJustSpell() + throws PersistenceLayerException + { + Ability a = primaryContext.ref.constructCDOMObject( + Ability.class, "My Feat"); + primaryContext.ref.reassociateCategory(AbilityCategory.FEAT, a); + a = secondaryContext.ref.constructCDOMObject(Ability.class, + "My Feat"); + secondaryContext.ref.reassociateCategory(AbilityCategory.FEAT, a); + primaryContext.ref.constructCDOMObject(Spell.class, + "Lightning Bolt"); + secondaryContext.ref.constructCDOMObject(Spell.class, + "Lightning Bolt"); + runRoundRobin("ABILITY=Feat|My Feat", "SPELL|Lightning Bolt"); + } +} \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-08-06 21:54:11
|
Revision: 7406 http://pcgen.svn.sourceforge.net/pcgen/?rev=7406&view=rev Author: thpr Date: 2008-08-06 21:54:19 +0000 (Wed, 06 Aug 2008) Log Message: ----------- tests Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/util/StringPClassUtil.java Trunk/pcgen/code/src/java/plugin/lsttokens/AbilityLst.java Added Paths: ----------- Trunk/pcgen/code/src/utest/plugin/lsttokens/AbilityLstTest.java Modified: Trunk/pcgen/code/src/java/pcgen/util/StringPClassUtil.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/util/StringPClassUtil.java 2008-08-06 21:51:24 UTC (rev 7405) +++ Trunk/pcgen/code/src/java/pcgen/util/StringPClassUtil.java 2008-08-06 21:54:19 UTC (rev 7406) @@ -33,11 +33,11 @@ classMap = new HashMap<String, Class<? extends PObject>>(); stringMap = new HashMap<Class<? extends PObject>, String>(); + classMap.put("ABILITY", Ability.class); classMap.put("DEITY", Deity.class); classMap.put("DOMAIN", Domain.class); classMap.put("EQUIPMENT", Equipment.class); classMap.put("EQMOD", EquipmentModifier.class); - classMap.put("FEAT", Ability.class); classMap.put("CLASS", PCClass.class); classMap.put("LANGUAGE", Language.class); classMap.put("RACE", Race.class); @@ -50,7 +50,7 @@ stringMap.put(Domain.class, "DOMAIN"); stringMap.put(Equipment.class, "EQUIPMENT"); stringMap.put(EquipmentModifier.class, "EQMOD"); - stringMap.put(Ability.class, "FEAT"); + stringMap.put(Ability.class, "ABILITY"); stringMap.put(PCClass.class, "CLASS"); stringMap.put(Language.class, "LANGUAGE"); stringMap.put(Race.class, "RACE"); Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/AbilityLst.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/AbilityLst.java 2008-08-06 21:51:24 UTC (rev 7405) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/AbilityLst.java 2008-08-06 21:54:19 UTC (rev 7406) @@ -23,14 +23,17 @@ package plugin.lsttokens; import java.util.ArrayList; -import java.util.Collection; import java.util.List; +import java.util.Set; import java.util.StringTokenizer; +import java.util.TreeSet; import pcgen.base.util.MapToList; +import pcgen.base.util.TripleKeyMapToList; import pcgen.cdom.base.AssociatedPrereqObject; import pcgen.cdom.base.CDOMObject; import pcgen.cdom.base.CDOMReference; +import pcgen.cdom.base.Category; import pcgen.cdom.base.Constants; import pcgen.cdom.enumeration.AssociationKey; import pcgen.cdom.reference.ReferenceUtilities; @@ -128,9 +131,13 @@ return false; } final String natureKey = tok.nextToken(); - final Ability.Nature nature = Ability.Nature.valueOf(natureKey); - if (nature == null) + Ability.Nature nature; + try { + nature = Ability.Nature.valueOf(natureKey); + } + catch (IllegalArgumentException iae) + { Logging.errorPrint(getTokenName() + " refers to invalid Ability Nature: " + natureKey); return false; @@ -221,39 +228,44 @@ // Zero indicates no Token return null; } - Collection<CDOMReference<Ability>> added = changes.getAdded(); - Collection<CDOMReference<Ability>> removedItems = changes.getRemoved(); - StringBuilder sb = new StringBuilder(); - if (changes.includesGlobalClear()) + + + + TripleKeyMapToList<Ability.Nature, Category<Ability>, List<Prerequisite>, CDOMReference<Ability>> m = new TripleKeyMapToList<Ability.Nature, Category<Ability>, List<Prerequisite>, CDOMReference<Ability>>(); + for (CDOMReference<Ability> ab : mtl.getKeySet()) { - if (removedItems != null && !removedItems.isEmpty()) + for (AssociatedPrereqObject assoc : mtl.getListFor(ab)) { - context.addWriteMessage("Non-sensical relationship in " - + getTokenName() - + ": global .CLEAR and local .CLEAR. performed"); - return null; + Ability.Nature nature = assoc + .getAssociation(AssociationKey.NATURE); + AbilityCategory cat = assoc + .getAssociation(AssociationKey.CATEGORY); + m.addToListFor(nature, cat, assoc.getPrerequisiteList(), ab); } - sb.append(Constants.LST_DOT_CLEAR); } - else if (removedItems != null && !removedItems.isEmpty()) + + Set<String> returnSet = new TreeSet<String>(); + for (Ability.Nature nature : m.getKeySet()) { - context.addWriteMessage(getTokenName() + " does not support " - + Constants.LST_DOT_CLEAR_DOT); - return null; - } - if (added != null && !added.isEmpty()) - { - if (sb.length() != 0) + for (Category<Ability> category : m.getSecondaryKeySet(nature)) { - sb.append(Constants.PIPE); + for (List<Prerequisite> prereqs : m.getTertiaryKeySet(nature, category)) + { + StringBuilder sb = new StringBuilder(); + sb.append(category).append(Constants.PIPE); + sb.append(nature).append(Constants.PIPE); + sb.append(ReferenceUtilities.joinLstFormat(m.getListFor(nature, + category, prereqs), Constants.PIPE)); + if (prereqs != null && !prereqs.isEmpty()) + { + sb.append(Constants.PIPE); + sb.append(getPrerequisiteString(context, prereqs)); + } + returnSet.add(sb.toString()); + } } - sb.append(ReferenceUtilities.joinLstFormat(added, Constants.PIPE)); } - if (sb.length() == 0) - { - return null; - } - return new String[] { sb.toString() }; + return returnSet.toArray(new String[returnSet.size()]); } public Class<CDOMObject> getTokenClass() Added: Trunk/pcgen/code/src/utest/plugin/lsttokens/AbilityLstTest.java =================================================================== --- Trunk/pcgen/code/src/utest/plugin/lsttokens/AbilityLstTest.java (rev 0) +++ Trunk/pcgen/code/src/utest/plugin/lsttokens/AbilityLstTest.java 2008-08-06 21:54:19 UTC (rev 7406) @@ -0,0 +1,340 @@ +/* + * Copyright (c) 2007 Tom Parker <th...@us...> + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation; either version 2.1 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + * details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ +package plugin.lsttokens; + +import java.net.URISyntaxException; + +import org.junit.Test; + +import pcgen.cdom.base.CDOMObject; +import pcgen.core.Ability; +import pcgen.core.AbilityCategory; +import pcgen.core.PCTemplate; +import pcgen.core.SettingsHandler; +import pcgen.persistence.PersistenceLayerException; +import pcgen.rules.persistence.CDOMLoader; +import pcgen.rules.persistence.token.CDOMPrimaryToken; +import plugin.lsttokens.testsupport.AbstractGlobalTokenTestCase; +import plugin.lsttokens.testsupport.CDOMTokenLoader; +import plugin.lsttokens.testsupport.TokenRegistration; +import plugin.pretokens.parser.PreLevelParser; +import plugin.pretokens.parser.PreRaceParser; +import plugin.pretokens.writer.PreLevelWriter; +import plugin.pretokens.writer.PreRaceWriter; + +public class AbilityLstTest extends AbstractGlobalTokenTestCase +{ + + static CDOMPrimaryToken<CDOMObject> token = new AbilityLst(); + static CDOMTokenLoader<PCTemplate> loader = new CDOMTokenLoader<PCTemplate>( + PCTemplate.class); + + @Override + public void setUp() throws PersistenceLayerException, URISyntaxException + { + super.setUp(); + TokenRegistration.register(new PreRaceParser()); + TokenRegistration.register(new PreRaceWriter()); + TokenRegistration.register(new PreLevelParser()); + TokenRegistration.register(new PreLevelWriter()); + } + + @Override + public CDOMLoader<PCTemplate> getLoader() + { + return loader; + } + + @Override + public Class<PCTemplate> getCDOMClass() + { + return PCTemplate.class; + } + + @Override + public CDOMPrimaryToken<CDOMObject> getToken() + { + return token; + } + + @Test + public void testInvalidEmpty() throws PersistenceLayerException + { + assertFalse(parse("")); + assertNoSideEffects(); + } + + @Test + public void testInvalidNotANature() throws PersistenceLayerException + { + assertFalse(parse("FEAT|NotANature|,TestWP1")); + assertNoSideEffects(); + } + + @Test + public void testInvalidNotaCategory() throws PersistenceLayerException + { + assertFalse(parse("NotaCategory|NORMAL|,TestWP1")); + assertNoSideEffects(); + } + + @Test + public void testInvalidNoAbility() throws PersistenceLayerException + { + assertFalse(parse("FEAT|NORMAL")); + assertNoSideEffects(); + } + + @Test + public void testInvalidCategoryOnly() throws PersistenceLayerException + { + assertFalse(parse("FEAT")); + assertNoSideEffects(); + } + + @Test + public void testInvalidCategoryBarOnly() throws PersistenceLayerException + { + assertFalse(parse("FEAT|")); + assertNoSideEffects(); + } + + @Test + public void testInvalidEmptyCategory() throws PersistenceLayerException + { + assertFalse(parse("|NORMAL|Abil")); + assertNoSideEffects(); + } + + @Test + public void testInvalidEmptyNature() throws PersistenceLayerException + { + assertFalse(parse("FEAT||Abil")); + assertNoSideEffects(); + } + + @Test + public void testInvalidEmptyAbility() throws PersistenceLayerException + { + assertFalse(parse("FEAT|NORMAL|")); + assertNoSideEffects(); + } + + @Test + public void testInvalidOnlyPre() throws PersistenceLayerException + { + assertFalse(parse("FEAT|NORMAL|PRERACE:1,Human")); + assertNoSideEffects(); + } + + @Test + public void testInvalidDoubleBarAbility() throws PersistenceLayerException + { + assertFalse(parse("FEAT|NORMAL|Abil1||Abil2")); + assertNoSideEffects(); + } + + @Test + public void testInvalidInsertedPre() throws PersistenceLayerException + { + assertFalse(parse("FEAT|NORMAL|Abil1|PRELEVEL:MIN=4|Abil2")); + assertNoSideEffects(); + } + + @Test + public void testInvalidDoubleBarStartAbility() + throws PersistenceLayerException + { + assertFalse(parse("FEAT|NORMAL||Abil1|Abil2")); + assertNoSideEffects(); + } + + @Test + public void testInvalidBarEndAbility() throws PersistenceLayerException + { + assertFalse(parse("FEAT|NORMAL|Abil1|")); + assertNoSideEffects(); + } + + @Test + public void testRoundRobinJustSpell() throws PersistenceLayerException + { + Ability ab = primaryContext.ref.constructCDOMObject( + Ability.class, "Abil1"); + primaryContext.ref.reassociateCategory(AbilityCategory.FEAT, ab); + ab = secondaryContext.ref.constructCDOMObject(Ability.class, + "Abil1"); + secondaryContext.ref.reassociateCategory(AbilityCategory.FEAT, ab); + runRoundRobin("Feat|NORMAL|Abil1"); + } + + @Test + public void testRoundRobinJustTwoPrereq() throws PersistenceLayerException + { + Ability ab = primaryContext.ref.constructCDOMObject( + Ability.class, "Abil1"); + primaryContext.ref.reassociateCategory(AbilityCategory.FEAT, ab); + ab = secondaryContext.ref.constructCDOMObject(Ability.class, + "Abil1"); + secondaryContext.ref.reassociateCategory(AbilityCategory.FEAT, ab); + runRoundRobin("Feat|NORMAL|Abil1|PRELEVEL:MIN=5|PRERACE:1,Human"); + } + + @Test + public void testRoundRobinTwoSpell() throws PersistenceLayerException + { + Ability ab = primaryContext.ref.constructCDOMObject( + Ability.class, "Abil1"); + primaryContext.ref.reassociateCategory(AbilityCategory.FEAT, ab); + ab = secondaryContext.ref.constructCDOMObject(Ability.class, + "Abil1"); + secondaryContext.ref.reassociateCategory(AbilityCategory.FEAT, ab); + ab = primaryContext.ref.constructCDOMObject(Ability.class, "Abil2"); + primaryContext.ref.reassociateCategory(AbilityCategory.FEAT, ab); + ab = secondaryContext.ref.constructCDOMObject(Ability.class, + "Abil2"); + secondaryContext.ref.reassociateCategory(AbilityCategory.FEAT, ab); + runRoundRobin("Feat|NORMAL|Abil1|Abil2"); + } + + @Test + public void testRoundRobinTwoNature() throws PersistenceLayerException + { + Ability ab = primaryContext.ref.constructCDOMObject( + Ability.class, "Abil1"); + primaryContext.ref.reassociateCategory(AbilityCategory.FEAT, ab); + ab = secondaryContext.ref.constructCDOMObject(Ability.class, + "Abil1"); + secondaryContext.ref.reassociateCategory(AbilityCategory.FEAT, ab); + ab = primaryContext.ref.constructCDOMObject(Ability.class, "Abil2"); + primaryContext.ref.reassociateCategory(AbilityCategory.FEAT, ab); + ab = secondaryContext.ref.constructCDOMObject(Ability.class, + "Abil2"); + secondaryContext.ref.reassociateCategory(AbilityCategory.FEAT, ab); + ab = primaryContext.ref.constructCDOMObject(Ability.class, "Abil3"); + primaryContext.ref.reassociateCategory(AbilityCategory.FEAT, ab); + ab = secondaryContext.ref.constructCDOMObject(Ability.class, + "Abil3"); + secondaryContext.ref.reassociateCategory(AbilityCategory.FEAT, ab); + ab = primaryContext.ref.constructCDOMObject(Ability.class, "Abil4"); + primaryContext.ref.reassociateCategory(AbilityCategory.FEAT, ab); + ab = secondaryContext.ref.constructCDOMObject(Ability.class, + "Abil4"); + secondaryContext.ref.reassociateCategory(AbilityCategory.FEAT, ab); + runRoundRobin("Feat|NORMAL|Abil1|Abil2", "Feat|VIRTUAL|Abil3|Abil4"); + } + + @Test + public void testRoundRobinTwoCategory() throws PersistenceLayerException + { + Ability ab = primaryContext.ref.constructCDOMObject( + Ability.class, "Abil1"); + primaryContext.ref.reassociateCategory(AbilityCategory.FEAT, ab); + ab = secondaryContext.ref.constructCDOMObject(Ability.class, + "Abil1"); + secondaryContext.ref.reassociateCategory(AbilityCategory.FEAT, ab); + ab = primaryContext.ref.constructCDOMObject(Ability.class, "Abil2"); + primaryContext.ref.reassociateCategory(AbilityCategory.FEAT, ab); + ab = secondaryContext.ref.constructCDOMObject(Ability.class, + "Abil2"); + secondaryContext.ref.reassociateCategory(AbilityCategory.FEAT, ab); + AbilityCategory ac = new AbilityCategory("NEWCAT"); + SettingsHandler.getGame().addAbilityCategory(ac); + ab = primaryContext.ref.constructCDOMObject(Ability.class, "Abil3"); + primaryContext.ref.reassociateCategory(ac, ab); + ab = secondaryContext.ref.constructCDOMObject(Ability.class, + "Abil3"); + secondaryContext.ref.reassociateCategory(ac, ab); + ab = primaryContext.ref.constructCDOMObject(Ability.class, "Abil4"); + primaryContext.ref.reassociateCategory(ac, ab); + ab = secondaryContext.ref.constructCDOMObject(Ability.class, + "Abil4"); + secondaryContext.ref.reassociateCategory(ac, ab); + runRoundRobin("Feat|VIRTUAL|Abil1|Abil2", "NEWCAT|VIRTUAL|Abil3|Abil4"); + } + + @Test + public void testRoundRobinDupe() throws PersistenceLayerException + { + Ability ab = primaryContext.ref.constructCDOMObject( + Ability.class, "Abil1"); + primaryContext.ref.reassociateCategory(AbilityCategory.FEAT, ab); + ab = secondaryContext.ref.constructCDOMObject(Ability.class, + "Abil1"); + secondaryContext.ref.reassociateCategory(AbilityCategory.FEAT, ab); + runRoundRobin("Feat|VIRTUAL|Abil1|Abil1"); + } + + @Test + public void testRoundRobinDupeDiffNature() throws PersistenceLayerException + { + Ability ab = primaryContext.ref.constructCDOMObject( + Ability.class, "Abil1"); + primaryContext.ref.reassociateCategory(AbilityCategory.FEAT, ab); + ab = secondaryContext.ref.constructCDOMObject(Ability.class, + "Abil1"); + secondaryContext.ref.reassociateCategory(AbilityCategory.FEAT, ab); + runRoundRobin("Feat|NORMAL|Abil1", "Feat|VIRTUAL|Abil1"); + } + + @Test + public void testRoundRobinDupeOnePrereq() throws PersistenceLayerException + { + Ability ab = primaryContext.ref.constructCDOMObject( + Ability.class, "Abil1"); + primaryContext.ref.reassociateCategory(AbilityCategory.FEAT, ab); + ab = secondaryContext.ref.constructCDOMObject(Ability.class, + "Abil1"); + secondaryContext.ref.reassociateCategory(AbilityCategory.FEAT, ab); + runRoundRobin("Feat|VIRTUAL|Abil1|Abil1|PRERACE:1,Human"); + assertTrue(primaryContext.ref.validate()); + assertTrue(secondaryContext.ref.validate()); + } + + @Test + public void testRoundRobinDupeDiffPrereqs() + throws PersistenceLayerException + { + Ability ab = primaryContext.ref.constructCDOMObject( + Ability.class, "Abil1"); + primaryContext.ref.reassociateCategory(AbilityCategory.FEAT, ab); + ab = secondaryContext.ref.constructCDOMObject(Ability.class, + "Abil1"); + secondaryContext.ref.reassociateCategory(AbilityCategory.FEAT, ab); + runRoundRobin("Feat|VIRTUAL|Abil1", + "Feat|VIRTUAL|Abil1|PRERACE:1,Human"); + assertTrue(primaryContext.ref.validate()); + assertTrue(secondaryContext.ref.validate()); + } + + @Test + public void testRoundRobinDupeTwoDiffPrereqs() + throws PersistenceLayerException + { + Ability ab = primaryContext.ref.constructCDOMObject( + Ability.class, "Abil1"); + primaryContext.ref.reassociateCategory(AbilityCategory.FEAT, ab); + ab = secondaryContext.ref.constructCDOMObject(Ability.class, + "Abil1"); + secondaryContext.ref.reassociateCategory(AbilityCategory.FEAT, ab); + runRoundRobin("Feat|VIRTUAL|Abil1|Abil1|PRERACE:1,Elf", + "Feat|VIRTUAL|Abil1|PRERACE:1,Human"); + assertTrue(primaryContext.ref.validate()); + assertTrue(secondaryContext.ref.validate()); + } +} \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-08-06 22:47:58
|
Revision: 7416 http://pcgen.svn.sourceforge.net/pcgen/?rev=7416&view=rev Author: thpr Date: 2008-08-06 22:48:06 +0000 (Wed, 06 Aug 2008) Log Message: ----------- tests Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/Description.java Trunk/pcgen/code/src/java/plugin/lsttokens/ability/BenefitToken.java Added Paths: ----------- Trunk/pcgen/code/src/utest/plugin/lsttokens/ability/BenefitTokenTest.java Trunk/pcgen/code/src/utest/plugin/lsttokens/equipment/SPropTokenTest.java Modified: Trunk/pcgen/code/src/java/pcgen/core/Description.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Description.java 2008-08-06 22:37:08 UTC (rev 7415) +++ Trunk/pcgen/code/src/java/pcgen/core/Description.java 2008-08-06 22:48:06 UTC (rev 7416) @@ -315,4 +315,37 @@ { return getPCCText(); } + + + @Override + public int hashCode() + { + return theComponents.size() + 7 * getPrerequisiteCount() + 31 + * (theVariables == null ? 0 : theVariables.size()); + } + + @Override + public boolean equals(Object o) + { + if (o == this) + { + return true; + } + if (!(o instanceof Description)) + { + return false; + } + Description other = (Description) o; + if (theVariables == null) + { + if (other.theVariables != null) + { + return false; + } + } + return theComponents.equals(other.theComponents) + && (theVariables == null || theVariables.equals(other.theVariables)) + && equalsPrereqObject(other); + } + } Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/ability/BenefitToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/ability/BenefitToken.java 2008-08-06 22:37:08 UTC (rev 7415) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/ability/BenefitToken.java 2008-08-06 22:48:06 UTC (rev 7416) @@ -49,8 +49,12 @@ return true; } - context.getObjectContext().addToList(ability, ListKey.BENEFIT, - parseBenefit(value)); + Description ben = parseBenefit(value); + if (ben == null) + { + return false; + } + context.getObjectContext().addToList(ability, ListKey.BENEFIT, ben); return true; } @@ -90,7 +94,7 @@ { for (Description d : added) { - list.add(EntityEncoder.encode(d.getPCCText())); + list.add(d.getPCCText()); } } if (list.isEmpty()) @@ -109,10 +113,21 @@ */ public Description parseBenefit(final String aDesc) { + if (isEmpty(aDesc) || hasIllegalSeparator('|', aDesc)) + { + return null; + } final StringTokenizer tok = new StringTokenizer(aDesc, Constants.PIPE); - final Description desc = new Description(EntityEncoder.decode(tok - .nextToken())); + String firstToken = tok.nextToken(); + if (PreParserFactory.isPreReqString(firstToken)) + { + Logging.errorPrint("Invalid " + getTokenName() + ": " + aDesc); + Logging.errorPrint(" PRExxx can not be only value"); + return null; + } + final Description desc = new Description(EntityEncoder + .decode(firstToken)); boolean isPre = false; while (tok.hasMoreTokens()) @@ -131,7 +146,7 @@ + aDesc); Logging .errorPrint(" PRExxx must be at the END of the Token"); - isPre = false; + return null; } desc.addVariable(token); } Added: Trunk/pcgen/code/src/utest/plugin/lsttokens/ability/BenefitTokenTest.java =================================================================== --- Trunk/pcgen/code/src/utest/plugin/lsttokens/ability/BenefitTokenTest.java (rev 0) +++ Trunk/pcgen/code/src/utest/plugin/lsttokens/ability/BenefitTokenTest.java 2008-08-06 22:48:06 UTC (rev 7416) @@ -0,0 +1,151 @@ +/* + * Copyright (c) 2007 Tom Parker <th...@us...> + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation; either version 2.1 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + * details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ +package plugin.lsttokens.ability; + +import java.net.URISyntaxException; + +import org.junit.Before; +import org.junit.Test; + +import pcgen.core.Ability; +import pcgen.persistence.PersistenceLayerException; +import pcgen.rules.persistence.CDOMLoader; +import pcgen.rules.persistence.token.CDOMPrimaryToken; +import plugin.lsttokens.testsupport.AbstractTokenTestCase; +import plugin.lsttokens.testsupport.CDOMTokenLoader; +import plugin.lsttokens.testsupport.TokenRegistration; +import plugin.pretokens.parser.PreClassParser; +import plugin.pretokens.parser.PreRaceParser; +import plugin.pretokens.writer.PreClassWriter; +import plugin.pretokens.writer.PreRaceWriter; + +public class BenefitTokenTest extends AbstractTokenTestCase<Ability> +{ + + static BenefitToken token = new BenefitToken(); + static CDOMTokenLoader<Ability> loader = new CDOMTokenLoader<Ability>( + Ability.class); + + @Override + public Class<Ability> getCDOMClass() + { + return Ability.class; + } + + @Override + public CDOMLoader<Ability> getLoader() + { + return loader; + } + + @Override + public CDOMPrimaryToken<Ability> getToken() + { + return token; + } + + PreClassParser preclass = new PreClassParser(); + PreClassWriter preclasswriter = new PreClassWriter(); + PreRaceParser prerace = new PreRaceParser(); + PreRaceWriter preracewriter = new PreRaceWriter(); + + @Override + @Before + public void setUp() throws PersistenceLayerException, URISyntaxException + { + super.setUp(); + TokenRegistration.register(preclass); + TokenRegistration.register(prerace); + TokenRegistration.register(preclasswriter); + TokenRegistration.register(preracewriter); + } + + @Test + public void testInvalidDoublePipe() throws PersistenceLayerException + { + assertFalse(parse("SA Number %||VarF")); + assertNoSideEffects(); + } + + @Test + public void testInvalidEndingPipe() throws PersistenceLayerException + { + assertFalse(parse("SA Number|")); + assertNoSideEffects(); + } + + @Test + public void testInvalidStartingPipe() throws PersistenceLayerException + { + assertFalse(parse("|Var")); + assertNoSideEffects(); + } + + @Test + public void testInvalidVarAfterPre() throws PersistenceLayerException + { + assertFalse(parse("SA % plus %|Var|PRECLASS:1,Fighter|Var2")); + assertNoSideEffects(); + } + + @Test + public void testInvalidOnlyPre() throws PersistenceLayerException + { + assertFalse(parse("PRECLASS:1,Fighter")); + assertNoSideEffects(); + } + + @Test + public void testRoundRobinBase() throws PersistenceLayerException + { + runRoundRobin("SA Number One"); + } + + @Test + public void testRoundRobinVariable() throws PersistenceLayerException + { + runRoundRobin("SA Number %|Variab"); + } + + @Test + public void testRoundRobinPre() throws PersistenceLayerException + { + runRoundRobin("SA Number One|PRECLASS:1,Fighter=1"); + } + + @Test + public void testRoundRobinDoublePre() throws PersistenceLayerException + { + runRoundRobin("SA Number One|PRECLASS:1,Fighter=1|PRERACE:1,Human"); + } + + @Test + public void testRoundRobinVarDoublePre() throws PersistenceLayerException + { + runRoundRobin("SA Number % before %|Var|TwoVar|PRECLASS:1,Fighter=1|PRERACE:1,Human"); + } + + @Test + public void testRoundRobinCompound() throws PersistenceLayerException + { + runRoundRobin( + "SA Number % before %|Var|TwoVar|PRECLASS:1,Fighter=1|PRERACE:1,Human", + "SA Number One|PRECLASS:1,Fighter=1"); + } + +} Added: Trunk/pcgen/code/src/utest/plugin/lsttokens/equipment/SPropTokenTest.java =================================================================== --- Trunk/pcgen/code/src/utest/plugin/lsttokens/equipment/SPropTokenTest.java (rev 0) +++ Trunk/pcgen/code/src/utest/plugin/lsttokens/equipment/SPropTokenTest.java 2008-08-06 22:48:06 UTC (rev 7416) @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2007 Tom Parker <th...@us...> + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation; either version 2.1 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + * details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ +package plugin.lsttokens.equipment; + +import org.junit.Test; + +import pcgen.core.Equipment; +import pcgen.persistence.PersistenceLayerException; +import pcgen.rules.persistence.CDOMLoader; +import pcgen.rules.persistence.token.CDOMPrimaryToken; +import plugin.lsttokens.testsupport.AbstractTextPropertyTokenTestCase; +import plugin.lsttokens.testsupport.CDOMTokenLoader; + +public class SPropTokenTest extends + AbstractTextPropertyTokenTestCase<Equipment> +{ + static SpropToken token = new SpropToken(); + static CDOMTokenLoader<Equipment> loader = new CDOMTokenLoader<Equipment>( + Equipment.class); + + @Override + public Class<Equipment> getCDOMClass() + { + return Equipment.class; + } + + @Override + public CDOMLoader<Equipment> getLoader() + { + return loader; + } + + @Override + public CDOMPrimaryToken<Equipment> getToken() + { + return token; + } + + @Test + public void testInvalidDoubleClear() throws PersistenceLayerException + { + assertFalse(parse(".CLEAR|.CLEAR|Second")); + assertNoSideEffects(); + } + + @Test + public void testInvalidClearAsVariable() throws PersistenceLayerException + { + assertFalse(parse("Second|.CLEAR")); + assertNoSideEffects(); + } +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jde...@us...> - 2008-08-30 02:13:45
|
Revision: 7619 http://pcgen.svn.sourceforge.net/pcgen/?rev=7619&view=rev Author: jdempsey Date: 2008-08-30 02:13:54 +0000 (Sat, 30 Aug 2008) Log Message: ----------- Fix bug: [5.15.0] BASE_ITEM not being set in equipment customizer Issue#: 2058606 Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/Equipment.java Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Parser.java Trunk/pcgen/code/src/test/pcgen/core/EquipmentTest.java Trunk/pcgen/code/src/test/pcgen/util/TestHelper.java Modified: Trunk/pcgen/code/src/java/pcgen/core/Equipment.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Equipment.java 2008-08-29 16:54:15 UTC (rev 7618) +++ Trunk/pcgen/code/src/java/pcgen/core/Equipment.java 2008-08-30 02:13:54 UTC (rev 7619) @@ -3676,7 +3676,7 @@ * * @param aPC */ - private void setBase(final PlayerCharacter aPC) { + public void setBase(final PlayerCharacter aPC) { if (get(ObjectKey.BASE_ITEM) == null) { Modified: Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Parser.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Parser.java 2008-08-29 16:54:15 UTC (rev 7618) +++ Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Parser.java 2008-08-30 02:13:54 UTC (rev 7619) @@ -4664,6 +4664,7 @@ { // standard item aEquip = aEquip2.clone(); + aEquip.setBase(thePC); aEquip.load(customProperties, "$", "=", thePC); //$NON-NLS-1$//$NON-NLS-2$ aEquip.remove(StringKey.OUTPUT_NAME); if (!aEquip.isType(Constants.s_CUSTOM)) Modified: Trunk/pcgen/code/src/test/pcgen/core/EquipmentTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/EquipmentTest.java 2008-08-29 16:54:15 UTC (rev 7618) +++ Trunk/pcgen/code/src/test/pcgen/core/EquipmentTest.java 2008-08-30 02:13:54 UTC (rev 7619) @@ -26,15 +26,22 @@ */ package pcgen.core; +import java.net.URI; +import java.net.URISyntaxException; + import junit.framework.Test; import junit.framework.TestSuite; import junit.textui.TestRunner; import pcgen.AbstractCharacterTestCase; import pcgen.PCGenTestCase; +import pcgen.base.lang.UnreachableError; import pcgen.cdom.base.Constants; import pcgen.cdom.enumeration.ObjectKey; import pcgen.cdom.enumeration.StringKey; import pcgen.cdom.reference.CDOMDirectSingleRef; +import pcgen.persistence.lst.CampaignSourceEntry; +import pcgen.persistence.lst.GenericLoader; +import pcgen.rules.context.LoadContext; /** * Equipment Test @@ -94,13 +101,34 @@ { super.setUp(); - this.eq = new Equipment(); - this.eq.setName("Dummy"); - SizeAdjustment sa = SettingsHandler.getGame().getSizeAdjustmentNamed("M"); - eq.put(ObjectKey.SIZE, sa); - eq.put(ObjectKey.BASESIZE, sa); + CampaignSourceEntry source; + try + { + source = new CampaignSourceEntry(new Campaign(), + new URI("file:/" + getClass().getName() + ".java")); + } + catch (URISyntaxException e) + { + throw new UnreachableError(e); + } - this.eq.setKeyName(this.OriginalKey); + GenericLoader<Equipment> eqLoader = + new GenericLoader<Equipment>(Equipment.class); + eq = eqLoader.parseLine(Globals.getContext(), null, + "Dummy SIZE:M KEY:OrigKey", source); + eq = Globals.getContext().ref.silentlyGetConstructedCDOMObject( + Equipment.class, OriginalKey); + + GenericLoader<EquipmentModifier> loader = + new GenericLoader<EquipmentModifier>(EquipmentModifier.class); + loader + .parseLine( + Globals.getContext(), + null, + "+1 (Enhancement to Weapon or Ammunition) KEY:PLUS1W FORMATCAT:MIDDLE NAMEOPT:TEXT=+1 TYPE:Ammunition.Weapon PLUS:1 VISIBLE:QUALIFY ITYPE:Masterwork.Enhancement.Magic.Plus1 SOURCEPAGE:RSRD SpecialMaterials.rtf BONUS:WEAPON|DAMAGE,TOHIT|1|TYPE=Enhancement ASSIGNTOALL:NO", + source); + EquipmentModifier eqMod = Globals.getContext().ref.silentlyGetConstructedCDOMObject( + EquipmentModifier.class, "PLUS1W"); } /***************************************************************************** @@ -325,4 +353,45 @@ is(custEq.getSize(), eq("L"), "reduce size size"); is(custEq.getDamage(getCharacter()), eq("1d8"), "reduce size damage"); } + + /** + * Test the loading a output of customised equipment. This time without a set of the base + * item included, so a limited representation of the object is expected to be output. + */ + public void testCustomEquipRoundRobin() + { + EquipmentModifier eqMod = Globals.getContext().ref.silentlyGetConstructedCDOMObject( + EquipmentModifier.class, "PLUS1W"); + assertNotNull("Eqmod should be present", eqMod); + + Equipment aEquip = eq.clone(); + String customProperties = "NAME=Falchion +1 (Small)$SIZE=S$EQMOD=PLUS1W"; + PlayerCharacter thePC = getCharacter(); + aEquip.load(customProperties, "$", "=", thePC); //$NON-NLS-1$//$NON-NLS-2$ + assertEquals("Equip name", "Falchion +1 (Small)", aEquip.getDisplayName()); + assertEquals("Equip size", "S", aEquip.getSize()); + assertEquals("Equip eqmod", "PLUS1W", aEquip.getEqModifierList(true).get(0).getKeyName()); + assertEquals("Output", "Falchion +1 (Small)$EQMOD=PLUS1W", aEquip.formatSaveLine('$', '=').trim()); + } + + /** + * Test the loading a output of customised equipment. This time with a set of the base + * item included, so an exact replica of the object is expected to be output. + */ + public void testCustomEquipRoundRobinWithBase() + { + EquipmentModifier eqMod = Globals.getContext().ref.silentlyGetConstructedCDOMObject( + EquipmentModifier.class, "PLUS1W"); + assertNotNull("Eqmod should be present", eqMod); + + Equipment aEquip = eq.clone(); + aEquip.setBase(getCharacter()); + String customProperties = "NAME=Falchion +1 (Small)$SIZE=S$EQMOD=PLUS1W"; + PlayerCharacter thePC = getCharacter(); + aEquip.load(customProperties, "$", "=", thePC); //$NON-NLS-1$//$NON-NLS-2$ + assertEquals("Equip name", "Falchion +1 (Small)", aEquip.getDisplayName()); + assertEquals("Equip size", "S", aEquip.getSize()); + assertEquals("Equip eqmod", "PLUS1W", aEquip.getEqModifierList(true).get(0).getKeyName()); + assertEquals("Output", "Dummy$"+customProperties, aEquip.formatSaveLine('$', '=').trim()); + } } Modified: Trunk/pcgen/code/src/test/pcgen/util/TestHelper.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/util/TestHelper.java 2008-08-29 16:54:15 UTC (rev 7618) +++ Trunk/pcgen/code/src/test/pcgen/util/TestHelper.java 2008-08-30 02:13:54 UTC (rev 7619) @@ -98,6 +98,8 @@ sa.setAbbreviation(abb); gamemode.addToSizeAdjustmentList(sa); + Globals.getContext().ref.importObject(sa); + Globals.getContext().ref.registerAbbreviation(sa, sa.getAbbreviation()); } gamemode.getSizeAdjustmentNamed("Medium").setIsDefaultSize(true); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jde...@us...> - 2008-09-01 12:02:52
|
Revision: 7638 http://pcgen.svn.sourceforge.net/pcgen/?rev=7638&view=rev Author: jdempsey Date: 2008-09-01 12:02:57 +0000 (Mon, 01 Sep 2008) Log Message: ----------- Fix bug: ABILITY lost capability to use SUBSET Ability Categories Issue#: 2059135 Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/AbilityUtilities.java Trunk/pcgen/code/src/test/pcgen/core/AbilityUtilitiesTest.java Modified: Trunk/pcgen/code/src/java/pcgen/core/AbilityUtilities.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/AbilityUtilities.java 2008-09-01 02:35:24 UTC (rev 7637) +++ Trunk/pcgen/code/src/java/pcgen/core/AbilityUtilities.java 2008-09-01 12:02:57 UTC (rev 7638) @@ -124,11 +124,13 @@ final Collection<String> choices = new ArrayList<String>(); getUndecoratedName(abilityName, choices); - Ability anAbility = getAbilityFromList(theAbilityList, "FEAT", abilityName, Ability.Nature.ANY); + AbilityCategory cat = SettingsHandler.getGame().getAbilityCategory(category); + Ability anAbility = getAbilityFromList(theAbilityList, cat.getAbilityCategory(), abilityName, Ability.Nature.ANY); + if (anAbility == null) { - anAbility = cloneGlobalAbility(category, abilityName); + anAbility = cloneGlobalAbility(cat.getAbilityCategory(), abilityName); if (anAbility != null) { Modified: Trunk/pcgen/code/src/test/pcgen/core/AbilityUtilitiesTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/AbilityUtilitiesTest.java 2008-09-01 02:35:24 UTC (rev 7637) +++ Trunk/pcgen/code/src/test/pcgen/core/AbilityUtilitiesTest.java 2008-09-01 12:02:57 UTC (rev 7638) @@ -25,6 +25,7 @@ package pcgen.core; import pcgen.PCGenTestCase; +import pcgen.util.TestHelper; import java.util.ArrayList; import java.util.List; @@ -72,4 +73,38 @@ "Second extracted decoration is correct"); } + /** + * Verify adding abilities both from a parent and a child category. + */ + public void testAddCloneOfGlobalAbilityToListWithChoicesNonFeatChild() + { + // Create non feat parent cat + AbilityCategory parent = new AbilityCategory("TestParent"); + SettingsHandler.getGame().addLstAbilityCategory(parent); + + // Create child cat + AbilityCategory child = new AbilityCategory("TestChild"); + child.setAbilityCategory("TestParent"); + List<String> typeList = new ArrayList<String>(); + typeList.add("Australian"); + child.setAbilityTypes(typeList); + SettingsHandler.getGame().addLstAbilityCategory(child); + + // Create ability in parent with child's type + Ability ability = TestHelper.makeAbility("TestAbility", "TestParent", "Australian"); + + // Call addCloneOfGlobalAbilityToListWithChoices with parent and expect to see it in list + List<Ability> testList = new ArrayList<Ability>(); + assertNotNull("Add in parent cat should return ability", AbilityUtilities.addCloneOfGlobalAbilityToListWithChoices(testList, "TestParent", "KEY_TestAbility")); + assertEquals("Ability list size after adding 1 ability", 1, testList.size()); + assertEquals("Key of added ability", "KEY_TestAbility", testList.get(0).keyName); + assertNotSame("Should be a clone, not the same object", ability, testList.get(0)); + + // Call addCloneOfGlobalAbilityToListWithChoices with child and expect to see it in list + testList.clear(); + assertNotNull("Add in child cat should return ability", AbilityUtilities.addCloneOfGlobalAbilityToListWithChoices(testList, "TestChild", "KEY_TestAbility")); + assertEquals("Ability list size after adding 1 ability", 1, testList.size()); + assertEquals("Key of added ability", "KEY_TestAbility", testList.get(0).keyName); + assertNotSame("Should be a clone, not the same object", ability, testList.get(0)); + } } \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jde...@us...> - 2008-09-14 04:11:03
|
Revision: 7720 http://pcgen.svn.sourceforge.net/pcgen/?rev=7720&view=rev Author: jdempsey Date: 2008-09-14 04:11:12 +0000 (Sun, 14 Sep 2008) Log Message: ----------- FReq: [4E] Allow .MOD of ASPECT tag for Abilities and Feats - Add MapKeyMap to support maps of values - Begin conversion of Aspect to be use aspect name as a key in a map Issue#: 2099750 Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/cdom/helper/Aspect.java Added Paths: ----------- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/AspectName.java Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/MapKey.java Trunk/pcgen/code/src/java/pcgen/cdom/util/MapKeyMap.java Trunk/pcgen/code/src/utest/pcgen/cdom/ Trunk/pcgen/code/src/utest/pcgen/cdom/util/ Trunk/pcgen/code/src/utest/pcgen/cdom/util/MapKeyMapTest.java Added: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/AspectName.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/AspectName.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/AspectName.java 2008-09-14 04:11:12 UTC (rev 7720) @@ -0,0 +1,186 @@ +/* + * AspectName.java + * Copyright 2008 (C) James Dempsey + * + * 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 20/08/2008 20:04:21 + * + * $Id: $ + */ + +package pcgen.cdom.enumeration; + +import java.util.Collection; +import java.util.Collections; + +import pcgen.base.enumeration.TypeSafeConstant; +import pcgen.base.util.CaseInsensitiveMap; + +/** + * This Class is a Type Safe Constant. It is designed to allow Ability Aspect + * names in a type-safe fashion, so that they can be quickly compared and use + * less memory when identical Aspect names exist in two CDOMObjects. + * + * Last Editor: $Author: $ + * Last Edited: $Date: $ + * + * @author James Dempsey <jde...@us...> + * @version $Revision: $ + */ +public final class AspectName implements TypeSafeConstant +{ + + /** This Map contains the mappings from Strings to the Type Safe Constant. */ + private static CaseInsensitiveMap<AspectName> nameMap; + + /** This is used to provide a unique ordinal to each constant in this class. */ + private static int ordinalCount = 0; + + /** The name of this Constant. */ + private final String fieldName; + + /** The ordinal of this Constant. */ + private final transient int ordinal; + + /** + * Instantiates a new ability aspect. + * + * @param name the name + */ + private AspectName(String name) + { + if (name == null) + { + throw new IllegalArgumentException( + "Name for AspectName cannot be null"); + } + ordinal = ordinalCount++; + fieldName = name; + } + + /** + * Converts this Constant to a String (returns the name of this Constant). + * + * @return The string representation (name) of this Constant + */ + @Override + public String toString() + { + return fieldName; + } + + /** + * Gets the ordinal of this Constant. + * + * @return the ordinal + */ + public int getOrdinal() + { + return ordinal; + } + + /** + * Returns the constant for the given String (the search for the constant is + * case insensitive). If the constant does not already exist, a new Constant + * is created with the given String as the name of the Constant. + * + * @param s The name of the constant to be returned + * + * @return The Constant for the given name + */ + public static AspectName getConstant(String s) + { + initializeNameMap(); + AspectName o = nameMap.get(s); + if (o == null) + { + o = new AspectName(s); + nameMap.put(s, o); + } + return o; + } + + /** + * Thread safe construction of typeMap. + */ + private static synchronized void initializeNameMap() + { + if (nameMap == null) + { + nameMap = new CaseInsensitiveMap<AspectName>(); + } + } + + /** + * Returns the constant for the given String (the search for the constant is + * case insensitive). If the constant does not already exist, an + * IllegalArgumentException is thrown. + * + * @param s The name of the constant to be returned + * + * @return The Constant for the given name + * + * @throws IllegalArgumentException if the given String is not a previously defined RaceSubType + */ + public static AspectName valueOf(String s) + { + initializeNameMap(); + AspectName o = nameMap.get(s); + if (o == null) + { + throw new IllegalArgumentException(s + + " is not a previously defined AspectName"); + } + return o; + } + + /** + * Returns a Collection of all of the Constants in this Class. + * + * This collection maintains a reference to the Constants in this Class, so + * if a new Constant is created, the Collection returned by this method will + * be modified. (Beware of ConcurrentModificationExceptions) + * + * @return a Collection of all of the Constants in this Class. + */ + public static Collection<AspectName> getAllConstants() + { + if (nameMap == null) + { + return Collections.emptyList(); + } + return Collections.unmodifiableCollection(nameMap.values()); + } + + /** + * Clears all of the Constants in this Class (forgetting the mapping from + * the String to the Constant). + */ + /* + * CONSIDER Need to consider the ramifications of this on TypeSafeMap, since + * this does not (and really cannot) reset the ordinal count... Does this + * method need to be renamed, such that it is clearConstantMap? - Tom + * Parker, Feb 28, 2007 + */ + public static void clearConstants() + { + if (nameMap != null) + { + nameMap.clear(); + } + } + +} Added: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/MapKey.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/MapKey.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/MapKey.java 2008-09-14 04:11:12 UTC (rev 7720) @@ -0,0 +1,72 @@ +/* + * MapKey.java + * Copyright 2008 (C) James Dempsey + * + * 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 11/09/2008 19:28:45 + * + * $Id: $ + */ +package pcgen.cdom.enumeration; + +import pcgen.cdom.helper.Aspect; + +/** + * This is a Typesafe enumeration of legal Map Characteristics of an object. It + * is designed to act as an index to a specific Object items within a + * CDOMObject. + * + * ListKeys are designed to store items in a CDOMObject in a type-safe + * fashion. Note that it is possible to use the MapKey to cast the object to + * the type of object stored by the ListKey. (This assists with Generics) + * + * @param <T> + * The class of object stored by this MapKey. + * + * Last Editor: $Author: $ + * Last Edited: $Date: $ + * + * @author James Dempsey <jde...@us...> + * @version $Revision: $ + */ +public final class MapKey<K, V> +{ + + /** ASPECT - a map key. */ + public static final MapKey<AspectName, Aspect> ASPECT = new MapKey<AspectName, Aspect>(); + /** TEST - a test map key. May be deleted and its usage replaced when a second Map Key is created. */ + public static final MapKey<String, String> TEST = new MapKey<String, String>(); + + /** + * Private constructor to prevent instantiation of this class. + */ + private MapKey() + { + //Only allow instantation here + } + + /** + * Cast an object into the MapKey's value type + * + * @param o the object to cast + * + * @return the object as the MapKey's value type + */ + public V cast(Object o) + { + return (V) o; + } +} Modified: Trunk/pcgen/code/src/java/pcgen/cdom/helper/Aspect.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/helper/Aspect.java 2008-09-14 03:34:44 UTC (rev 7719) +++ Trunk/pcgen/code/src/java/pcgen/cdom/helper/Aspect.java 2008-09-14 04:11:12 UTC (rev 7720) @@ -26,6 +26,7 @@ import java.util.List; import pcgen.cdom.base.Constants; +import pcgen.cdom.enumeration.AspectName; import pcgen.core.Ability; import pcgen.core.AbilityCategory; import pcgen.core.PlayerCharacter; @@ -56,7 +57,7 @@ /** * The name of the name stored in this Aspect. */ - private final String name; + private final AspectName key; private List<String> theComponents = new ArrayList<String>(); private List<String> theVariables = null; @@ -86,8 +87,44 @@ throw new IllegalArgumentException( "Value for Aspect cannot be null"); } - this.name = name; + this.key = AspectName.getConstant(name); + parseAspectString(aString); + } + + /** + * Instantiates a new aspect. + * + * @param name the name of the aspect + * @param aString the aspect string + */ + public Aspect(final AspectName key, final String aString ) + { + if (key == null) + { + throw new IllegalArgumentException( + "Key for Aspect cannot be null"); + } + if (aString == null) + { + throw new IllegalArgumentException( + "Value for Aspect cannot be null"); + } + this.key = key; + + parseAspectString(aString); + } + + /** + * Parse an aspect definition string and populate the Aspect with + * the contents. This drives the processing to split the description + * from the parameters and to identify the references to the + * parameters. + * + * @param aString The aspect definition string. + */ + private void parseAspectString(final String aString) + { int currentInd = 0; int percentInd = -1; while ( (percentInd = aString.indexOf('%', currentInd)) != -1 ) @@ -180,7 +217,7 @@ */ public String getName() { - return name; + return key.toString(); } /** Added: Trunk/pcgen/code/src/java/pcgen/cdom/util/MapKeyMap.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/util/MapKeyMap.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/cdom/util/MapKeyMap.java 2008-09-14 04:11:12 UTC (rev 7720) @@ -0,0 +1,232 @@ +/* + * MapKeyMap.java + * Copyright 2008 (C) James Dempsey + * + * 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 11/09/2008 23:20:54 + * + * $Id: $ + */ +package pcgen.cdom.util; + +import java.util.Map; +import java.util.Set; + +import pcgen.base.util.DoubleKeyMap; +import pcgen.cdom.enumeration.MapKey; + +/** + * This encapsulates a DoubleKeyMap in a typesafe and value-semantic way. + * + * Specifically, when Generics are properly used by a class using a + * MapKeyMap, this class ensures that any MapKey will only return a Map + * of the same Generic type as the MapKey. Note this relationship is only + * enforced with Generics, and could be violated if Generics are not properly + * used. + * + * This Class also is reference-semantic with respect to the Maps. + * In other words, the modification of any Collection returned by a + * MapKeyMap will not impact the internal contents of the + * MapKeyMap. Also, any Collection used as a parameter to a method is not + * stored directly, the Collection can be modified after the method has returned + * without impacting the internal contents of the MapKeyMap. + * + * **NOTE** This class is NOT thread safe. + * + * Last Editor: $Author: $ + * Last Edited: $Date: $ + * + * @author James Dempsey <jde...@us...> + * @version $Revision: $ + */ +public class MapKeyMap +{ + + /* + * Much as for ListKeyMapToList.map this must remain generic. See Tom's + * comment in that class for the full explanation. + */ + /** The internal storage of this MapKeyMap. */ + private final DoubleKeyMap map = new DoubleKeyMap(); + + /** + * Creates a new (empty) MapKeyMap. + */ + public MapKeyMap() + { + // Do Nothing + } + + /** + * Copies the key/value combinations from the given MapKeyMap into this + * MapKeyMap. If this MapKeyMap already contained a mapping for the + * any of the key combinations in the given MapKeyMap, the previous value + * is overwritten. + * + * @param mkm The MapKeyMap for which the key/value combinations should + * be placed into this MapKeyMap + * + * @throws NullPointerException if the given MapKeyMap is null + */ + public final void putAll(MapKeyMap mkm) + { + map.putAll(mkm.map); + } + + /** + * Adds the given value to the List for the given ListKey. The null value + * cannot be used as a key in a MapKeyMap. This method will + * automatically initialize the map for the given primary key if there is not + * already a Map for that primary key. + * + * This method is reference-semantic and this MapKeyMap will maintain + * a strong reference to both the key object and the value object given as + * arguments to this method. + * + * @param key1 + * The MapKey indicating which Map the given object should be + * added to. + * @param value + * The value to be added to the List for the given key. + */ + public <K, V> void addToMapFor(MapKey<K, V> key1, K key2, V value) + { + map.put(key1, key2, value); + } + + /** + * Returns true if this MapKeyMap contains a Map for the given + * MapKey. This method returns false if the given key is not in this + * MapKeyMap. + * + * This method is value-semantic in that no changes are made to the object + * passed into the method. + * + * @param key + * The MapKey being tested. + * @return true if this MapKeyMap contains a Map for the given key; + * false otherwise. + */ + public boolean containsMapFor(MapKey<?, ?> key) + { + return map.containsKey(key); + } + + /** + * Returns a copy of the List contained in this MapKeyMap for the + * given ListKey. This method returns null if the given key is not in this + * MapKeyMap. + * + * This method is value-semantic in that no changes are made to the object + * passed into the method and ownership of the returned List is transferred + * to the class calling this method. + * + * @param key + * The ListKey for which a copy of the list should be returned. + * @return a copy of the List contained in this MapKeyMap for the + * given key; null if the given key is not a key in this + * MapKeyMap. + */ + public <K, V> V get(MapKey<K, V> key1, K key2) + { + return (V) map.get(key1, key2); + } + + /** + * Removes the given value from the list for the given ListKey. Returns true + * if the value was successfully removed from the list for the given + * ListKey. Returns false if there is not a list for the given ListKey or if + * the list for the given ListKey did not contain the given value object. + * + * @param key + * The ListKey indicating which List the given object should be + * removed from + * @param value + * The value to be removed from the List for the given key + * @return true if the value was successfully removed from the list for the + * given key; false otherwise + */ + public <K, V> boolean removeFromListFor(MapKey<K, V> key1, K key2) + { + return map.remove(key1, key2) != null; + } + + /** + * Removes the List for the given ListKey. Note there is no requirement that + * the list for the given key be empty before this method is called. + * + * Ownership of the returned Map is transferred to the object calling this + * method. + * + * @return The Map which this MapKeyMap previous mapped the given + * key + */ + public <K, V> Map<K, V> removeMapFor(MapKey<K, V> key) + { + return map.removeAll(key); + } + + /** + * Returns a Set indicating the Keys of this MapKeyMap. Ownership of + * the Set is transferred to the calling Object, no association is kept + * between the Set and this MapKeyMap. (Thus, removal of a key from + * the returned Set will not remove that key from this MapKeyMap) + * + * NOTE: This method returns all of the keys this MapKeyMap contains. + * It DOES NOT determine whether the Lists defined for the keys are empty. + * Therefore, it is possible that this MapKeyMap contains one or more + * keys, and all of the lists associated with those keys are empty, yet this + * method will return a non-zero length Set. + * + * @return a Set containing the keys in this MapKeyMap + */ + public Set<MapKey<?, ?>> getKeySet() + { + return map.getKeySet(); + } + + /** + * Returns the consistent-with-equals hashCode for this MapKeyMap. + * + * @return the int + * + * @see java.lang.Object#hashCode() + */ + @Override + public int hashCode() + { + return map.hashCode(); + } + + /** + * Returns true if this MapKeyMap is equal to the given Object. + * + * Note that equality as defined by this method is both a class of + * MapKeyMap and equality of contents of the MapKeyMap. + * + * @param o the o + * + * @return true, if equals + * + * @see java.lang.Object#equals() + */ + @Override + public boolean equals(Object o) + { + return o instanceof MapKeyMap + && map.equals(((MapKeyMap) o).map); + } +} Added: Trunk/pcgen/code/src/utest/pcgen/cdom/util/MapKeyMapTest.java =================================================================== --- Trunk/pcgen/code/src/utest/pcgen/cdom/util/MapKeyMapTest.java (rev 0) +++ Trunk/pcgen/code/src/utest/pcgen/cdom/util/MapKeyMapTest.java 2008-09-14 04:11:12 UTC (rev 7720) @@ -0,0 +1,219 @@ +/* + * MapKeyMapTest.java + * Copyright 2008 (C) James Dempsey + * + * 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 14/09/2008 09:53:37 + * + * $Id: $ + */ +package pcgen.cdom.util; + +import java.util.Map; +import java.util.Set; + +import junit.framework.TestCase; + +import org.junit.Test; + +import pcgen.cdom.enumeration.AspectName; +import pcgen.cdom.enumeration.MapKey; +import pcgen.cdom.helper.Aspect; + +/** + * The Class <code>MapKeyMapTest</code> test that the MapKeyMap + * class is functioning correctly. + * + * Last Editor: $Author: $ + * Last Edited: $Date: $ + * + * @author James Dempsey <jde...@us...> + * @version $Revision: $ + */ +public class MapKeyMapTest extends TestCase +{ + + private static final String BREED = "shetland sheepdog"; + private static final String AGE = "1"; + private static final String NAME = "Mistletoe"; + + /** The map key map. */ + private MapKeyMap mapKeyMap; + + private AspectName ageKey; + private AspectName nameKey; + private AspectName breedKey; + + private Aspect ageAspect; + private Aspect nameAspect; + private Aspect breedAspect; + + /* (non-Javadoc) + * @see pcgen.PCGenTestCase#setUp() + */ + @Override + protected void setUp() throws Exception + { + mapKeyMap = new MapKeyMap(); + ageKey = AspectName.getConstant("agE"); + nameKey = AspectName.getConstant("Name"); + breedKey = AspectName.getConstant("breed"); + + ageAspect = new Aspect("age", AGE); + mapKeyMap.addToMapFor(MapKey.ASPECT, ageKey, ageAspect); + nameAspect = new Aspect("name", NAME); + mapKeyMap.addToMapFor(MapKey.ASPECT, nameKey, nameAspect); + breedAspect = new Aspect("breed", BREED); + mapKeyMap.addToMapFor(MapKey.ASPECT, breedKey, breedAspect); + + super.setUp(); + } + + /** + * Test retrieval of items from the map + */ + @Test + public void testGet() + { + assertEquals("Retrieve 3rd item by both keys", breedAspect, mapKeyMap + .get(MapKey.ASPECT, breedKey)); + assertEquals("Retrieve 2nd item by both keys", nameAspect, mapKeyMap + .get(MapKey.ASPECT, nameKey)); + assertEquals("Retrieve 1st item by both keys", ageAspect, mapKeyMap + .get(MapKey.ASPECT, ageKey)); + } + + /** + * Test loading the map with another map. + */ + @Test + public void testPutAll() + { + MapKeyMap newMap = new MapKeyMap(); + + assertEquals("Expect an empty map intially", null, newMap + .get(MapKey.ASPECT, ageKey)); + + newMap.putAll(mapKeyMap); + assertEquals("Retrieve 3rd item by both keys", breedAspect, newMap + .get(MapKey.ASPECT, breedKey)); + assertEquals("Retrieve 1st item by both keys", ageAspect, newMap + .get(MapKey.ASPECT, ageKey)); + } + + /** + * Test adding an entry to the map overwriting an existing entry. + */ + @Test + public void testAddToMapFor() + { + assertEquals("Validate initial value of age", ageAspect, mapKeyMap + .get(MapKey.ASPECT, ageKey)); + Aspect newage = new Aspect("age", "2"); + mapKeyMap.addToMapFor(MapKey.ASPECT, ageKey, newage); + assertEquals("Validate initial value of age", newage, mapKeyMap + .get(MapKey.ASPECT, ageKey)); + } + + /** + * Test removing items from the list. + */ + @Test + public void testRemoveFromListFor() + { + assertEquals("Validate initial value of breed", breedAspect, mapKeyMap + .get(MapKey.ASPECT, breedKey)); + assertTrue("Should be true as item is present", mapKeyMap + .removeFromListFor(MapKey.ASPECT, breedKey)); + assertEquals("Validate breed is no longer present", null, mapKeyMap + .get(MapKey.ASPECT, breedKey)); + assertFalse("Should be false as item is no longer present", mapKeyMap + .removeFromListFor(MapKey.ASPECT, breedKey)); + } + + /** + * Test retrieval of the primary key set and that the retrieved set is + * not a pointer to the master set in the MapKeyMap. + */ + @Test + public void testGetKeySet() + { + Set<MapKey<?, ?>> keySet = mapKeyMap.getKeySet(); + + assertEquals("only one primary key", 1, keySet.size()); + assertEquals("Only element should be an aspect", MapKey.ASPECT, keySet + .toArray()[0]); + + mapKeyMap.addToMapFor(MapKey.TEST, "foo", "bar"); + assertEquals( + "Still only one primary key, returned set should be independant of main collection", + 1, keySet.size()); + assertFalse("Set should not include test yet", keySet.contains(MapKey.TEST)); + + keySet = mapKeyMap.getKeySet(); + assertEquals("Now two primary keys", 2, keySet.size()); + assertTrue("Set should include aspect", keySet.contains(MapKey.ASPECT)); + assertTrue("Set should include test", keySet.contains(MapKey.TEST)); + } + + /** + * Test the containsMapFor method and the effect of adding and + * removing items on it. + */ + @Test + public void testContainsMapFor() + { + assertTrue("Should have ASPECT", mapKeyMap.containsMapFor(MapKey.ASPECT)); + assertFalse("Should not have TEST", mapKeyMap.containsMapFor(MapKey.TEST)); + + mapKeyMap.addToMapFor(MapKey.TEST, "foo", "bar"); + assertTrue("Should have ASPECT", mapKeyMap.containsMapFor(MapKey.ASPECT)); + assertTrue("Should have TEST now", mapKeyMap.containsMapFor(MapKey.TEST)); + + assertTrue("Should be true as item is present", mapKeyMap + .removeFromListFor(MapKey.TEST, "foo")); + assertTrue("Should have ASPECT", mapKeyMap.containsMapFor(MapKey.ASPECT)); + assertFalse("Should not have TEST", mapKeyMap.containsMapFor(MapKey.TEST)); + + assertTrue("Should be true as item is present", mapKeyMap + .removeFromListFor(MapKey.ASPECT, breedKey)); + assertTrue("Should still have ASPECT", mapKeyMap.containsMapFor(MapKey.ASPECT)); + assertFalse("Should not have TEST", mapKeyMap.containsMapFor(MapKey.TEST)); + } + + + /** + * Test the removal of a map by key. + */ + @Test + public void testRemoveMapFor() + { + assertTrue("Should have ASPECT", mapKeyMap + .containsMapFor(MapKey.ASPECT)); + + Map<AspectName, Aspect> removed = mapKeyMap.removeMapFor(MapKey.ASPECT); + assertFalse("Should not have ASPECT", mapKeyMap + .containsMapFor(MapKey.ASPECT)); + assertEquals("Removed map should have all expected elements", 3, + removed.size()); + assertEquals("Retrieve 3rd item", breedAspect, removed + .get(breedKey)); + assertEquals("Retrieve 2nd item", nameAspect, removed + .get(nameKey)); + assertEquals("Retrieve 1st item", ageAspect, removed + .get(ageKey)); + } +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-09-18 00:08:39
|
Revision: 7750 http://pcgen.svn.sourceforge.net/pcgen/?rev=7750&view=rev Author: thpr Date: 2008-09-18 00:08:41 +0000 (Thu, 18 Sep 2008) Log Message: ----------- First shuffle of association method in preparation for BONUS process consolidation Modified Paths: -------------- Trunk/pcgen/code/src/java/gmgen/plugin/PlayerCharacterOutput.java Trunk/pcgen/code/src/java/pcgen/cdom/base/TransitionChoice.java Trunk/pcgen/code/src/java/pcgen/cdom/helper/Aspect.java 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/AbilityUtilities.java Trunk/pcgen/code/src/java/pcgen/core/AssociationStore.java Trunk/pcgen/code/src/java/pcgen/core/AssociationSupport.java Trunk/pcgen/code/src/java/pcgen/core/Description.java Trunk/pcgen/code/src/java/pcgen/core/Equipment.java Trunk/pcgen/code/src/java/pcgen/core/EquipmentModifier.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/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/StatList.java Trunk/pcgen/code/src/java/pcgen/core/TextProperty.java Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorPC.java Trunk/pcgen/code/src/java/pcgen/core/analysis/SkillCostCalc.java Trunk/pcgen/code/src/java/pcgen/core/chooser/HPChoiceManager.java Trunk/pcgen/code/src/java/pcgen/core/chooser/SAListChoiceManager.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/UserInputChoiceManager.java Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityFeat.java Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityWeaponBonus.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/editor/EditorMainForm.java Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoTempMod.java Trunk/pcgen/code/src/java/pcgen/gui/tabs/spells/InfoPreparedSpells.java Trunk/pcgen/code/src/java/pcgen/gui/utils/PObjectNode.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/PCGVer2Creator.java Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Parser.java Trunk/pcgen/code/src/java/pcgen/io/exporttoken/AbilityListToken.java Trunk/pcgen/code/src/java/pcgen/io/exporttoken/AbilityToken.java Trunk/pcgen/code/src/java/pcgen/io/exporttoken/SkillToken.java Trunk/pcgen/code/src/java/plugin/charactersheet/gui/Page2Panel.java Trunk/pcgen/code/src/java/plugin/charactersheet/gui/SkillsPane.java Trunk/pcgen/code/src/java/plugin/jepcommands/CountCommand.java Trunk/pcgen/code/src/test/pcgen/core/EquipmentModifierTest.java Trunk/pcgen/code/src/test/pcgen/core/PCClassTest.java Trunk/pcgen/code/src/test/pcgen/core/PObjectTest.java Trunk/pcgen/code/src/test/pcgen/core/PlayerCharacterTest.java Trunk/pcgen/code/src/test/pcgen/io/exporttoken/StatTokenTest.java Trunk/pcgen/code/src/test/pcgen/io/exporttoken/WeaponTokenTest.java Trunk/pcgen/code/src/test/plugin/exporttokens/ACTokenTest.java Trunk/pcgen/code/src/test/plugin/exporttokens/AttackTokenTest.java Added Paths: ----------- Trunk/pcgen/code/src/java/pcgen/core/AssocStore.java Modified: Trunk/pcgen/code/src/java/gmgen/plugin/PlayerCharacterOutput.java =================================================================== --- Trunk/pcgen/code/src/java/gmgen/plugin/PlayerCharacterOutput.java 2008-09-17 09:03:13 UTC (rev 7749) +++ Trunk/pcgen/code/src/java/gmgen/plugin/PlayerCharacterOutput.java 2008-09-18 00:08:41 UTC (rev 7750) @@ -211,7 +211,7 @@ } firstLine = false; - sb.append(feat.qualifiedName()); + sb.append(feat.qualifiedName(pc)); } return sb.toString(); Modified: Trunk/pcgen/code/src/java/pcgen/cdom/base/TransitionChoice.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/base/TransitionChoice.java 2008-09-17 09:03:13 UTC (rev 7749) +++ Trunk/pcgen/code/src/java/pcgen/cdom/base/TransitionChoice.java 2008-09-18 00:08:41 UTC (rev 7750) @@ -136,7 +136,7 @@ for (T choice : driveChoice) { choiceActor.applyChoice(choice, apc); - apc.addAssociation(this, choice); + apc.addAssoc(this, choice); } } Modified: Trunk/pcgen/code/src/java/pcgen/cdom/helper/Aspect.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/helper/Aspect.java 2008-09-17 09:03:13 UTC (rev 7749) +++ Trunk/pcgen/code/src/java/pcgen/cdom/helper/Aspect.java 2008-09-18 00:08:41 UTC (rev 7750) @@ -232,7 +232,7 @@ { final StringBuffer buf = new StringBuffer(); - Ability pcAbility = aPC.getAbilityMatching((Ability)theOwner); + Ability pcAbility = aPC.getAbilityMatching(theOwner); if (pcAbility != null) { theOwner = pcAbility; @@ -257,7 +257,7 @@ } else if ( var.equals(VAR_CHOICE) ) { - if ( theOwner != null && theOwner.getAssociatedCount() > 0 ) + if (theOwner != null && aPC.hasAssociations(theOwner)) { buf.append(theOwner.getAssociated(0)); } @@ -266,15 +266,15 @@ { if ( theOwner != null ) { - for ( int i = 0; i < theOwner.getAssociatedCount(true); i++ ) + for ( int i = 0; i < aPC.getExpandedAssociationCount(theOwner); i++ ) { if ( i > 0 ) { - if (theOwner.getAssociatedCount(true) != 2) + if (aPC.getExpandedAssociationCount(theOwner) != 2) { buf.append(Constants.COMMA + ' '); } - if (i == theOwner.getAssociatedCount(true) - 1) + if (i == aPC.getExpandedAssociationCount(theOwner) - 1) { buf.append(" and "); } Modified: Trunk/pcgen/code/src/java/pcgen/cdom/reference/AssociationReference.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/reference/AssociationReference.java 2008-09-17 09:03:13 UTC (rev 7749) +++ Trunk/pcgen/code/src/java/pcgen/cdom/reference/AssociationReference.java 2008-09-18 00:08:41 UTC (rev 7750) @@ -23,6 +23,8 @@ import pcgen.cdom.base.CDOMObject; import pcgen.cdom.base.CDOMReference; +import pcgen.core.AssociationStore; +import pcgen.core.Globals; import pcgen.core.PObject; /** @@ -129,7 +131,8 @@ { return false; } - int assocCount = referenceObj.getAssociatedCount(); + AssociationStore as = Globals.getCurrentPC(); + int assocCount = as.getAssociationCount(referenceObj); String key = obj.getKeyName(); for (int e = 0; e < assocCount; ++e) { @@ -158,7 +161,8 @@ public Collection<T> getContainedObjects() { List<T> list = new ArrayList<T>(); - int assocCount = referenceObj.getAssociatedCount(); + AssociationStore as = Globals.getCurrentPC(); + int assocCount = as.getAssociationCount(referenceObj); for (T obj : all.getContainedObjects()) { String key = obj.getKeyName(); @@ -199,7 +203,8 @@ @Override public int getObjectCount() { - return referenceObj.getAssociatedCount(); + AssociationStore as = Globals.getCurrentPC(); + return as.getAssociationCount(referenceObj); } /** Modified: Trunk/pcgen/code/src/java/pcgen/core/Ability.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Ability.java 2008-09-17 09:03:13 UTC (rev 7749) +++ Trunk/pcgen/code/src/java/pcgen/core/Ability.java 2008-09-18 00:08:41 UTC (rev 7750) @@ -308,6 +308,7 @@ /** * This method generates a name for this Ability which includes any choices * made and a count of how many times it has been applied. + * @param pc TODO * * @return The name of the full Ability, plus any sub-choices made for this * character. Starts with the name of the ability, and then (for @@ -315,7 +316,7 @@ * of the times the ability is applied e.g. " (3x)", or a list of * the sub-choices e.g. " (Sub1, Sub2, ...)". */ - public String qualifiedName() + public String qualifiedName(PlayerCharacter pc) { // start with the name of the ability // don't do for Weapon Profs @@ -325,17 +326,17 @@ { return getDisplayName(); } - if ((getAssociatedCount() > 0) + if (pc.hasAssociations(this) && !getKeyName().startsWith("Armor Proficiency") ) { if ((getChoiceString().length() == 0) || (getSafe(ObjectKey.MULTIPLE_ALLOWED) && getSafe(ObjectKey.STACKS))) { - if (getAssociatedCount() > 1) + if (pc.getAssociationCount(this) > 1) { // number of items only (ie stacking), e.g. " (1x)" aStrBuf.append(" ("); - aStrBuf.append((int) (getAssociatedCount() * getSafe(ObjectKey.SELECTION_COST).doubleValue())); + aStrBuf.append((int) (pc.getAssociationCount(this) * getSafe(ObjectKey.SELECTION_COST).doubleValue())); aStrBuf.append("x)"); } } @@ -347,7 +348,7 @@ int i = 0; // list of items in associatedList, e.g. " (Sub1, Sub2, ...)" - for (int e = 0; e < getAssociatedCount(true); ++e) + for (int e = 0; e < pc.getExpandedAssociationCount(this); ++e) { if (i > 0) { @@ -434,13 +435,12 @@ /** * Enhanced containsAssociated, which parses the input parameter for "=", * "+num" and "-num" to extract the value to look for. - * * @param type The type we're looking for * * @return enhanced containsAssociated, which parses the input parameter * for "=", "+num" and "-num" to extract the value to look for. */ - @Override int numberInList(final String type) + @Override int numberInList(PlayerCharacter pc, final String type) { String aType = type; @@ -473,9 +473,9 @@ } int iCount = 0; - for (int i = 0; i < getAssociatedCount(); ++i) + for (String assoc : pc.getAssociationList(this)) { - if (getAssociated(i).equalsIgnoreCase(aType)) + if (assoc.equalsIgnoreCase(aType)) { iCount += 1; } Modified: Trunk/pcgen/code/src/java/pcgen/core/AbilityUtilities.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/AbilityUtilities.java 2008-09-17 09:03:13 UTC (rev 7749) +++ Trunk/pcgen/code/src/java/pcgen/core/AbilityUtilities.java 2008-09-18 00:08:41 UTC (rev 7750) @@ -368,7 +368,7 @@ final AbilityCategory category) { // how many sub-choices to make - double abilityCount = (ability.getAssociatedCount() * ability.getSafe(ObjectKey.SELECTION_COST).doubleValue()); + double abilityCount = (aPC.getAssociationCount(ability) * ability.getSafe(ObjectKey.SELECTION_COST).doubleValue()); boolean adjustedAbilityPool = false; @@ -412,7 +412,7 @@ // if no sub choices made (i.e. all of them removed in Chooser box), // then remove the Feat boolean removed = false; - boolean result = (ability.getSafe(ObjectKey.MULTIPLE_ALLOWED) && singleChoice) ? (ability.getAssociatedCount() > 0) : addIt ; + boolean result = (ability.getSafe(ObjectKey.MULTIPLE_ALLOWED) && singleChoice) ? aPC.hasAssociations(ability) : addIt ; if (! result) { @@ -438,13 +438,13 @@ } else if (category == AbilityCategory.FEAT) { - int listSize = ability.getAssociatedCount(); + int listSize = aPC.getAssociationCount(ability); for (Ability myAbility : aPC.getRealAbilitiesList(AbilityCategory.FEAT)) { if (myAbility.getKeyName().equalsIgnoreCase(ability.getKeyName())) { - listSize = myAbility.getAssociatedCount(); + listSize = aPC.getAssociationCount(myAbility); } } Added: Trunk/pcgen/code/src/java/pcgen/core/AssocStore.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/AssocStore.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/core/AssocStore.java 2008-09-18 00:08:41 UTC (rev 7750) @@ -0,0 +1,20 @@ +package pcgen.core; + +import java.util.List; + +public interface AssocStore +{ + public void addAssoc(Object obj, Object o); + + public void removeAssoc(Object obj, Object o); + + public List<Object> removeAllAssocs(Object obj); + + public int getAssocCount(Object obj); + + public boolean hasAssocs(Object obj); + + public List<Object> getAssocList(Object obj); + + public boolean containsAssoc(Object obj, Object o); +} Modified: Trunk/pcgen/code/src/java/pcgen/core/AssociationStore.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/AssociationStore.java 2008-09-17 09:03:13 UTC (rev 7749) +++ Trunk/pcgen/code/src/java/pcgen/core/AssociationStore.java 2008-09-18 00:08:41 UTC (rev 7750) @@ -4,17 +4,23 @@ public interface AssociationStore { - public void addAssociation(Object obj, Object o); + public void addAssociation(PObject obj, String o); - public void removeAssociation(Object obj, Object o); + public void removeAssociation(PObject obj, String o); - public List<Object> removeAllAssociations(Object obj); + public List<String> removeAllAssociations(PObject obj); - public int getAssociationCount(Object obj); + public int getAssociationCount(PObject obj); - public boolean hasAssociations(Object obj); + public boolean hasAssociations(PObject obj); - public List<Object> getAssociationList(Object obj); + public List<String> getAssociationList(PObject obj); - public boolean containsAssociated(Object obj, Object o); + public boolean containsAssociated(PObject obj, String o); + + /* + * Temporary + */ + public int getExpandedAssociationCount(PObject obj); + } Modified: Trunk/pcgen/code/src/java/pcgen/core/AssociationSupport.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/AssociationSupport.java 2008-09-17 09:03:13 UTC (rev 7749) +++ Trunk/pcgen/code/src/java/pcgen/core/AssociationSupport.java 2008-09-18 00:08:41 UTC (rev 7750) @@ -4,43 +4,43 @@ import pcgen.base.util.HashMapToList; -public class AssociationSupport implements AssociationStore +public class AssociationSupport implements AssocStore { private final HashMapToList<Object, Object> assocMap = new HashMapToList<Object, Object>(); - public void addAssociation(Object obj, Object o) + public void addAssoc(Object obj, Object o) { assocMap.addToListFor(obj, o); } - public void removeAssociation(Object obj, Object o) + public void removeAssoc(Object obj, Object o) { assocMap.removeFromListFor(obj, o); } - public List<Object> removeAllAssociations(Object obj) + public List<Object> removeAllAssocs(Object obj) { return assocMap.removeListFor(obj); } - public int getAssociationCount(Object obj) + public int getAssocCount(Object obj) { return assocMap.sizeOfListFor(obj); } - public boolean hasAssociations(Object obj) + public boolean hasAssocs(Object obj) { return assocMap.containsListFor(obj); } - public List<Object> getAssociationList(Object obj) + public List<Object> getAssocList(Object obj) { return assocMap.getListFor(obj); } - public boolean containsAssociated(Object obj, Object o) + public boolean containsAssoc(Object obj, Object o) { return assocMap.containsInList(obj, o); } Modified: Trunk/pcgen/code/src/java/pcgen/core/Description.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Description.java 2008-09-17 09:03:13 UTC (rev 7749) +++ Trunk/pcgen/code/src/java/pcgen/core/Description.java 2008-09-18 00:08:41 UTC (rev 7750) @@ -190,7 +190,7 @@ } else if ( var.equals(VAR_CHOICE) ) { - if ( theOwner != null && theOwner.getAssociatedCount() > 0 ) + if ( theOwner != null && aPC.hasAssociations(theOwner) ) { buf.append(theOwner.getAssociated(0)); } @@ -199,15 +199,15 @@ { if ( theOwner != null ) { - for ( int i = 0; i < theOwner.getAssociatedCount(true); i++ ) + for ( int i = 0; i < aPC.getExpandedAssociationCount(theOwner); i++ ) { if ( i > 0 ) { - if (theOwner.getAssociatedCount(true) != 2) + if (aPC.getExpandedAssociationCount(theOwner) != 2) { buf.append(Constants.COMMA + ' '); } - if (i == theOwner.getAssociatedCount(true) - 1) + if (i == aPC.getExpandedAssociationCount(theOwner) - 1) { buf.append(" and "); } Modified: Trunk/pcgen/code/src/java/pcgen/core/Equipment.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Equipment.java 2008-09-17 09:03:13 UTC (rev 7749) +++ Trunk/pcgen/code/src/java/pcgen/core/Equipment.java 2008-09-18 00:08:41 UTC (rev 7750) @@ -80,7 +80,9 @@ * @version $Revision$ */ public final class Equipment extends PObject implements Serializable, - EquipmentCollection, Comparable<Object>, VariableContainer { + EquipmentCollection, Comparable<Object>, VariableContainer, + AssociationStore +{ private static final long serialVersionUID = 1; private static final int UNLIMITED_CAPACITY = -1; @@ -598,7 +600,7 @@ if (!eqModList.isEmpty()) { for (EquipmentModifier eqMod : eqModList) { - aList.addAll(eqMod.getBonusListOfType(aType, aName)); + aList.addAll(eqMod.getBonusListOfType(this, aType, aName)); } } @@ -685,7 +687,7 @@ // the cost of the metal before the armor gets resized. // for (EquipmentModifier eqMod : eqModifierList) { - int iCount = eqMod.getAssociatedCount(); + int iCount = getAssociationCount(eqMod); if (iCount < 1) { iCount = 1; @@ -701,7 +703,7 @@ } for (EquipmentModifier eqMod : altEqModifierList) { - int iCount = eqMod.getAssociatedCount(); + int iCount = getAssociationCount(eqMod); if (iCount < 1) { iCount = 1; @@ -750,7 +752,7 @@ weightAlreadyUsed = false; for (EquipmentModifier eqMod : eqModifierList) { - int iCount = eqMod.getAssociatedCount(); + int iCount = getAssociationCount(eqMod); if (iCount < 1) { iCount = 1; @@ -762,11 +764,11 @@ Pattern pat = Pattern.compile("BASECOST"); Matcher mat; - if ((eqMod.getAssociatedCount() > 0) + if (hasAssociations(eqMod) && !costFormula.equals(eqMod.getCost(0))) { eqModCost = BigDecimal.ZERO; - for (int idx = 0; idx < eqMod.getAssociatedCount(); ++idx) { + for (int idx = 0; idx < getAssociationCount(eqMod); ++idx) { mat = pat.matcher(eqMod.getCost(idx)); costFormula = mat.replaceAll("(BASECOST/" + getSafe(IntegerKey.BASE_QUANTITY) + ")"); @@ -815,7 +817,7 @@ } for (EquipmentModifier eqMod : altEqModifierList) { - int iCount = eqMod.getAssociatedCount(); + int iCount = getAssociationCount(eqMod); if (iCount < 1) { iCount = 1; @@ -1806,7 +1808,7 @@ retString.append(", "); } first = false; - retString.append(sprop.getParsedText()); + retString.append(sprop.getText()); } return retString.toString(); } @@ -1820,7 +1822,7 @@ for (EquipmentModifier eqMod : getEqModifierList(true)) { Integer min = eqMod.get(IntegerKey.MIN_CHARGES); if (min != null && min > 0) { - eqMod.setRemainingCharges(remainingCharges); + eqMod.setRemainingCharges(this, remainingCharges); } } } @@ -1834,7 +1836,7 @@ for (EquipmentModifier eqMod : getEqModifierList(true)) { Integer min = eqMod.get(IntegerKey.MIN_CHARGES); if (min != null && min > 0) { - return eqMod.getRemainingCharges(); + return eqMod.getRemainingCharges(this); } } @@ -2001,7 +2003,7 @@ for (EquipmentModifier eqMod : getEqModifierList(true)) { Integer min = eqMod.get(IntegerKey.MIN_CHARGES); if (min != null && min > 0) { - return eqMod.getUsedCharges(); + return eqMod.getUsedCharges(this); } } @@ -2406,7 +2408,7 @@ if (selectedChoice != null && selectedChoice.length() > 0) { if (!eqMod.getChoiceString().startsWith("EQBUILDER.")) { aMod.setChoice(selectedChoice, equipChoice); - allRemoved = aMod.getAssociatedCount() == 0; + allRemoved = !hasAssociations(aMod); } } else if (aMod.getChoice(1, this, true, aPC) == 0) { allRemoved = true; @@ -2576,7 +2578,7 @@ int iCount; for (EquipmentModifier eqMod : eqModifierList) { - iCount = eqMod.getAssociatedCount(); + iCount = getAssociationCount(eqMod); if (iCount < 1) { iCount = 1; @@ -2586,7 +2588,7 @@ } for (EquipmentModifier eqMod : altEqModifierList) { - iCount = eqMod.getAssociatedCount(); + iCount = getAssociationCount(eqMod); if (iCount < 1) { iCount = 1; @@ -3223,7 +3225,7 @@ // Get a response from user (if one required) // Remove the modifier if all associated choices are deleted - if ((aMod.getAssociatedCount() == 0) + if (!hasAssociations(aMod) || (aMod.getChoice(0, this, false, aPC) == 0)) { eqModList.remove(aMod); if (bPrimary) { @@ -3816,7 +3818,7 @@ aString.append(eqMod.getKeyName()); // Add the modifiers - for (int e2 = 0; e2 < eqMod.getAssociatedCount(); ++e2) { + for (int e2 = 0; e2 < getAssociationCount(eqMod); ++e2) { final String strMod = eqMod.getAssociated(e2); aString.append('|').append(strMod.replace('|', '=')); } @@ -4552,7 +4554,7 @@ while (aTok.hasMoreTokens()) { final String x = aTok.nextToken().replace('=', '|'); - for (int i = eqMod.getAssociatedCount() - 1; i >= 0; --i) { + for (int i = getAssociationCount(eqMod) - 1; i >= 0; --i) { final String aChoice = eqMod.getAssociated(i); if (aChoice.startsWith(x)) { @@ -4561,7 +4563,7 @@ } } - if (eqMod.getAssociatedCount() == 0) { + if (!hasAssociations(eqMod)) { removeEqModifier(eqMod, bPrimary, aPC); } } @@ -4658,7 +4660,7 @@ EquipmentModifier aEqMod = getEqModifierKeyed("ADDTYPE", bPrimary); if (aEqMod != null) { - for (int e = 0; e < aEqMod.getAssociatedCount(); ++e) { + for (int e = 0; e < getAssociationCount(aEqMod); ++e) { String aType = aEqMod.getAssociated(e); aType = aType.toUpperCase(); @@ -5976,7 +5978,7 @@ if (eqMod != null) { - for (int i = 0; i < eqMod.getAssociatedCount(); ++i) + for (int i = 0; i < getAssociationCount(eqMod); ++i) { final String aString = eqMod.getAssociated(i); @@ -6045,4 +6047,54 @@ } return null; } + + public void addAssociation(PObject obj, String o) + { + obj.addAssociated(o); + } + + public boolean containsAssociated(PObject obj, String o) + { + return obj.containsAssociated(o); + } + + public int getAssociationCount(PObject obj) + { + return obj.tempGetAssociatedCount(); + } + + public List<String> getAssociationList(PObject obj) + { + List<String> list = new ArrayList<String>(); + for (AssociatedChoice<String> ac : obj.getAssociatedList()) + { + list.add(ac.getDefaultChoice()); + } + return list; + } + + public boolean hasAssociations(PObject obj) + { + return obj.tempGetAssociatedCount() > 0; + } + + public List<String> removeAllAssociations(PObject obj) + { + List<String> list = getAssociationList(obj); + for (int i = obj.tempGetAssociatedCount() - 1; i > 0; i--) + { + obj.removeAssociated(i); + } + return list; + } + + public void removeAssociation(PObject obj, String o) + { + obj.removeAssociated(o); + } + + public int getExpandedAssociationCount(PObject obj) + { + return obj.tempGetAssociatedCount(true); + } } Modified: Trunk/pcgen/code/src/java/pcgen/core/EquipmentModifier.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/EquipmentModifier.java 2008-09-17 09:03:13 UTC (rev 7749) +++ Trunk/pcgen/code/src/java/pcgen/core/EquipmentModifier.java 2008-09-18 00:08:41 UTC (rev 7750) @@ -45,6 +45,7 @@ import pcgen.core.utils.MessageType; import pcgen.core.utils.ShowMessageDelegate; import pcgen.util.Delta; +import pcgen.util.Logging; import pcgen.util.chooser.ChooserFactory; import pcgen.util.chooser.ChooserInterface; @@ -69,22 +70,15 @@ * * @return returns all BonusObj's that are "active" */ - public List<BonusObj> getActiveBonuses(final PObject caller, final PlayerCharacter aPC) + public List<BonusObj> getActiveBonuses(final Equipment caller, final PlayerCharacter aPC) { final List<BonusObj> aList = new ArrayList<BonusObj>(); - for ( BonusObj bonus : getBonusList() ) + for ( BonusObj bonus : getBonusList(caller) ) { - if (caller instanceof Equipment) + if (PrereqHandler.passesAll(bonus.getPrerequisiteList(), caller, + aPC)) { - if ( PrereqHandler.passesAll(bonus.getPrerequisiteList(), ((Equipment)caller), aPC) ) - { - bonus.setApplied(true); - aList.add(bonus); - } - } - else if ( bonus.qualifies(aPC) ) - { bonus.setApplied(true); aList.add(bonus); } @@ -104,9 +98,9 @@ * include one entry for each associated choice. */ @Override - public List<BonusObj> getBonusList() + public List<BonusObj> getBonusList(AssociationStore as) { - final List<BonusObj> myBonusList = new ArrayList<BonusObj>(super.getBonusList()); + final List<BonusObj> myBonusList = new ArrayList<BonusObj>(super.getBonusList(as)); for (int i = myBonusList.size() - 1; i > -1; i--) { @@ -118,7 +112,7 @@ if (idx >= 0) { // Add an entry for each of the associated list entries - for (int j = getAssociatedCount() - 1; j >= 0; j--) + for (int j = as.getAssociationCount(this) - 1; j >= 0; j--) { final BonusObj newBonus = Bonus.newBonus( aString.substring(0, idx) + getAssociated(j) + @@ -155,18 +149,17 @@ /** * Gets a list of bonuses held in this object that match both name and type - * * @param aType The type to match * @param aName The name to match * * @return a List of bonuses mathing both name and type */ @Override - public List<BonusObj> getBonusListOfType(final String aType, final String aName) + public List<BonusObj> getBonusListOfType(AssociationStore as, final String aType, final String aName) { final List<BonusObj> aList = new ArrayList<BonusObj>(); - for ( BonusObj bonus : getBonusList() ) + for ( BonusObj bonus : getBonusList(as) ) { if ( (bonus.getTypeOfBonus().indexOf(aType) >= 0) && @@ -219,7 +212,7 @@ // TODO WTF is this loop doing? how many times does it expect "%CHOICE" to // appear in the special property? - for (int j = 0; j < getAssociatedCount(); j++) + for (int j = 0; j < caller.getAssociationCount(this); j++) { propName = propName.replaceFirst("%CHOICE", getAssociated(j)); } @@ -317,58 +310,12 @@ final PlayerCharacter aPC, final String aType, final String aName, - final Object obj) + final AssociationStore obj) { - return super.bonusTo(aType, aName, obj, getBonusList(), aPC); + return super.bonusTo(aType, aName, obj, getBonusList(obj), aPC); } /** - * Should use this instead of the current getBonusList() but have to find - * everywhere an EquipmentModifier is added from and call this function. JSC - * 08/20/03 - */ - public void calcBonuses() - { - final List<BonusObj> addList = new ArrayList<BonusObj>(); - final List<BonusObj> delList = new ArrayList<BonusObj>(); - - for ( BonusObj bonus : getBonusList() ) - { - final String aString = bonus.toString(); - final int idx = aString.indexOf("%CHOICE"); - - if (idx >= 0) - { - delList.add(bonus); - - // Add an entry for each of the - // associated list entries - for (int j = 0; j < getAssociatedCount(); j++) - { - final BonusObj newBonus = Bonus.newBonus( - aString.substring(0, idx) + getAssociated(j) + - aString.substring(idx + 7)); - newBonus.setCreatorObject(this); - addList.add(newBonus); - } - } - } - - if (delList.size() > 0) - { - for ( BonusObj bonus : delList ) - { - removeBonusList(bonus); - } - - for ( BonusObj bonus : addList ) - { - addBonusList(bonus); - } - } - } - - /** * Clone an EquipmentModifier * * @return a clone of the EquipmentModifier @@ -408,17 +355,31 @@ @Override public int getSR(final PlayerCharacter aPC) { + Logging.errorPrint("Should not call getSR(PlayerCharacter) on EqMod"); + return 0; + } + + public int getSR(Equipment parent, PlayerCharacter aPC) + { if (getSRFormula() == null) { return 0; } - if ("%CHOICE".equals(getSRFormula()) && (getAssociatedCount() > 0)) + if ("%CHOICE".equals(getSRFormula()) && parent.hasAssociations(this)) { return Delta.parseInt(getAssociatedObject(0).toString()); } - return super.getSR(aPC); + final String srFormula = getSRFormula(); + + //if there's a current PC, go ahead and evaluate the formula + if (srFormula != null) + { + return parent.getVariableValue(srFormula, getQualifiedKey(), aPC).intValue(); + } + + return 0; } /** @@ -478,7 +439,7 @@ selectedList = chooser.getSelectedList(); setChoice(selectedList, equipChoice); - return getAssociatedCount(); + return parent.getAssociationCount(this); } void setChoice(final String choice, final EquipmentChoice equipChoice) @@ -832,9 +793,9 @@ return costdouble; } - void setRemainingCharges(final int remainingCharges) + void setRemainingCharges(Equipment parent, final int remainingCharges) { - if (getAssociatedCount() > 0) + if (parent.getAssociationCount(this) > 0) { String listEntry = getAssociated(0); String chargeInfo = getSpellInfoString(listEntry, s_CHARGES); @@ -852,9 +813,9 @@ } } - int getRemainingCharges() + int getRemainingCharges(Equipment parent) { - if (getAssociatedCount() > 0) + if (parent.getAssociationCount(this) > 0) { return getSpellInfo(getAssociated(0), s_CHARGES); } @@ -862,9 +823,9 @@ return 0; } - int getUsedCharges() + int getUsedCharges(Equipment parent) { - return get(IntegerKey.MAX_CHARGES) - getRemainingCharges(); + return get(IntegerKey.MAX_CHARGES) - getRemainingCharges(parent); } public static int getSpellInfo(final String listEntry, final String desiredInfo) @@ -920,7 +881,7 @@ Set<String> typesToGetBonusesFor = new HashSet<String>(); - for ( BonusObj bonus : getBonusList() ) + for ( BonusObj bonus : getBonusList(parent) ) { boolean meetsAll = true; Modified: Trunk/pcgen/code/src/java/pcgen/core/Globals.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Globals.java 2008-09-17 09:03:13 UTC (rev 7749) +++ Trunk/pcgen/code/src/java/pcgen/core/Globals.java 2008-09-18 00:08:41 UTC (rev 7750) @@ -2999,4 +2999,9 @@ return aList; } + public static AssociationStore getCurrentPC() + { + return currentPC; + } + } Modified: Trunk/pcgen/code/src/java/pcgen/core/PCClass.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-09-17 09:03:13 UTC (rev 7749) +++ Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-09-18 00:08:41 UTC (rev 7750) @@ -2910,7 +2910,7 @@ * FINALPCCLASSLEVELONLY This is only part of the level, as the skill list is * calculated based on other factors, it is not a Tag */ - public boolean hasClassSkill(final String aString) + public boolean hasClassSkill(PlayerCharacter pc, final String aString) { if ((classSkillList == null) || classSkillList.isEmpty()) { @@ -2921,7 +2921,7 @@ { final PCClass pcClass = Globals.getContext().ref.silentlyGetConstructedCDOMObject(PCClass.class, key.getLSTformat()); - if ((pcClass != null) && pcClass.hasCSkill(aString)) + if ((pcClass != null) && pcClass.hasCSkill(pc, aString)) { return true; } Modified: Trunk/pcgen/code/src/java/pcgen/core/PObject.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-09-17 09:03:13 UTC (rev 7749) +++ Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-09-18 00:08:41 UTC (rev 7750) @@ -210,9 +210,9 @@ * Get associated count, without expanding * @return associated count */ - public final int getAssociatedCount() + public final int tempGetAssociatedCount() { - return getAssociatedCount(false); + return tempGetAssociatedCount(false); } /** @@ -220,7 +220,7 @@ * @param expand * @return associated count */ - public final int getAssociatedCount(final boolean expand) + public final int tempGetAssociatedCount(final boolean expand) { if (associatedList == null) { @@ -1411,9 +1411,9 @@ StringBuilder sb = new StringBuilder(); sb.append(key.substring(0, idx)); - if (getAssociatedCount() != 0) + if (pc.hasAssociations(this)) { - for (int i = 0; i < getAssociatedCount(); ++i) + for (int i = 0; i < pc.getAssociationCount(this); ++i) { if (i != 0) { @@ -2437,9 +2437,9 @@ StringBuilder sb = new StringBuilder(); sb.append(key.substring(0, idx)); - if (getAssociatedCount() != 0) + if (aPC.hasAssociations(this)) { - for (int i = 0; i < getAssociatedCount(); ++i) + for (int i = 0; i < aPC.getAssociationCount(this); ++i) { if (i != 0) { @@ -2866,7 +2866,7 @@ // This method currently does nothing so it may be overriden in PCClass. } - public final boolean hasCcSkill(final String aName) + public final boolean hasCcSkill(PlayerCharacter pc, final String aName) { List<String> ccSkillList = getCcSkillList(); if ((ccSkillList == null) || ccSkillList.isEmpty()) @@ -2884,7 +2884,7 @@ { String aString; - for (int e = 0; e < getAssociatedCount(); ++e) + for (int e = 0; e < pc.getAssociationCount(this); ++e) { aString = getAssociated(e); @@ -2911,7 +2911,7 @@ return false; } - public final boolean hasCSkill(final String aName) + public final boolean hasCSkill(PlayerCharacter pc, final String aName) { List<String> cSkillList = getCSkillList(); if ((cSkillList == null) || cSkillList.isEmpty()) @@ -2928,7 +2928,7 @@ { String aString; - for (int e = 0; e < getAssociatedCount(); ++e) + for (int e = 0; e < pc.getAssociationCount(this); ++e) { aString = getAssociated(e); @@ -3040,7 +3040,7 @@ } } - int numberInList(final String aType) + int numberInList(PlayerCharacter pc, final String aType) { return 0; } @@ -3496,22 +3496,39 @@ /** * Get the list of bonuses for this object + * @param as TODO * @return the list of bonuses for this object */ + public List<BonusObj> getBonusList(AssociationStore as) + { + return bonusList; + } + + /** + * Get the list of bonuses for this object + * @param as TODO + * @return the list of bonuses for this object + */ public List<BonusObj> getBonusList() { return bonusList; } + public void clearBonusList() + { + bonusList.clear(); + } + /** * Get the list of bounuses of a particular type for this object + * @param as TODO * @param aType * @param aName * @return the list of bounuses of a particular type for this object */ - public List<BonusObj> getBonusListOfType(final String aType, final String aName) + public List<BonusObj> getBonusListOfType(AssociationStore as, final String aType, final String aName) { - return BonusUtilities.getBonusFromList(getBonusList(), aType, aName); + return BonusUtilities.getBonusFromList(getBonusList(as), aType, aName); } /** @@ -3537,9 +3554,9 @@ * @param aPC * @return the bonus */ - public double bonusTo(final String aType, final String aName, final Object obj, final PlayerCharacter aPC) + public double bonusTo(final String aType, final String aName, final AssociationStore obj, final PlayerCharacter aPC) { - return bonusTo(aType, aName, obj, getBonusList(), aPC); + return bonusTo(aType, aName, obj, getBonusList(obj), aPC); } /** @@ -3593,7 +3610,7 @@ if ("VAR".equals(aType)) { - iTimes = Math.max(1, getAssociatedCount()); + iTimes = Math.max(1, aPC.getAssociationCount(this)); // // SALIST will stick BONUS:VAR|... @@ -3610,7 +3627,7 @@ { String bString = bonus.toString().toUpperCase(); - if (getAssociatedCount() != 0) + if (aPC.hasAssociations(this)) { int span = 4; int idx = bString.indexOf("%VAR"); @@ -3626,19 +3643,18 @@ final String firstPart = bString.substring(0, idx); final String secondPart = bString.substring(idx + span); - for (int i = 1; i < getAssociatedCount(); ++i) + for (int i = 0; i < aPC.getAssociationCount(this); ++i) { final String xString = new StringBuffer().append(firstPart).append(getAssociated(i)).append(secondPart) .toString().toUpperCase(); retVal += calcBonus(xString, aType, aName, aTypePlusName, obj, iTimes, bonus, aPC); } - - bString = new StringBuffer().append(firstPart).append(getAssociated(0)).append(secondPart).toString() - .toUpperCase(); } } - - retVal += calcBonus(bString, aType, aName, aTypePlusName, obj, iTimes, bonus, aPC); + else + { + retVal += calcBonus(bString, aType, aName, aTypePlusName, obj, iTimes, bonus, aPC); + } } return retVal; @@ -4087,7 +4103,7 @@ String aString = aTok.nextToken(); if ((!aString.equalsIgnoreCase(aType) && !aString.endsWith("%LIST")) - || (aString.endsWith("%LIST") && (numberInList(aType) == 0)) || (aName.equals("ALL"))) + || (aString.endsWith("%LIST") && (numberInList(aPC, aType) == 0)) || (aName.equals("ALL"))) { return 0; } @@ -4156,7 +4172,7 @@ if ("LIST".equalsIgnoreCase(aList)) { - final int iCount = numberInList(aName); + final int iCount = numberInList(aPC, aName); if (iCount != 0) { Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-09-17 09:03:13 UTC (rev 7749) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-09-18 00:08:41 UTC (rev 7750) @@ -6468,8 +6468,8 @@ } final List<BonusObj> tempList = - getRace().getBonusListOfType(aType.toUpperCase(), - aName.toUpperCase()); + getRace().getBonusListOfType(this, + aType.toUpperCase(), aName.toUpperCase()); return calcBonusFromList(tempList); } @@ -8899,12 +8899,12 @@ for (EquipmentModifier eqMod : eq.getEqModifierList(true)) { - SR = Math.max(SR, eqMod.getSR(this)); + SR = Math.max(SR, eqMod.getSR(eq, this)); } for (EquipmentModifier eqMod : eq.getEqModifierList(false)) { - SR = Math.max(SR, eqMod.getSR(this)); + SR = Math.max(SR, eqMod.getSR(eq, this)); } } } @@ -11395,7 +11395,7 @@ for (PObject obj : aList) { final List<BonusObj> tempList = - obj.getBonusListOfType(aType, aName); + obj.getBonusListOfType(this, aType, aName); if (!tempList.isEmpty()) { @@ -11893,7 +11893,7 @@ for (PObject anObj : aList) { final List<BonusObj> tempList = - anObj.getBonusListOfType(aType, aName); + anObj.getBonusListOfType(this, aType, aName); iBonus += calcBonusWithCostFromList(tempList); } @@ -13100,14 +13100,14 @@ int k = Math.max(1, - (int) (anObj.getAssociatedCount() * + (int) (getAssociationCount(anObj) * anObj.getSafe(ObjectKey.SELECTION_COST).doubleValue())); - if (anObj.getAssociatedCount() > 0) + if (hasAssociations(anObj)) { k = 0; - for (int f = 0; f < anObj.getAssociatedCount(); ++f) + for (int f = 0; f < getAssociationCount(anObj); ++f) { final String aString = anObj.getAssociated(f); @@ -16374,7 +16374,7 @@ { continue; } - final int subfeatCount = aFeat.getAssociatedCount(); + final int subfeatCount = getAssociationCount(aFeat); double cost = aFeat.getSafe(ObjectKey.SELECTION_COST).doubleValue(); int select = getVariableValue(aFeat.getSelectCount(), "").intValue(); @@ -16414,7 +16414,7 @@ { for (final Ability ability : abilities) { - final int subfeatCount = ability.getAssociatedCount(); + final int subfeatCount = getAssociationCount(ability); double cost = ability.getSafe(ObjectKey.SELECTION_COST).doubleValue(); int select = getVariableValue(ability.getSelectCount(), "") @@ -16760,7 +16760,7 @@ Ability aggregateFeat = aHashMap.get(vFeat.getKeyName()); aggregateFeat = aggregateFeat.clone(); - for (int e1 = 0; e1 < vFeat.getAssociatedCount(); ++e1) + for (int e1 = 0; e1 < getAssociationCount(vFeat); ++e1) { final String aString = vFeat.getAssociated(e1); @@ -16790,7 +16790,7 @@ Ability aggregateFeat = aHashMap.get(autoFeat.getKeyName()); aggregateFeat = aggregateFeat.clone(); - for (int e1 = 0; e1 < autoFeat.getAssociatedCount(); ++e1) + for (int e1 = 0; e1 < getAssociationCount(autoFeat); ++e1) { final String aString = autoFeat.getAssociated(e1); if (aggregateFeat.getSafe(ObjectKey.STACKS) @@ -17259,7 +17259,7 @@ if (aDomain != null) { - for (int e2 = 0; e2 < aDomain.getAssociatedCount(); ++e2) + for (int e2 = 0; e2 < getAssociationCount(aDomain); ++e2) { final String aString = aDomain.getAssociated(e2); @@ -17866,41 +17866,91 @@ return cache.getSkillCost(this, sk, cl); } - public void addAssociation(Object obj, Object o) + public void addAssociation(PObject obj, String o) { - assocSupt.addAssociation(obj, o); + obj.addAssociated(o); } - public boolean containsAssociated(Object obj, Object o) + public boolean containsAssociated(PObject obj, String o) { - return assocSupt.containsAssociated(obj, o); + return obj.containsAssociated(o); } - public int getAssociationCount(Object obj) + public int getAssociationCount(PObject obj) { - return assocSupt.getAssociationCount(obj); + return obj.tempGetAssociatedCount(); } - public List<Object> getAssociationList(Object obj) + public List<String> getAssociationList(PObject obj) { - return assocSupt.getAssociationList(obj); + List<String> list = new ArrayList<String>(); + for (AssociatedChoice<String> ac : obj.getAssociatedList()) + { + list.add(ac.getDefaultChoice()); + } + return list; } - public boolean hasAssociations(Object obj) + public boolean hasAssociations(PObject obj) { - return assocSupt.hasAssociations(obj); + return obj.tempGetAssociatedCount() > 0; } - public List<Object> removeAllAssociations(Object obj) + public List<String> removeAllAssociations(PObject obj) { - return assocSupt.removeAllAssociations(obj); + List<String> list = getAssociationList(obj); + for (int i = obj.tempGetAssociatedCount() - 1; i > 0; i--) + { + obj.removeAssociated(i); + } + return list; } - public void removeAssociation(Object obj, Object o) + public void removeAssociation(PObject obj, String o) { - assocSupt.removeAssociation(obj, o); + obj.removeAssociated(o); } + public int getExpandedAssociationCount(PObject obj) + { + return obj.tempGetAssociatedCount(true); + } + + public void addAssoc(Object obj, Object o) + { + assocSupt.addAssoc(obj, o); + } + + public boolean containsAssoc(Object obj, Object o) + { + return assocSupt.containsAssoc(obj, o); + } + + public int getAssocCount(Object obj) + { + return assocSupt.getAssocCount(obj); + } + + public List<Object> getAssocList(Object obj) + { + return assocSupt.getAssocList(obj); + } + + public boolean hasAssocs(Object obj) + { + return assocSupt.hasAssocs(obj); + } + + public List<Object> removeAllAssocs(Object obj) + { + return assocSupt.removeAllAssocs(obj); + } + + public void removeAssoc(Object obj, Object o) + { + assocSupt.removeAssoc(obj, o); + } + public boolean hasUnlockedStat(PCStat stat) { for (CDOMObject cdo : getCDOMObjectList()) Modified: Trunk/pcgen/code/src/java/pcgen/core/Skill.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Skill.java 2008-09-17 09:03:13 UTC (rev 7749) +++ Trunk/pcgen/code/src/java/pcgen/core/Skill.java 2008-09-18 00:08:41 UTC (rev 7750) @@ -27,6 +27,7 @@ import java.util.List; import java.util.StringTokenizer; +import pcgen.base.lang.StringUtil; import pcgen.cdom.base.Constants; import pcgen.cdom.base.TransitionChoice; import pcgen.cdom.enumeration.ListKey; @@ -404,28 +405,19 @@ /** * Get the qualified name + * @param pc TODO * @return qualified name */ - public String qualifiedName() + public String qualifiedName(PlayerCharacter pc) { - if (getAssociatedCount() == 0) + if (!pc.hasAssociations(this)) { return this.getOutputName(); } - final StringBuffer buffer = new StringBuffer(getAssociatedCount() * 20); + final StringBuffer buffer = new StringBuffer(pc.getAssociationCount(this) * 20); buffer.append(this.getOutputName()).append("("); - - for (int i = 0; i < getAssociatedCount(); i++) - { - if (i > 0) - { - buffer.append(", "); - } - - buffer.append(getAssociated(i)); - } - + buffer.append(StringUtil.joinToStringBuffer(pc.getAssociationList(this), ", ")); buffer.append(")"); return buffer.toString(); @@ -479,7 +471,7 @@ } else { - final int selectedLanguages = getAssociatedCount(); + final int selectedLanguages = aPC.getAssociationCount(this); final int maxLanguages = getTotalRank(aPC).intValue(); if (selectedLanguages > maxLanguages) @@ -578,7 +570,7 @@ int iCount = 0; for ( LevelAbility la : laList ) { - iCount += la.getAssociatedCount(); + iCount += aPC.getAssociationCount(la); } if (CoreUtility.doublesEqual(getRank().doubleValue() + bonus, 0.0)) Modified: Trunk/pcgen/code/src/java/pcgen/core/StatList.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/StatList.java 2008-09-17 09:03:13 UTC (rev 7749) +++ Trunk/pcgen/code/src/java/pcgen/core/StatList.java 2008-09-18 00:08:41 UTC (rev 7750) @@ -32,6 +32,7 @@ import java.util.regex.Pattern; import pcgen.core.bonus.BonusObj; +import pcgen.core.bonus.BonusUtilities; /** * <code>StatList</code>. @@ -86,7 +87,8 @@ for ( PCStat stat : stats ) { - aList.addAll(stat.getBonusListOfType(aType, aName)); + aList.addAll(BonusUtilities.getBonusFromList(stat.getBonusList(), + aType, aName)); } return aList; Modified: Trunk/pcgen/code/src/java/pcgen/core/TextProperty.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/TextProperty.java 2008-09-17 09:03:13 UTC (rev 7749) +++ Trunk/pcgen/code/src/java/pcgen/core/TextProperty.java 2008-09-18 00:08:41 UTC (rev 7750) @@ -90,34 +90,13 @@ } /** - * Parse the property, replace the %CHOICE - * @param text - * @return Parsed property, with replaced the %CHOICE - */ - public String parse(String text) { - for (int i = 0; i < getAssociatedCount(); i++) { - text = text.replaceFirst("%CHOICE", getAssociated(i)); - } - return text; - } - - /** * Get the parsed text (%CHOICEs replaced) - * @return the parsed text (%CHOICEs replaced) - */ - public String getParsedText() - { - return parse(getText()); - } - - /** - * Get the parsed text (%CHOICEs replaced) * @param pc * @return Get the parsed text (%CHOICEs replaced) */ public String getParsedText(final PlayerCharacter pc, final VariableContainer anOwner) { - return getParsedText(pc, parse(getText()), anOwner); + return getParsedText(pc, getText(), anOwner); } protected String getParsedText(final PlayerCharacter pc, final String fullDesc, final VariableContainer anOwner) Modified: Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorPC.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorPC.java 2008-09-17 09:03:13 UTC (rev 7749) +++ Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorPC.java 2008-09-18 00:08:41 UTC (rev 7750) @@ -152,7 +152,7 @@ } else { - count += Math.max(1, feat.getAssociatedCount()); + count += Math.max(1, getPc().getAssociationCount(feat)); } } } @@ -167,7 +167,7 @@ } else { - count += Math.max(1, feat.getAssociatedCount()); + count += Math.max(1, getPc().getAssociationCount(feat)); } } } Modified: Trunk/pcgen/code/src/java/pcgen/core/analysis/SkillCostCalc.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/analysis/SkillCostCalc.java 2008-09-17 09:03:13 UTC (rev 7749) +++ Trunk/pcgen/code/src/java/pcgen/core/analysis/SkillCostCalc.java 2008-09-18 00:08:41 UTC (rev 7750) @@ -54,7 +54,7 @@ String keyName = sk.getKeyName(); - if (aPC.getRace().hasCSkill(keyName)) + if (aPC.getRace().hasCSkill(aPC, keyName)) { return true; } @@ -66,13 +66,13 @@ } // hasCSkill is a class.lst loader skill - if (aClass.hasCSkill(keyName)) + if (aClass.hasCSkill(aPC, keyName)) { return true; } // test for SKILLLIST skill - if (aClass.hasClassSkill(keyName)) + if (aClass.hasClassSkill(aPC, keyName)) { return true; } @@ -89,20 +89,20 @@ { if ((aCD.getDomain() != null) && aCD.isFromPCClass(aClass.getKeyName()) - && aCD.getDomain().hasCSkill(keyName)) + && aCD.getDomain().hasCSkill(aPC, keyName)) { return true; } } - if ((aPC.getDeity() != null) && aPC.getDeity().hasCSkill(keyName)) + if ((aPC.getDeity() != null) && aPC.getDeity().hasCSkill(aPC, keyName)) { return true; } for (Ability aFeat : aPC.getFullAbilitySet()) { - if (aFeat.hasCSkill(keyName)) + if (aFeat.hasCSkill(aPC, keyName)) { return true; } @@ -111,7 +111,7 @@ List<Skill> skillList = new ArrayList<Skill>(aPC.getSkillList()); for (Skill aSkill : skillList) { - if (aSkill.hasCSkill(keyName)) + if (aSkill.hasCSkill(aPC, keyName)) { return true; } @@ -123,14 +123,14 @@ { if (eq.isEquipped()) { - if (eq.hasCSkill(keyName)) + if (eq.hasCSkill(aPC, keyName)) { return true; } for (EquipmentModifier eqMod : eq.getEqModifierList(true)) { - if (eqMod.hasCSkill(keyName)) + if (eqMod.hasCSkill(aPC, keyName)) { return true; } @@ -138,7 +138,7 @@ for (EquipmentModifier eqMod : eq.getEqModifierList(false)) { - if (eqMod.hasCSkill(keyName)) + if (eqMod.hasCSkill(aPC, keyName)) { return true; } @@ -148,7 +148,7 @@ for (PCTemplate aTemplate : aPC.getTemplateList()) { - if (aTemplate.hasCSkill(keyName)) + if (aTemplate.hasCSkill(aPC, keyName)) { return true; } @@ -222,7 +222,7 @@ } String keyName = sk.getKeyName(); - if (aPC.getRace().hasCcSkill(keyName)) + if (aPC.getRace().hasCcSkill(aPC, keyName)) { return true; } @@ -231,18 +231,18 @@ { if ((aCD.getDomain() != null) && aCD.isFromPCClass(aClass.getKeyName()) - && aCD.getDomain().hasCcSkill(keyName)) + && aCD.getDomain().hasCcSkill(aPC, keyName)) { return true; } } - if ((aPC.getDeity() != null) && aPC.getDeity().hasCcSkill(keyName)) + if ((aPC.getDeity() != null) && aPC.getDeity().hasCcSkill(aPC, keyName)) { return true; } - if (aClass.hasCcSkill(keyName)) + if (aClass.hasCcSkill(aPC, keyName)) { return true; } @@ -257,7 +257,7 @@ for (Ability feat : aPC.getFullAbilitySet()) { - if (feat.hasCcSkill(keyName)) + if (feat.hasCcSkill(aPC, keyName)) { return true; } @@ -266,7 +266,7 @@ List<Skill> skillList = new ArrayList<Skill>(aPC.getSkillList()); for (Skill aSkill : skillList) { - if (aSkill.hasCcSkill(keyName)) + if (aSkill.hasCcSkill(aPC, keyName)) { return true; } @@ -276,14 +276,14 @@ { if (eq.isEquipped()) { - if (eq.hasCcSkill(keyName)) + if (eq.hasCcSkill(aPC, keyName)) { return true; } for (EquipmentModifier eqMod : eq.getEqModifierList(true)) { - if (eqMod.hasCcSkill(keyName)) + if (eqMod.hasCcSkill(aPC, keyName)) { return true; } @@ -291,7 +291,7 @@ for (EquipmentModifier eqMod : eq.getEqModifierList(false)) { - if (eqMod.hasCcSkill(keyName)) + if (eqMod.hasCcSkill(aPC, keyName)) { return true; } @@ -301,7 +301,7 @@ for (PCTemplate template : aPC.getTemplateList()) { - if (template.hasCcSkill(keyName)) + if (template.hasCcSkill(aPC, keyName)) { return true; } Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/HPChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/HPChoiceManager.java 2008-09-17 09:03:13 UTC (rev 7749) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/HPChoiceManager.java 2008-09-18 00:08:41 UTC (rev 7750) @@ -69,7 +69,7 @@ availableList.add(choiceSec); - for (int e1 = 0; e1 < pobject.getAssociatedCount(); ++e1) + for (int e1 = 0; e1 < aPc.getAssociationCount(pobject); ++e1) { selectedList.add(choiceSec); } Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/SAListChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/SAListChoiceManager.java 2008-09-17 09:03:13 UTC (rev 7749) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/SAListChoiceManager.java 2008-09-18 00:08:41 UTC (rev 7750) @@ -84,10 +84,9 @@ { // remove previous selections from special abilities // aBonusList contains all possible selections in form: <displayed info>|<special ability> - for (int e = 0; e < pobject.getAssociatedCount(); ++e) + for (String assoc : aPC.getAssociationList(pobject)) { - final String aString = pobject.getAssociated(e); - final String prefix = aString + "|"; + final String prefix = assoc + "|"; for ( String bString : aBonusList ) { Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/SpellLevelChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/SpellLevelChoiceManager.java 2008-09-17 09:03:13 UTC (rev 7749) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/SpellLevelChoiceManager.java 2008-09-18 00:08:41 UTC (rev 7750) @@ -124,13 +124,11 @@ // remove previous selections from bonuses // aBonusList contains the bonuses - for (int e = 0; e < pobject.getAssociatedCount(); ++e) + for (String assoc : aPc.getAssociationList(pobject)) { - final String aString = pobject.getAssociated(e); - for ( String bonus : aBonusList ) { - pobject.removeBonus(bonus, aString, aPc); + pobject.removeBonus(bonus, assoc, aPc); } } pobject.clearAssociated(); Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/SpellListChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/SpellListChoiceManager.java 2008-09-17 09:03:13 UTC (rev 7749) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/SpellListChoiceManager.java 2008-09-18 00:08:41 UTC (rev 7750) @@ -82,7 +82,7 @@ final List<String> availableList, final List<String> selectedList) { - if (Ability.class.isInstance(pobject) && chooseAbility()) + if (Ability.class.isInstance(pobject) && chooseAbility(aPc)) { setSpellListSelections(aPc, availableList, selectedList); @@ -175,10 +175,11 @@ * instance has its own list of choices. This routine get the user to * choose one of the instances. It returns 1 + the instances index, this is * the account for the item "New" which is first in the list. + * @param pc TODO * * @return true if a valid sub ability was chosen */ - private boolean chooseAbility() + private boolean chooseAbility(PlayerCharacter pc) { Ability anAbility = (Ability) pobject; int i; @@ -187,7 +188,7 @@ final StringBuffer sb = new StringBuffer(100); - for (int j = 0; j < anAbility.getAssociatedCount(); ++j) + for (int j = 0; j < pc.getAssociationCount(anAbility); ++j) { fmc = (FeatMultipleChoice) anAbility.getAssociatedList().get(j); sb.append(anAbility.getKeyName()).append(" ("); Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/UserInputChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/UserInputChoiceManager.java 2008-09-17 09:03:13 UTC (rev 7749) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/UserInputChoiceManager.java 2008-09-18 00:08:41 UTC (rev 7750) @@ -22,7 +22,6 @@ */ package pcgen.core.chooser; -import java.util.ArrayList; import java.util.List; import pcgen.cdom.base.Constants; @@ -70,11 +69,9 @@ final List<String> availableList, final List<String> selectedList) { - if (pobject.getAssociatedCount() != 0) + if (aPc.hasAssociations(pobject)) { - List<String> abilityKeys = new ArrayList<String>(); - pobject.addAssociatedTo( abilityKeys ); - selectedList.addAll(abilityKeys); + selectedList.addAll(aPc.getAssociationList(pobject)); } availableList.clear(); availableList.add(Constants.EMPTY_STRING); Modified: Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityFeat.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityFeat.java 2008-09-17 09:03:13 UTC (rev 7749) +++ Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityFeat.java 2008-09-18 00:08:41 UTC (rev 7750) @@ -85,13 +85,13 @@ public void subForLevel(final PlayerCharacter aPC) { // If nothing saved, then process as LevelAbility - if (getAssociatedCount(false) == 0) + if (!aPC.hasAssociations(this)) { super.subForLevel(aPC); } else { - for (int j = 0; j < getAssociatedCount(); ++j) + for (int j = 0; j < aPC.getAssociationCount(this); ++j) { String featKey = getAssociatedList().get(j).toString(); final Ability anAbility = Globals.getAbilityKeyed("FEAT", featKey); Modified: Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityWeaponBonus.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityWeaponBonus.java 2008-09-17 09:03:13 UTC (rev 7749) +++ Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityWeaponBonus.java 2008-09-18 00:08:41 UTC (rev 7750) @@ -69,11 +69,11 @@ if (aFeat != null) { - for (int ii = 0; ii < aFeat.getAssociatedCount(); ++ii) + for (String assoc : aPC.getAssociationList(aFeat)) { - if (!aArrayList.contains(aFeat.getAssociated(ii))) + if (!aArrayList.contains(assoc)) { - aArrayList.add(aFeat.getAssociated(ii)); + aArrayList.add(assoc); } } } Modified: Trunk/pcgen/code/src/java/pcgen/core/prereq/PrerequisiteUtilities.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/prereq/PrerequisiteUtilities.java 2008-09-17 09:03:13 UTC (rev 7749) +++ Trunk/pcgen/code/src/java/pcgen/core/prereq/PrerequisiteUtilities.java 2008-09-18 00:08:41 UTC (rev 7750) @@ -249,7 +249,7 @@ runningTotal++; if (ability.getSafe(ObjectKey.MULTIPLE_ALLOWED) && countMults) { - runningTotal += (ability.getAssociatedCount() - 1); + runningTotal += (character.getAssociationCount(ability) - 1); } } } @@ -338,7 +338,7 @@ if (aFeat.getSafe(ObjectKey.MULTIPLE_ALLOWED) && countMults) { runningTotal += - (aFeat.getAssociatedCount() - 1); + (character.getAssociationCount(aFeat) - 1); } } else @@ -347,8 +347,7 @@ if (wildCardPos > -1) { - for (int k = 0; k < aFeat - .getAssociatedCount(); ++k) + for (int k = 0; k < character.getAssociationCount(aFeat); ++k) { final String fString = ... [truncated message content] |
From: <jde...@us...> - 2008-09-18 16:17:25
|
Revision: 7754 http://pcgen.svn.sourceforge.net/pcgen/?rev=7754&view=rev Author: jdempsey Date: 2008-09-18 23:17:30 +0000 (Thu, 18 Sep 2008) Log Message: ----------- FReq: [4E] Allow .MOD of ASPECT tag for Abilities and Feats Issue#: 2099750 Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/base/util/DoubleKeyMap.java Trunk/pcgen/code/src/java/pcgen/cdom/base/CDOMObject.java Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/AspectName.java Trunk/pcgen/code/src/java/pcgen/cdom/helper/Aspect.java Trunk/pcgen/code/src/java/pcgen/cdom/util/MapKeyMap.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/gui/tabs/ability/AbilityInfoPanel.java Trunk/pcgen/code/src/java/pcgen/io/exporttoken/AbilityToken.java Trunk/pcgen/code/src/java/pcgen/rules/context/ConsolidatedObjectCommitStrategy.java Trunk/pcgen/code/src/java/pcgen/rules/context/ObjectCommitStrategy.java Trunk/pcgen/code/src/java/pcgen/rules/context/ObjectContext.java Trunk/pcgen/code/src/java/plugin/lsttokens/ability/AspectToken.java Trunk/pcgen/code/src/test/pcgen/io/exporttoken/AbilityTokenTest.java Trunk/pcgen/code/src/utest/pcgen/cdom/util/MapKeyMapTest.java Added Paths: ----------- Trunk/pcgen/code/src/java/pcgen/rules/context/MapChanges.java Modified: Trunk/pcgen/code/src/java/pcgen/base/util/DoubleKeyMap.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/base/util/DoubleKeyMap.java 2008-09-18 04:10:16 UTC (rev 7753) +++ Trunk/pcgen/code/src/java/pcgen/base/util/DoubleKeyMap.java 2008-09-18 23:17:30 UTC (rev 7754) @@ -235,6 +235,25 @@ } /** + * Retrieves the Map from DoubleKeyMap for the given primary key. If this DoubleKeyMap + * does not a mapping for the given key, an empty map is returned. + * + * @param key1 + * The primary key for retrieving the map + * @return Map<K2, V> The map stored for the given key + */ + public Map<K2, V> getMapFor(K1 key1) + { + Map<K2, V> localMap = map.get(key1); + Map<K2, V> copy = new HashMap<K2, V>(); + if (localMap != null) + { + copy.putAll(localMap); + } + return copy; + } + + /** * Returns trus if the DoubleKeyMap contains a value stored under the given * primary key and any secondary key. * Modified: Trunk/pcgen/code/src/java/pcgen/cdom/base/CDOMObject.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/base/CDOMObject.java 2008-09-18 04:10:16 UTC (rev 7753) +++ Trunk/pcgen/code/src/java/pcgen/cdom/base/CDOMObject.java 2008-09-18 23:17:30 UTC (rev 7754) @@ -27,14 +27,17 @@ import java.util.Set; import pcgen.base.formula.Formula; +import pcgen.base.util.DoubleKeyMap; import pcgen.base.util.DoubleKeyMapToList; import pcgen.cdom.enumeration.FormulaKey; import pcgen.cdom.enumeration.IntegerKey; import pcgen.cdom.enumeration.ListKey; +import pcgen.cdom.enumeration.MapKey; import pcgen.cdom.enumeration.ObjectKey; import pcgen.cdom.enumeration.StringKey; import pcgen.cdom.enumeration.VariableKey; import pcgen.cdom.util.ListKeyMapToList; +import pcgen.cdom.util.MapKeyMap; import pcgen.core.PlayerCharacter; public abstract class CDOMObject extends ConcretePrereqObject implements @@ -70,7 +73,11 @@ // TODO Make this private once PObject is cleaned up protected ListKeyMapToList listChar = new ListKeyMapToList(); + /** A map of Maps for the object */ // TODO make this final once clone() is no longer required... + private MapKeyMap mapChar = new MapKeyMap(); + + // TODO make this final once clone() is no longer required... private DoubleKeyMapToList<CDOMReference<? extends CDOMList<? extends PrereqObject>>, CDOMReference<?>, AssociatedPrereqObject> cdomListMods = new DoubleKeyMapToList<CDOMReference<? extends CDOMList<? extends PrereqObject>>, CDOMReference<?>, AssociatedPrereqObject>(); public final boolean containsKey(IntegerKey arg0) @@ -282,6 +289,102 @@ return listChar.getKeySet(); } + // ===== MapKeyMap Methods ===== + + /** + * Add a value to the map of maps. + * + * @param mk The MapKey we are adding an entry to + * @param key The key to assign against + * @param value The value to be stored. + */ + public final <K, V> void addToMapFor(MapKey<K, V> mk, K key, V value) + { + mapChar.addToMapFor(mk, key, value); + } + + /** + * Remove a value from the map of maps. + * + * @param mk The MapKey we are removing an entry from + * @param key The key to eject + */ + public final <K, V> void removeFromMapFor(MapKey<K, V> mk, K key) + { + mapChar.removeFromMapFor(mk, key); + } + + /** + * Remove a map from the map of maps. + * + * @param mk The MapKey we are removing + */ + public final <K, V> void removeMapFor(MapKey<K, V> mk) + { + mapChar.removeMapFor(mk); + } + + /** + * Retrieve the map of keys and values for the MapKey. + * + * @param mk The MapKey we are retrieving + * @return The map of keys and values. + */ + public final <K, V> Map<K, V> getMapFor(MapKey<K, V> mk) + { + return mapChar.getMapFor(mk); + } + + /** + * Retrieve the set of keys for the MapKey. + * + * @param mk The MapKey we are retrieving + * @return The set of keys. + */ + public final <K, V> Set<K> getKeysFor(MapKey<K, V> mk) + { + return mapChar.getKeysFor(mk); + } + + /** + * Get the value for the given MapKey and secondary key. If there is + * not a mapping for the given keys, null is returned. + * + * @param mk + * The MapKey for retrieving the given value + * @param key2 + * The secondary key for retrieving the given value + * @return Object The value stored for the given keys + */ + public final <K, V> V get(MapKey<K, V> mk, K key2) + { + return mapChar.get(mk, key2); + } + + /** + * Remove the value associated with the primary and secondary keys + * from the map. + * + * @param mk The MapKey of the entry we are removing + * @param key2 The secondary key of the entry we are removing + * @return true if the key and its associated value were successfully removed + * from the map; false otherwise + */ + public final <K, V> boolean removeFromMap(MapKey<K, V> mk, K key2) + { + return mapChar.removeFromMapFor(mk, key2); + } + + /** + * Retrieve the set of mapkeys held. + * + * @return The set of mapkeys. + */ + public final Set<MapKey<?, ?>> getMapKeys() + { + return mapChar.getKeySet(); + } + public String getKeyName() { // FIXME TODO Patched for now to avoid NPEs, but this is wrong @@ -294,6 +397,11 @@ return returnKey; } + public final int getSafeSizeOfMapFor(MapKey<?, ?> key) + { + return mapChar.containsMapFor(key) ? mapChar.getKeysFor(key).size() : 0; + } + public String getDisplayName() { return this.get(StringKey.NAME); Modified: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/AspectName.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/AspectName.java 2008-09-18 04:10:16 UTC (rev 7753) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/AspectName.java 2008-09-18 23:17:30 UTC (rev 7754) @@ -40,7 +40,7 @@ * @author James Dempsey <jde...@us...> * @version $Revision: $ */ -public final class AspectName implements TypeSafeConstant +public final class AspectName implements TypeSafeConstant, Comparable<AspectName> { /** This Map contains the mappings from Strings to the Type Safe Constant. */ @@ -183,4 +183,12 @@ } } + /* (non-Javadoc) + * @see java.lang.Comparable#compareTo(java.lang.Object) + */ + public int compareTo(AspectName o) + { + return fieldName.compareTo(o.fieldName); + } + } Modified: Trunk/pcgen/code/src/java/pcgen/cdom/helper/Aspect.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/helper/Aspect.java 2008-09-18 04:10:16 UTC (rev 7753) +++ Trunk/pcgen/code/src/java/pcgen/cdom/helper/Aspect.java 2008-09-18 23:17:30 UTC (rev 7754) @@ -219,6 +219,16 @@ { return key.toString(); } + + /** + * Gets the key of the aspect. + * + * @return the aspect key + */ + public AspectName getKey() + { + return key; + } /** * Gets the name string after having substituting all variables. Modified: Trunk/pcgen/code/src/java/pcgen/cdom/util/MapKeyMap.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/util/MapKeyMap.java 2008-09-18 04:10:16 UTC (rev 7753) +++ Trunk/pcgen/code/src/java/pcgen/cdom/util/MapKeyMap.java 2008-09-18 23:17:30 UTC (rev 7754) @@ -146,20 +146,59 @@ } /** - * Removes the given value from the list for the given ListKey. Returns true - * if the value was successfully removed from the list for the given - * ListKey. Returns false if there is not a list for the given ListKey or if - * the list for the given ListKey did not contain the given value object. + * Returns a copy of the List contained in this MapKeyMap for the + * given ListKey. This method returns null if the given key is not in this + * MapKeyMap. * + * This method is value-semantic in that no changes are made to the object + * passed into the method and ownership of the returned List is transferred + * to the class calling this method. + * * @param key - * The ListKey indicating which List the given object should be + * The ListKey for which a copy of the list should be returned. + * @return a copy of the List contained in this MapKeyMap for the + * given key; null if the given key is not a key in this + * MapKeyMap. + */ + public <K, V> Map<K, V> getMapFor(MapKey<K, V> key1) + { + return map.getMapFor(key1); + } + + /** + * Returns a Set of the secondary keys for the given primary key in this + * MapKeyMap. This method returns an empty set if the given key is not in this + * MapKeyMap. + * + * Note: This Set is reference-semantic. The ownership of the Set is + * transferred to the calling Object; therefore, changes to the returned Set + * will NOT impact the MapKeyMap. + * + * @param key + * The MapKey for which a copy of the keys should be returned. + * @return A <tt>Set</tt> of secondary key objects for the given primary + * key. + */ + public <K, V> Set<K> getKeysFor(MapKey<K, V> key1) + { + return map.getSecondaryKeySet(key1); + } + + /** + * Removes the given value from the map for the given MapKey. Returns true + * if the value was successfully removed from the map for the given + * MapKey. Returns false if there is not a map for the given MapKey or if + * the map for the given MapKey did not contain the given secondary key. + * + * @param key1 + * The MapKey indicating which Map the given object should be * removed from - * @param value - * The value to be removed from the List for the given key - * @return true if the value was successfully removed from the list for the - * given key; false otherwise + * @param key2 + * The key to be removed from the Map + * @return true if the key and its associated value were successfully removed + * from the map; false otherwise */ - public <K, V> boolean removeFromListFor(MapKey<K, V> key1, K key2) + public <K, V> boolean removeFromMapFor(MapKey<K, V> key1, K key2) { return map.remove(key1, key2) != null; } Modified: Trunk/pcgen/code/src/java/pcgen/core/PCClass.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-09-18 04:10:16 UTC (rev 7753) +++ Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-09-18 23:17:30 UTC (rev 7754) @@ -3964,13 +3964,13 @@ // Go through the specialty list (SA) and adjust the class to the new // name // - for (int lev : mapChar.getSecondaryKeySet(MapKey.SAB)) + for (int lev : mapListChar.getSecondaryKeySet(MapKey.SAB)) { - for (SpecialAbility sa : mapChar.getListFor(MapKey.SAB, lev)) + for (SpecialAbility sa : mapListChar.getListFor(MapKey.SAB, lev)) { if (sa.getSASource().length() != 0) { - mapChar.removeFromListFor(MapKey.SAB, lev, sa); + mapListChar.removeFromListFor(MapKey.SAB, lev, sa); sa = new SpecialAbility(sa.getKeyName(), sa .getSASource(), sa.getSADesc()); @@ -5018,9 +5018,9 @@ setRegionString(otherClass.getRegionString()); } - for (int lev : otherClass.mapChar.getSecondaryKeySet(MapKey.SAB)) + for (int lev : otherClass.mapListChar.getSecondaryKeySet(MapKey.SAB)) { - for (SpecialAbility sa : otherClass.mapChar.getListFor(MapKey.SAB, + for (SpecialAbility sa : otherClass.mapListChar.getListFor(MapKey.SAB, lev)) { addSAB(sa, lev); Modified: Trunk/pcgen/code/src/java/pcgen/core/PObject.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-09-18 04:10:16 UTC (rev 7753) +++ Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-09-18 23:17:30 UTC (rev 7754) @@ -96,7 +96,7 @@ private static boolean dontRecurse = false; /** A map of Lists for the object */ - protected final MapKeyMapToList mapChar = new MapKeyMapToList(); + protected final MapKeyMapToList mapListChar = new MapKeyMapToList(); /** List of associated items for the object */ // TODO Contains strings or FeatMultipleObjects @@ -1363,22 +1363,22 @@ public void addSAB(SpecialAbility sa, int level) { - mapChar.addToListFor(MapKey.SAB, level, sa); + mapListChar.addToListFor(MapKey.SAB, level, sa); } public void clearSABList(int level) { - mapChar.removeListFor(MapKey.SAB, level); + mapListChar.removeListFor(MapKey.SAB, level); } public void clearAllSABLists() { - mapChar.removeListsFor(MapKey.SAB); + mapListChar.removeListsFor(MapKey.SAB); } public void removeSAB(String s, int level) { - List<SpecialAbility> sabs = mapChar.getListFor(MapKey.SAB, level); + List<SpecialAbility> sabs = mapListChar.getListFor(MapKey.SAB, level); if (sabs != null) { for (SpecialAbility sa : sabs) @@ -1386,7 +1386,7 @@ if (sa.getDisplayName().equals(s) || sa.getDisplayName().startsWith(s + "|")) { - mapChar.removeFromListFor(MapKey.SAB, level, sa); + mapListChar.removeFromListFor(MapKey.SAB, level, sa); } } } @@ -1394,9 +1394,9 @@ public void addSABToList(List<SpecialAbility> saList, PlayerCharacter pc) { - for (Integer lvl : mapChar.getSecondaryKeySet(MapKey.SAB)) + for (Integer lvl : mapListChar.getSecondaryKeySet(MapKey.SAB)) { - List<SpecialAbility> sabs = mapChar.getListFor(MapKey.SAB, lvl); + List<SpecialAbility> sabs = mapListChar.getListFor(MapKey.SAB, lvl); if (sabs != null) { for (SpecialAbility sa : sabs) @@ -1862,7 +1862,7 @@ */ public final void addAutoArray(String arrayName, String item) { - mapChar.addToListFor(MapKey.AUTO_ARRAY, arrayName, item); + mapListChar.addToListFor(MapKey.AUTO_ARRAY, arrayName, item); } /** @@ -1886,7 +1886,7 @@ */ public final void clearAutoMap() { - mapChar.removeListsFor(MapKey.AUTO_ARRAY); + mapListChar.removeListsFor(MapKey.AUTO_ARRAY); } /** @@ -1896,17 +1896,17 @@ */ public final void clearAutoTag(String tag) { - mapChar.removeListFor(MapKey.AUTO_ARRAY, tag); + mapListChar.removeListFor(MapKey.AUTO_ARRAY, tag); } public final Set<String> getAutoMapKeys() { - return mapChar.getSecondaryKeySet(MapKey.AUTO_ARRAY); + return mapListChar.getSecondaryKeySet(MapKey.AUTO_ARRAY); } public final List<String> getAuto(String tag) { - return mapChar.getListFor(MapKey.AUTO_ARRAY, tag); + return mapListChar.getListFor(MapKey.AUTO_ARRAY, tag); } /** @@ -2229,12 +2229,12 @@ txt.append("\tKEY:").append(getKeyName()); // } - Set<String> aaKeys = mapChar.getSecondaryKeySet(MapKey.AUTO_ARRAY); + Set<String> aaKeys = mapListChar.getSecondaryKeySet(MapKey.AUTO_ARRAY); if (aaKeys != null) { for (String s : aaKeys) { - List<String> values = mapChar.getListFor(MapKey.AUTO_ARRAY, s); + List<String> values = mapListChar.getListFor(MapKey.AUTO_ARRAY, s); for (String value : values) { if (value != null && value.trim().length() > 0) @@ -2620,7 +2620,7 @@ */ public final void addAutoTagsToList(final String tag, final Collection aList, final PlayerCharacter aPC, boolean expandWeaponTypes) { - List<String> list = mapChar.getListFor(MapKey.AUTO_ARRAY, tag); + List<String> list = mapListChar.getListFor(MapKey.AUTO_ARRAY, tag); if (list == null) { Modified: Trunk/pcgen/code/src/java/pcgen/gui/tabs/ability/AbilityInfoPanel.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/tabs/ability/AbilityInfoPanel.java 2008-09-18 04:10:16 UTC (rev 7753) +++ Trunk/pcgen/code/src/java/pcgen/gui/tabs/ability/AbilityInfoPanel.java 2008-09-18 23:17:30 UTC (rev 7754) @@ -35,6 +35,7 @@ import java.awt.GridBagLayout; import java.math.BigDecimal; import java.util.List; +import java.util.Set; import javax.swing.BorderFactory; import javax.swing.JPanel; @@ -42,7 +43,9 @@ import javax.swing.border.TitledBorder; import pcgen.base.lang.StringUtil; +import pcgen.cdom.enumeration.AspectName; import pcgen.cdom.enumeration.ListKey; +import pcgen.cdom.enumeration.MapKey; import pcgen.cdom.enumeration.ObjectKey; import pcgen.cdom.helper.Aspect; import pcgen.core.Ability; @@ -179,12 +182,13 @@ "in_InfoDescription", //$NON-NLS-1$ theAbility.piDescSubString(thePC))); - if (theAbility.getSizeOfListFor(ListKey.ASPECT) > 0) + if (theAbility.getSafeSizeOfMapFor(MapKey.ASPECT) > 0) { - List<Aspect> aspectList = theAbility.getSafeListFor(ListKey.ASPECT); + Set<AspectName> aspectKeys = theAbility.getKeysFor(MapKey.ASPECT); StringBuffer buff = new StringBuffer(); - for (Aspect aspect : aspectList) + for (AspectName key : aspectKeys) { + Aspect aspect = theAbility.get(MapKey.ASPECT, key); if (buff.length() > 0) { buff.append(", "); Modified: Trunk/pcgen/code/src/java/pcgen/io/exporttoken/AbilityToken.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/exporttoken/AbilityToken.java 2008-09-18 04:10:16 UTC (rev 7753) +++ Trunk/pcgen/code/src/java/pcgen/io/exporttoken/AbilityToken.java 2008-09-18 23:17:30 UTC (rev 7754) @@ -25,10 +25,17 @@ import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import java.util.SortedSet; import java.util.StringTokenizer; +import java.util.TreeSet; +import pcgen.cdom.enumeration.AspectName; import pcgen.cdom.enumeration.ListKey; +import pcgen.cdom.enumeration.MapKey; import pcgen.cdom.enumeration.ObjectKey; import pcgen.cdom.helper.Aspect; import pcgen.core.Ability; @@ -363,7 +370,7 @@ } else if (tokenSource.endsWith(".ASPECTCOUNT")) { - retString += aAbility.getSizeOfListFor(ListKey.ASPECT); + retString += aAbility.getSafeSizeOfMapFor(MapKey.ASPECT); } else if (tokenSource.indexOf(".HASASPECT.") > -1) { @@ -402,10 +409,13 @@ */ private String getAspectString(PlayerCharacter pc, Ability ability) { - List<Aspect> aspectList = ability.getSafeListFor(ListKey.ASPECT); + Set<AspectName> aspectKeys = ability.getKeysFor(MapKey.ASPECT); + SortedSet<AspectName> sortedKeys = new TreeSet<AspectName>(aspectKeys); + //List<Aspect> aspectList = ability.getSafeListFor(ListKey.ASPECT); StringBuffer buff = new StringBuffer(); - for (Aspect aspect : aspectList) + for (AspectName key : sortedKeys) { + Aspect aspect = ability.get(MapKey.ASPECT, key); if (buff.length() > 0) { buff.append(", "); @@ -444,9 +454,12 @@ Aspect target = null; if (index > -1) { - if (index < ability.getSizeOfListFor(ListKey.ASPECT)) + if (index < ability.getSafeSizeOfMapFor(MapKey.ASPECT)) { - target = ability.getElementInList(ListKey.ASPECT, index); + Set<AspectName> aspectKeys = ability.getKeysFor(MapKey.ASPECT); + List<AspectName> sortedKeys = new ArrayList<AspectName>(aspectKeys); + Collections.sort(sortedKeys); + target = ability.get(MapKey.ASPECT, sortedKeys.get(index)); } } else @@ -496,15 +509,7 @@ return null; } - List<Aspect> aspectList = ability.getSafeListFor(ListKey.ASPECT); - for (Aspect aspect : aspectList) - { - if (key.equals(aspect.getName())) - { - return aspect; - } - } - return null; + return ability.get(MapKey.ASPECT, AspectName.getConstant(key)); } /** Modified: Trunk/pcgen/code/src/java/pcgen/rules/context/ConsolidatedObjectCommitStrategy.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/rules/context/ConsolidatedObjectCommitStrategy.java 2008-09-18 04:10:16 UTC (rev 7753) +++ Trunk/pcgen/code/src/java/pcgen/rules/context/ConsolidatedObjectCommitStrategy.java 2008-09-18 23:17:30 UTC (rev 7754) @@ -29,6 +29,7 @@ import pcgen.cdom.enumeration.FormulaKey; import pcgen.cdom.enumeration.IntegerKey; import pcgen.cdom.enumeration.ListKey; +import pcgen.cdom.enumeration.MapKey; import pcgen.cdom.enumeration.ObjectKey; import pcgen.cdom.enumeration.StringKey; import pcgen.cdom.enumeration.VariableKey; @@ -151,11 +152,27 @@ cdo.removeFromListFor(lk, val); } + public <K, V> void put(CDOMObject cdo, MapKey<K, V> mk, K key, V value) + { + cdo.addToMapFor(mk, key, value); + } + + public <K, V> void remove(CDOMObject cdo, MapKey<K, V> mk, K key) + { + cdo.removeFromMapFor(mk, key); + } + public void put(ConcretePrereqObject cpo, Prerequisite p) { cpo.addPrerequisite(p); } + public <K, V> MapChanges<K, V> getMapChanges(CDOMObject cdo, MapKey<K, V> mk) + { + return new MapChanges<K, V>(cdo.getMapFor(mk), null, false); + } + + public Changes<Prerequisite> getPrerequisiteChanges(ConcretePrereqObject obj) { return new CollectionChanges<Prerequisite>(obj.getPrerequisiteList(), Added: Trunk/pcgen/code/src/java/pcgen/rules/context/MapChanges.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/rules/context/MapChanges.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/rules/context/MapChanges.java 2008-09-18 23:17:30 UTC (rev 7754) @@ -0,0 +1,49 @@ +package pcgen.rules.context; + +import java.util.Map; + + +public class MapChanges<K, V> +{ + private final Map<K, V> positive; + private final Map<K, V> negative; + private final boolean clear; + + public MapChanges(Map<K, V> added, Map<K, V> removed, + boolean globallyCleared) + { + positive = added; + negative = removed; + clear = globallyCleared; + } + + public boolean includesGlobalClear() + { + return clear; + } + + public boolean isEmpty() + { + return !clear && !hasAddedItems() && !hasRemovedItems(); + } + + public Map<K, V> getAdded() + { + return positive; + } + + public boolean hasAddedItems() + { + return positive != null && !positive.isEmpty(); + } + + public Map<K, V> getRemoved() + { + return negative; + } + + public boolean hasRemovedItems() + { + return negative != null && !negative.isEmpty(); + } +} Modified: Trunk/pcgen/code/src/java/pcgen/rules/context/ObjectCommitStrategy.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/rules/context/ObjectCommitStrategy.java 2008-09-18 04:10:16 UTC (rev 7753) +++ Trunk/pcgen/code/src/java/pcgen/rules/context/ObjectCommitStrategy.java 2008-09-18 23:17:30 UTC (rev 7754) @@ -26,6 +26,7 @@ import pcgen.cdom.enumeration.FormulaKey; import pcgen.cdom.enumeration.IntegerKey; import pcgen.cdom.enumeration.ListKey; +import pcgen.cdom.enumeration.MapKey; import pcgen.cdom.enumeration.ObjectKey; import pcgen.cdom.enumeration.StringKey; import pcgen.cdom.enumeration.VariableKey; @@ -62,6 +63,12 @@ public <T> Changes<T> getListChanges(CDOMObject cdo, ListKey<T> lk); + public <K, V> void put(CDOMObject cdo, MapKey<K, V> mk, K key, V value); + + public <K, V> void remove(CDOMObject cdo, MapKey<K, V> mk, K key); + + public <K, V> MapChanges<K, V> getMapChanges(CDOMObject cdo, MapKey<K, V> mk); + public void setExtractURI(URI extractURI); public void setSourceURI(URI sourceURI); Modified: Trunk/pcgen/code/src/java/pcgen/rules/context/ObjectContext.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/rules/context/ObjectContext.java 2008-09-18 04:10:16 UTC (rev 7753) +++ Trunk/pcgen/code/src/java/pcgen/rules/context/ObjectContext.java 2008-09-18 23:17:30 UTC (rev 7754) @@ -32,6 +32,7 @@ import pcgen.cdom.enumeration.FormulaKey; import pcgen.cdom.enumeration.IntegerKey; import pcgen.cdom.enumeration.ListKey; +import pcgen.cdom.enumeration.MapKey; import pcgen.cdom.enumeration.ObjectKey; import pcgen.cdom.enumeration.StringKey; import pcgen.cdom.enumeration.VariableKey; @@ -84,6 +85,11 @@ edits.addToList(cdo, key, value); } + public <K, V> void put(CDOMObject cdo, MapKey<K, V> mk, K key, V value) + { + edits.put(cdo, mk, key, value); + } + public void put(CDOMObject cdo, FormulaKey fk, Formula f) { edits.put(cdo, fk, f); @@ -113,7 +119,7 @@ { edits.put(cdo, vk, f); } - + // public void give(String sourceToken, CDOMObject cdo, PrereqObject target) // { // addToList(cdo, ListKey.GIVEN, new SourceWrapper(target, sourceToken)); @@ -143,6 +149,11 @@ edits.removeList(cdo, lk); } + public <K, V> void remove(CDOMObject cdo, MapKey<K, V> mk, K key) + { + edits.remove(cdo, mk, key); + } + public void commit() { for (URI uri : edits.globalClearSet.getKeySet()) @@ -172,6 +183,10 @@ { removeListKey(cdo, key, neg); } + for (MapKey<?, ?> key1 : neg.getMapKeys()) + { + removeMapKey(cdo, key1, neg); + } } } } @@ -212,6 +227,10 @@ { putListKey(cdo, key, pos); } + for (MapKey<?, ?> key1 : pos.getMapKeys()) + { + putMapKey(cdo, key1, pos); + } /* * TODO CDOM List Mods */ @@ -260,6 +279,25 @@ commit.put(cdo, key, neg.get(key)); } + private <K, V> void removeMapKey(CDOMObject cdo, MapKey<K, V> key1, + CDOMObject neg) + { + Set<K> secKeys = neg.getKeysFor(key1); + for (K key2 : secKeys) + { + commit.remove(cdo, key1, key2); + } + } + + private <K, V>void putMapKey(CDOMObject cdo, MapKey<K, V> key1, CDOMObject pos) + { + Set<K> secKeys = pos.getKeysFor(key1); + for (K key2 : secKeys) + { + commit.put(cdo, key1, key2, pos.get(key1, key2)); + } + } + public void rollback() { edits.decommit(); @@ -280,6 +318,11 @@ return commit.getListChanges(cdo, lk); } + public <K, V> MapChanges<K, V> getMapChanges(CDOMObject cdo, MapKey<K, V> mk) + { + return commit.getMapChanges(cdo, mk); + } + // public <T> Changes<T> getGivenChanges(String sourceToken, CDOMObject cdo, Class<T> cl) // { // return new GivenChanges<T>(cl, sourceToken, commit.getListChanges(cdo, ListKey.GIVEN)); @@ -422,6 +465,26 @@ getNegative(sourceURI, cdo).addToListFor(lk, val); } + // ==== MapKey manipulation functions ==== + + public <K, V> void put(CDOMObject cdo, MapKey<K, V> mk, K key, V value) + { + getPositive(sourceURI, cdo).addToMapFor(mk, key, value); + } + + public <K, V> void remove(CDOMObject cdo, MapKey<K, V> mk, K key) + { + getNegative(sourceURI, cdo).addToMapFor(mk, key, null); + } + + public <K, V> MapChanges<K, V> getMapChanges(CDOMObject cdo, MapKey<K, V> mk) + { + return new MapChanges<K, V>(getPositive(sourceURI, cdo).getMapFor( + mk), getNegative(sourceURI, cdo).getMapFor(mk), false); + } + + // ==== end of MapKey manipulation functions ==== + public String getString(CDOMObject cdo, StringKey sk) { String added = getPositive(extractURI, cdo).get(sk); Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/ability/AspectToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/ability/AspectToken.java 2008-09-18 04:10:16 UTC (rev 7753) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/ability/AspectToken.java 2008-09-18 23:17:30 UTC (rev 7754) @@ -27,12 +27,13 @@ import java.util.TreeSet; import pcgen.cdom.base.Constants; -import pcgen.cdom.enumeration.ListKey; +import pcgen.cdom.enumeration.AspectName; +import pcgen.cdom.enumeration.MapKey; import pcgen.cdom.helper.Aspect; import pcgen.core.Ability; import pcgen.io.EntityEncoder; -import pcgen.rules.context.Changes; import pcgen.rules.context.LoadContext; +import pcgen.rules.context.MapChanges; import pcgen.rules.persistence.token.CDOMPrimaryToken; import pcgen.util.Logging; @@ -96,8 +97,8 @@ + "format is: AspectName|Aspect value|Variable|... was: " + value); return false; } - context.getObjectContext().addToList(ability, ListKey.ASPECT, - parseAspect(key, val)); + Aspect a = parseAspect(key, val); + context.getObjectContext().put(ability, MapKey.ASPECT, a.getKey(), a); return true; } @@ -129,15 +130,17 @@ */ public String[] unparse(LoadContext context, Ability obj) { - Changes<Aspect> changes = - context.getObjectContext().getListChanges(obj, ListKey.ASPECT); + MapChanges<AspectName, Aspect> changes = + context.getObjectContext().getMapChanges(obj, MapKey.ASPECT); if (changes == null || changes.isEmpty()) { return null; } Set<String> set = new TreeSet<String>(); - for (Aspect q : changes.getAdded()) + Set<AspectName> keys = changes.getAdded().keySet(); + for (AspectName an : keys) { + Aspect q = changes.getAdded().get(an); set.add(new StringBuilder().append(q.getName()).append( Constants.PIPE).append(q.getPCCText()).toString()); } Modified: Trunk/pcgen/code/src/test/pcgen/io/exporttoken/AbilityTokenTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/io/exporttoken/AbilityTokenTest.java 2008-09-18 04:10:16 UTC (rev 7753) +++ Trunk/pcgen/code/src/test/pcgen/io/exporttoken/AbilityTokenTest.java 2008-09-18 23:17:30 UTC (rev 7754) @@ -25,7 +25,9 @@ import junit.framework.Test; import junit.framework.TestSuite; import pcgen.AbstractCharacterTestCase; +import pcgen.cdom.enumeration.AspectName; import pcgen.cdom.enumeration.ListKey; +import pcgen.cdom.enumeration.MapKey; import pcgen.cdom.enumeration.ObjectKey; import pcgen.cdom.helper.Aspect; import pcgen.core.Ability; @@ -78,11 +80,11 @@ Ability ab1 = TestHelper.makeAbility("Perform (Dance)", "FEAT", "General.Fighter"); ab1.put(ObjectKey.MULTIPLE_ALLOWED, Boolean.FALSE); ab1.put(ObjectKey.VISIBILITY, Visibility.DEFAULT); - ab1.addToListFor(ListKey.ASPECT, new Aspect("Colour", "Green")); - ab1.addToListFor(ListKey.ASPECT, new Aspect("Size", "L")); - ab1.addToListFor(ListKey.ASPECT, new Aspect("Shape", "Icosahedron")); - ab1.addToListFor(ListKey.ASPECT, new Aspect("Sides", "20")); - ab1.addToListFor(ListKey.ASPECT, new Aspect("Age In Years", "2000")); + ab1.addToMapFor(MapKey.ASPECT, AspectName.getConstant("Colour"), new Aspect("Colour", "Green")); + ab1.addToMapFor(MapKey.ASPECT, AspectName.getConstant("Size"), new Aspect("Size", "L")); + ab1.addToMapFor(MapKey.ASPECT, AspectName.getConstant("Shape"), new Aspect("Shape", "Icosahedron")); + ab1.addToMapFor(MapKey.ASPECT, AspectName.getConstant("Sides"), new Aspect("Sides", "20")); + ab1.addToMapFor(MapKey.ASPECT, AspectName.getConstant("Age In Years"), new Aspect("Age In Years", "2000")); character.addAbility(featCategory, ab1, null); } @@ -96,7 +98,7 @@ PlayerCharacter character = getCharacter(); assertEquals( - "Colour: Green, Size: L, Shape: Icosahedron, Sides: 20, Age In Years: 2000", + "Age In Years: 2000, Colour: Green, Shape: Icosahedron, Sides: 20, Size: L", tok.getToken("ABILITY.FEAT.0.ASPECT", character, eh)); } Modified: Trunk/pcgen/code/src/utest/pcgen/cdom/util/MapKeyMapTest.java =================================================================== --- Trunk/pcgen/code/src/utest/pcgen/cdom/util/MapKeyMapTest.java 2008-09-18 04:10:16 UTC (rev 7753) +++ Trunk/pcgen/code/src/utest/pcgen/cdom/util/MapKeyMapTest.java 2008-09-18 23:17:30 UTC (rev 7754) @@ -137,11 +137,11 @@ assertEquals("Validate initial value of breed", breedAspect, mapKeyMap .get(MapKey.ASPECT, breedKey)); assertTrue("Should be true as item is present", mapKeyMap - .removeFromListFor(MapKey.ASPECT, breedKey)); + .removeFromMapFor(MapKey.ASPECT, breedKey)); assertEquals("Validate breed is no longer present", null, mapKeyMap .get(MapKey.ASPECT, breedKey)); assertFalse("Should be false as item is no longer present", mapKeyMap - .removeFromListFor(MapKey.ASPECT, breedKey)); + .removeFromMapFor(MapKey.ASPECT, breedKey)); } /** @@ -184,12 +184,12 @@ assertTrue("Should have TEST now", mapKeyMap.containsMapFor(MapKey.TEST)); assertTrue("Should be true as item is present", mapKeyMap - .removeFromListFor(MapKey.TEST, "foo")); + .removeFromMapFor(MapKey.TEST, "foo")); assertTrue("Should have ASPECT", mapKeyMap.containsMapFor(MapKey.ASPECT)); assertFalse("Should not have TEST", mapKeyMap.containsMapFor(MapKey.TEST)); assertTrue("Should be true as item is present", mapKeyMap - .removeFromListFor(MapKey.ASPECT, breedKey)); + .removeFromMapFor(MapKey.ASPECT, breedKey)); assertTrue("Should still have ASPECT", mapKeyMap.containsMapFor(MapKey.ASPECT)); assertFalse("Should not have TEST", mapKeyMap.containsMapFor(MapKey.TEST)); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-09-25 02:59:34
|
Revision: 7784 http://pcgen.svn.sourceforge.net/pcgen/?rev=7784&view=rev Author: thpr Date: 2008-09-25 02:59:24 +0000 (Thu, 25 Sep 2008) Log Message: ----------- First set of changes on Associations (PC/Equip vs. PObject) Modified Paths: -------------- 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/Equipment.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/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/NoChoiceChoiceManager.java Trunk/pcgen/code/src/java/pcgen/core/chooser/SAListChoiceManager.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/SpellLevelChoiceManager.java Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityAbility.java Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityFeat.java Trunk/pcgen/code/src/java/pcgen/gui/EqBuilder.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 Trunk/pcgen/code/src/java/pcgen/persistence/lst/utils/FeatParser.java Trunk/pcgen/code/src/test/pcgen/cdom/helper/AspectTest.java Trunk/pcgen/code/src/test/pcgen/core/AbilityTest.java Trunk/pcgen/code/src/test/pcgen/core/AbilityUtilitiesTest.java Trunk/pcgen/code/src/test/pcgen/core/DescriptionTest.java Trunk/pcgen/code/src/test/pcgen/core/EquipmentModifierTest.java Trunk/pcgen/code/src/test/pcgen/core/PObjectTest.java Trunk/pcgen/code/src/test/pcgen/core/bonus/BonusTest.java Trunk/pcgen/code/src/test/pcgen/core/chooser/MiscChoiceManagerTest.java Trunk/pcgen/code/src/test/pcgen/core/prereq/PreFeatTest.java Trunk/pcgen/code/src/test/plugin/jepcommands/CountCommandTest.java Modified: Trunk/pcgen/code/src/java/pcgen/core/Ability.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Ability.java 2008-09-25 02:49:07 UTC (rev 7783) +++ Trunk/pcgen/code/src/java/pcgen/core/Ability.java 2008-09-25 02:59:24 UTC (rev 7784) @@ -666,7 +666,7 @@ for (int i = 0; i < selectedSize; ++i) { - anAbility.addAssociated((String) chooser.getSelectedList().get(i)); + aPC.addAssociation(anAbility, (String) chooser.getSelectedList().get(i)); } // aPC.calcActiveBonuses(); Modified: Trunk/pcgen/code/src/java/pcgen/core/AbilityUtilities.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/AbilityUtilities.java 2008-09-25 02:49:07 UTC (rev 7783) +++ Trunk/pcgen/code/src/java/pcgen/core/AbilityUtilities.java 2008-09-25 02:59:24 UTC (rev 7784) @@ -49,19 +49,19 @@ /** * Add the choices in the List to the ability if it is legal to do so. - * + * @param pc TODO * @param ability Ability to add the choices to * @param choices the iterable collection of choices to add */ private static void addChoicesToAbility( - final Ability ability, - final Iterable<String> choices) + PlayerCharacter pc, + final Ability ability, final Iterable<String> choices) { for ( final String choice : choices ) { if (ability.canAddAssociation(choice)) { - ability.addAssociated(choice); + pc.addAssociation(ability, choice); } } } @@ -71,16 +71,17 @@ * Clone anAbility, apply choices and add it to the addList, provided the * Ability allows it (if not isMultiples check if it's already there before * adding it). - * + * @param pc TODO * @param anAbility * @param choices * @param addList + * * @return the Ability added, or null if Ability was not added to the list. */ public static Ability addCloneOfAbilityToListwithChoices( + PlayerCharacter pc, final Ability anAbility, - final List<String> choices, - final List<Ability> addList) + final List<String> choices, final List<Ability> addList) { Ability newAbility = null; @@ -95,7 +96,7 @@ if (choices != null) { - addChoicesToAbility(newAbility, choices); + addChoicesToAbility(pc, newAbility, choices); } addList.add(newAbility); } @@ -109,7 +110,7 @@ * it in global Storage and, if it's there, clone it and add it the List. * If we got an ability, then add any sub choices from the name to the * associated list of the ability. - * + * @param pc TODO * @param theAbilityList A list of abilities to add to * @param category The category of Ability to add * @param abilityName The name of the Ability to Add @@ -117,9 +118,9 @@ * @return The Ability processed */ public static Ability addCloneOfGlobalAbilityToListWithChoices( + PlayerCharacter pc, final List<Ability> theAbilityList, - final String category, - final String abilityName) + final String category, final String abilityName) { final Collection<String> choices = new ArrayList<String>(); getUndecoratedName(abilityName, choices); @@ -130,7 +131,7 @@ if (anAbility == null) { - anAbility = cloneGlobalAbility(cat.getAbilityCategory(), abilityName); + anAbility = cloneGlobalAbility(pc, cat.getAbilityCategory(), abilityName); if (anAbility != null) { @@ -140,16 +141,16 @@ if (anAbility != null) { - addChoicesToAbility(anAbility, choices); + addChoicesToAbility(pc, anAbility, choices); } return anAbility; } public static Ability addCloneOfGlobalAbilityToListWithChoices( + PlayerCharacter pc, final List<Ability> anAbilityList, - final AbilityCategory aCategory, - final String aKey) + final AbilityCategory aCategory, final String aKey) { final Collection<String> choices = new ArrayList<String>(); getUndecoratedName(aKey, choices); @@ -158,7 +159,7 @@ if (anAbility == null) { - anAbility = cloneGlobalAbility(aCategory.getAbilityCategory(), aKey); + anAbility = cloneGlobalAbility(pc, aCategory.getAbilityCategory(), aKey); if (anAbility != null) { @@ -168,7 +169,7 @@ if (anAbility != null) { - addChoicesToAbility(anAbility, choices); + addChoicesToAbility(pc, anAbility, choices); } return anAbility; @@ -180,6 +181,7 @@ * @param anAbility * @param choices * @param addList + * @param pc TODO * @param levelInfo * @return the Ability added */ @@ -187,14 +189,14 @@ final Ability anAbility, final List<String> choices, final List<Ability> addList, - final PCLevelInfo levelInfo) + PlayerCharacter pc, final PCLevelInfo levelInfo) { if (anAbility == null) { return null; } - final Ability newAbility = addCloneOfAbilityToListwithChoices(anAbility, choices, addList); + final Ability newAbility = addCloneOfAbilityToListwithChoices(pc, anAbility, choices, addList); if (newAbility != null) { @@ -217,21 +219,21 @@ * @param category * @param aFeatKey * @param abilityList + * @param pc TODO * @param levelInfo - * * @return the Ability added */ public static Ability addVirtualAbility( final String category, final String aFeatKey, final List<Ability> abilityList, - final PCLevelInfo levelInfo) + PlayerCharacter pc, final PCLevelInfo levelInfo) { final List<String> choices = new ArrayList<String>(); final String abilityKey = getUndecoratedName(aFeatKey, choices); final Ability anAbility = Globals.getAbilityKeyed(category, abilityKey); - return addVirtualAbility(anAbility, choices, abilityList, levelInfo); + return addVirtualAbility(anAbility, choices, abilityList, pc, levelInfo); } @@ -306,15 +308,15 @@ /** * If an ability in Global storage matches the category and name passed * in, then return a clone of that Ability. - * + * @param pc TODO * @param category * @param anAbilityKey * * @return a clone of a global ability */ private static Ability cloneGlobalAbility( - final String category, - final String anAbilityKey) + PlayerCharacter pc, + final String category, final String anAbilityKey) { final Collection<String> choices = new ArrayList<String>(); final String baseKey = getUndecoratedName(anAbilityKey, choices); @@ -336,7 +338,7 @@ if (choices.size() > 0) { - addChoicesToAbility(anAbility, choices); + addChoicesToAbility(pc, anAbility, choices); } } @@ -384,7 +386,7 @@ { if (ability.canAddAssociation(choice)) { - ability.addAssociated(choice); + aPC.addAssociation(ability, choice); } } else @@ -823,7 +825,7 @@ { if (addIt) { - anAbility.addAssociated(wp.getKeyName()); + aPC.addAssociation(anAbility, wp.getKeyName()); } else { @@ -837,7 +839,7 @@ { if (addIt) { - anAbility.addAssociated(aString); + aPC.addAssociation(anAbility, aString); } else { @@ -1186,6 +1188,7 @@ * @return the Ability added, or null if Ability was not added to the list. */ public static Ability addAbilityToListwithChoices( + PlayerCharacter pc, final Ability anAbility, final List<String> choices, final List<Ability> addList) @@ -1199,7 +1202,7 @@ if (choices != null) { - addChoicesToAbility(abil, choices); + addChoicesToAbility(pc, abil, choices); } return abil; Modified: Trunk/pcgen/code/src/java/pcgen/core/Equipment.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Equipment.java 2008-09-25 02:49:07 UTC (rev 7783) +++ Trunk/pcgen/code/src/java/pcgen/core/Equipment.java 2008-09-25 02:59:24 UTC (rev 7784) @@ -2259,7 +2259,7 @@ // like number of charges. eqMod.clearAssociated(); } - eqMod.addAssociated(x.replace('=', '|')); + addAssociation(eqMod, x.replace('=', '|')); } } } @@ -2407,7 +2407,7 @@ boolean allRemoved = false; if (selectedChoice != null && selectedChoice.length() > 0) { if (!eqMod.getChoiceString().startsWith("EQBUILDER.")) { - aMod.setChoice(selectedChoice, equipChoice); + aMod.setChoice(this, selectedChoice, equipChoice); allRemoved = !hasAssociations(aMod); } } else if (aMod.getChoice(1, this, true, aPC) == 0) { @@ -6050,7 +6050,7 @@ public void addAssociation(PObject obj, String o) { - obj.addAssociated(o); + obj.tempAddAssociated(o); } public boolean containsAssociated(PObject obj, String o) @@ -6066,9 +6066,21 @@ public List<String> getAssociationList(PObject obj) { List<String> list = new ArrayList<String>(); - for (AssociatedChoice<String> ac : obj.getAssociatedList()) + ArrayList<AssociatedChoice<String>> assocList = obj.getAssociatedList(); + if (assocList != null) { - list.add(ac.getDefaultChoice()); + for (AssociatedChoice<String> ac : assocList) + { + final String choiceStr = ac.getDefaultChoice(); + if (choiceStr.equals(Constants.EMPTY_STRING)) + { + list.add(null); + } + else + { + list.add(choiceStr); + } + } } return list; } Modified: Trunk/pcgen/code/src/java/pcgen/core/EquipmentModifier.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/EquipmentModifier.java 2008-09-25 02:49:07 UTC (rev 7783) +++ Trunk/pcgen/code/src/java/pcgen/core/EquipmentModifier.java 2008-09-25 02:59:24 UTC (rev 7784) @@ -235,7 +235,7 @@ * 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 @@ -246,14 +246,14 @@ * @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 Object[] spellMetamagicFeats, final int charges) { final StringBuffer spellInfo = new StringBuffer(100); spellInfo.append("SPELLNAME[").append(theSpell.getKeyName()).append("] "); @@ -295,7 +295,7 @@ spellInfo.append("] "); } - addAssociated(spellInfo.toString()); + parent.addAssociation(this, spellInfo.toString()); } /** @@ -437,19 +437,19 @@ chooser.setVisible(true); selectedList = chooser.getSelectedList(); - setChoice(selectedList, equipChoice); + setChoice(parent, selectedList, equipChoice); return parent.getAssociationCount(this); } - void setChoice(final String choice, final EquipmentChoice equipChoice) + void setChoice(Equipment parent, final String choice, final EquipmentChoice equipChoice) { final List<String> tempList = new ArrayList<String>(); tempList.add(choice); - setChoice(tempList, equipChoice); + setChoice(parent, tempList, equipChoice); } - void setChoice(final List<String> selectedList, final EquipmentChoice equipChoice) + void setChoice(Equipment parent, final List<String> selectedList, final EquipmentChoice equipChoice) { clearAssociated(); @@ -496,7 +496,7 @@ if (equipChoice.isAllowDuplicates() || !containsAssociated(aString)) { - addAssociated(aString); + parent.addAssociation(this, aString); } } } Modified: Trunk/pcgen/code/src/java/pcgen/core/PObject.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-09-25 02:49:07 UTC (rev 7783) +++ Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-09-25 02:59:24 UTC (rev 7784) @@ -611,74 +611,16 @@ { return getAbilityKeys(null, AbilityCategory.FEAT, Ability.Nature.VIRTUAL); } - -// /** -// * Add automatic weapon proficienies for this object -// * @param aString -// */ -// public final void addWeaponProfAutos(final String aString) -// { -// final StringTokenizer aTok = new StringTokenizer(aString, "|"); -// -// ListKey<String> weaponProfListKey = ListKey.WEAPON_PROF; -// -// while (aTok.hasMoreTokens()) -// { -// final String bString = aTok.nextToken(); -// -// if (".CLEAR".equals(bString)) -// { -// removeListFor(weaponProfListKey); -// } -// else if (bString.startsWith("TYPE=") || bString.startsWith("TYPE.")) -// { -// final Collection<WeaponProf> weaponProfsOfType = Globals.getAllWeaponProfsOfType(bString.substring(5)); -// if (weaponProfsOfType != null) -// { -// for (Iterator<WeaponProf> e = weaponProfsOfType.iterator(); e.hasNext();) -// { -// final String cString = e.next().getKeyName(); -// -// if (!containsInList(weaponProfListKey, cString)) -// { -// addToListFor(weaponProfListKey, cString); -// } -// } -// } -// } -// else -// { -// if (!containsInList(weaponProfListKey, bString)) -// { -// addToListFor(weaponProfListKey, bString); -// } -// } -// } -// } -// /** -// * Get the automatic weapon proficiencies for this object -// * @return the automatic weapon proficiencies for this object -// */ -// public List<String> getWeaponProfAutos() -// { -// return getSafeListFor(ListKey.WEAPON_PROF); -// } - /** * Add the collection passed in to the associated list for this object * @param collection */ public final void addAllToAssociated(final Collection<String> collection) { - if (associatedList == null) - { - associatedList = new ArrayList<AssociatedChoice<String>>(); - } - for ( String choice : collection ) { - addAssociated( choice ); + tempAddAssociated( choice ); } } @@ -686,7 +628,7 @@ * Add the item to the associated list for this object * @param aString the string to add to the associated list */ - public final void addAssociated(final String aString) + public final void tempAddAssociated(final String aString) { if (associatedList == null) { @@ -4279,100 +4221,7 @@ return result == null ? new ArrayList<String>() : Collections .unmodifiableList(result); } - -// public List<BonusObj> getActiveBonuses(final PlayerCharacter aPC, final String aBonusType, final String aBonusName) -// { -// if (!PrereqHandler.passesAll(this.getPreReqList(), aPC, this)) -// { -// return Collections.emptyList(); -// } -// -// for ( final BonusObj bonus : getBonusList() ) -// { -// if ( bonus.getTypeOfBonus().equalsIgnoreCase(aBonusType) && bonus.getBonusName().equalsIgnoreCase(aBonusName) ) -// { -// -// } -// } -// } -// /** -// * Add a Spell-Like Ability granted by this object. -// * -// * @param anAbility The SLA to grant. -// */ -// public void addSpellLikeAbility( final SpellLikeAbility anAbility ) -// { -// if ( spellLikeAbilities == null ) -// { -// spellLikeAbilities = new ArrayList<SpellLikeAbility>(); -// } -// spellLikeAbilities.add( anAbility ); -// } -// -// /** -// * Adds a list of Spell-Like Abilities to this object granted at a specific -// * level. -// * -// * @param aLevel The level at which the SLAs will be granted. For PCClass -// * this will be the level in the specified class for all other objects it -// * is total character level. -// * @param aList List of Spell-Like Abilities to add. -// */ -// public void addSpellLikeAbilities( final int aLevel, final List<SpellLikeAbility> aList ) -// { -// Prerequisite minLevel = null; -// if (aLevel > -9) -// { -// try -// { -// PreParserFactory factory = PreParserFactory.getInstance(); -// String preLevelString = "PRELEVEL:" + aLevel; -// // TODO - Refactor this into an overridable method -// // getLevelPrereq() -// // TODO - Change this to not use the parser to build it. -// if (this instanceof PCClass) -// { -// // Classes handle this differently -// preLevelString = "PRECLASS:1," + this.getKeyName() + "=" + aLevel; -// } -// minLevel = factory.parse(preLevelString); -// } -// catch (PersistenceLayerException notUsed) -// { -// // This should never happen -// assert false; -// } -// } -// for ( SpellLikeAbility sla : aList ) -// { -// if ( minLevel != null ) -// { -// sla.addPreReq( minLevel ); -// } -// if ( spellLikeAbilities == null ) -// { -// spellLikeAbilities = new ArrayList<SpellLikeAbility>(); -// } -// spellLikeAbilities.add( sla ); -// } -// } -// -// /** -// * Gets an unmodifiable list of Spell-Like Abilities provided by this -// * object. -// * -// * @return An unmodifiable Collection of SLAs. -// */ -// public Collection<SpellLikeAbility> getSpellLikeAbilities() -// { -// if ( spellLikeAbilities == null ) -// { -// return Collections.emptyList(); -// } -// return Collections.unmodifiableList(spellLikeAbilities); -// } - public String getCompressedChoice(AssociatedChoice<String> c) { if (c instanceof FeatMultipleChoice) Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-09-25 02:49:07 UTC (rev 7783) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-09-25 02:59:24 UTC (rev 7784) @@ -12255,7 +12255,7 @@ if (anAbility.getSafe(ObjectKey.MULTIPLE_ALLOWED) && !anAbility.containsAssociated(aString)) { - anAbility.addAssociated(aString); + addAssociation(anAbility, aString); anAbility.sortAssociated(); } } @@ -12287,7 +12287,7 @@ } anAbility = anAbility.clone(); - anAbility.addAssociated(aString); + addAssociation(anAbility, aString); if (isAuto) { @@ -16767,7 +16767,7 @@ if (aggregateFeat.getSafe(ObjectKey.STACKS) || !aggregateFeat.containsAssociated(aString)) { - aggregateFeat.addAssociated(aString); + addAssociation(aggregateFeat, aString); } } @@ -16796,7 +16796,7 @@ if (aggregateFeat.getSafe(ObjectKey.STACKS) || !aggregateFeat.containsAssociated(aString)) { - aggregateFeat.addAssociated(aString); + addAssociation(aggregateFeat, aString); } } @@ -17065,7 +17065,7 @@ List<Ability> abilities = theAbilities.get( AbilityCategory.FEAT, nature); Ability added = AbilityUtilities - .addAbilityToListwithChoices(ab, choices, + .addAbilityToListwithChoices(this, ab, choices, abilities); if (added != null) { added.setFeatType(nature); @@ -17097,7 +17097,7 @@ List<Ability> abilities = theAbilities.get( cat, nature); Ability added = AbilityUtilities - .addAbilityToListwithChoices(ab, choices, + .addAbilityToListwithChoices(this, ab, choices, abilities); if (added != null) { added.setFeatType(nature); @@ -17124,7 +17124,7 @@ for (final String key : abilityKeys) { final Ability added = AbilityUtilities - .addCloneOfGlobalAbilityToListWithChoices( + .addCloneOfGlobalAbilityToListWithChoices(this, abilities, cat, key); if (added != null) { @@ -17235,8 +17235,8 @@ Ability added = AbilityUtilities .addCloneOfGlobalAbilityToListWithChoices( - abilities, Constants.FEAT_CATEGORY, - aTok.nextToken()); + this, abilities, + Constants.FEAT_CATEGORY, aTok.nextToken()); if (added != null) { added.setFeatType(Ability.Nature.AUTOMATIC); @@ -17272,9 +17272,9 @@ Ability added = AbilityUtilities .addCloneOfGlobalAbilityToListWithChoices( + this, abilities, - Constants.FEAT_CATEGORY, - aString.substring(idx + 1)); + Constants.FEAT_CATEGORY, aString.substring(idx + 1)); if (added != null) { added.setFeatType(Ability.Nature.AUTOMATIC); @@ -17304,8 +17304,8 @@ choices = Collections.emptyList(); } Ability added = AbilityUtilities - .addAbilityToListwithChoices(ab, - choices, abilities); + .addAbilityToListwithChoices(this, + ab, choices, abilities); if (added != null) { added.setFeatType(Ability.Nature.AUTOMATIC); @@ -17868,7 +17868,7 @@ public void addAssociation(PObject obj, String o) { - obj.addAssociated(o); + obj.tempAddAssociated(o); } public boolean containsAssociated(PObject obj, String o) @@ -17884,9 +17884,21 @@ public List<String> getAssociationList(PObject obj) { List<String> list = new ArrayList<String>(); - for (AssociatedChoice<String> ac : obj.getAssociatedList()) + ArrayList<AssociatedChoice<String>> assocList = obj.getAssociatedList(); + if (assocList != null) { - list.add(ac.getDefaultChoice()); + for (AssociatedChoice<String> ac : assocList) + { + final String choiceStr = ac.getDefaultChoice(); + if (choiceStr.equals(Constants.EMPTY_STRING)) + { + list.add(null); + } + else + { + list.add(choiceStr); + } + } } return list; } @@ -17915,7 +17927,6 @@ { return obj.tempGetAssociatedCount(true); } - public void addAssoc(Object obj, Object o) { assocSupt.addAssoc(obj, o); Modified: Trunk/pcgen/code/src/java/pcgen/core/analysis/SkillLanguage.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/analysis/SkillLanguage.java 2008-09-25 02:49:07 UTC (rev 7783) +++ Trunk/pcgen/code/src/java/pcgen/core/analysis/SkillLanguage.java 2008-09-25 02:59:24 UTC (rev 7784) @@ -221,7 +221,7 @@ // TODO Fix this to allow Language objects. for (Iterator<?> i = lc.getSelectedList().iterator(); i.hasNext();) { - languageSkill.addAssociated(((Language) i.next()).getKeyName()); + aPC.addAssociation(languageSkill, ((Language) i.next()).getKeyName()); } aPC.setDirty(true); Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/AbstractBasicPObjectChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/AbstractBasicPObjectChoiceManager.java 2008-09-25 02:49:07 UTC (rev 7783) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/AbstractBasicPObjectChoiceManager.java 2008-09-25 02:59:24 UTC (rev 7784) @@ -58,12 +58,12 @@ { if (!pobject.containsAssociated(st)) { - pobject.addAssociated(st); + aPC.addAssociation(pobject, st); } } else { - pobject.addAssociated(st); + aPC.addAssociation(pobject, st); } } adjustPool(selected); Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/AbstractBasicStringChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/AbstractBasicStringChoiceManager.java 2008-09-25 02:49:07 UTC (rev 7783) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/AbstractBasicStringChoiceManager.java 2008-09-25 02:59:24 UTC (rev 7784) @@ -80,6 +80,6 @@ protected void associateChoice(PlayerCharacter pc, String st) { - pobject.addAssociated(st); + pc.addAssociation(pobject, st); } } Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/NoChoiceChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/NoChoiceChoiceManager.java 2008-09-25 02:49:07 UTC (rev 7783) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/NoChoiceChoiceManager.java 2008-09-25 02:59:24 UTC (rev 7784) @@ -54,7 +54,7 @@ pobject.clearAssociated(); for (int i = 0; i < selected.size(); i++) { - pobject.addAssociated(Constants.EMPTY_STRING); + apc.addAssociation(pobject, Constants.EMPTY_STRING); } adjustPool(selected); } Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/SAListChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/SAListChoiceManager.java 2008-09-25 02:49:07 UTC (rev 7783) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/SAListChoiceManager.java 2008-09-25 02:59:24 UTC (rev 7784) @@ -116,12 +116,12 @@ { if (isMultYes() && !isStackYes()) { - pobject.addAssociated(name); + aPc.addAssociation(pobject, name); } else { final String prefix = name + "|"; - pobject.addAssociated(name); + aPc.addAssociation(pobject, name); // SALIST: aBonusList contains all possible selections in form: <displayed info>|<special ability> for ( String bString : aBonusList ) Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/SimpleArmorProfChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/SimpleArmorProfChoiceManager.java 2008-09-25 02:49:07 UTC (rev 7783) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/SimpleArmorProfChoiceManager.java 2008-09-25 02:59:24 UTC (rev 7784) @@ -133,12 +133,12 @@ { if (!pobject.containsAssociated(st)) { - pobject.addAssociated(st); + aPC.addAssociation(pobject, st); } } else { - pobject.addAssociated(st); + aPC.addAssociation(pobject, st); } } adjustPool(selected); Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/SimpleShieldProfChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/SimpleShieldProfChoiceManager.java 2008-09-25 02:49:07 UTC (rev 7783) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/SimpleShieldProfChoiceManager.java 2008-09-25 02:59:24 UTC (rev 7784) @@ -133,12 +133,12 @@ { if (!pobject.containsAssociated(st)) { - pobject.addAssociated(st); + aPC.addAssociation(pobject, st); } } else { - pobject.addAssociated(st); + aPC.addAssociation(pobject, st); } } adjustPool(selected); Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/SimpleWeaponProfChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/SimpleWeaponProfChoiceManager.java 2008-09-25 02:49:07 UTC (rev 7783) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/SimpleWeaponProfChoiceManager.java 2008-09-25 02:59:24 UTC (rev 7784) @@ -446,7 +446,7 @@ if (anAbility != null) { - pobject.addAssociated( + aPC.addAssociation(pobject, "FEAT?" + anAbility.getKeyName() + "(" + aChoice + ")"); } } @@ -469,7 +469,7 @@ if ((anAbility != null) && !anAbility.containsAssociated(aChoice)) { - anAbility.addAssociated(aChoice); + aPC.addAssociation(anAbility, aChoice); } } } Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/SpellLevelChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/SpellLevelChoiceManager.java 2008-09-25 02:49:07 UTC (rev 7783) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/SpellLevelChoiceManager.java 2008-09-25 02:59:24 UTC (rev 7784) @@ -148,7 +148,7 @@ { for ( String bString : aBonusList ) { - pobject.addAssociated(name); + aPc.addAssociation(pobject, name); pobject.applyBonus(bString, name, aPc, true); } Modified: Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityAbility.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityAbility.java 2008-09-25 02:49:07 UTC (rev 7783) +++ Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityAbility.java 2008-09-25 02:59:24 UTC (rev 7784) @@ -677,7 +677,7 @@ ab, choiceList, aList, - pcLevelInfo); + aPC, pcLevelInfo); aPC.setDirty(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 02:49:07 UTC (rev 7783) +++ Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityFeat.java 2008-09-25 02:59:24 UTC (rev 7784) @@ -195,7 +195,7 @@ "FEAT", featName, aPC.getDirectVirtualAbilities(AbilityCategory.FEAT), - pcLevelInfo); + aPC, pcLevelInfo); aPC.setDirty(true); if (aFeat != null) Modified: Trunk/pcgen/code/src/java/pcgen/gui/EqBuilder.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/EqBuilder.java 2008-09-25 02:49:07 UTC (rev 7783) +++ Trunk/pcgen/code/src/java/pcgen/gui/EqBuilder.java 2008-09-25 02:59:24 UTC (rev 7784) @@ -1384,14 +1384,14 @@ if (existingEqMod != null) { - existingEqMod.setSpellInfo((PObject) castingClass, theSpell, variant, spellType, baseSpellLevel, - casterLevel, metamagicFeats, charges); + existingEqMod.setSpellInfo(aNewEq, (PObject) castingClass, theSpell, variant, spellType, + baseSpellLevel, casterLevel, metamagicFeats, charges); } else { eqMod = eqMod.clone(); - eqMod.setSpellInfo((PObject) castingClass, theSpell, variant, spellType, baseSpellLevel, casterLevel, - metamagicFeats, charges); + eqMod.setSpellInfo(aNewEq, (PObject) castingClass, theSpell, variant, spellType, baseSpellLevel, + casterLevel, metamagicFeats, charges); aNewEq.addEqModifier(eqMod, true, aPC); } Modified: Trunk/pcgen/code/src/java/pcgen/io/PCGIOHandler.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/PCGIOHandler.java 2008-09-25 02:49:07 UTC (rev 7783) +++ Trunk/pcgen/code/src/java/pcgen/io/PCGIOHandler.java 2008-09-25 02:59:24 UTC (rev 7784) @@ -473,7 +473,7 @@ if (aFeat.getSafe(ObjectKey.MULTIPLE_ALLOWED) && !currentPC.hasAssociations(aFeat)) { - aFeat.addAssociated("PLEASE MAKE APPROPRIATE SELECTION"); + currentPC.addAssociation(aFeat, "PLEASE MAKE APPROPRIATE SELECTION"); warnings .add("Multiple selection feat found with no selections (" + aFeat.getDisplayName() + "). Correct on Feat tab."); Modified: Trunk/pcgen/code/src/java/pcgen/io/PCGVer0Parser.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/PCGVer0Parser.java 2008-09-25 02:49:07 UTC (rev 7783) +++ Trunk/pcgen/code/src/java/pcgen/io/PCGVer0Parser.java 2008-09-25 02:59:24 UTC (rev 7784) @@ -1235,7 +1235,7 @@ else if ((anAbility.getSafe(ObjectKey.MULTIPLE_ALLOWED) && anAbility.getSafe(ObjectKey.STACKS)) || !anAbility.containsAssociated(aString)) { - anAbility.addAssociated(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 02:49:07 UTC (rev 7783) +++ Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Parser.java 2008-09-25 02:59:24 UTC (rev 7784) @@ -2097,7 +2097,7 @@ } else if (TAG_ASSOCIATEDDATA.equals(tag)) { - aCharacterDomain.getDomain().addAssociated( + thePC.addAssociation(aCharacterDomain.getDomain(), EntityEncoder.decode(element.getText())); } } @@ -2384,7 +2384,7 @@ String[] assoc = appliedToKey.split(Constants.COMMA, -1); for (String string : assoc) { - ability.addAssociated(string); + thePC.addAssociation(ability, string); } } } @@ -2417,7 +2417,7 @@ ability = AbilityUtilities.addVirtualAbility(ability, new ArrayList<String>(), thePC - .getDirectVirtualAbilities(category), null); + .getDirectVirtualAbilities(category), thePC, null); if (ability == null) { Logging @@ -2652,7 +2652,7 @@ else if ((aFeat.getSafe(ObjectKey.MULTIPLE_ALLOWED) && aFeat.getSafe(ObjectKey.STACKS)) || !aFeat.containsAssociated(appliedToKey)) { - aFeat.addAssociated(appliedToKey); + thePC.addAssociation(aFeat, appliedToKey); } } else if (TAG_SAVE.equals(tag)) @@ -3470,7 +3470,7 @@ } else if (TAG_ASSOCIATEDDATA.equals(tag)) { - aSkill.addAssociated(EntityEncoder.decode(element.getText())); + thePC.addAssociation(aSkill, EntityEncoder.decode(element.getText())); } else if (tag.equals(TAG_LEVELABILITY)) { @@ -4244,7 +4244,7 @@ AbilityUtilities.addVirtualAbility(Constants.FEAT_CATEGORY, abilityKey, thePC .getDirectVirtualAbilities(AbilityCategory.FEAT), - null); + thePC, null); anAbility.setNeedsSaving(true); thePC.setDirty(true); } Modified: Trunk/pcgen/code/src/java/pcgen/persistence/lst/utils/FeatParser.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/persistence/lst/utils/FeatParser.java 2008-09-25 02:49:07 UTC (rev 7783) +++ Trunk/pcgen/code/src/java/pcgen/persistence/lst/utils/FeatParser.java 2008-09-25 02:59:24 UTC (rev 7784) @@ -96,7 +96,7 @@ { for (final String choice : choices) { - anAbility.addAssociated(choice); + anAbility.tempAddAssociated(choice); } aList.add(anAbility); Modified: Trunk/pcgen/code/src/test/pcgen/cdom/helper/AspectTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/cdom/helper/AspectTest.java 2008-09-25 02:49:07 UTC (rev 7783) +++ Trunk/pcgen/code/src/test/pcgen/cdom/helper/AspectTest.java 2008-09-25 02:59:24 UTC (rev 7784) @@ -28,6 +28,7 @@ import pcgen.cdom.enumeration.VariableKey; import pcgen.core.Ability; import pcgen.core.AbilityCategory; +import pcgen.core.PlayerCharacter; import pcgen.util.TestHelper; /** @@ -122,14 +123,16 @@ final Ability pobj = TestHelper.makeAbility("dummy", AbilityCategory.FEAT .getAbilityCategory(), "Foo"); - getCharacter().addAbility(AbilityCategory.FEAT, pobj, null); + PlayerCharacter pc = getCharacter(); + pc.addAbility(AbilityCategory.FEAT, pobj, null); final Aspect aspect = new Aspect(ASPECT_NAME, "%1"); aspect.addVariable("%CHOICE"); - assertEquals("", aspect.getAspectText(getCharacter(), pobj)); + assertEquals("", aspect.getAspectText(pc, pobj)); - pobj.addAssociated("Foo"); - assertEquals("Foo", aspect.getAspectText(getCharacter(), pobj)); + pc.addAssociation(pobj, "Foo"); + + assertEquals("Foo", aspect.getAspectText(pc, pobj)); } /** @@ -140,14 +143,15 @@ final Ability pobj = TestHelper.makeAbility("dummy", AbilityCategory.FEAT .getAbilityCategory(), "Foo"); - getCharacter().addAbility(AbilityCategory.FEAT, pobj, null); + PlayerCharacter pc = getCharacter(); + pc.addAbility(AbilityCategory.FEAT, pobj, null); final Aspect aspect = new Aspect(ASPECT_NAME, "%1"); aspect.addVariable("%LIST"); - assertEquals("", aspect.getAspectText(getCharacter(), pobj)); + assertEquals("", aspect.getAspectText(pc, pobj)); - pobj.addAssociated("Foo"); - assertEquals("Foo", aspect.getAspectText(getCharacter(), pobj)); + pc.addAssociation(pobj, "Foo"); + assertEquals("Foo", aspect.getAspectText(pc, pobj)); } /** @@ -174,10 +178,11 @@ final Aspect aspect = new Aspect(ASPECT_NAME, "Testing"); aspect.addVariable("%LIST"); - assertEquals("Testing", aspect.getAspectText(getCharacter(), pobj)); + PlayerCharacter pc = getCharacter(); + assertEquals("Testing", aspect.getAspectText(pc, pobj)); - pobj.addAssociated("Foo"); - assertEquals("Testing", aspect.getAspectText(getCharacter(), pobj)); + pc.addAssociation(pobj, "Foo"); + assertEquals("Testing", aspect.getAspectText(pc, pobj)); } /** @@ -190,23 +195,24 @@ .getAbilityCategory(), "Foo"); dummy.put(VariableKey.getConstant("TestVar"), FormulaFactory .getFormulaFor(2)); - dummy.addAssociated("Associated 1"); - dummy.addAssociated("Associated 2"); + PlayerCharacter pc = getCharacter(); + pc.addAssociation(dummy, "Associated 1"); + pc.addAssociation(dummy, "Associated 2"); final Aspect aspect = new Aspect(ASPECT_NAME, "%1 test %3 %2"); aspect.addVariable("TestVar"); - assertEquals("0 test ", aspect.getAspectText(getCharacter(), dummy)); + assertEquals("0 test ", aspect.getAspectText(pc, dummy)); - getCharacter().addAbility(AbilityCategory.FEAT, dummy, null); - assertEquals("2 test ", aspect.getAspectText(getCharacter(), dummy)); + pc.addAbility(AbilityCategory.FEAT, dummy, null); + assertEquals("2 test ", aspect.getAspectText(pc, dummy)); aspect.addVariable("%CHOICE"); assertEquals("2 test Associated 1", aspect - .getAspectText(getCharacter(), dummy)); + .getAspectText(pc, dummy)); aspect.addVariable("%LIST"); assertEquals("Replacement of %LIST failed", "2 test Associated 1 and Associated 2 Associated 1", aspect - .getAspectText(getCharacter(), dummy)); + .getAspectText(pc, dummy)); } } Modified: Trunk/pcgen/code/src/test/pcgen/core/AbilityTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/AbilityTest.java 2008-09-25 02:49:07 UTC (rev 7783) +++ Trunk/pcgen/code/src/test/pcgen/core/AbilityTest.java 2008-09-25 02:59:24 UTC (rev 7784) @@ -90,13 +90,13 @@ TestHelper.makeAbility("Weapon Throwing", "FEAT", "General.Fighter"); ab5.put(ObjectKey.MULTIPLE_ALLOWED, Boolean.TRUE); - ab5.addAssociated("Wellies"); + ab5.tempAddAssociated("Wellies"); Ability ab6 = ab5.clone(); - ab6.addAssociated("Bar Stool"); + ab6.tempAddAssociated("Bar Stool"); Ability ab7 = ab5.clone(); - ab7.addAssociated("Tantrum"); + ab7.tempAddAssociated("Tantrum"); ab7.setName("Weapon Throwing (Tantrum)"); ab7.setKeyName("KEY_Weapon Throwing (Tantrum)"); Modified: Trunk/pcgen/code/src/test/pcgen/core/AbilityUtilitiesTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/AbilityUtilitiesTest.java 2008-09-25 02:49:07 UTC (rev 7783) +++ Trunk/pcgen/code/src/test/pcgen/core/AbilityUtilitiesTest.java 2008-09-25 02:59:24 UTC (rev 7784) @@ -95,14 +95,14 @@ // Call addCloneOfGlobalAbilityToListWithChoices with parent and expect to see it in list List<Ability> testList = new ArrayList<Ability>(); - assertNotNull("Add in parent cat should return ability", AbilityUtilities.addCloneOfGlobalAbilityToListWithChoices(testList, "TestParent", "KEY_TestAbility")); + assertNotNull("Add in parent cat should return ability", AbilityUtilities.addCloneOfGlobalAbilityToListWithChoices(null, testList, "TestParent", "KEY_TestAbility")); assertEquals("Ability list size after adding 1 ability", 1, testList.size()); assertEquals("Key of added ability", "KEY_TestAbility", testList.get(0).keyName); assertNotSame("Should be a clone, not the same object", ability, testList.get(0)); // Call addCloneOfGlobalAbilityToListWithChoices with child and expect to see it in list testList.clear(); - assertNotNull("Add in child cat should return ability", AbilityUtilities.addCloneOfGlobalAbilityToListWithChoices(testList, "TestChild", "KEY_TestAbility")); + assertNotNull("Add in child cat should return ability", AbilityUtilities.addCloneOfGlobalAbilityToListWithChoices(null, testList, "TestChild", "KEY_TestAbility")); assertEquals("Ability list size after adding 1 ability", 1, testList.size()); assertEquals("Key of added ability", "KEY_TestAbility", testList.get(0).keyName); assertNotSame("Should be a clone, not the same object", ability, testList.get(0)); Modified: Trunk/pcgen/code/src/test/pcgen/core/DescriptionTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/DescriptionTest.java 2008-09-25 02:49:07 UTC (rev 7783) +++ Trunk/pcgen/code/src/test/pcgen/core/DescriptionTest.java 2008-09-25 02:59:24 UTC (rev 7784) @@ -140,10 +140,11 @@ final Description desc = new Description("%1"); desc.addVariable("%CHOICE"); - assertTrue(desc.getDescription(getCharacter(), pobj).equals("")); + PlayerCharacter pc = getCharacter(); + assertTrue(desc.getDescription(pc, pobj).equals("")); - pobj.addAssociated("Foo"); - assertTrue(desc.getDescription(getCharacter(), pobj).equals("Foo")); + pc.addAssociation(pobj, "Foo"); + assertTrue(desc.getDescription(pc, pobj).equals("Foo")); } /** @@ -155,10 +156,11 @@ final Description desc = new Description("%1"); desc.addVariable("%LIST"); - assertTrue(desc.getDescription(getCharacter(), pobj).equals("")); + PlayerCharacter pc = getCharacter(); + assertTrue(desc.getDescription(pc, pobj).equals("")); - pobj.addAssociated("Foo"); - assertTrue(desc.getDescription(getCharacter(), pobj).equals("Foo")); + pc.addAssociation(pobj, "Foo"); + assertTrue(desc.getDescription(pc, pobj).equals("Foo")); } /** @@ -181,10 +183,11 @@ final Description desc = new Description("Testing"); desc.addVariable("%LIST"); - assertTrue(desc.getDescription(getCharacter(), pobj).equals("Testing")); + PlayerCharacter pc = getCharacter(); + assertTrue(desc.getDescription(pc, pobj).equals("Testing")); - pobj.addAssociated("Foo"); - assertTrue(desc.getDescription(getCharacter(), pobj).equals("Testing")); + pc.addAssociation(pobj, "Foo"); + assertTrue(desc.getDescription(pc, pobj).equals("Testing")); } /** @@ -195,23 +198,24 @@ final Race dummy = new Race(); dummy.put(VariableKey.getConstant("TestVar"), FormulaFactory .getFormulaFor(2)); - dummy.addAssociated("Associated 1"); - dummy.addAssociated("Associated 2"); + PlayerCharacter pc = getCharacter(); + pc.addAssociation(dummy, "Associated 1"); + pc.addAssociation(dummy, "Associated 2"); final Description desc = new Description("%1 test %3 %2"); desc.addVariable("TestVar"); - assertEquals("0 test ", desc.getDescription(getCharacter(), dummy)); + assertEquals("0 test ", desc.getDescription(pc, dummy)); - getCharacter().setRace(dummy); - assertEquals("2 test ", desc.getDescription(getCharacter(), dummy)); + pc.setRace(dummy); + assertEquals("2 test ", desc.getDescription(pc, dummy)); desc.addVariable("%CHOICE"); assertEquals("2 test Associated 1", desc - .getDescription(getCharacter(), dummy)); + .getDescription(pc, dummy)); desc.addVariable("%LIST"); assertEquals("Replacement of %LIST failed", "2 test Associated 1 and Associated 2 Associated 1", desc - .getDescription(getCharacter(), dummy)); + .getDescription(pc, dummy)); } } Modified: Trunk/pcgen/code/src/test/pcgen/core/EquipmentModifierTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/EquipmentModifierTest.java 2008-09-25 02:49:07 UTC (rev 7783) +++ Trunk/pcgen/code/src/test/pcgen/core/EquipmentModifierTest.java 2008-09-25 02:59:24 UTC (rev 7784) @@ -118,9 +118,9 @@ final BonusObj aBonus = Bonus.newBonus("WEAPON|DAMAGE|((%CHOICE)MIN(STR))"); eqMod.addBonusList(aBonus); - eqMod.addAssociated("+13"); final Equipment e = new Equipment(); + e.addAssociation(eqMod, "+13"); for (BonusObj bonusObj : eqMod.getBonusList(e)) { @@ -137,11 +137,12 @@ final EquipmentModifier eqMod = new EquipmentModifier(); final BonusObj aBonus = Bonus.newBonus("WEAPON|TOHIT|-2|PREVARGT:%CHOICE,STR"); - eqMod.addAssociated("+13"); - eqMod.addBonusList(aBonus); final Equipment e = new Equipment(); + e.addAssociation(eqMod, "+13"); + eqMod.addBonusList(aBonus); + for (BonusObj bonusObj : eqMod.getBonusList(e)) { assertEquals("-2", bonusObj.getValue()); @@ -165,12 +166,13 @@ final EquipmentModifier eqMod = new EquipmentModifier(); final BonusObj aBonus = Bonus.newBonus("WEAPON|TOHIT|-2|PREVARGT:%CHOICE,STR"); - eqMod.addAssociated("+1"); - eqMod.addAssociated("+2"); + + final Equipment e = new Equipment(); + + e.addAssociation(eqMod, "+1"); + e.addAssociation(eqMod, "+2"); eqMod.addBonusList(aBonus); - final Equipment e = new Equipment(); - final List<BonusObj> list = eqMod.getBonusList(e); int i = 1; for (int j = list.size() - 1; j > 0; j--) Modified: Trunk/pcgen/code/src/test/pcgen/core/PObjectTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/PObjectTest.java 2008-09-25 02:49:07 UTC (rev 7783) +++ Trunk/pcgen/code/src/test/pcgen/core/PObjectTest.java 2008-09-25 02:59:24 UTC (rev 7784) @@ -196,19 +196,19 @@ PlayerCharacter aPC = getCharacter(); aPC.addFeat(pObj, null); - pObj.addAssociated("TestPsion 1"); + aPC.addAssociation(pObj, "TestPsion 1"); pObj.applyBonus("SPELLKNOWN|CLASS=TestPsion;LEVEL=1|1", "TestPsion 1", aPC, false); aPC.calcActiveBonuses(); assertEquals("Should get 1 bonus known spells", 1, (int) aPC .getTotalBonusTo("SPELLKNOWN", "CLASS.TestPsion;LEVEL.1")); - pObj.addAssociated("TestPsion 1"); + aPC.addAssociation(pObj, "TestPsion 1"); pObj.applyBonus("SPELLKNOWN|CLASS=TestPsion;LEVEL=1|1", "TestPsion 1", aPC, true); aPC.calcActiveBonuses(); assertEquals("Should get 3 bonus known spells", (2 * 1) + 1, (int) aPC .getTotalBonusTo("SPELLKNOWN", "CLASS.TestPsion;LEVEL.1")); - pObj.addAssociated("TestPsion 1"); + aPC.addAssociation(pObj, "TestPsion 1"); pObj.applyBonus("SPELLKNOWN|CLASS=TestPsion;LEVEL=1|1", "TestPsion 1", aPC, false); aPC.calcActiveBonuses(); @@ -250,12 +250,12 @@ PlayerCharacter aPC = getCharacter(); int baseHP = aPC.hitPoints(); - pObj.addAssociated(""); + aPC.addAssociation(pObj, ""); aPC.addFeat(pObj, null); aPC.calcActiveBonuses(); assertEquals("Should have added 3 HPs", baseHP + 3, aPC.hitPoints()); - pObj.addAssociated(""); + aPC.addAssociation(pObj, ""); aPC.calcActiveBonuses(); assertEquals("2 instances should have added 6 HPs", baseHP + 6, aPC .hitPoints()); @@ -289,12 +289,12 @@ PlayerCharacter aPC = getCharacter(); int baseHP = aPC.hitPoints(); - pObj.addAssociated("+3 HP"); + aPC.addAssociation(pObj, "+3 HP"); aPC.addFeat(pObj, null); aPC.calcActiveBonuses(); assertEquals("Should have added 3 HPs", baseHP + 3, aPC.hitPoints()); - pObj.addAssociated("+3 HP"); + aPC.addAssociation(pObj, "+3 HP"); aPC.calcActiveBonuses(); assertEquals("2 instances should have added 6 HPs", baseHP + 6, aPC .hitPoints()); Modified: Trunk/pcgen/code/src/test/pcgen/core/bonus/BonusTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/bonus/BonusTest.java 2008-09-25 02:49:07 UTC (rev 7783) +++ Trunk/pcgen/code/src/test/pcgen/core/bonus/BonusTest.java 2008-09-25 02:59:24 UTC (rev 7784) @@ -220,7 +220,7 @@ bonusList.add(bonus); final Ability testBonus = new Ability(); testBonus.addBonusList(bonus); - testBonus.addAssociated("INT"); + character.addAssociation(testBonus, "INT"); bonus.setCreatorObject(testBonus); character.addFeat(testBonus, null); List<BonusPair> bonusPairs = bonus.getStringListFromBonus(); @@ -243,8 +243,8 @@ bonusList.add(bonus); final Ability testBonus = new Ability(); testBonus.addBonusList(bonus); - testBonus.addAssociated("INT"); - testBonus.addAssociated("STR"); + character.addAssociation(testBonus, "INT"); + character.addAssociation(testBonus, "STR"); bonus.setCreatorObject(testBonus); character.addFeat(testBonus, null); @@ -272,8 +272,8 @@ bonusList.add(bonus); final Ability testBonus = new Ability(); testBonus.addBonusList(bonus); - testBonus.addAssociated("INT"); - testBonus.addAssociated("STR"); + character.addAssociation(testBonus, "INT"); + character.addAssociation(testBonus, "STR"); bonus.setCreatorObject(testBonus); character.addFeat(testBonus, null); Modified: Trunk/pcgen/code/src/test/pcgen/core/chooser/MiscChoiceManagerTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/chooser/MiscChoiceManagerTest.java 2008-09-25 02:49:07 UTC (rev 7783) +++ Trunk/pcgen/code/src/test/pcgen/core/chooser/MiscChoiceManagerTest.java 2008-09-25 02:59:24 UTC (rev 7784) @@ -110,7 +110,7 @@ is(choiceManager.typeHandled(), strEq("MISC"), "got expected chooser"); - pObj.addAssociated("Bar"); + aPC.addAssociation(pObj, "Bar"); List available = new ArrayList(); List selected = new ArrayList(); Modified: Trunk/pcgen/code/src/test/pcgen/core/prereq/PreFeatTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/prereq/PreFeatTest.java 2008-09-25 02:49:07 UTC (rev 7783) +++ Trunk/pcgen/code/src/test/pcgen/core/prereq/PreFeatTest.java 2008-09-25 02:59:24 UTC (rev 7784) @@ -102,7 +102,7 @@ final Ability focusFeat = new Ability(); focusFeat.setName("Weapon Focus"); - focusFeat.addAssociated("Rapier"); + character.addAssociation(focusFeat, "Rapier"); character.addFeat(focusFeat, null); final Prerequisite preFeat = new Prerequisite(); @@ -156,7 +156,7 @@ final Ability spellFocus = new Ability(); spellFocus.setName("Spell Focus"); - spellFocus.addAssociated("Conjuration"); + character.addAssociation(spellFocus, "Conjuration"); character.addFeat(spellFocus, null); final Prerequisite preSpellFocus = new Prerequisite(); @@ -201,7 +201,7 @@ final FeatLoader featLoader = new FeatLoader(); featLoader.parseLine(Globals.getContext(), spellFocus, spellFocusStr, cse); character.addFeat(spellFocus, null); - spellFocus.addAssociated("Evocation"); + character.addAssociation(spellFocus, "Evocation"); final Prerequisite preSpellFocus = new Prerequisite(); preSpellFocus.setKind("FEAT"); @@ -245,7 +245,7 @@ final FeatLoader featLoader = new FeatLoader(); featLoader.parseLine(Globals.getContext(), spellFocus, spellFocusStr, cse); character.addFeat(spellFocus, null); - spellFocus.addAssociated("Evocation"); + character.addAssociation(spellFocus, "Evocation"); final Ability armourProf = new Ability(); armourProf.setName("Armor Proficiency (Light)"); @@ -309,7 +309,7 @@ assertFalse("Should not pass without skill focus", passes); character.addFeat(skillFocusKnow, null); - skillFocusKnow.addAssociated("Knowledge (Arcana)"); + character.addAssociation(skillFocusKnow, "Knowledge (Arcana)"); passes = PrereqHandler.passes(prereq, character, null); assertTrue("Should pass with skill focus", passes); @@ -336,12 +336,12 @@ assertFalse("Should not pass without spell focus", passes); character.addFeat(spellFocus, null); - spellFocus.addAssociated("Evocation"); + character.addAssociation(spellFocus, "Evocation"); passes = PrereqHandler.passes(prereq, character, null); assertFalse("Should not pass with only one spell focus", passes); - spellFocus.addAssociated("Enchantment"); + character.addAssociation(spellFocus, "Enchantment"); passes = PrereqHandler.passes(prereq, character, null); assertTrue("Should pass with spell focus", passes); Modified: Trunk/pcgen/code/src/test/plugin/jepcommands/CountCommandTest.java =================================================================== --- Trunk/pcgen/code/src/test/plugin/jepcommands/CountCommandTest.java 2008-09-25 02:49:07 UTC (rev 7783) +++ Trunk/pcgen/code/src/test/plugin/jepcommands/CountCommandTest.java 2008-09-25 02:59:24 UTC (rev 7784) @@ -120,8 +120,8 @@ abArray[1].put(ObjectKey.MULTIPLE_ALLOWED, Boolean.TRUE); - abArray[1].addAssociated("one"); - abArray[1].addAssociated("two"); + character.addAssociation(abArray[1], "one"); + character.addAssociation(abArray[1], "two"); for (int i = 0;6 > i;i++) { character.addAbility(featCategory, abArray[i], null); @@ -461,7 +461,7 @@ ab.put(ObjectKey.MULTIPLE_ALLOWED, Boolean.TRUE); - ab.addAssociated("munch"); + character.addAssociation(ab, "munch"); // now the tests @@ -478,12 +478,12 @@ is(character.getVariableValue(s,""), eq(1.0, 0.1), s + " one choice"); - ab.addAssociated("devour"); + character.addAssociation(ab, "devour"); character.setDirty(true); is(character.getVariableValue(s,""), eq(2.0, 0.1), s + " two choices"); - ab.addAssociated("nibble"); + character.addAssociation(ab, "nibble"); character.setDirty(true); is(character.getVariableValue(s,""), eq(3.0, 0.1), s + " three choices"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-09-26 02:08:28
|
Revision: 7794 http://pcgen.svn.sourceforge.net/pcgen/?rev=7794&view=rev Author: thpr Date: 2008-09-26 01:40:08 +0000 (Fri, 26 Sep 2008) Log Message: ----------- Additional association changes includes fixes to "weight" calculation when SELECT is used Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/EqModNameOpt.java Trunk/pcgen/code/src/java/pcgen/cdom/helper/Aspect.java 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/AbilityUtilities.java Trunk/pcgen/code/src/java/pcgen/core/AssociatedChoice.java Trunk/pcgen/code/src/java/pcgen/core/AssociationStore.java Trunk/pcgen/code/src/java/pcgen/core/Description.java Trunk/pcgen/code/src/java/pcgen/core/Equipment.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/VariableProcessorPC.java Trunk/pcgen/code/src/java/pcgen/core/chooser/HPChoiceManager.java Trunk/pcgen/code/src/java/pcgen/core/chooser/SpellListChoiceManager.java Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityFeat.java Trunk/pcgen/code/src/java/pcgen/core/prereq/PrerequisiteUtilities.java Trunk/pcgen/code/src/java/pcgen/gui/utils/PObjectNode.java Trunk/pcgen/code/src/java/pcgen/io/PCGIOHandler.java Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Creator.java Trunk/pcgen/code/src/java/pcgen/io/exporttoken/AbilityToken.java Trunk/pcgen/code/src/java/plugin/jepcommands/CountCommand.java Trunk/pcgen/code/src/test/pcgen/core/EquipmentModifierTest.java Modified: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/EqModNameOpt.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/EqModNameOpt.java 2008-09-26 01:32:21 UTC (rev 7793) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/EqModNameOpt.java 2008-09-26 01:40:08 UTC (rev 7794) @@ -104,14 +104,13 @@ { StringBuilder sb = new StringBuilder(100); boolean first = true; - for (AssociatedChoice<String> a : mod.getAssociatedList()) + for (String listEntry : parent.getAssociationList(mod)) { if (!first) { sb.append(", "); } first = false; - String listEntry = a.getDefaultChoice(); String spellName = EquipmentModifier.getSpellInfoString( listEntry, "SPELLNAME"); @@ -229,4 +228,35 @@ } } + public String associatedList(List<AssociatedChoice<String>> associatedList) + { + if (associatedList == null) + { + return Constants.EMPTY_STRING; + } + else + { + StringBuilder sb = new StringBuilder(); + boolean first = true; + for (AssociatedChoice<String> choice : associatedList) + { + if (!first) + { + sb.append(", "); + } + first = false; + final String choiceStr = choice.getDefaultChoice(); + if (choiceStr.equals(Constants.EMPTY_STRING)) + { + sb.append('*'); + } + else + { + sb.append(choiceStr); + } + } + return sb.toString(); + } + } + } Modified: Trunk/pcgen/code/src/java/pcgen/cdom/helper/Aspect.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/helper/Aspect.java 2008-09-26 01:32:21 UTC (rev 7793) +++ Trunk/pcgen/code/src/java/pcgen/cdom/helper/Aspect.java 2008-09-26 01:40:08 UTC (rev 7794) @@ -276,15 +276,15 @@ { if ( theOwner != null ) { - for ( int i = 0; i < aPC.getExpandedAssociationCount(theOwner); i++ ) + for ( int i = 0; i < aPC.getDetailedAssociationCount(theOwner); i++ ) { if ( i > 0 ) { - if (aPC.getExpandedAssociationCount(theOwner) != 2) + if (aPC.getDetailedAssociationCount(theOwner) != 2) { buf.append(Constants.COMMA + ' '); } - if (i == aPC.getExpandedAssociationCount(theOwner) - 1) + if (i == aPC.getDetailedAssociationCount(theOwner) - 1) { buf.append(" and "); } Modified: Trunk/pcgen/code/src/java/pcgen/cdom/reference/AssociationReference.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/reference/AssociationReference.java 2008-09-26 01:32:21 UTC (rev 7793) +++ Trunk/pcgen/code/src/java/pcgen/cdom/reference/AssociationReference.java 2008-09-26 01:40:08 UTC (rev 7794) @@ -132,11 +132,10 @@ return false; } AssociationStore as = Globals.getCurrentPC(); - int assocCount = as.getAssociationCount(referenceObj); String key = obj.getKeyName(); - for (int e = 0; e < assocCount; ++e) + for (String assoc : as.getAssociationList(referenceObj)) { - if (key.equalsIgnoreCase(referenceObj.getAssociated(e))) + if (key.equalsIgnoreCase(assoc)) { return true; } @@ -162,13 +161,13 @@ { List<T> list = new ArrayList<T>(); AssociationStore as = Globals.getCurrentPC(); - int assocCount = as.getAssociationCount(referenceObj); + List<String> associationList = as.getAssociationList(referenceObj); for (T obj : all.getContainedObjects()) { String key = obj.getKeyName(); - for (int e = 0; e < assocCount; ++e) + for (String assoc : associationList) { - if (key.equalsIgnoreCase(referenceObj.getAssociated(e))) + if (key.equalsIgnoreCase(assoc)) { list.add(obj); break; @@ -204,7 +203,7 @@ public int getObjectCount() { AssociationStore as = Globals.getCurrentPC(); - return as.getAssociationCount(referenceObj); + return as.getDetailedAssociationCount(referenceObj); } /** Modified: Trunk/pcgen/code/src/java/pcgen/core/Ability.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Ability.java 2008-09-26 01:32:21 UTC (rev 7793) +++ Trunk/pcgen/code/src/java/pcgen/core/Ability.java 2008-09-26 01:40:08 UTC (rev 7794) @@ -333,11 +333,11 @@ { if ((getChoiceString().length() == 0) || (getSafe(ObjectKey.MULTIPLE_ALLOWED) && getSafe(ObjectKey.STACKS))) { - if (pc.getAssociationCount(this) > 1) + if (pc.getDetailedAssociationCount(this) > 1) { // number of items only (ie stacking), e.g. " (1x)" aStrBuf.append(" ("); - aStrBuf.append((int) (pc.getAssociationCount(this) * getSafe(ObjectKey.SELECTION_COST).doubleValue())); + aStrBuf.append((int) (pc.getDetailedAssociationCount(this) * getSafe(ObjectKey.SELECTION_COST).doubleValue())); aStrBuf.append("x)"); } } @@ -349,7 +349,7 @@ int i = 0; // list of items in associatedList, e.g. " (Sub1, Sub2, ...)" - for (int e = 0; e < pc.getExpandedAssociationCount(this); ++e) + for (int e = 0; e < pc.getDetailedAssociationCount(this); ++e) { if (i > 0) { Modified: Trunk/pcgen/code/src/java/pcgen/core/AbilityUtilities.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/AbilityUtilities.java 2008-09-26 01:32:21 UTC (rev 7793) +++ Trunk/pcgen/code/src/java/pcgen/core/AbilityUtilities.java 2008-09-26 01:40:08 UTC (rev 7794) @@ -370,7 +370,7 @@ final AbilityCategory category) { // how many sub-choices to make - double abilityCount = (aPC.getAssociationCount(ability) * ability.getSafe(ObjectKey.SELECTION_COST).doubleValue()); + double abilityCount = (aPC.getSelectCorrectedAssociationCount(ability) * ability.getSafe(ObjectKey.SELECTION_COST).doubleValue()); boolean adjustedAbilityPool = false; @@ -440,13 +440,13 @@ } else if (category == AbilityCategory.FEAT) { - int listSize = aPC.getAssociationCount(ability); + int listSize = aPC.getSelectCorrectedAssociationCount(ability); for (Ability myAbility : aPC.getRealAbilitiesList(AbilityCategory.FEAT)) { if (myAbility.getKeyName().equalsIgnoreCase(ability.getKeyName())) { - listSize = aPC.getAssociationCount(myAbility); + listSize = aPC.getSelectCorrectedAssociationCount(myAbility); } } Modified: Trunk/pcgen/code/src/java/pcgen/core/AssociatedChoice.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/AssociatedChoice.java 2008-09-26 01:32:21 UTC (rev 7793) +++ Trunk/pcgen/code/src/java/pcgen/core/AssociatedChoice.java 2008-09-26 01:40:08 UTC (rev 7794) @@ -195,6 +195,6 @@ @Override public String toString() { - return "AssociatedChoice: " + this.getDefaultChoice(); + return getDefaultChoice().toString(); } } Modified: Trunk/pcgen/code/src/java/pcgen/core/AssociationStore.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/AssociationStore.java 2008-09-26 01:32:21 UTC (rev 7793) +++ Trunk/pcgen/code/src/java/pcgen/core/AssociationStore.java 2008-09-26 01:40:08 UTC (rev 7794) @@ -10,17 +10,14 @@ public List<String> removeAllAssociations(PObject obj); - public int getAssociationCount(PObject obj); - public boolean hasAssociations(PObject obj); public List<String> getAssociationList(PObject obj); public boolean containsAssociated(PObject obj, String o); - /* - * Temporary - */ - public int getExpandedAssociationCount(PObject obj); + public int getSelectCorrectedAssociationCount(PObject obj); + public int getDetailedAssociationCount(PObject obj); + } Modified: Trunk/pcgen/code/src/java/pcgen/core/Description.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Description.java 2008-09-26 01:32:21 UTC (rev 7793) +++ Trunk/pcgen/code/src/java/pcgen/core/Description.java 2008-09-26 01:40:08 UTC (rev 7794) @@ -199,15 +199,15 @@ { if ( theOwner != null ) { - for ( int i = 0; i < aPC.getExpandedAssociationCount(theOwner); i++ ) + for ( int i = 0; i < aPC.getDetailedAssociationCount(theOwner); i++ ) { if ( i > 0 ) { - if (aPC.getExpandedAssociationCount(theOwner) != 2) + if (aPC.getDetailedAssociationCount(theOwner) != 2) { buf.append(Constants.COMMA + ' '); } - if (i == aPC.getExpandedAssociationCount(theOwner) - 1) + if (i == aPC.getDetailedAssociationCount(theOwner) - 1) { buf.append(" and "); } Modified: Trunk/pcgen/code/src/java/pcgen/core/Equipment.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Equipment.java 2008-09-26 01:32:21 UTC (rev 7793) +++ Trunk/pcgen/code/src/java/pcgen/core/Equipment.java 2008-09-26 01:40:08 UTC (rev 7794) @@ -689,7 +689,7 @@ // the cost of the metal before the armor gets resized. // for (EquipmentModifier eqMod : eqModifierList) { - int iCount = getAssociationCount(eqMod); + int iCount = getSelectCorrectedAssociationCount(eqMod); if (iCount < 1) { iCount = 1; @@ -705,7 +705,7 @@ } for (EquipmentModifier eqMod : altEqModifierList) { - int iCount = getAssociationCount(eqMod); + int iCount = getSelectCorrectedAssociationCount(eqMod); if (iCount < 1) { iCount = 1; @@ -754,7 +754,7 @@ weightAlreadyUsed = false; for (EquipmentModifier eqMod : eqModifierList) { - int iCount = getAssociationCount(eqMod); + int iCount = getSelectCorrectedAssociationCount(eqMod); if (iCount < 1) { iCount = 1; @@ -767,11 +767,12 @@ Matcher mat; if (hasAssociations(eqMod) - && !costFormula.equals(eqMod.getCost(0))) { + && !costFormula.equals(eqMod.getCost(eqMod.getAssociated(0)))) { eqModCost = BigDecimal.ZERO; - for (int idx = 0; idx < getAssociationCount(eqMod); ++idx) { - mat = pat.matcher(eqMod.getCost(idx)); + for (String assoc : getAssociationList(eqMod)) + { + mat = pat.matcher(eqMod.getCost(assoc)); costFormula = mat.replaceAll("(BASECOST/" + getSafe(IntegerKey.BASE_QUANTITY) + ")"); @@ -819,7 +820,7 @@ } for (EquipmentModifier eqMod : altEqModifierList) { - int iCount = getAssociationCount(eqMod); + int iCount = getSelectCorrectedAssociationCount(eqMod); if (iCount < 1) { iCount = 1; @@ -2412,7 +2413,7 @@ aMod.setChoice(this, selectedChoice, equipChoice); allRemoved = !hasAssociations(aMod); } - } else if (aMod.getChoice(1, this, true, aPC) == 0) { + } else if (!aMod.getChoice(1, this, true, aPC)) { allRemoved = true; } @@ -2580,7 +2581,7 @@ int iCount; for (EquipmentModifier eqMod : eqModifierList) { - iCount = getAssociationCount(eqMod); + iCount = getSelectCorrectedAssociationCount(eqMod); if (iCount < 1) { iCount = 1; @@ -2590,7 +2591,7 @@ } for (EquipmentModifier eqMod : altEqModifierList) { - iCount = getAssociationCount(eqMod); + iCount = getSelectCorrectedAssociationCount(eqMod); if (iCount < 1) { iCount = 1; @@ -3228,7 +3229,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) == 0)) { + || !aMod.getChoice(0, this, false, aPC)) { eqModList.remove(aMod); if (bPrimary) { typeListCachePrimary = null; @@ -3820,8 +3821,8 @@ aString.append(eqMod.getKeyName()); // Add the modifiers - for (int e2 = 0; e2 < getAssociationCount(eqMod); ++e2) { - final String strMod = eqMod.getAssociated(e2); + for (String strMod : getAssociationList(eqMod)) + { aString.append('|').append(strMod.replace('|', '=')); } } @@ -4556,9 +4557,8 @@ while (aTok.hasMoreTokens()) { final String x = aTok.nextToken().replace('=', '|'); - for (int i = getAssociationCount(eqMod) - 1; i >= 0; --i) { - final String aChoice = eqMod.getAssociated(i); - + for (String aChoice : getAssociationList(eqMod)) + { if (aChoice.startsWith(x)) { removeAssociation(eqMod, aChoice); } @@ -4662,8 +4662,8 @@ EquipmentModifier aEqMod = getEqModifierKeyed("ADDTYPE", bPrimary); if (aEqMod != null) { - for (int e = 0; e < getAssociationCount(aEqMod); ++e) { - String aType = aEqMod.getAssociated(e); + for (String aType : getAssociationList(aEqMod)) + { aType = aType.toUpperCase(); if (!calculatedTypeList.contains(aType)) { @@ -5980,10 +5980,8 @@ if (eqMod != null) { - for (int i = 0; i < getAssociationCount(eqMod); ++i) + for (String aString : getAssociationList(eqMod)) { - final String aString = eqMod.getAssociated(i); - if (aString.startsWith(it)) { return aString.substring(it.length()); @@ -6060,9 +6058,11 @@ return obj.tempContainsAssociated(o); } - public int getAssociationCount(PObject obj) + public int getSelectCorrectedAssociationCount(PObject obj) { - return obj.tempGetAssociatedCount(); + //TODO Null here is probably a problem for the PC :/ + return obj.tempGetAssociatedCount() + / getVariableValue(obj.getSelectCount(), "", null).intValue(); } public List<String> getAssociationList(PObject obj) @@ -6071,9 +6071,9 @@ ArrayList<AssociatedChoice<String>> assocList = obj.getAssociatedList(); if (assocList != null) { - for (AssociatedChoice<String> ac : assocList) + for (AssociatedChoice<?> ac : assocList) { - final String choiceStr = ac.getDefaultChoice(); + final String choiceStr = ac.toString(); if (choiceStr.equals(Constants.EMPTY_STRING)) { list.add(null); @@ -6104,7 +6104,7 @@ obj.tempRemoveAssociated(o); } - public int getExpandedAssociationCount(PObject obj) + public int getDetailedAssociationCount(PObject obj) { return obj.tempGetAssociatedCount(true); } Modified: Trunk/pcgen/code/src/java/pcgen/core/EquipmentModifier.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/EquipmentModifier.java 2008-09-26 01:32:21 UTC (rev 7793) +++ Trunk/pcgen/code/src/java/pcgen/core/EquipmentModifier.java 2008-09-26 01:40:08 UTC (rev 7794) @@ -112,10 +112,10 @@ if (idx >= 0) { // Add an entry for each of the associated list entries - for (int j = as.getAssociationCount(this) - 1; j >= 0; j--) + for (String assoc : as.getAssociationList(this)) { final BonusObj newBonus = Bonus.newBonus( - aString.substring(0, idx) + getAssociated(j) + + aString.substring(0, idx) + assoc + aString.substring(idx + 7)); newBonus.setCreatorObject(this); @@ -136,7 +136,7 @@ } // call expandToken to handle prereqs - newBonus.expandToken("%CHOICE", getAssociated(j)); + newBonus.expandToken("%CHOICE", assoc); myBonusList.add(newBonus); } @@ -212,9 +212,9 @@ // TODO WTF is this loop doing? how many times does it expect "%CHOICE" to // appear in the special property? - for (int j = 0; j < caller.getAssociationCount(this); j++) + for (String assoc : caller.getAssociationList(this)) { - propName = propName.replaceFirst("%CHOICE", getAssociated(j)); + propName = propName.replaceFirst("%CHOICE", assoc); } if ((propName != null) && !propName.equals("")) @@ -388,20 +388,20 @@ * @param bAdd being added * @return an integer where apparently (from how it's used) only 0 is significant */ - int getChoice(final int pool, final Equipment parent, final boolean bAdd, PlayerCharacter pc) + boolean getChoice(final int pool, final Equipment parent, final boolean bAdd, PlayerCharacter pc) { String choiceString = getChoiceString(); if (choiceString.length() == 0) { - return 1; + return true; } final boolean forEqBuilder = choiceString.startsWith("EQBUILDER."); if (bAdd && forEqBuilder) { - return 1; + return true; } final ChooserInterface chooser = ChooserFactory.getChooserInstance(); @@ -437,7 +437,7 @@ selectedList = chooser.getSelectedList(); setChoice(parent, selectedList, equipChoice); - return parent.getAssociationCount(this); + return parent.hasAssociations(this); } void setChoice(Equipment parent, final String choice, final EquipmentChoice equipChoice) @@ -716,9 +716,8 @@ return costFormula; } - protected String getCost(final int eqIdx) + protected String getCost(final String listEntry) { - final String listEntry = getAssociated(eqIdx); String costFormula = getSafe(FormulaKey.COST).toString(); String modChoice = ""; @@ -793,7 +792,7 @@ void setRemainingCharges(Equipment parent, final int remainingCharges) { - if (parent.getAssociationCount(this) > 0) + if (parent.hasAssociations(this)) { List<String> assoc = parent.removeAllAssociations(this); String listEntry = assoc.get(0); @@ -818,7 +817,7 @@ int getRemainingCharges(Equipment parent) { - if (parent.getAssociationCount(this) > 0) + if (parent.hasAssociations(this)) { return getSpellInfo(getAssociated(0), s_CHARGES); } Modified: Trunk/pcgen/code/src/java/pcgen/core/PObject.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-09-26 01:32:21 UTC (rev 7793) +++ Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-09-26 01:40:08 UTC (rev 7794) @@ -1312,15 +1312,7 @@ if (pc.hasAssociations(this)) { - for (int i = 0; i < pc.getAssociationCount(this); ++i) - { - if (i != 0) - { - sb.append(" ,"); - } - - sb.append(getAssociated(i)); - } + sb.append(StringUtil.joinToStringBuffer(pc.getAssociationList(this), ", ")); } else { @@ -2338,15 +2330,7 @@ if (aPC.hasAssociations(this)) { - for (int i = 0; i < aPC.getAssociationCount(this); ++i) - { - if (i != 0) - { - sb.append(" ,"); - } - - sb.append(getAssociated(i)); - } + sb.append(StringUtil.joinToStringBuffer(aPC.getAssociationList(this), ", ")); } else { @@ -2780,12 +2764,8 @@ if (ccSkillList.contains("LIST")) { - String aString; - - for (int e = 0; e < pc.getAssociationCount(this); ++e) + for (String aString : pc.getAssociationList(this)) { - aString = getAssociated(e); - if (aName.startsWith(aString) || aString.startsWith(aName)) { return true; @@ -2824,12 +2804,8 @@ if (cSkillList.contains("LIST")) { - String aString; - - for (int e = 0; e < pc.getAssociationCount(this); ++e) + for (String aString : pc.getAssociationList(this)) { - aString = getAssociated(e); - if (aName.startsWith(aString) || aString.startsWith(aName)) { return true; @@ -3508,7 +3484,7 @@ if ("VAR".equals(aType)) { - iTimes = Math.max(1, aPC.getAssociationCount(this)); + iTimes = Math.max(1, aPC.getDetailedAssociationCount(this)); // // SALIST will stick BONUS:VAR|... @@ -3541,9 +3517,9 @@ final String firstPart = bString.substring(0, idx); final String secondPart = bString.substring(idx + span); - for (int i = 0; i < aPC.getAssociationCount(this); ++i) + for (String assoc : aPC.getAssociationList(this)) { - final String xString = new StringBuffer().append(firstPart).append(getAssociated(i)).append(secondPart) + final String xString = new StringBuffer().append(firstPart).append(assoc).append(secondPart) .toString().toUpperCase(); retVal += calcBonus(xString, aType, aName, aTypePlusName, obj, iTimes, bonus, aPC); } Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-09-26 01:32:21 UTC (rev 7793) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-09-26 01:40:08 UTC (rev 7794) @@ -13097,25 +13097,23 @@ iBonus = aBonus.resolve(this, anObj.getQualifiedKey()).doubleValue(); } - int k = - Math.max(1, - (int) (getAssociationCount(anObj) * - anObj.getSafe(ObjectKey.SELECTION_COST).doubleValue())); - + int k; if (hasAssociations(anObj)) { k = 0; - for (int f = 0; f < getAssociationCount(anObj); ++f) + for (String aString : getAssociationList(anObj)) { - final String aString = anObj.getAssociated(f); - if (aString.equalsIgnoreCase(aBonus.getBonusInfo())) { ++k; } } } + else + { + k = 1; + } if ((k == 0) && !CoreUtility.doublesEqual(iBonus, 0)) { @@ -16373,18 +16371,18 @@ { continue; } - final int subfeatCount = getAssociationCount(aFeat); + final int subfeatCount = getSelectCorrectedAssociationCount(aFeat); double cost = aFeat.getSafe(ObjectKey.SELECTION_COST).doubleValue(); - int select = - getVariableValue(aFeat.getSelectCount(), "").intValue(); - double relativeCost = cost / select; if (aFeat.getChoiceString() != null && aFeat.getChoiceString().length() > 0) { - iCount += Math.ceil(subfeatCount * relativeCost); + iCount += Math.ceil(subfeatCount * cost); } else { + int select = getVariableValue(aFeat.getSelectCount(), "") + .intValue(); + double relativeCost = cost / select; if (!AbilityCategory.FEAT.allowFractionalPool()) { iCount += (int) Math.ceil(relativeCost); @@ -16413,19 +16411,18 @@ { for (final Ability ability : abilities) { - final int subfeatCount = getAssociationCount(ability); + final int subfeatCount = getSelectCorrectedAssociationCount(ability); double cost = ability.getSafe(ObjectKey.SELECTION_COST).doubleValue(); - int select = - getVariableValue(ability.getSelectCount(), "") - .intValue(); - double relativeCost = cost / select; if (ability.getChoiceString() != null && ability.getChoiceString().length() > 0) { - spent += Math.ceil(subfeatCount * relativeCost); + spent += Math.ceil(subfeatCount * cost); } else { + int select = getVariableValue(ability.getSelectCount(), "") + .intValue(); + double relativeCost = cost / select; if (!aCategory.allowFractionalPool()) { spent += (int) Math.ceil(relativeCost); @@ -16759,10 +16756,8 @@ Ability aggregateFeat = aHashMap.get(vFeat.getKeyName()); aggregateFeat = aggregateFeat.clone(); - for (int e1 = 0; e1 < getAssociationCount(vFeat); ++e1) + for (String aString : getAssociationList(vFeat)) { - final String aString = vFeat.getAssociated(e1); - if (aggregateFeat.getSafe(ObjectKey.STACKS) || !containsAssociated(aggregateFeat, aString)) { @@ -16789,9 +16784,8 @@ Ability aggregateFeat = aHashMap.get(autoFeat.getKeyName()); aggregateFeat = aggregateFeat.clone(); - for (int e1 = 0; e1 < getAssociationCount(autoFeat); ++e1) + for (String aString : getAssociationList(autoFeat)) { - final String aString = autoFeat.getAssociated(e1); if (aggregateFeat.getSafe(ObjectKey.STACKS) || !containsAssociated(aggregateFeat, aString)) { @@ -17258,10 +17252,8 @@ if (aDomain != null) { - for (int e2 = 0; e2 < getAssociationCount(aDomain); ++e2) + for (String aString : getAssociationList(aDomain)) { - final String aString = aDomain.getAssociated(e2); - if (aString.startsWith("FEAT")) { final int idx = aString.indexOf('?'); @@ -17875,9 +17867,10 @@ return obj.tempContainsAssociated(o); } - public int getAssociationCount(PObject obj) + public int getSelectCorrectedAssociationCount(PObject obj) { - return obj.tempGetAssociatedCount(); + return obj.tempGetAssociatedCount() + / getVariableValue(obj.getSelectCount(), "", this).intValue(); } public List<String> getAssociationList(PObject obj) @@ -17919,7 +17912,7 @@ obj.tempRemoveAssociated(o); } - public int getExpandedAssociationCount(PObject obj) + public int getDetailedAssociationCount(PObject obj) { return obj.tempGetAssociatedCount(true); } Modified: Trunk/pcgen/code/src/java/pcgen/core/Skill.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Skill.java 2008-09-26 01:32:21 UTC (rev 7793) +++ Trunk/pcgen/code/src/java/pcgen/core/Skill.java 2008-09-26 01:40:08 UTC (rev 7794) @@ -415,7 +415,7 @@ return this.getOutputName(); } - final StringBuffer buffer = new StringBuffer(pc.getAssociationCount(this) * 20); + final StringBuilder buffer = new StringBuilder(); buffer.append(this.getOutputName()).append("("); buffer.append(StringUtil.joinToStringBuffer(pc.getAssociationList(this), ", ")); buffer.append(")"); @@ -470,7 +470,7 @@ } else { - final int selectedLanguages = aPC.getAssociationCount(this); + final int selectedLanguages = aPC.getSelectCorrectedAssociationCount(this); final int maxLanguages = getTotalRank(aPC).intValue(); if (selectedLanguages > maxLanguages) @@ -566,7 +566,7 @@ int iCount = 0; for ( LevelAbility la : laList ) { - iCount += aPC.getAssociationCount(la); + iCount += aPC.getDetailedAssociationCount(la); } if (CoreUtility.doublesEqual(getRank().doubleValue() + bonus, 0.0)) Modified: Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorPC.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorPC.java 2008-09-26 01:32:21 UTC (rev 7793) +++ Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorPC.java 2008-09-26 01:40:08 UTC (rev 7794) @@ -152,7 +152,7 @@ } else { - count += Math.max(1, getPc().getAssociationCount(feat)); + count += Math.max(1, getPc().getSelectCorrectedAssociationCount(feat)); } } } @@ -167,7 +167,7 @@ } else { - count += Math.max(1, getPc().getAssociationCount(feat)); + count += Math.max(1, getPc().getSelectCorrectedAssociationCount(feat)); } } } Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/HPChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/HPChoiceManager.java 2008-09-26 01:32:21 UTC (rev 7793) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/HPChoiceManager.java 2008-09-26 01:40:08 UTC (rev 7794) @@ -69,9 +69,9 @@ availableList.add(choiceSec); - for (int e1 = 0; e1 < aPc.getAssociationCount(pobject); ++e1) + for (String assoc : aPc.getAssociationList(pobject)) { - selectedList.add(choiceSec); + selectedList.add(assoc); } setPreChooserChoices(selectedList.size()); } Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/SpellListChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/SpellListChoiceManager.java 2008-09-26 01:32:21 UTC (rev 7793) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/SpellListChoiceManager.java 2008-09-26 01:40:08 UTC (rev 7794) @@ -188,7 +188,7 @@ final StringBuffer sb = new StringBuffer(100); - for (int j = 0; j < pc.getAssociationCount(anAbility); ++j) + for (int j = 0; j < pc.getSelectCorrectedAssociationCount(anAbility); ++j) { fmc = (FeatMultipleChoice) anAbility.getAssociatedList().get(j); sb.append(anAbility.getKeyName()).append(" ("); Modified: Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityFeat.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityFeat.java 2008-09-26 01:32:21 UTC (rev 7793) +++ Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityFeat.java 2008-09-26 01:40:08 UTC (rev 7794) @@ -91,9 +91,8 @@ } else { - for (int j = 0; j < aPC.getAssociationCount(this); ++j) + for (String featKey : aPC.getAssociationList(this)) { - String featKey = getAssociatedList().get(j).toString(); final Ability anAbility = Globals.getAbilityKeyed("FEAT", featKey); if (anAbility == null) Modified: Trunk/pcgen/code/src/java/pcgen/core/prereq/PrerequisiteUtilities.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/prereq/PrerequisiteUtilities.java 2008-09-26 01:32:21 UTC (rev 7793) +++ Trunk/pcgen/code/src/java/pcgen/core/prereq/PrerequisiteUtilities.java 2008-09-26 01:40:08 UTC (rev 7794) @@ -249,7 +249,7 @@ runningTotal++; if (ability.getSafe(ObjectKey.MULTIPLE_ALLOWED) && countMults) { - runningTotal += (character.getAssociationCount(ability) - 1); + runningTotal += (character.getSelectCorrectedAssociationCount(ability) - 1); } } } @@ -338,7 +338,7 @@ if (aFeat.getSafe(ObjectKey.MULTIPLE_ALLOWED) && countMults) { runningTotal += - (character.getAssociationCount(aFeat) - 1); + (character.getSelectCorrectedAssociationCount(aFeat) - 1); } } else @@ -347,12 +347,9 @@ if (wildCardPos > -1) { - for (int k = 0; k < character.getAssociationCount(aFeat); ++k) + for (String assoc : character.getAssociationList(aFeat)) { - - final String fString = - aFeat.getAssociated(k) - .toUpperCase(); + final String fString = assoc.toUpperCase(); if (wildCardPos == 0 || fString.startsWith(subKey .substring(0, wildCardPos - 1) Modified: Trunk/pcgen/code/src/java/pcgen/gui/utils/PObjectNode.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/utils/PObjectNode.java 2008-09-26 01:32:21 UTC (rev 7793) +++ Trunk/pcgen/code/src/java/pcgen/gui/utils/PObjectNode.java 2008-09-26 01:40:08 UTC (rev 7794) @@ -268,7 +268,7 @@ // // If 1st selection has no length, then in is from CHOOSE:NOCHOICE // - final int subCount = aPC.getAssociationCount(aFeat); + final int subCount = aPC.getDetailedAssociationCount(aFeat); if ((subCount > 1) && (aFeat.getAssociated(0, true).length() == 0)) { @@ -278,7 +278,7 @@ } else { - for (int i = 0; i < aPC.getExpandedAssociationCount(aFeat); i++) + for (int i = 0; i < aPC.getDetailedAssociationCount(aFeat); i++) { if (addComma) { Modified: Trunk/pcgen/code/src/java/pcgen/io/PCGIOHandler.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/PCGIOHandler.java 2008-09-26 01:32:21 UTC (rev 7793) +++ Trunk/pcgen/code/src/java/pcgen/io/PCGIOHandler.java 2008-09-26 01:40:08 UTC (rev 7794) @@ -368,9 +368,8 @@ buildSALIST(aFeat.getChoiceString(), aAvailable, aBonus, currentPC); - for (int i = 0; i < aPC.getAssociationCount(aFeat); i++) + for (String aString : aPC.getAssociationList(aFeat)) { - String aString = aFeat.getAssociated(i); String orig = aString; final String prefix = aString + "|"; boolean bLoop = true; @@ -459,9 +458,8 @@ // // Byngl July 12, 2002 // - for (int it3 = 0; it3 < currentPC.getAssociationCount(aFeat); it3++) + for (String skillString : currentPC.getAssociationList(aFeat)) { - final String skillString = aFeat.getAssociated(it3); try { PObjectLoader.parseTag(aFeat, "CSKILL:" + skillString); Modified: Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Creator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Creator.java 2008-09-26 01:32:21 UTC (rev 7793) +++ Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Creator.java 2008-09-26 01:40:08 UTC (rev 7794) @@ -1158,11 +1158,11 @@ buffer.append(TAG_DOMAIN).append(':'); buffer.append(EntityEncoder.encode(domain.getKeyName())); - for (int i = 0; i < thePC.getAssociationCount(domain); ++i) + for (String assoc : thePC.getAssociationList(domain)) { buffer.append('|'); buffer.append(TAG_ASSOCIATEDDATA).append(':'); - buffer.append(EntityEncoder.encode(domain.getAssociated(i))); + buffer.append(EntityEncoder.encode(assoc)); } for (final Description desc : domain.getDescriptionList()) @@ -1396,7 +1396,6 @@ buffer.append(TAG_MAPKEY).append(TAG_END); buffer.append(EntityEncoder.encode(ability.getKeyName())) .append(TAG_SEPARATOR); - int it2 = 0; if (ability.getSafe(ObjectKey.MULTIPLE_ALLOWED)) { buffer.append(TAG_APPLIEDTO).append(TAG_END); @@ -1404,14 +1403,14 @@ { buffer.append(TAG_MULTISELECT).append(':'); } - for (; it2 < thePC.getAssociationCount(ability); ++it2) + boolean first = true; + for (String assoc : thePC.getAssociationList(ability)) { - if (it2 > 0 && it2 < thePC.getAssociationCount(ability)) + if (!first) { buffer.append(Constants.COMMA); } - buffer.append(EntityEncoder.encode(ability - .getAssociated(it2))); + buffer.append(EntityEncoder.encode(assoc)); } buffer.append(TAG_SEPARATOR); } @@ -1978,11 +1977,11 @@ buffer.append(']'); } - for (int i = 0; i < thePC.getAssociationCount(skill); ++i) + for (String assoc : thePC.getAssociationList(skill)) { buffer.append('|'); buffer.append(TAG_ASSOCIATEDDATA).append(':'); - buffer.append(EntityEncoder.encode(skill.getAssociated(i))); + buffer.append(EntityEncoder.encode(assoc)); } appendLevelAbilityInfo(buffer, skill); @@ -2633,7 +2632,7 @@ .append('[').append(TAG_PROMPT).append(':').append( EntityEncoder.encode(la.getTagData())); - for (int j = 0; j < thePC.getExpandedAssociationCount(la); ++j) + for (int j = 0; j < thePC.getDetailedAssociationCount(la); ++j) { buffer .append('|') Modified: Trunk/pcgen/code/src/java/pcgen/io/exporttoken/AbilityToken.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/exporttoken/AbilityToken.java 2008-09-26 01:32:21 UTC (rev 7793) +++ Trunk/pcgen/code/src/java/pcgen/io/exporttoken/AbilityToken.java 2008-09-26 01:40:08 UTC (rev 7794) @@ -33,6 +33,7 @@ import java.util.StringTokenizer; import java.util.TreeSet; +import pcgen.base.lang.StringUtil; import pcgen.cdom.enumeration.AspectName; import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.MapKey; @@ -338,22 +339,11 @@ } else if (tokenSource.endsWith(".ASSOCIATED")) { - StringBuffer buf = new StringBuffer(); - - for (int j = 0; j < pc.getAssociationCount(aAbility); j++) - { - if (j != 0) - { - buf.append(","); - } - buf.append(aAbility.getAssociated(j)); - } - - retString += buf.toString(); + retString += StringUtil.join(pc.getAssociationList(aAbility), ","); } else if (tokenSource.endsWith(".ASSOCIATEDCOUNT")) { - retString += Integer.toString(pc.getAssociationCount(aAbility)); + retString += Integer.toString(pc.getDetailedAssociationCount(aAbility)); } else if (tokenSource.endsWith(".SOURCE")) { Modified: Trunk/pcgen/code/src/java/plugin/jepcommands/CountCommand.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/jepcommands/CountCommand.java 2008-09-26 01:32:21 UTC (rev 7793) +++ Trunk/pcgen/code/src/java/plugin/jepcommands/CountCommand.java 2008-09-26 01:40:08 UTC (rev 7794) @@ -127,8 +127,8 @@ for (final PObject ab : filtered) { - final double ac = pc.getAssociationCount(ab); - accum += 1.01 >= ac ? 1 : pc.getAssociationCount(ab); + final double ac = pc.getSelectCorrectedAssociationCount(ab); + accum += 1.01 >= ac ? 1 : ac; } return accum; } Modified: Trunk/pcgen/code/src/test/pcgen/core/EquipmentModifierTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/EquipmentModifierTest.java 2008-09-26 01:32:21 UTC (rev 7793) +++ Trunk/pcgen/code/src/test/pcgen/core/EquipmentModifierTest.java 2008-09-26 01:40:08 UTC (rev 7794) @@ -174,16 +174,14 @@ eqMod.addBonusList(aBonus); final List<BonusObj> list = eqMod.getBonusList(e); - int i = 1; for (int j = list.size() - 1; j > 0; j--) { final BonusObj bonusObj = list.get(j); assertEquals("-2", bonusObj.getValue()); final Prerequisite prereq = bonusObj.getPrerequisiteList().get(0); - assertEquals("+" + i, prereq.getKey()); + assertEquals("+" + (j+1), prereq.getKey()); assertEquals("STR", prereq.getOperand()); - i++; } assertEquals("-2", aBonus.getValue()); final Prerequisite prereq = aBonus.getPrerequisiteList().get(0); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jde...@us...> - 2008-09-27 11:58:44
|
Revision: 7803 http://pcgen.svn.sourceforge.net/pcgen/?rev=7803&view=rev Author: jdempsey Date: 2008-09-27 11:58:41 +0000 (Sat, 27 Sep 2008) Log Message: ----------- FReq: Skill BONUS explanation improvement Issue#: 2002109 Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/analysis/SkillModifier.java Added Paths: ----------- Trunk/pcgen/code/src/test/pcgen/core/analysis/ Trunk/pcgen/code/src/test/pcgen/core/analysis/SkillModifierTest.java Modified: Trunk/pcgen/code/src/java/pcgen/core/analysis/SkillModifier.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/analysis/SkillModifier.java 2008-09-27 07:04:45 UTC (rev 7802) +++ Trunk/pcgen/code/src/java/pcgen/core/analysis/SkillModifier.java 2008-09-27 11:58:41 UTC (rev 7803) @@ -21,6 +21,7 @@ package pcgen.core.analysis; import java.util.ArrayList; +import java.util.List; import java.util.regex.Pattern; import pcgen.cdom.enumeration.ObjectKey; @@ -158,26 +159,49 @@ double bonusObjTotal = 0.0; StringBuffer bonusDetails = new StringBuffer(); String keyName = sk.getKeyName(); + String bonusKey = ("SKILL." + keyName).toUpperCase(); for (BonusObj bonus : aPC.getActiveBonusList()) { // calculate bonus and add to activeBonusMap - if (bonus.isApplied() && "SKILL".equals(bonus.getBonusName()) - && bonus.getBonusInfoList().contains(keyName.toUpperCase())) + if (bonus.isApplied() && "SKILL".equals(bonus.getBonusName())) { - double iBonus = 0; - for (BonusPair bp : bonus.getStringListFromBonus()) + boolean include = + bonus.getBonusInfoList() + .contains(keyName.toUpperCase()); + if (!include) { - iBonus += bp.resolve(aPC).doubleValue(); + for (BonusPair bp : bonus.getStringListFromBonus()) + { + String bpKey = bp.bonusKey.toUpperCase(); + if (bpKey.startsWith(bonusKey)) + { + include = true; + break; + } + } } - if (!CoreUtility.doublesEqual(iBonus, 0.0)) + + if (include) { - if (bonusDetails.length() > 0) + double iBonus = 0; + for (BonusPair bp : bonus.getStringListFromBonus()) { - bonusDetails.append(' '); + String bpKey = bp.bonusKey.toUpperCase(); + if (bpKey.startsWith(bonusKey)) + { + iBonus += bp.resolve(aPC).doubleValue(); + } } - bonusDetails.append(Delta.toString((int) iBonus)); - bonusDetails.append(bonus.getBonusContext(shortForm)); - bonusObjTotal += iBonus; + if (!CoreUtility.doublesEqual(iBonus, 0.0)) + { + if (bonusDetails.length() > 0) + { + bonusDetails.append(' '); + } + bonusDetails.append(Delta.toString((int) iBonus)); + bonusDetails.append(bonus.getBonusContext(shortForm)); + bonusObjTotal += iBonus; + } } } } Added: Trunk/pcgen/code/src/test/pcgen/core/analysis/SkillModifierTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/analysis/SkillModifierTest.java (rev 0) +++ Trunk/pcgen/code/src/test/pcgen/core/analysis/SkillModifierTest.java 2008-09-27 11:58:41 UTC (rev 7803) @@ -0,0 +1,135 @@ +/* + * SkillModifierTest.java + * Copyright 2008 (C) James Dempsey + * + * 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 27/09/2008 21:04:10 + * + * $Id: $ + */ +package pcgen.core.analysis; + +import org.junit.Test; + +import pcgen.AbstractCharacterTestCase; +import pcgen.cdom.enumeration.ObjectKey; +import pcgen.cdom.enumeration.SkillArmorCheck; +import pcgen.core.Ability; +import pcgen.core.AbilityCategory; +import pcgen.core.AssociatedChoice; +import pcgen.core.Globals; +import pcgen.core.PCClass; +import pcgen.core.PlayerCharacter; +import pcgen.core.Race; +import pcgen.core.Skill; +import pcgen.util.TestHelper; + +/** + * The Class <code>SkillModifierTest</code> is responsible for checking that the + * SkillModifier class is operating correctly. + * + * Last Editor: $Author: $ + * Last Edited: $Date: $ + * + * @author James Dempsey <jde...@us...> + * @version $Revision: $ + */ +public class SkillModifierTest extends AbstractCharacterTestCase +{ + + PCClass pcClass; + Race emptyRace = new Race(); + boolean firstTime = true; + Ability skillFocus = new Ability(); + Ability persuasive = new Ability(); + Skill bluff; + + /* (non-Javadoc) + * @see pcgen.AbstractCharacterTestCase#setUp() + */ + @Override + protected void setUp() throws Exception + { + super.setUp(); + + if (firstTime) + { + firstTime = false; + + pcClass = new PCClass(); + + TestHelper.makeSkill("Bluff", "Charisma", "CHA", true, + SkillArmorCheck.NONE); + TestHelper.makeSkill("Listen", "Wisdom", "WIS", true, + SkillArmorCheck.NONE); + + skillFocus = + TestHelper.makeAbility("Skill Focus", AbilityCategory.FEAT + .getAbilityCategory(), "General"); + skillFocus.addBonusList("SKILL|LIST|3"); + skillFocus.put(ObjectKey.MULTIPLE_ALLOWED, true); + skillFocus + .setChoiceString("SKILLSNAMED|TYPE.Strength|TYPE.Dexterity|TYPE.Constitution|TYPE.Intelligence|TYPE.Wisdom|TYPE.Charisma"); + + persuasive = + TestHelper.makeAbility("Persuasive", AbilityCategory.FEAT + .getAbilityCategory(), "General"); + persuasive.addBonusList("SKILL|KEY_Bluff,KEY_Listen|2"); + persuasive.put(ObjectKey.MULTIPLE_ALLOWED, false); + + } + + final PlayerCharacter character = getCharacter(); + character.incrementClassLevel(1, pcClass); + } + + /* (non-Javadoc) + * @see pcgen.AbstractCharacterTestCase#tearDown() + */ + @Override + protected void tearDown() throws Exception + { + pcClass = null; + super.tearDown(); + } + + /** + * Test getModifierExplanation for both lists and multiple + * bonus feats. + */ + @Test + public void testGetModifierExplanation() + { + bluff = + Globals.getContext().ref.silentlyGetConstructedCDOMObject( + Skill.class, "KEY_bluff"); + PlayerCharacter pc = getCharacter(); + + assertEquals("Initial state", "", SkillModifier.getModifierExplanation( + bluff, pc, false)); + + skillFocus.addAssociated(new AssociatedChoice<String>("KEY_Bluff")); + pc.addAbility(AbilityCategory.FEAT, skillFocus, null); + assertEquals("Bonus after skill focus", "+3[Skill Focus]", + SkillModifier.getModifierExplanation(bluff, pc, false)); + + pc.addAbility(AbilityCategory.FEAT, persuasive, null); + assertEquals("Bonus after persuasive", + "+3[Skill Focus] +2[Persuasive]", SkillModifier + .getModifierExplanation(bluff, pc, false)); + } + +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |