From: <th...@us...> - 2008-09-27 17:12:11
|
Revision: 7807 http://pcgen.svn.sourceforge.net/pcgen/?rev=7807&view=rev Author: thpr Date: 2008-09-27 17:12:09 +0000 (Sat, 27 Sep 2008) Log Message: ----------- Skill Modifier description must be deterministic to be testable :) Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/analysis/SkillModifier.java 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 16:32:32 UTC (rev 7806) +++ Trunk/pcgen/code/src/java/pcgen/core/analysis/SkillModifier.java 2008-09-27 17:12:09 UTC (rev 7807) @@ -21,9 +21,11 @@ package pcgen.core.analysis; import java.util.ArrayList; -import java.util.List; +import java.util.Set; +import java.util.TreeSet; import java.util.regex.Pattern; +import pcgen.base.lang.StringUtil; import pcgen.cdom.enumeration.ObjectKey; import pcgen.core.Globals; import pcgen.core.PCStat; @@ -157,7 +159,7 @@ boolean shortForm) { double bonusObjTotal = 0.0; - StringBuffer bonusDetails = new StringBuffer(); + Set<String> explanation = new TreeSet<String>(); String keyName = sk.getKeyName(); String bonusKey = ("SKILL." + keyName).toUpperCase(); for (BonusObj bonus : aPC.getActiveBonusList()) @@ -194,18 +196,16 @@ } if (!CoreUtility.doublesEqual(iBonus, 0.0)) { - if (bonusDetails.length() > 0) - { - bonusDetails.append(' '); - } - bonusDetails.append(Delta.toString((int) iBonus)); - bonusDetails.append(bonus.getBonusContext(shortForm)); + explanation.add(Delta.toString((int) iBonus) + bonus.getBonusContext(shortForm)); bonusObjTotal += iBonus; } } } } + StringBuilder bonusDetails = new StringBuilder(); + bonusDetails.append(StringUtil.joinToStringBuffer(explanation, " ")); + // TODO: Need to add other bonuses which are not encoded as bonus // objects // - familiars, racial, feats - and add them to bonusObjTotal @@ -295,13 +295,13 @@ * value is not 0. * * @param bonusDetails - * The StringBuffer being built up. NB: May be modified. + * The StringBuilder being built up. NB: May be modified. * @param bonus * The value of the bonus. * @param description * The description of the bonus. */ - public static void appendBonusDesc(Skill sk, StringBuffer bonusDetails, + public static void appendBonusDesc(Skill sk, StringBuilder bonusDetails, double bonus, String description) { if (CoreUtility.doublesEqual(bonus, 0.0)) Modified: Trunk/pcgen/code/src/test/pcgen/core/analysis/SkillModifierTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/analysis/SkillModifierTest.java 2008-09-27 16:32:32 UTC (rev 7806) +++ Trunk/pcgen/code/src/test/pcgen/core/analysis/SkillModifierTest.java 2008-09-27 17:12:09 UTC (rev 7807) @@ -128,7 +128,7 @@ pc.addAbility(AbilityCategory.FEAT, persuasive, null); assertEquals("Bonus after persuasive", - "+3[Skill Focus] +2[Persuasive]", SkillModifier + "+2[Persuasive] +3[Skill Focus]", SkillModifier .getModifierExplanation(bluff, pc, false)); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-09-27 19:09:09
|
Revision: 7810 http://pcgen.svn.sourceforge.net/pcgen/?rev=7810&view=rev Author: thpr Date: 2008-09-27 19:08:59 +0000 (Sat, 27 Sep 2008) Log Message: ----------- DESC token update Modified Paths: -------------- Trunk/pcgen/code/src/java/gmgen/plugin/PcgCombatant.java Trunk/pcgen/code/src/java/gmgen/plugin/PlayerCharacterOutput.java 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/cdom/helper/Aspect.java Trunk/pcgen/code/src/java/pcgen/core/Ability.java Trunk/pcgen/code/src/java/pcgen/core/Description.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/SubClass.java Trunk/pcgen/code/src/java/pcgen/core/SubstitutionClass.java Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassLevelPanel.java Trunk/pcgen/code/src/java/pcgen/gui/editor/DeityBasePanel.java Trunk/pcgen/code/src/java/pcgen/gui/editor/DomainBasePanel.java Trunk/pcgen/code/src/java/pcgen/gui/editor/FeatBasePanel.java Trunk/pcgen/code/src/java/pcgen/gui/editor/SpellBasePanel.java Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoDomain.java Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoTempMod.java Trunk/pcgen/code/src/java/pcgen/gui/tabs/ability/AbilityInfoPanel.java Trunk/pcgen/code/src/java/pcgen/gui/tabs/ability/AbilityModel.java Trunk/pcgen/code/src/java/pcgen/gui/tabs/spells/InfoSpellsSubTab.java Trunk/pcgen/code/src/java/pcgen/gui/tabs/spells/SpellModel.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/pcgen/io/exporttoken/DomainToken.java Trunk/pcgen/code/src/java/pcgen/io/exporttoken/EqToken.java Trunk/pcgen/code/src/java/pcgen/persistence/lst/LstSystemLoader.java Trunk/pcgen/code/src/java/plugin/charactersheet/gui/ClassSpellLevelPane.java Trunk/pcgen/code/src/java/plugin/charactersheet/gui/Page2Panel.java Trunk/pcgen/code/src/java/plugin/exporttokens/DeityToken.java Trunk/pcgen/code/src/java/plugin/exporttokens/SpellMemToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/DescLst.java Trunk/pcgen/code/src/test/pcgen/core/PCClassTest.java Trunk/pcgen/code/src/test/pcgen/core/PObjectTest.java Trunk/pcgen/code/src/test/plugin/jepcommands/ClassLevelCommandTest.java Added Paths: ----------- Trunk/pcgen/code/src/java/pcgen/core/analysis/DescriptionFormatting.java Trunk/pcgen/code/src/utest/plugin/lsttokens/DescLstTest.java Modified: Trunk/pcgen/code/src/java/gmgen/plugin/PcgCombatant.java =================================================================== --- Trunk/pcgen/code/src/java/gmgen/plugin/PcgCombatant.java 2008-09-27 19:06:44 UTC (rev 7809) +++ Trunk/pcgen/code/src/java/gmgen/plugin/PcgCombatant.java 2008-09-27 19:08:59 UTC (rev 7810) @@ -52,6 +52,7 @@ import pcgen.core.SettingsHandler; import pcgen.core.Skill; import pcgen.core.StatList; +import pcgen.core.analysis.DescriptionFormatting; import pcgen.core.analysis.SkillModifier; import pcgen.core.character.CharacterSpell; import pcgen.core.spell.Spell; @@ -879,7 +880,7 @@ Domain dom = cd.getDomain(); statBuf.append(pcOut.getDomainName(dom)); //|DOMAIN| statBuf.append(" ("); - statBuf.append(pcOut.getDomainPower(pc, dom)); //|DOMAIN.POWER| + statBuf.append(DescriptionFormatting.piDescString(pc, dom)); //|DOMAIN.POWER| statBuf.append(")"); } @@ -1087,7 +1088,7 @@ spellBuff.append("<a href=" + '"' + "spell:"); spellBuff.append(spell.getDisplayName()); spellBuff.append("\\"); - spellBuff.append(aPC.parseSpellString(spell, spell.getDescription(aPC), cs.getOwner())); + spellBuff.append(aPC.parseSpellString(spell, aPC.getDescription(spell), cs.getOwner())); spellBuff.append("\\"); spellBuff.append(StringUtil.joinToStringBuffer(spell.getListFor(ListKey.RANGE), ", ")); spellBuff.append("\\"); Modified: Trunk/pcgen/code/src/java/gmgen/plugin/PlayerCharacterOutput.java =================================================================== --- Trunk/pcgen/code/src/java/gmgen/plugin/PlayerCharacterOutput.java 2008-09-27 19:06:44 UTC (rev 7809) +++ Trunk/pcgen/code/src/java/gmgen/plugin/PlayerCharacterOutput.java 2008-09-27 19:08:59 UTC (rev 7810) @@ -19,6 +19,7 @@ import pcgen.core.PlayerCharacter; import pcgen.core.SettingsHandler; import pcgen.core.StatList; +import pcgen.core.analysis.DescriptionFormatting; import pcgen.io.ExportHandler; import pcgen.util.enumeration.AttackType; @@ -141,11 +142,6 @@ return domain.getDisplayName(); } - public String getDomainPower(final PlayerCharacter aPC, Domain domain) - { - return domain.piDescString(aPC); - } - public String getEquipmentList() { StringBuffer sb = new StringBuffer(); Modified: Trunk/pcgen/code/src/java/pcgen/cdom/base/CDOMObject.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/base/CDOMObject.java 2008-09-27 19:06:44 UTC (rev 7809) +++ Trunk/pcgen/code/src/java/pcgen/cdom/base/CDOMObject.java 2008-09-27 19:08:59 UTC (rev 7810) @@ -27,7 +27,6 @@ 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; @@ -38,6 +37,7 @@ import pcgen.cdom.enumeration.VariableKey; import pcgen.cdom.util.ListKeyMapToList; import pcgen.cdom.util.MapKeyMap; +import pcgen.core.Description; import pcgen.core.PlayerCharacter; public abstract class CDOMObject extends ConcretePrereqObject implements @@ -619,4 +619,8 @@ tc.act(tc.driveChoice(aPC), aPC); } + public ListKey<Description> getDescriptionKey() + { + return ListKey.DESCRIPTION; + } } Modified: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java 2008-09-27 19:06:44 UTC (rev 7809) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java 2008-09-27 19:08:59 UTC (rev 7810) @@ -221,6 +221,7 @@ public static final ListKey<Movement> MOVEMENT = new ListKey<Movement>(); public static final ListKey<FollowerOption> COMPANIONLIST = new ListKey<FollowerOption>(); public static final ListKey<FollowerLimit> FOLLOWERS = new ListKey<FollowerLimit>(); + public static final ListKey<Description> DESCRIPTION = new ListKey<Description>(); /** Private constructor to prevent instantiation of this class */ private ListKey() { Modified: Trunk/pcgen/code/src/java/pcgen/cdom/helper/Aspect.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/helper/Aspect.java 2008-09-27 19:06:44 UTC (rev 7809) +++ Trunk/pcgen/code/src/java/pcgen/cdom/helper/Aspect.java 2008-09-27 19:08:59 UTC (rev 7810) @@ -307,7 +307,7 @@ { buf.append(Constants.COMMA + ' '); } - buf.append(feat.getDescription(aPC)); + buf.append(aPC.getDescription(feat)); first = false; } } @@ -315,7 +315,7 @@ else { final Ability feat = aPC.getAbilityKeyed(AbilityCategory.FEAT, featName); - buf.append(feat.getDescription(aPC)); + buf.append(aPC.getDescription(feat)); } } else if ( var.startsWith("\"") ) //$NON-NLS-1$ Modified: Trunk/pcgen/code/src/java/pcgen/core/Ability.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Ability.java 2008-09-27 19:06:44 UTC (rev 7809) +++ Trunk/pcgen/code/src/java/pcgen/core/Ability.java 2008-09-27 19:08:59 UTC (rev 7810) @@ -138,23 +138,6 @@ } /** - * Get a description of what this ability does - * - * @return the benefit if it is set and they are turned on, otherwise - * return the description - */ - @Override - public String getDescription(final PlayerCharacter aPC) - { - if (SettingsHandler.useFeatBenefits() && getBenefits(aPC).length() > 1) - { - return getBenefits(aPC); - } - - return super.getDescription(aPC); - } - - /** * Set the category of this Ability * * @param category the category of the ability @@ -737,4 +720,15 @@ { put(ObjectKey.ABILITY_CAT, cat); } + + @Override + public ListKey<Description> getDescriptionKey() + { + if (SettingsHandler.useFeatBenefits() && containsListFor(ListKey.BENEFIT)) + { + return ListKey.BENEFIT; + } + return ListKey.DESCRIPTION; + } + } Modified: Trunk/pcgen/code/src/java/pcgen/core/Description.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Description.java 2008-09-27 19:06:44 UTC (rev 7809) +++ Trunk/pcgen/code/src/java/pcgen/core/Description.java 2008-09-27 19:08:59 UTC (rev 7810) @@ -230,7 +230,7 @@ { buf.append(Constants.COMMA + ' '); } - buf.append(feat.getDescription(aPC)); + buf.append(aPC.getDescription(feat)); first = false; } } @@ -238,7 +238,7 @@ else { final Ability feat = aPC.getAbilityKeyed(AbilityCategory.FEAT, featName); - buf.append(feat.getDescription(aPC)); + buf.append(aPC.getDescription(feat)); } } else if ( var.startsWith("\"") ) //$NON-NLS-1$ Modified: Trunk/pcgen/code/src/java/pcgen/core/PObject.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-09-27 19:06:44 UTC (rev 7809) +++ Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-09-27 19:08:59 UTC (rev 7810) @@ -40,8 +40,6 @@ import java.util.SortedSet; import java.util.StringTokenizer; import java.util.TreeSet; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import pcgen.base.lang.StringUtil; import pcgen.base.util.DoubleKeyMap; @@ -124,8 +122,6 @@ private String chooseLanguageAutos = Constants.EMPTY_STRING; - private List<Description> theDescriptions = null; - private HashMap<String,List<String>> servesAsList =null; private URI sourceURI = null; @@ -280,56 +276,6 @@ put(StringKey.DESCRIPTION, a); } - /** - * Adds a description for this object. Multiple descriptions are allowed - * and will be concatonated on output. - * - * <p>The format of the description tag - * @param aDesc - */ - public void addDescription( final Description aDesc ) - { - if ( theDescriptions == null ) - { - theDescriptions = new ArrayList<Description>(); - } - theDescriptions.add( aDesc ); - } - - /** - * Clears all current descriptions for the object. - */ - public void removeAllDescriptions() - { - theDescriptions = null; - } - - /** - * Removes <tt>Description</tt>s who's PCC Text matches the pattern - * specified. - * - * @param aDescPattern The regular expression to search for. - */ - public void removeDescription( final String aDescPattern ) - { - if ( theDescriptions == null ) - { - return; - } - final Pattern pattern = Pattern.compile(aDescPattern); - - for ( final Iterator<Description> i = theDescriptions.iterator(); i.hasNext(); ) - { - final String descText = i.next().getPCCText(); - final Matcher matcher = pattern.matcher(descText); - if ( matcher.find() ) -// if ( descText.matches(aDescPattern) ) - { - i.remove(); - } - } - } - public final String getDescription() { String characteristic = get(StringKey.DESCRIPTION); @@ -337,49 +283,6 @@ } /** - * Get the description of this object - * - * @param aPC The PlayerCharacter this object is associated to. - * @return the description of this object - */ - public String getDescription(final PlayerCharacter aPC) - { - if ( theDescriptions == null ) - { - return Constants.EMPTY_STRING; - } - final StringBuffer buf = new StringBuffer(); - boolean wrote = false; - for ( final Description desc : theDescriptions ) - { - final String str = desc.getDescription(aPC, this); - if ( str.length() > 0 ) - { - if ( wrote ) - { - buf.append(Constants.COMMA + ' '); - } - buf.append(str); - wrote = true; - } - else - { - wrote = false; - } - } - return buf.toString(); - } - - public List<Description> getDescriptionList() - { - if ( theDescriptions == null ) - { - return Collections.emptyList(); - } - return Collections.unmodifiableList(theDescriptions); - } - - /** * Get the level ability list for this object * @return the level ability list for this object */ @@ -800,10 +703,6 @@ retVal.levelAbilityList.add(ab); } } - if ( this.theDescriptions != null ) - { - retVal.theDescriptions = new ArrayList<Description>(theDescriptions); - } return retVal; } @@ -1854,25 +1753,6 @@ } /** - * Get the Product Identity description String - * @return the Product Identity description String - */ - public String piDescString(final PlayerCharacter aPC) - { - return piDescString(aPC, true); - } - - /** - * In some cases, we need a PI-formatted string to place within a - * pre-existing <html> tag - * @return PI description - */ - public String piDescSubString(final PlayerCharacter aPC) - { - return piDescString(aPC, false); - } - - /** * Get the Product Identity string * @return the Product Identity string */ @@ -1982,11 +1862,6 @@ txt.append(getDisplayName()); } - for ( final Description desc : getDescriptionList() ) - { - txt.append("\tDESC:").append(pcgen.io.EntityEncoder.encode(desc.getPCCText())); - } - // if (!getDisplayName().equals(getKeyName())) // { txt.append("\tKEY:").append(getKeyName()); @@ -2836,32 +2711,6 @@ removeListFor(ListKey.SELECTED_WEAPON_PROF_BONUS); } - private String piDescString(final PlayerCharacter aPC, final boolean useHeader) - { - final String desc = getDescription(aPC); - - if (getSafe(ObjectKey.DESC_PI)) - { - final StringBuffer sb = new StringBuffer(desc.length() + 30); - - if (useHeader) - { - sb.append("<html>"); - } - - sb.append("<b><i>").append(desc).append("</i></b>"); - - if (useHeader) - { - sb.append("</html>"); - } - - return sb.toString(); - } - - return desc; - } - /** * Returns the Product Identity string (with or without the header) * @param useHeader Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-09-27 19:06:44 UTC (rev 7809) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-09-27 19:08:59 UTC (rev 7810) @@ -18059,4 +18059,30 @@ { selectedFavoredClass = sfc; } + public String getDescription(PObject cdo) + { + List<Description> theDescriptions = cdo.getListFor(cdo.getDescriptionKey()); + + if ( theDescriptions == null ) + { + return Constants.EMPTY_STRING; + } + final StringBuilder sb = new StringBuilder(); + boolean needcomma = false; + for ( final Description desc : theDescriptions ) + { + final String str = desc.getDescription(this, cdo); + if ( str.length() > 0 ) + { + if ( needcomma ) + { + sb.append(Constants.COMMA).append(' '); + } + sb.append(str); + needcomma = true; + } + } + return sb.toString(); + } + } Modified: Trunk/pcgen/code/src/java/pcgen/core/SubClass.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/SubClass.java 2008-09-27 19:06:44 UTC (rev 7809) +++ Trunk/pcgen/code/src/java/pcgen/core/SubClass.java 2008-09-27 19:08:59 UTC (rev 7810) @@ -28,6 +28,7 @@ import pcgen.cdom.base.CategorizedCDOMObject; import pcgen.cdom.base.Category; import pcgen.cdom.enumeration.IntegerKey; +import pcgen.cdom.enumeration.ListKey; import pcgen.persistence.PersistenceLayerException; import pcgen.persistence.lst.CampaignSourceEntry; import pcgen.persistence.lst.PCClassLoader; @@ -159,7 +160,7 @@ { final Campaign customCampaign = new Campaign(); customCampaign.setName("Custom"); - customCampaign.addDescription(new Description("Custom data")); + customCampaign.addToListFor(ListKey.DESCRIPTION, new Description("Custom data")); final CampaignSourceEntry tempSource = new CampaignSourceEntry(customCampaign, aClass.getSourceURI()); Modified: Trunk/pcgen/code/src/java/pcgen/core/SubstitutionClass.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/SubstitutionClass.java 2008-09-27 19:06:44 UTC (rev 7809) +++ Trunk/pcgen/code/src/java/pcgen/core/SubstitutionClass.java 2008-09-27 19:08:59 UTC (rev 7810) @@ -80,7 +80,7 @@ { final Campaign customCampaign = new Campaign(); customCampaign.setName("Custom"); - customCampaign.addDescription(new Description("Custom data")); + customCampaign.addToListFor(ListKey.DESCRIPTION, new Description("Custom data")); final CampaignSourceEntry tempSource = new CampaignSourceEntry(customCampaign, aClass.getSourceURI()); @@ -141,7 +141,7 @@ 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")); + customCampaign.addToListFor(ListKey.DESCRIPTION, new Description("Custom data")); final CampaignSourceEntry tempSource = new CampaignSourceEntry(customCampaign, this.getSourceURI()); Added: Trunk/pcgen/code/src/java/pcgen/core/analysis/DescriptionFormatting.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/analysis/DescriptionFormatting.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/core/analysis/DescriptionFormatting.java 2008-09-27 19:08:59 UTC (rev 7810) @@ -0,0 +1,56 @@ +package pcgen.core.analysis; + +import pcgen.cdom.enumeration.ObjectKey; +import pcgen.core.PObject; +import pcgen.core.PlayerCharacter; + +public class DescriptionFormatting +{ + + private static String piDescString(PlayerCharacter aPC, PObject cdo, + boolean useHeader) + { + final String desc = aPC.getDescription(cdo); + + if (cdo.getSafe(ObjectKey.DESC_PI)) + { + final StringBuffer sb = new StringBuffer(desc.length() + 30); + + if (useHeader) + { + sb.append("<html>"); + } + + sb.append("<b><i>").append(desc).append("</i></b>"); + + if (useHeader) + { + sb.append("</html>"); + } + + return sb.toString(); + } + + return desc; + } + + /** + * Get the Product Identity description String + * @return the Product Identity description String + */ + public static String piDescString(PlayerCharacter aPC, PObject po) + { + return piDescString(aPC, po, true); + } + + /** + * In some cases, we need a PI-formatted string to place within a + * pre-existing <html> tag + * @return PI description + */ + public static String piDescSubString(PlayerCharacter aPC, PObject po) + { + return piDescString(aPC, po, false); + } + +} Modified: Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassLevelPanel.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassLevelPanel.java 2008-09-27 19:06:44 UTC (rev 7809) +++ Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassLevelPanel.java 2008-09-27 19:08:59 UTC (rev 7810) @@ -128,7 +128,7 @@ // Get/Create the dummy campaign for custom data. Campaign customCampaign = new Campaign(); customCampaign.setName("Custom"); - customCampaign.addDescription(new Description("Custom data")); + customCampaign.addToListFor(ListKey.DESCRIPTION, new Description("Custom data")); // Make sure the object source file is set URI sourceFile = object.getSourceURI(); Modified: Trunk/pcgen/code/src/java/pcgen/gui/editor/DeityBasePanel.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/editor/DeityBasePanel.java 2008-09-27 19:06:44 UTC (rev 7809) +++ Trunk/pcgen/code/src/java/pcgen/gui/editor/DeityBasePanel.java 2008-09-27 19:08:59 UTC (rev 7810) @@ -261,7 +261,7 @@ { setHolyItemText(thisPObject.get(StringKey.HOLY_ITEM)); final StringBuffer buf = new StringBuffer(); - for ( final Description desc : thisPObject.getDescriptionList() ) + for ( final Description desc : thisPObject.getSafeListFor(ListKey.DESCRIPTION) ) { if ( buf.length() != 0 ) { Modified: Trunk/pcgen/code/src/java/pcgen/gui/editor/DomainBasePanel.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/editor/DomainBasePanel.java 2008-09-27 19:06:44 UTC (rev 7809) +++ Trunk/pcgen/code/src/java/pcgen/gui/editor/DomainBasePanel.java 2008-09-27 19:08:59 UTC (rev 7810) @@ -27,6 +27,7 @@ import java.util.Map; import java.util.StringTokenizer; +import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; import pcgen.core.Description; import pcgen.core.PObject; @@ -117,7 +118,7 @@ public void updateView(PObject thisPObject) { final StringBuffer buf = new StringBuffer(); - for ( final Description desc : thisPObject.getDescriptionList() ) + for ( final Description desc : thisPObject.getSafeListFor(ListKey.DESCRIPTION) ) { if ( buf.length() != 0 ) { Modified: Trunk/pcgen/code/src/java/pcgen/gui/editor/FeatBasePanel.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/editor/FeatBasePanel.java 2008-09-27 19:06:44 UTC (rev 7809) +++ Trunk/pcgen/code/src/java/pcgen/gui/editor/FeatBasePanel.java 2008-09-27 19:08:59 UTC (rev 7810) @@ -40,6 +40,7 @@ import pcgen.cdom.base.Constants; import pcgen.cdom.enumeration.IntegerKey; +import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; import pcgen.core.Ability; import pcgen.core.Categorisable; @@ -289,7 +290,7 @@ Ability thisFeat = (Ability) thisPObject; final StringBuffer buf = new StringBuffer(); - for ( final Description desc : thisPObject.getDescriptionList() ) + for ( final Description desc : thisPObject.getSafeListFor(ListKey.DESCRIPTION) ) { if ( buf.length() != 0 ) { Modified: Trunk/pcgen/code/src/java/pcgen/gui/editor/SpellBasePanel.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/editor/SpellBasePanel.java 2008-09-27 19:06:44 UTC (rev 7809) +++ Trunk/pcgen/code/src/java/pcgen/gui/editor/SpellBasePanel.java 2008-09-27 19:08:59 UTC (rev 7810) @@ -228,7 +228,7 @@ { Spell thisSpell = (Spell) thisPObject; final StringBuffer buf = new StringBuffer(); - for ( final Description desc : thisPObject.getDescriptionList() ) + for ( final Description desc : thisPObject.getSafeListFor(ListKey.DESCRIPTION) ) { if ( buf.length() != 0 ) { Modified: Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoDomain.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoDomain.java 2008-09-27 19:06:44 UTC (rev 7809) +++ Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoDomain.java 2008-09-27 19:08:59 UTC (rev 7810) @@ -105,6 +105,7 @@ import pcgen.core.QualifiedObject; import pcgen.core.SettingsHandler; import pcgen.core.WeaponProf; +import pcgen.core.analysis.DescriptionFormatting; import pcgen.core.prereq.PrereqHandler; import pcgen.core.prereq.Prerequisite; import pcgen.core.prereq.PrerequisiteUtilities; @@ -391,7 +392,7 @@ infoText.append(BR); infoText.append(PropertyFactory.getFormattedString( "in_InfoDescription", //$NON-NLS-1$ - aDeity.piDescString(pc))); + DescriptionFormatting.piDescString(pc, aDeity))); List<CDOMReference<WeaponProf>> dwp = aDeity.getListFor( ListKey.DEITYWEAPON); @@ -461,7 +462,7 @@ infoText.append(FONT_PLUS_1).append(BOLD).append( aDomain.piSubString()).append(END_BOLD).append(END_FONT); - String aString = aDomain.getDescription(getPc()); + String aString = pc.getDescription(aDomain); if (aString.length() != 0) { infoText.append(BR); Modified: Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoTempMod.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoTempMod.java 2008-09-27 19:06:44 UTC (rev 7809) +++ Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoTempMod.java 2008-09-27 19:08:59 UTC (rev 7810) @@ -79,6 +79,7 @@ import pcgen.core.PlayerCharacter; import pcgen.core.SettingsHandler; import pcgen.core.Skill; +import pcgen.core.analysis.DescriptionFormatting; import pcgen.core.bonus.Bonus; import pcgen.core.bonus.BonusObj; import pcgen.core.character.CharacterSpell; @@ -717,7 +718,7 @@ b.appendSpacer(); b.appendI18nElement("in_itmInfoLabelTextTarget",aSpell.getTarget()); //$NON-NLS-1$ b.appendLineBreak(); - b.appendI18nElement("in_itmInfoLabelTextSpellDescription",aSpell.piDescSubString(pc)); //$NON-NLS-1$ + b.appendI18nElement("in_itmInfoLabelTextSpellDescription",DescriptionFormatting.piDescSubString(pc, aSpell)); //$NON-NLS-1$ String bString = aSpell.getTempDescription(); if (bString.length() > 0) 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-27 19:06:44 UTC (rev 7809) +++ Trunk/pcgen/code/src/java/pcgen/gui/tabs/ability/AbilityInfoPanel.java 2008-09-27 19:08:59 UTC (rev 7810) @@ -34,7 +34,6 @@ import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.math.BigDecimal; -import java.util.List; import java.util.Set; import javax.swing.BorderFactory; @@ -44,13 +43,13 @@ 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; import pcgen.core.AbilityCategory; import pcgen.core.PlayerCharacter; +import pcgen.core.analysis.DescriptionFormatting; import pcgen.core.prereq.PrerequisiteUtilities; import pcgen.gui.utils.JLabelPane; import pcgen.gui.utils.Utility; @@ -180,7 +179,7 @@ sb.append(BR); sb.append(PropertyFactory.getFormattedString( "in_InfoDescription", //$NON-NLS-1$ - theAbility.piDescSubString(thePC))); + DescriptionFormatting.piDescSubString(thePC, theAbility))); if (theAbility.getSafeSizeOfMapFor(MapKey.ASPECT) > 0) { Modified: Trunk/pcgen/code/src/java/pcgen/gui/tabs/ability/AbilityModel.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/tabs/ability/AbilityModel.java 2008-09-27 19:06:44 UTC (rev 7809) +++ Trunk/pcgen/code/src/java/pcgen/gui/tabs/ability/AbilityModel.java 2008-09-27 19:08:59 UTC (rev 7810) @@ -41,6 +41,7 @@ import pcgen.core.PlayerCharacter; import pcgen.core.SettingsHandler; import pcgen.core.SourceEntry.SourceFormat; +import pcgen.core.analysis.DescriptionFormatting; import pcgen.core.prereq.PrereqHandler; import pcgen.core.prereq.Prerequisite; import pcgen.core.prereq.PrerequisiteUtilities; @@ -423,7 +424,7 @@ case DESCRIPTION: if (ability != null) { - retVal = ability.piDescSubString(thePC); + retVal = DescriptionFormatting.piDescSubString(thePC, ability); } break; case CHOICES: Modified: Trunk/pcgen/code/src/java/pcgen/gui/tabs/spells/InfoSpellsSubTab.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/tabs/spells/InfoSpellsSubTab.java 2008-09-27 19:06:44 UTC (rev 7809) +++ Trunk/pcgen/code/src/java/pcgen/gui/tabs/spells/InfoSpellsSubTab.java 2008-09-27 19:08:59 UTC (rev 7810) @@ -874,7 +874,7 @@ } b.appendLineBreak(); b.appendI18nElement("in_descrip", pc.parseSpellString(aSpell, - aSpell.getDescription(getPc()), cs.getOwner())); + pc.getDescription(aSpell), cs.getOwner())); final String cString = PrerequisiteUtilities.preReqHTMLStringsForList(pc, null, aSpell.getPrerequisiteList(), false); Modified: Trunk/pcgen/code/src/java/pcgen/gui/tabs/spells/SpellModel.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/tabs/spells/SpellModel.java 2008-09-27 19:06:44 UTC (rev 7809) +++ Trunk/pcgen/code/src/java/pcgen/gui/tabs/spells/SpellModel.java 2008-09-27 19:08:59 UTC (rev 7810) @@ -41,6 +41,7 @@ import pcgen.core.PlayerCharacter; import pcgen.core.Race; import pcgen.core.SettingsHandler; +import pcgen.core.analysis.DescriptionFormatting; import pcgen.core.character.CharacterSpell; import pcgen.core.character.SpellInfo; import pcgen.core.spell.Spell; @@ -464,11 +465,11 @@ if ((aSpell != null) && (spellA != null)) { - return pc.parseSpellString(aSpell, aSpell - .getDescription(pc), spellA.getOwner()); + return pc.parseSpellString(aSpell, pc + .getDescription(aSpell), spellA.getOwner()); } - return (aSpell != null) ? aSpell.piDescString(pc) : null; + return (aSpell != null) ? DescriptionFormatting.piDescString(pc, aSpell) : null; case COL_TARGET: Modified: Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Creator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Creator.java 2008-09-27 19:06:44 UTC (rev 7809) +++ Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Creator.java 2008-09-27 19:08:59 UTC (rev 7810) @@ -1073,7 +1073,7 @@ buffer.append('|'); buffer.append(TAG_ALIGNALLOW).append(':'); //TODO Need to clean this up? - for (final Description desc : aDeity.getDescriptionList()) + for (final Description desc : aDeity.getSafeListFor(ListKey.DESCRIPTION)) { buffer.append('|'); buffer.append(TAG_DESC).append(':'); @@ -1164,7 +1164,7 @@ buffer.append(EntityEncoder.encode(assoc)); } - for (final Description desc : domain.getDescriptionList()) + for (final Description desc : domain.getSafeListFor(ListKey.DESCRIPTION)) { buffer.append('|'); buffer.append(TAG_DOMAINGRANTS).append(':'); @@ -1428,7 +1428,7 @@ buffer.append(EntityEncoder.encode(save)); } - for (final Description desc : ability.getDescriptionList()) + for (final Description desc : ability.getSafeListFor(ListKey.DESCRIPTION)) { buffer.append(Constants.PIPE); buffer.append(TAG_DESC).append(':'); Modified: Trunk/pcgen/code/src/java/pcgen/io/exporttoken/AbilityToken.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/exporttoken/AbilityToken.java 2008-09-27 19:06:44 UTC (rev 7809) +++ Trunk/pcgen/code/src/java/pcgen/io/exporttoken/AbilityToken.java 2008-09-27 19:08:59 UTC (rev 7810) @@ -26,7 +26,6 @@ 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; @@ -35,7 +34,6 @@ 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; @@ -327,7 +325,7 @@ if (tokenSource.endsWith(".DESC")) { - retString += aAbility.getDescription(pc); + retString += pc.getDescription(aAbility); } else if (tokenSource.endsWith(".BENEFIT")) { Modified: Trunk/pcgen/code/src/java/pcgen/io/exporttoken/DomainToken.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/exporttoken/DomainToken.java 2008-09-27 19:06:44 UTC (rev 7809) +++ Trunk/pcgen/code/src/java/pcgen/io/exporttoken/DomainToken.java 2008-09-27 19:08:59 UTC (rev 7810) @@ -25,13 +25,14 @@ */ package pcgen.io.exporttoken; +import java.util.StringTokenizer; + import pcgen.cdom.base.Constants; import pcgen.core.Domain; import pcgen.core.PlayerCharacter; +import pcgen.core.analysis.DescriptionFormatting; import pcgen.io.ExportHandler; -import java.util.StringTokenizer; - /** * Deals with tokens: * @@ -129,7 +130,7 @@ Domain domain = (pc.getCharacterDomainList().get(domainIndex)).getDomain(); - return domain.piDescString(pc); + return DescriptionFormatting.piDescString(pc, domain); } catch (Exception e) { Modified: Trunk/pcgen/code/src/java/pcgen/io/exporttoken/EqToken.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/exporttoken/EqToken.java 2008-09-27 19:06:44 UTC (rev 7809) +++ Trunk/pcgen/code/src/java/pcgen/io/exporttoken/EqToken.java 2008-09-27 19:08:59 UTC (rev 7810) @@ -586,7 +586,7 @@ public static String getDescriptionToken(final PlayerCharacter aPC, Equipment eq) { - return eq.getDescription(aPC); + return aPC.getDescription(eq); } /** Modified: Trunk/pcgen/code/src/java/pcgen/persistence/lst/LstSystemLoader.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/persistence/lst/LstSystemLoader.java 2008-09-27 19:06:44 UTC (rev 7809) +++ Trunk/pcgen/code/src/java/pcgen/persistence/lst/LstSystemLoader.java 2008-09-27 19:08:59 UTC (rev 7810) @@ -49,6 +49,7 @@ import pcgen.base.lang.UnreachableError; import pcgen.cdom.base.Constants; import pcgen.cdom.enumeration.IntegerKey; +import pcgen.cdom.enumeration.ListKey; import pcgen.core.AbilityCategory; import pcgen.core.ArmorProf; import pcgen.core.Campaign; @@ -699,7 +700,7 @@ // The dummy campaign for custom data. Campaign customCampaign = new Campaign(); customCampaign.setName("Custom"); - customCampaign.addDescription(new Description("Custom data")); + customCampaign.addToListFor(ListKey.DESCRIPTION, new Description("Custom data")); // // Add the custom bioset file to the start of the list if it exists Modified: Trunk/pcgen/code/src/java/plugin/charactersheet/gui/ClassSpellLevelPane.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/charactersheet/gui/ClassSpellLevelPane.java 2008-09-27 19:06:44 UTC (rev 7809) +++ Trunk/pcgen/code/src/java/plugin/charactersheet/gui/ClassSpellLevelPane.java 2008-09-27 19:08:59 UTC (rev 7810) @@ -666,7 +666,7 @@ effect.setFont(new java.awt.Font(DIALOG, 0, 10)); effect.setText(new StringBuffer(EFFECT) .append( - pc.parseSpellString(spell, spell.getDescription(pc), cs + pc.parseSpellString(spell, pc.getDescription(spell), cs .getOwner())).toString()); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 1; Modified: Trunk/pcgen/code/src/java/plugin/charactersheet/gui/Page2Panel.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/charactersheet/gui/Page2Panel.java 2008-09-27 19:06:44 UTC (rev 7809) +++ Trunk/pcgen/code/src/java/plugin/charactersheet/gui/Page2Panel.java 2008-09-27 19:08:59 UTC (rev 7810) @@ -291,7 +291,7 @@ for (int i = 0; i < feats.size(); i++) { Ability feat = (Ability) feats.get(i); - featMap.put(feat.qualifiedName(aPC), feat.getDescription(aPC)); + featMap.put(feat.qualifiedName(aPC), aPC.getDescription(feat)); } return featMap; } Modified: Trunk/pcgen/code/src/java/plugin/exporttokens/DeityToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/exporttokens/DeityToken.java 2008-09-27 19:06:44 UTC (rev 7809) +++ Trunk/pcgen/code/src/java/plugin/exporttokens/DeityToken.java 2008-09-27 19:08:59 UTC (rev 7810) @@ -126,7 +126,7 @@ } else if ("DESCRIPTION".equals(subTag)) { - retString = deity.getDescription(pc); + retString = pc.getDescription(deity); } else if ("HOLYITEM".equals(subTag)) { Modified: Trunk/pcgen/code/src/java/plugin/exporttokens/SpellMemToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/exporttokens/SpellMemToken.java 2008-09-27 19:06:44 UTC (rev 7809) +++ Trunk/pcgen/code/src/java/plugin/exporttokens/SpellMemToken.java 2008-09-27 19:08:59 UTC (rev 7810) @@ -275,8 +275,8 @@ || "EFFECT".equals(aLabel)) { String mString = - aPC.parseSpellString(aSpell, aSpell - .getDescription(aPC), selectedCSpell + aPC.parseSpellString(aSpell, aPC + .getDescription(aSpell), selectedCSpell .getOwner()); retValue.append(mString); } @@ -376,8 +376,8 @@ { final String sString = getItemDescription("SPELL", - aSpell.getKeyName(), aSpell - .getDescription(aPC), aPC); + aSpell.getKeyName(), aPC + .getDescription(aSpell), aPC); if (altLabel.length() > 0) { Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/DescLst.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/DescLst.java 2008-09-27 19:06:44 UTC (rev 7809) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/DescLst.java 2008-09-27 19:08:59 UTC (rev 7810) @@ -6,16 +6,21 @@ */ package plugin.lsttokens; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; import java.util.StringTokenizer; +import pcgen.cdom.base.CDOMObject; import pcgen.cdom.base.Constants; +import pcgen.cdom.enumeration.ListKey; import pcgen.core.Description; -import pcgen.core.PObject; import pcgen.core.prereq.Prerequisite; import pcgen.io.EntityEncoder; -import pcgen.persistence.PersistenceLayerException; -import pcgen.persistence.lst.GlobalLstToken; -import pcgen.persistence.lst.prereq.PreParserFactory; +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; /** @@ -23,7 +28,8 @@ * * @author djones4 */ -public class DescLst implements GlobalLstToken +public class DescLst extends AbstractToken implements + CDOMPrimaryToken<CDOMObject> { /** * @see pcgen.persistence.lst.LstToken#getTokenName() @@ -33,87 +39,154 @@ return "DESC"; //$NON-NLS-1$ } - /** - * @see pcgen.persistence.lst.GlobalLstToken#parse(pcgen.core.PObject, java.lang.String, int) - */ - public boolean parse(final PObject obj, final String value, - @SuppressWarnings("unused") - int anInt) + public boolean parse(LoadContext context, CDOMObject obj, String value) { - if (value.startsWith(".CLEAR")) //$NON-NLS-1$ + if (isEmpty(value) || hasIllegalSeparator('|', value)) { - if (value.equals(".CLEAR")) //$NON-NLS-1$ - { - obj.removeAllDescriptions(); - } - else - { - obj.removeDescription(value.substring(7)); - } + return false; + } + + if (Constants.LST_DOT_CLEAR.equals(value)) + { + context.obj.removeList(obj, ListKey.DESCRIPTION); return true; } - obj.addDescription(parseDescription(value)); + if (value.startsWith(Constants.LST_DOT_CLEAR_DOT)) + { + context.getObjectContext().removePatternFromList(obj, + ListKey.DESCRIPTION, value.substring(7)); + return true; + } + + Description d = parseDescription(value); + if (d == null) + { + return false; + } + context.obj.addToList(obj, ListKey.DESCRIPTION, d); return true; } /** * Parses the DESC tag into a Description object. * - * @param aDesc The LST tag + * @param aDesc + * The LST tag * @return A <tt>Description</tt> object */ public Description parseDescription(final String aDesc) { - final StringTokenizer tok = new StringTokenizer(aDesc, Constants.PIPE); + StringTokenizer tok = new StringTokenizer(aDesc, Constants.PIPE); - final Description desc = - new Description(EntityEncoder.decode(tok.nextToken())); - - boolean isPre = false; - while (tok.hasMoreTokens()) + String descString = tok.nextToken(); + + if (descString.startsWith("PRE") || descString.startsWith("!PRE")) { - final String token = tok.nextToken(); - if (PreParserFactory.isPreReqString(token)) //$NON-NLS-1$ + Logging.errorPrint(getTokenName() + " encountered only a PRExxx: " + + aDesc); + return null; + } + Description desc = new Description(EntityEncoder.decode(descString)); + + if (!tok.hasMoreTokens()) + { + return desc; + } + + String token = tok.nextToken(); + while (true) + { + if (Constants.LST_DOT_CLEAR.equals(token)) { - addPrerequisites(desc, token); - isPre = true; + Logging.errorPrint(getTokenName() + + " tag confused by '.CLEAR' as a " + "middle token: " + + aDesc); + return null; } + else if (token.startsWith("PRE") || token.startsWith("!PRE")) + { + break; + } else { - if (isPre) - { - Logging.errorPrint("Invalid " + getTokenName() + ": " + aDesc); - Logging.errorPrint(" PRExxx must be at the END of the Token"); - isPre = false; - } desc.addVariable(token); } + + if (!tok.hasMoreTokens()) + { + // No prereqs, so we're done + return desc; + } + token = tok.nextToken(); } + while (true) + { + Prerequisite prereq = getPrerequisite(token); + if (prereq == null) + { + Logging.errorPrint(" (Did you put Abilities after the " + + "PRExxx tags in " + getTokenName() + ":?)"); + return null; + } + desc.addPrerequisite(prereq); + if (!tok.hasMoreTokens()) + { + break; + } + token = tok.nextToken(); + } return desc; } - public void addPrerequisites( Description desc, String unparsed) + public String[] unparse(LoadContext context, CDOMObject obj) { - final String[] tokens = unparsed.split("[<>\\|]"); - try + Changes<Description> changes = + context.obj.getListChanges(obj, ListKey.DESCRIPTION); + if (changes == null || changes.isEmpty()) { - final PreParserFactory factory = PreParserFactory.getInstance(); - - for ( final String pre : tokens ) + return null; + } + List<String> list = new ArrayList<String>(); + Collection<Description> removedItems = changes.getRemoved(); + if (changes.includesGlobalClear()) + { + if (removedItems != null && !removedItems.isEmpty()) { - final Prerequisite prereq = factory.parse(pre); - - if (prereq != null) - { - desc.addPrerequisite(prereq); - } + context.addWriteMessage("Non-sensical relationship in " + + getTokenName() + + ": global .CLEAR and local .CLEAR. performed"); + return null; } + list.add(Constants.LST_DOT_CLEAR); } - catch (PersistenceLayerException e) + if (removedItems != null && !removedItems.isEmpty()) { - e.printStackTrace(); + for (Description d : removedItems) + { + list.add(Constants.LST_DOT_CLEAR_DOT + d); + } } + /* + * TODO .CLEAR. is not properly round-robin capable + */ + Collection<Description> addedItems = changes.getAdded(); + if (addedItems != null) + { + for (Description d : addedItems) + { + list.add(d.getPCCText()); + } + } + if (list.isEmpty()) + { + return null; + } + return list.toArray(new String[list.size()]); } + 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-09-27 19:06:44 UTC (rev 7809) +++ Trunk/pcgen/code/src/test/pcgen/core/PCClassTest.java 2008-09-27 19:08:59 UTC (rev 7810) @@ -803,7 +803,7 @@ Campaign customCampaign = new Campaign(); customCampaign.setName("Unit Test"); customCampaign.setName("KEY_Unit Test"); - customCampaign.addDescription(new Description("Unit Test data")); + customCampaign.addToListFor(ListKey.DESCRIPTION, new Description("Unit Test data")); CampaignSourceEntry source; try { Modified: Trunk/pcgen/code/src/test/pcgen/core/PObjectTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/PObjectTest.java 2008-09-27 19:06:44 UTC (rev 7809) +++ Trunk/pcgen/code/src/test/pcgen/core/PObjectTest.java 2008-09-27 19:08:59 UTC (rev 7810) @@ -38,8 +38,6 @@ import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; import pcgen.cdom.list.AbilityList; -import pcgen.cdom.reference.CDOMSingleRef; -import pcgen.cdom.reference.ReferenceManufacturer; import pcgen.core.Ability.Nature; import pcgen.core.bonus.BonusObj; import pcgen.persistence.PersistenceLayerException; @@ -308,36 +306,29 @@ { final Description desc1 = new Description("Description 1"); final PObject pobj = new PObject(); - pobj.addDescription(desc1); + pobj.addToListFor(ListKey.DESCRIPTION, desc1); - assertEquals("Description should match", pobj - .getDescription(getCharacter()), "Description 1"); + PlayerCharacter pc = getCharacter(); + assertEquals("Description should match", pc + .getDescription(pobj), "Description 1"); final Description desc2 = new Description("Description 2"); - pobj.addDescription(desc2); + pobj.addToListFor(ListKey.DESCRIPTION, desc2); assertEquals("Description should match", "Description 1, Description 2", - pobj.getDescription(getCharacter())); + pc.getDescription(pobj)); final Description desc3 = new Description("Description %1"); desc3.addVariable("\"3\""); - pobj.addDescription(desc3); + pobj.addToListFor(ListKey.DESCRIPTION, desc3); assertEquals("Description should match", - "Description 1, Description 2, Description 3", pobj - .getDescription(getCharacter())); + "Description 1, Description 2, Description 3", pc + .getDescription(pobj)); - pobj.removeDescription("Description 2"); + pobj.removeFromListFor(ListKey.DESCRIPTION, desc2); assertEquals("Description should match", "Description 1, Description 3", - pobj.getDescription(getCharacter())); - - pobj.removeDescription("Description %"); - assertEquals("Description should match", "Description 1", pobj - .getDescription(getCharacter())); - - pobj.removeDescription("Description %\\w+"); - assertEquals("Description should match", "Description 1", pobj - .getDescription(getCharacter())); + pc.getDescription(pobj)); } /** Modified: Trunk/pcgen/code/src/test/plugin/jepcommands/ClassLevelCommandTest.java =================================================================== --- Trunk/pcgen/code/src/test/plugin/jepcommands/ClassLevelCommandTest.java 2008-09-27 19:06:44 UTC (rev 7809) +++ Trunk/pcgen/code/src/test/plugin/jepcommands/ClassLevelCommandTest.java 2008-09-27 19:08:59 UTC (rev 7810) @@ -78,7 +78,7 @@ Campaign customCampaign = new Campaign(); customCampaign.setName("Unit Test"); customCampaign.setName("KEY_Unit Test"); - customCampaign.addDescription(new Description("Unit Test data")); + customCampaign.addToListFor(ListKey.DESCRIPTION, new Description("Unit Test data")); // Create the monseter class type GameMode gamemode = SettingsHandler.getGame(); Added: Trunk/pcgen/code/src/utest/plugin/lsttokens/DescLstTest.java =================================================================== --- Trunk/pcgen/code/src/utest/plugin/lsttokens/DescLstTest.java (rev 0) +++ Trunk/pcgen/code/src/utest/plugin/lsttokens/DescLstTest.java 2008-09-27 19:08:59 UTC (rev 7810) @@ -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; + +import java.net.URISyntaxException; + +import org.junit.Before; +import org.junit.Test; + +import pcgen.cdom.base.CDOMObject; +import pcgen.core.PCTemplate; +import pcgen.persistence.PersistenceLayerException; +import pcgen.rules.persistence.CDOMLoader; +import pcgen.rules.persistence.token.CDOMPrimaryToken; +import plugin.lsttokens.testsupport.AbstractGlobalTokenTestCase; +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 DescLstTest extends AbstractGlobalTokenTestCase +{ + static CDOMPrimaryToken<CDOMObject> token = new DescLst(); + static CDOMTokenLoader<PCTemplate> loader = new CDOMTokenLoader<PCTemplate>( + PCTemplate.class); + + @Override + public CDOMLoader<PCTemplate> getLoader() + { + return loader; + } + + @Override + public Class<PCTemplate> getCDOMClass() + { + return PCTemplate.class; + } + + @Override + public CDOMPrimaryToken<CDOMObject> 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"); + } + +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-09-29 00:37:02
|
Revision: 7829 http://pcgen.svn.sourceforge.net/pcgen/?rev=7829&view=rev Author: thpr Date: 2008-09-29 00:36:48 +0000 (Mon, 29 Sep 2008) Log Message: ----------- Refactoring & cleanup Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/Equipment.java Trunk/pcgen/code/src/java/pcgen/core/PObject.java Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbility.java Trunk/pcgen/code/src/java/pcgen/gui/editor/EditorMainForm.java Trunk/pcgen/code/src/java/pcgen/io/exporttoken/EqToken.java Trunk/pcgen/code/src/java/pcgen/io/exporttoken/WeaponToken.java Trunk/pcgen/code/src/java/plugin/exporttokens/ArmorToken.java Trunk/pcgen/code/src/java/plugin/exporttokens/EqContainerToken.java Trunk/pcgen/code/src/java/plugin/exporttokens/EqContainersToken.java Trunk/pcgen/code/src/java/plugin/exporttokens/EqContainerwToken.java Trunk/pcgen/code/src/test/pcgen/core/PObjectTest.java Added Paths: ----------- Trunk/pcgen/code/src/java/pcgen/core/analysis/LanguageSupport.java Trunk/pcgen/code/src/java/pcgen/core/analysis/OutputNameFormatting.java Removed Paths: ------------- Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityList.java Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilitySpecial.java Modified: Trunk/pcgen/code/src/java/pcgen/core/Equipment.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Equipment.java 2008-09-28 20:15:01 UTC (rev 7828) +++ Trunk/pcgen/code/src/java/pcgen/core/Equipment.java 2008-09-29 00:36:48 UTC (rev 7829) @@ -2705,6 +2705,10 @@ } // + if (bonusMap != null) + { + eq.bonusMap = new HashMap<String, String>(bonusMap); + } eq.setMoveString(moveString()); // eq.setTypeString(super.getType()); @@ -2874,7 +2878,7 @@ * @return true if it has virtual feats */ public boolean hasVFeats() { - final List<String> vFeats = getVirtualFeatList(); + final List<String> vFeats = getAbilityKeys(null, AbilityCategory.FEAT, Ability.Nature.VIRTUAL); return (vFeats != null) && (vFeats.size() > 0); } @@ -6167,4 +6171,162 @@ { return assocSupt.getAssocList(obj, AssociationKey.CHOICES).get(0).get(0); } + + /** Map of the bonuses for the object */ + private HashMap<String, String> bonusMap = null; + + + /** + * Get the map of bonuses for this object + * @return bonusMap + */ + public HashMap<String, String> getBonusMap() + { + if (bonusMap == null) + { + bonusMap = new HashMap<String, String>(); + } + + return bonusMap; + } + + /** + * Put the key/value pair into the bonus map + * @param aKey + * @param aVal + */ + public void putBonusMap(final String aKey, final String aVal) + { + getBonusMap().put(aKey, aVal); + } + + /** + * @param bonus a Number (such as 2) + * @param bonusType "COMBAT.AC.Dodge" or "COMBAT.AC.Dodge.STACK" + */ + final void setBonusStackFor(final double bonus, String bonusType) + { + if (bonusType != null) + { + bonusType = bonusType.toUpperCase(); + } + + // Default to non-stacking bonuses + int index = -1; + + final StringTokenizer aTok = new StringTokenizer(bonusType, "."); + + // e.g. "COMBAT.AC.DODGE" + if ((bonusType != null) && (aTok.countTokens() >= 2)) + { + String aString; + + // we need to get the 3rd token to see + // if it should .STACK or .REPLACE + aTok.nextToken(); //Discard token + aString = aTok.nextToken(); + + // if the 3rd token is "BASE" we have something like + // CHECKS.BASE.Fortitude + if (aString.equals("BASE")) + { + if (aTok.hasMoreTokens()) + { + // discard next token (Fortitude) + aTok.nextToken(); + } + + if (aTok.hasMoreTokens()) + { + // check for a TYPE + aString = aTok.nextToken(); + } + else + { + // all BASE type bonuses should stack + aString = null; + } + } + else + { + if (aTok.hasMoreTokens()) + { + // Type: .DODGE + aString = aTok.nextToken(); + } + else + { + aString = null; + } + } + + if (aString != null) + { + index = SettingsHandler.getGame().getUnmodifiableBonusStackList().indexOf(aString); // e.g. Dodge + } + + // + // un-named (or un-TYPE'd) bonus should stack + if (aString == null) + { + index = 1; + } + else if (aString.equals("NULL")) + { + index = 1; + } + } + + // .STACK means stack + // .REPLACE stacks with other .REPLACE bonuses + if ((bonusType != null) && (bonusType.endsWith(".STACK") || bonusType.endsWith(".REPLACE"))) + { + index = 1; + } + + // If it's a negative bonus, it always needs to be added + if (bonus < 0) + { + index = 1; + } + + if (index == -1) // a non-stacking bonus + { + final String aVal = getBonusMap().get(bonusType); + + if (aVal == null) + { + putBonusMap(bonusType, String.valueOf(bonus)); + } + else + { + putBonusMap(bonusType, String.valueOf(Math.max(bonus, Float.parseFloat(aVal)))); + } + } + else // a stacking bonus + { + if (bonusType == null) + { + bonusType = ""; + } + else if (bonusType.endsWith(".REPLACE.STACK")) + { + // Check for the special case of: + // COMBAT.AC.Armor.REPLACE.STACK + // and remove the .STACK + bonusType = bonusType.substring(0, bonusType.length() - 6); + } + + final String aVal = getBonusMap().get(bonusType); + + if (aVal == null) + { + putBonusMap(bonusType, String.valueOf(bonus)); + } + else + { + putBonusMap(bonusType, String.valueOf(bonus + Float.parseFloat(aVal))); + } + } + } } Modified: Trunk/pcgen/code/src/java/pcgen/core/PObject.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-09-28 20:15:01 UTC (rev 7828) +++ Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-09-29 00:36:48 UTC (rev 7829) @@ -37,9 +37,7 @@ import java.util.List; import java.util.Map; import java.util.Set; -import java.util.SortedSet; import java.util.StringTokenizer; -import java.util.TreeSet; import pcgen.base.lang.StringUtil; import pcgen.base.util.DoubleKeyMap; @@ -51,6 +49,8 @@ import pcgen.cdom.enumeration.ObjectKey; import pcgen.cdom.enumeration.StringKey; import pcgen.cdom.reference.CDOMSingleRef; +import pcgen.core.analysis.LanguageSupport; +import pcgen.core.analysis.OutputNameFormatting; import pcgen.core.analysis.WeaponProfType; import pcgen.core.bonus.Bonus; import pcgen.core.bonus.BonusObj; @@ -68,7 +68,6 @@ import pcgen.persistence.PersistenceLayerException; import pcgen.persistence.lst.output.prereq.PrerequisiteWriter; import pcgen.persistence.lst.prereq.PreParserFactory; -import pcgen.rules.context.AbstractReferenceContext; import pcgen.util.Logging; import pcgen.util.chooser.ChooserFactory; import pcgen.util.chooser.ChooserInterface; @@ -106,8 +105,6 @@ /** The name to display to the user. This should be internationalized. */ protected String displayName = Constants.EMPTY_STRING; - /** Map of the bonuses for the object */ - private HashMap<String, String> bonusMap = null; /** List of Bonuses for the object */ private List<BonusObj> bonusList = new ArrayList<BonusObj>(); @@ -385,15 +382,6 @@ } /** - * Get the list of virtual feats for this object - * @return the list of virtual feats for this object - */ - public List<String> getVirtualFeatList() - { - return getAbilityKeys(null, AbilityCategory.FEAT, Ability.Nature.VIRTUAL); - } - - /** * Add to the 'save' for the character list * @param aString */ @@ -529,11 +517,6 @@ retVal.ownBonuses(); } - if (bonusMap != null) - { - retVal.bonusMap = new HashMap<String, String>(bonusMap); - } - if ((levelAbilityList != null) && !levelAbilityList.isEmpty()) { retVal.levelAbilityList = new ArrayList<LevelAbility>(); @@ -621,11 +604,6 @@ ChooserUtilities.getChoices(this, aChoice, availableList, selectedList, aPC); } - public List<DamageReduction> getDRList() - { - return getListFor(ListKey.DAMAGE_REDUCTION); - } - /** * Set the Key Name * @param aString @@ -1014,72 +992,6 @@ } /** - * Parse the output name to get a useable Name token - * @param aString - * @param aPC - * @return the output name to get a useable Name token - */ - public String parseOutputName(final String aString, final PlayerCharacter aPC) - { - final int varIndex = aString.indexOf('|'); - - if (varIndex <= 0) - { - return (aString); - } - - final StringTokenizer varTokenizer = new StringTokenizer(aString, "|"); - - final String preVarStr = varTokenizer.nextToken(); - - final ArrayList<Float> varArray = new ArrayList<Float>(); - final ArrayList<String> tokenList = new ArrayList<String>(); - - while (varTokenizer.hasMoreElements()) - { - final String token = varTokenizer.nextToken(); - tokenList.add(token.toUpperCase()); - varArray.add(aPC.getVariableValue(token, "")); - } - - final StringBuffer result = new StringBuffer(); - int varCount = 0; - int subIndex = preVarStr.indexOf('%'); - int lastIndex = 0; - - while (subIndex >= 0) - { - if (subIndex > 0) - { - result.append(preVarStr.substring(lastIndex, subIndex)); - } - - final String token = tokenList.get(varCount); - final Float val = varArray.get(varCount); - - if (token.endsWith(".INTVAL")) - { - result.append(String.valueOf(val.intValue())); - } - else - { - result.append(val.toString()); - } - - lastIndex = subIndex + 1; - varCount++; - subIndex = preVarStr.indexOf('%', lastIndex); - } - - if (preVarStr.length() > lastIndex) - { - result.append(preVarStr.substring(lastIndex)); - } - - return (result.toString()); - } - - /** * Remove the save * @param bonusString */ @@ -1545,7 +1457,7 @@ */ public String piString() { - return piString(true); + return OutputNameFormatting.piString(this, true); } /** @@ -1555,7 +1467,7 @@ */ public String piSubString() { - return piString(false); + return OutputNameFormatting.piString(this, false); } /** @@ -2430,42 +2342,6 @@ removeListFor(ListKey.SELECTED_WEAPON_PROF_BONUS); } - /** - * Returns the Product Identity string (with or without the header) - * @param useHeader - * @return the Product Identity string (with or without the header) - */ - private String piString(final boolean useHeader) - { - String aString = toString(); - - if (SettingsHandler.guiUsesOutputNameEquipment()) - { - aString = getOutputName(); - } - - if (getSafe(ObjectKey.NAME_PI)) - { - final StringBuffer sb = new StringBuffer(aString.length() + 30); - - if (useHeader) - { - sb.append("<html>"); - } - - sb.append("<b><i>").append(aString).append("</i></b>"); - - if (useHeader) - { - sb.append("</html>"); - } - - return sb.toString(); - } - - return aString; - } - protected void removeMyType(final String myType) { types.remove(myType); @@ -2481,26 +2357,6 @@ } /** - * Set a string referenced by a key - * @param key - * @param s - */ - public void setStringFor(StringKey key, String s) - { - put(key, s); - } - - /** - * Get the string given a key - * @param key - * @return string - */ - public String getStringFor(StringKey key) - { - return get(key); - } - - /** * Set a list of languages that the character this Template is applied to * automatically knows. * @@ -2539,7 +2395,7 @@ c.setPoolFlag(false); c.setTitle("Pick a Language: "); - Set<Language> list = getLanguagesFromString(chooseLanguageAutos); + Set<Language> list = LanguageSupport.getLanguagesFromString(chooseLanguageAutos); c.setAvailableList(new ArrayList<Language>(list)); c.setVisible(true); selectedList = c.getSelectedList(); @@ -2551,57 +2407,7 @@ } } - /** - * Returns a list of Language objects from a string of choices. The method - * will expand "ALL" or "ANY" into all languages and TYPE= into all - * languages of that type - * @param stringList Pipe separated list of language choices - * @return Sorted list of Language objects - */ - public static SortedSet<Language> getLanguagesFromString(final String stringList) - { - SortedSet<Language> list = new TreeSet<Language>(); - - final StringTokenizer tokens = new StringTokenizer(stringList, "|", false); - - AbstractReferenceContext ref = Globals.getContext().ref; - while (tokens.hasMoreTokens()) - { - final String aLang = tokens.nextToken(); - if ("ALL".equals(aLang)) - { - list.addAll(ref.getConstructedCDOMObjects(Language.class)); - return list; - } - else if (aLang.startsWith("TYPE=") || aLang.startsWith("TYPE.")) - { - list.addAll(Globals.getPObjectsOfType(ref - .getConstructedCDOMObjects(Language.class), aLang - .substring(5))); - } - else - { - Language languageKeyed = ref - .silentlyGetConstructedCDOMObject(Language.class, aLang); - if (languageKeyed == null) - { - Logging.debugPrint("Someone expected Language: " + aLang + " to exist: it doesn't"); - } - else - { - list.add(languageKeyed); - } - } - } - return list; - } - - /* ************************************************ - * End methods for the KeyedListContainer Interface - * ************************************************/ - private DoubleKeyMap<AbilityCategory, Ability.Nature, List<QualifiedObject<String>>> theAbilities = new DoubleKeyMap<AbilityCategory, Ability.Nature, List<QualifiedObject<String>>>(); - public void addAbility(final AbilityCategory aCategory, final Ability.Nature aNature, final QualifiedObject<String> anAbility) { @@ -2699,8 +2505,6 @@ } return Collections.unmodifiableList(abNature); } - - /** * Get the list of bonuses for this object @@ -2740,20 +2544,6 @@ } /** - * Get the map of bonuses for this object - * @return bonusMap - */ - public HashMap<String, String> getBonusMap() - { - if (bonusMap == null) - { - bonusMap = new HashMap<String, String>(); - } - - return bonusMap; - } - - /** * Apply the bonus to a PC, pass through object's default bonuslist * * @param aType @@ -2998,16 +2788,6 @@ } /** - * Put the key/value pair into the bonus map - * @param aKey - * @param aVal - */ - public void putBonusMap(final String aKey, final String aVal) - { - getBonusMap().put(aKey, aVal); - } - - /** * Remove the bonus object from the bonus list * @param aBonus */ @@ -3035,136 +2815,6 @@ } /** - * @param bonus a Number (such as 2) - * @param bonusType "COMBAT.AC.Dodge" or "COMBAT.AC.Dodge.STACK" - */ - final void setBonusStackFor(final double bonus, String bonusType) - { - if (bonusType != null) - { - bonusType = bonusType.toUpperCase(); - } - - // Default to non-stacking bonuses - int index = -1; - - final StringTokenizer aTok = new StringTokenizer(bonusType, "."); - - // e.g. "COMBAT.AC.DODGE" - if ((bonusType != null) && (aTok.countTokens() >= 2)) - { - String aString; - - // we need to get the 3rd token to see - // if it should .STACK or .REPLACE - aTok.nextToken(); //Discard token - aString = aTok.nextToken(); - - // if the 3rd token is "BASE" we have something like - // CHECKS.BASE.Fortitude - if (aString.equals("BASE")) - { - if (aTok.hasMoreTokens()) - { - // discard next token (Fortitude) - aTok.nextToken(); - } - - if (aTok.hasMoreTokens()) - { - // check for a TYPE - aString = aTok.nextToken(); - } - else - { - // all BASE type bonuses should stack - aString = null; - } - } - else - { - if (aTok.hasMoreTokens()) - { - // Type: .DODGE - aString = aTok.nextToken(); - } - else - { - aString = null; - } - } - - if (aString != null) - { - index = SettingsHandler.getGame().getUnmodifiableBonusStackList().indexOf(aString); // e.g. Dodge - } - - // - // un-named (or un-TYPE'd) bonus should stack - if (aString == null) - { - index = 1; - } - else if (aString.equals("NULL")) - { - index = 1; - } - } - - // .STACK means stack - // .REPLACE stacks with other .REPLACE bonuses - if ((bonusType != null) && (bonusType.endsWith(".STACK") || bonusType.endsWith(".REPLACE"))) - { - index = 1; - } - - // If it's a negative bonus, it always needs to be added - if (bonus < 0) - { - index = 1; - } - - if (index == -1) // a non-stacking bonus - { - final String aVal = getBonusMap().get(bonusType); - - if (aVal == null) - { - putBonusMap(bonusType, String.valueOf(bonus)); - } - else - { - putBonusMap(bonusType, String.valueOf(Math.max(bonus, Float.parseFloat(aVal)))); - } - } - else // a stacking bonus - { - if (bonusType == null) - { - bonusType = ""; - } - else if (bonusType.endsWith(".REPLACE.STACK")) - { - // Check for the special case of: - // COMBAT.AC.Armor.REPLACE.STACK - // and remove the .STACK - bonusType = bonusType.substring(0, bonusType.length() - 6); - } - - final String aVal = getBonusMap().get(bonusType); - - if (aVal == null) - { - putBonusMap(bonusType, String.valueOf(bonus)); - } - else - { - putBonusMap(bonusType, String.valueOf(bonus + Float.parseFloat(aVal))); - } - } - } - - /** * Apply the bonus to a character. The bonus can optionally * only be added once no matter how many associated choices this * object has. This is normally used where a bonus is added for @@ -3418,10 +3068,6 @@ { ((Equipment) obj).setBonusStackFor(bonus * iTimes, aTypePlusName + bonusTypeString); } - else - { - setBonusStackFor(bonus * iTimes, aTypePlusName + bonusTypeString); - } // The "ALL" subtag is used to build the stacking bonusMap // not to get a bonus value, so just return Added: Trunk/pcgen/code/src/java/pcgen/core/analysis/LanguageSupport.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/analysis/LanguageSupport.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/core/analysis/LanguageSupport.java 2008-09-29 00:36:48 UTC (rev 7829) @@ -0,0 +1,60 @@ +package pcgen.core.analysis; + +import java.util.SortedSet; +import java.util.StringTokenizer; +import java.util.TreeSet; + +import pcgen.core.Globals; +import pcgen.core.Language; +import pcgen.rules.context.AbstractReferenceContext; +import pcgen.util.Logging; + +public class LanguageSupport +{ + + /** + * Returns a list of Language objects from a string of choices. The method + * will expand "ALL" or "ANY" into all languages and TYPE= into all + * languages of that type + * @param stringList Pipe separated list of language choices + * @return Sorted list of Language objects + */ + public static SortedSet<Language> getLanguagesFromString(final String stringList) + { + SortedSet<Language> list = new TreeSet<Language>(); + + final StringTokenizer tokens = new StringTokenizer(stringList, "|", false); + + AbstractReferenceContext ref = Globals.getContext().ref; + while (tokens.hasMoreTokens()) + { + final String aLang = tokens.nextToken(); + if ("ALL".equals(aLang)) + { + list.addAll(ref.getConstructedCDOMObjects(Language.class)); + return list; + } + else if (aLang.startsWith("TYPE=") || aLang.startsWith("TYPE.")) + { + list.addAll(Globals.getPObjectsOfType(ref + .getConstructedCDOMObjects(Language.class), aLang + .substring(5))); + } + else + { + Language languageKeyed = ref + .silentlyGetConstructedCDOMObject(Language.class, aLang); + if (languageKeyed == null) + { + Logging.debugPrint("Someone expected Language: " + aLang + " to exist: it doesn't"); + } + else + { + list.add(languageKeyed); + } + } + } + return list; + } + +} Added: Trunk/pcgen/code/src/java/pcgen/core/analysis/OutputNameFormatting.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/analysis/OutputNameFormatting.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/core/analysis/OutputNameFormatting.java 2008-09-29 00:36:48 UTC (rev 7829) @@ -0,0 +1,116 @@ +package pcgen.core.analysis; + +import java.util.ArrayList; +import java.util.StringTokenizer; + +import pcgen.cdom.enumeration.ObjectKey; +import pcgen.core.PObject; +import pcgen.core.PlayerCharacter; +import pcgen.core.SettingsHandler; + +public class OutputNameFormatting +{ + + /** + * Parse the output name to get a useable Name token + * @param aString + * @param aPC + * @return the output name to get a useable Name token + */ + public static String parseOutputName(final String aString, final PlayerCharacter aPC) + { + final int varIndex = aString.indexOf('|'); + + if (varIndex <= 0) + { + return (aString); + } + + final StringTokenizer varTokenizer = new StringTokenizer(aString, "|"); + + final String preVarStr = varTokenizer.nextToken(); + + final ArrayList<Float> varArray = new ArrayList<Float>(); + final ArrayList<String> tokenList = new ArrayList<String>(); + + while (varTokenizer.hasMoreElements()) + { + final String token = varTokenizer.nextToken(); + tokenList.add(token.toUpperCase()); + varArray.add(aPC.getVariableValue(token, "")); + } + + final StringBuffer result = new StringBuffer(); + int varCount = 0; + int subIndex = preVarStr.indexOf('%'); + int lastIndex = 0; + + while (subIndex >= 0) + { + if (subIndex > 0) + { + result.append(preVarStr.substring(lastIndex, subIndex)); + } + + final String token = tokenList.get(varCount); + final Float val = varArray.get(varCount); + + if (token.endsWith(".INTVAL")) + { + result.append(String.valueOf(val.intValue())); + } + else + { + result.append(val.toString()); + } + + lastIndex = subIndex + 1; + varCount++; + subIndex = preVarStr.indexOf('%', lastIndex); + } + + if (preVarStr.length() > lastIndex) + { + result.append(preVarStr.substring(lastIndex)); + } + + return (result.toString()); + } + + /** + * Returns the Product Identity string (with or without the header) + * @param useHeader + * @return the Product Identity string (with or without the header) + */ + public static String piString(PObject po, final boolean useHeader) + { + String aString = po.toString(); + + if (SettingsHandler.guiUsesOutputNameEquipment()) + { + aString = po.getOutputName(); + } + + if (po.getSafe(ObjectKey.NAME_PI)) + { + final StringBuffer sb = new StringBuffer(aString.length() + 30); + + if (useHeader) + { + sb.append("<html>"); + } + + sb.append("<b><i>").append(aString).append("</i></b>"); + + if (useHeader) + { + sb.append("</html>"); + } + + return sb.toString(); + } + + return aString; + } + +} Modified: Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbility.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbility.java 2008-09-28 20:15:01 UTC (rev 7828) +++ Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbility.java 2008-09-29 00:36:48 UTC (rev 7829) @@ -440,12 +440,8 @@ final int aLevel, final String aString) { - if (aString.startsWith("SPECIAL")) + if (aString.startsWith("FEAT")) { - return new LevelAbilitySpecial(aowner, aLevel, aString); - } - else if (aString.startsWith("FEAT")) - { return new LevelAbilityFeat(aowner, aLevel, aString, false); } else if (aString.startsWith("VFEAT")) @@ -472,10 +468,6 @@ { return new LevelAbilityEquipment(aowner, aLevel, aString); } - else if (aString.startsWith("LIST")) - { - return new LevelAbilityList(aowner, aLevel, aString); - } else if (aString.startsWith("LANGUAGE") || aString.startsWith("Language")) { return new LevelAbilityLanguage(aowner, aLevel, aString); Deleted: Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityList.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityList.java 2008-09-28 20:15:01 UTC (rev 7828) +++ Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityList.java 2008-09-29 00:36:48 UTC (rev 7829) @@ -1,172 +0,0 @@ -/* - * LevelAbilityList.java - * Copyright 2001 (C) Dmitry Jemerov - * - * 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 July 24, 2001, 12:36 PM - */ -package pcgen.core.levelability; - -import pcgen.core.PObject; -import pcgen.core.PlayerCharacter; -import pcgen.core.pclevelinfo.PCLevelInfo; -import pcgen.util.chooser.ChooserInterface; - -import java.util.*; - -/** - * Represents an option list that a character gets when gaining a level - * (an ADD:LIST entry in the LST file). - * - * @author Dmitry Jemerov <yo...@sp...> - * @version $Revision$ - */ -final class LevelAbilityList extends LevelAbility -{ - private List<String> aBonusList; - private List<String> aChoiceList; - private int cnt = 0; - - LevelAbilityList(final PObject aowner, final int aLevel, final String aList) - { - super(aowner, aLevel, aList); - } - - List<String> getChoicesList(final String bString, final PlayerCharacter aPC) - { - aChoiceList = new ArrayList<String>(); - aBonusList = new ArrayList<String>(); - - return super.getChoicesList(bString.substring(5), aPC); - } - - /** - * Performs the initial setup of a chooser. - * @param c - * @param aPC - * @return String - */ - String prepareChooser(final ChooserInterface c, PlayerCharacter aPC) - { - super.prepareChooser(c, aPC); - c.setTitle("Option List"); - - return rawTagData; - } - - /** - * Process the choice selected by the user. - * @param selectedList - * @param aPC - * @param pcLevelInfo - * @param aArrayList - */ - public boolean processChoice( - final List<String> aArrayList, - final List<String> selectedList, - final PlayerCharacter aPC, - final PCLevelInfo pcLevelInfo) - { - for (int index = 0; index < selectedList.size(); ++index) - { - cnt = aArrayList.indexOf(selectedList.get(index)); - - String theChoice = null; - final List<String> selectedBonusList = new ArrayList<String>(); - final String prefix = cnt + "|"; - - for ( String bonus : aBonusList ) - { - if (bonus.startsWith(prefix)) - { - bonus = bonus.substring((cnt / 10) + 2); - selectedBonusList.add(bonus); - } - } - - for (Iterator<String> e = aChoiceList.iterator(); e.hasNext();) - { - theChoice = e.next(); - - if (theChoice.startsWith(prefix)) - { - theChoice = theChoice.substring((cnt / 10) + 9); - - break; - } - - theChoice = ""; - } - - if ((theChoice != null) && (theChoice.length() > 0)) - { - owner.getChoices(theChoice, aPC); - } - else if (selectedBonusList.size() > 0) - { - for ( String bonus : selectedBonusList ) - { - owner.applyBonus(bonus, "", aPC, false); - } - } - } - return true; - } - - /** - * Processes a single token in the comma-separated list of the ADD: - * field and adds the choices to be shown in the list to anArrayList. - * - * @param aToken the token to be processed. - * @param anArrayList the list to add the choice to. - * @param aPC the PC this Level ability is adding to. - */ - void processToken( - final String aToken, - final List<String> anArrayList, - final PlayerCharacter aPC) - { - final StringTokenizer cTok = new StringTokenizer(aToken, "[]", false); - - try - { - anArrayList.add(cTok.nextToken()); - } - catch (NoSuchElementException e) - { - //do nothing, TODO add debug logger and log condition - } - - while (cTok.hasMoreTokens()) - { - final String bTokString = cTok.nextToken(); - final String aString = new StringBuffer(cnt).append(String.valueOf(cnt)).append("|").append(bTokString) - .toString(); - - if (bTokString.startsWith("CHOOSE:")) - { - aChoiceList.add(aString); - } - - if (bTokString.startsWith("BONUS:")) - { - aBonusList.add(aString); - } - } - - cnt++; - } -} Deleted: Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilitySpecial.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilitySpecial.java 2008-09-28 20:15:01 UTC (rev 7828) +++ Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilitySpecial.java 2008-09-29 00:36:48 UTC (rev 7829) @@ -1,168 +0,0 @@ -/* - * LevelAbilitySpecial.java - * Copyright 2001 (C) Dmitry Jemerov - * - * 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 July 24, 2001, 11:24 PM - */ -package pcgen.core.levelability; - -import pcgen.cdom.enumeration.ListKey; -import pcgen.core.*; -import pcgen.core.pclevelinfo.PCLevelInfo; -import pcgen.util.chooser.ChooserInterface; - -import java.util.Collections; -import java.util.Iterator; -import java.util.List; - -/** - * Represents a special ability that a character gets when gaining a level - * (an ADD:SPECIAL entry in the LST file). - * - * @author Dmitry Jemerov <yo...@sp...> - * @version $Revision$ - */ -final class LevelAbilitySpecial extends LevelAbility -{ - LevelAbilitySpecial(final PObject aowner, final int aLevel, final String aList) - { - super(aowner, aLevel, aList); - } - - List<String> getChoicesList(String choices, final PlayerCharacter aPC) - { - choices = choices.substring(choices.lastIndexOf('(') + 1); - - if (choices.lastIndexOf(")") >= (choices.length() - 2)) - { - choices = choices.substring(0, choices.lastIndexOf(")")); - } - - final List<String> aList = super.getChoicesList(choices, aPC); - Collections.sort(aList); - - return aList; - } - - /** - * Performs the initial setup of a chooser. - * @param c - * @param aPC - * @return String - */ - String prepareChooser(final ChooserInterface c, PlayerCharacter aPC) - { - super.prepareChooser(c, aPC); - c.setTitle("Special Ability Choice"); - - return rawTagData; - } - - /** - * Process the choice selected by the user. - * @param aArrayList - * @param selectedList - * @param aPC - * @param pcLevelInfo - */ - public boolean processChoice( - final List<String> aArrayList, - final List<String> selectedList, - final PlayerCharacter aPC, - final PCLevelInfo pcLevelInfo) - { - for ( String selection : selectedList ) - { - if ("Free Feat".equals(selection)) - { - aPC.adjustFeats(1); - continue; - } - - final SpecialAbility sa; - - if (this.owner instanceof PCClass) - { - String source = "PCCLASS|" + this.owner.getKeyName() + "|" + level(); - sa = new SpecialAbility(selection, source); - } - else - { - sa = new SpecialAbility(selection); - } - - this.owner.addToListFor(ListKey.SPECIAL_ABILITY, sa); - this.owner.addSave(selection); - } - return true; - } - - /** - * Processes a single token in the comma-separated list of the ADD: - * field and adds the choices to be shown in the list to anArrayList. - * - * @param aToken the token to be processed. - * @param anArrayList the list to add the choice to. - * @param aPC the PC this Level ability is adding to. - */ - void processToken( - final String aToken, - final List<String> anArrayList, - final PlayerCharacter aPC) - { - - if ("FEATLIST".equals(aToken)) - { - for (Iterator<? extends Categorisable> it = Globals.getAbilityKeyIterator("FEAT"); it.hasNext(); ) { - final Ability anAbility = (Ability)it.next(); - - if (aPC.canSelectAbility(anAbility)) - { - anArrayList.add(anAbility.getKeyName()); - } - } - } - else if ("Free Feat".equals(aToken)) - { - anArrayList.add(aToken); - } - else if (aToken.startsWith("FEATTYPE=") || aToken.startsWith("FEATTYPE.")) - { - final String featType = aToken.substring(9); - anArrayList.addAll(aPC.getAvailableFeatNames(featType)); - } - else if (aToken.startsWith("FEAT=") || aToken.startsWith("FEAT.")) - { - String anAbilityKey = aToken.substring(5); - final Ability anAbility = Globals.getAbilityKeyed("FEAT", anAbilityKey); - - if (aPC.canSelectAbility(anAbility)) - { - anArrayList.add(anAbility.getKeyName()); - } - } - else - { - final List<String> aList = aPC.getSpecialAbilityListStrings(); - - if (!aList.contains(aToken)) - { - anArrayList.add(aToken); - } - } - } -} Modified: Trunk/pcgen/code/src/java/pcgen/gui/editor/EditorMainForm.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/editor/EditorMainForm.java 2008-09-28 20:15:01 UTC (rev 7828) +++ Trunk/pcgen/code/src/java/pcgen/gui/editor/EditorMainForm.java 2008-09-29 00:36:48 UTC (rev 7829) @@ -67,6 +67,7 @@ import pcgen.cdom.list.DomainList; import pcgen.cdom.reference.CDOMDirectSingleRef; import pcgen.core.Ability; +import pcgen.core.AbilityCategory; import pcgen.core.Categorisable; import pcgen.core.Deity; import pcgen.core.Domain; @@ -1522,7 +1523,7 @@ availableRaceVirtualFeatList.add(anAbility.getKeyName()); } - for (Iterator<String> e = ((Race) thisPObject).getVirtualFeatList().iterator(); e.hasNext();) + for (Iterator<String> e = ((Race) thisPObject).getAbilityKeys(null, AbilityCategory.FEAT, Ability.Nature.VIRTUAL).iterator(); e.hasNext();) { String featName = e.next(); Modified: Trunk/pcgen/code/src/java/pcgen/io/exporttoken/EqToken.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/exporttoken/EqToken.java 2008-09-28 20:15:01 UTC (rev 7828) +++ Trunk/pcgen/code/src/java/pcgen/io/exporttoken/EqToken.java 2008-09-29 00:36:48 UTC (rev 7829) @@ -40,6 +40,7 @@ import pcgen.core.Globals; import pcgen.core.PlayerCharacter; import pcgen.core.SettingsHandler; +import pcgen.core.analysis.OutputNameFormatting; import pcgen.io.ExportHandler; import pcgen.util.BigDecimalHelper; @@ -754,7 +755,7 @@ */ public static String getNameToken(Equipment eq, PlayerCharacter pc) { - return eq.parseOutputName(eq.getOutputName(), pc); + return OutputNameFormatting.parseOutputName(eq.getOutputName(), pc); } /** Modified: Trunk/pcgen/code/src/java/pcgen/io/exporttoken/WeaponToken.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/exporttoken/WeaponToken.java 2008-09-28 20:15:01 UTC (rev 7828) +++ Trunk/pcgen/code/src/java/pcgen/io/exporttoken/WeaponToken.java 2008-09-29 00:36:48 UTC (rev 7829) @@ -42,6 +42,7 @@ import pcgen.core.SettingsHandler; import pcgen.core.SizeAdjustment; import pcgen.core.WeaponProf; +import pcgen.core.analysis.OutputNameFormatting; import pcgen.core.bonus.BonusObj; import pcgen.core.bonus.BonusUtilities; import pcgen.io.ExportHandler; @@ -542,7 +543,7 @@ { sb.append("*"); } - sb.append(eq.parseOutputName(eq.getOutputName(), pc)); + sb.append(OutputNameFormatting.parseOutputName(eq.getOutputName(), pc)); sb.append(eq.getAppliedName()); return sb.toString(); @@ -561,7 +562,7 @@ { sb.append("*"); } - sb.append(eq.parseOutputName(eq.getOutputName(), pc)); + sb.append(OutputNameFormatting.parseOutputName(eq.getOutputName(), pc)); sb.append(eq.getAppliedName()); return sb.toString(); Modified: Trunk/pcgen/code/src/java/plugin/exporttokens/ArmorToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/exporttokens/ArmorToken.java 2008-09-28 20:15:01 UTC (rev 7828) +++ Trunk/pcgen/code/src/java/plugin/exporttokens/ArmorToken.java 2008-09-29 00:36:48 UTC (rev 7829) @@ -7,6 +7,7 @@ import pcgen.cdom.base.Constants; import pcgen.core.Equipment; import pcgen.core.PlayerCharacter; +import pcgen.core.analysis.OutputNameFormatting; import pcgen.io.ExportHandler; import pcgen.io.exporttoken.Token; import pcgen.util.BigDecimalHelper; @@ -448,7 +449,7 @@ ret.append("*"); } - ret.append(eq.parseOutputName(eq.getOutputName(), aPC)); + ret.append(OutputNameFormatting.parseOutputName(eq.getOutputName(), aPC)); ret.append(eq.getAppliedName()); } else if (property.startsWith("OUTPUTNAME")) @@ -459,7 +460,7 @@ ret.append("*"); } - ret.append(eq.parseOutputName(eq.getOutputName(), aPC)); + ret.append(OutputNameFormatting.parseOutputName(eq.getOutputName(), aPC)); ret.append(eq.getAppliedName()); } else if (property.startsWith("TOTALAC")) Modified: Trunk/pcgen/code/src/java/plugin/exporttokens/EqContainerToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/exporttokens/EqContainerToken.java 2008-09-28 20:15:01 UTC (rev 7828) +++ Trunk/pcgen/code/src/java/plugin/exporttokens/EqContainerToken.java 2008-09-29 00:36:48 UTC (rev 7829) @@ -32,6 +32,7 @@ import pcgen.core.Equipment; import pcgen.core.Globals; import pcgen.core.PlayerCharacter; +import pcgen.core.analysis.OutputNameFormatting; import pcgen.io.ExportHandler; import pcgen.io.exporttoken.Token; import pcgen.util.BigDecimalHelper; @@ -494,7 +495,7 @@ */ public static String getNameToken(Equipment eq, PlayerCharacter pc) { - return eq.parseOutputName(eq.getOutputName(), pc); + return OutputNameFormatting.parseOutputName(eq.getOutputName(), pc); } /** Modified: Trunk/pcgen/code/src/java/plugin/exporttokens/EqContainersToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/exporttokens/EqContainersToken.java 2008-09-28 20:15:01 UTC (rev 7828) +++ Trunk/pcgen/code/src/java/plugin/exporttokens/EqContainersToken.java 2008-09-29 00:36:48 UTC (rev 7829) @@ -29,6 +29,7 @@ import pcgen.core.Equipment; import pcgen.core.Globals; import pcgen.core.PlayerCharacter; +import pcgen.core.analysis.OutputNameFormatting; import pcgen.io.ExportHandler; import pcgen.io.exporttoken.Token; import pcgen.util.BigDecimalHelper; @@ -494,7 +495,7 @@ */ public static String getNameToken(Equipment eq, PlayerCharacter pc) { - return eq.parseOutputName(eq.getOutputName(), pc); + return OutputNameFormatting.parseOutputName(eq.getOutputName(), pc); } /** Modified: Trunk/pcgen/code/src/java/plugin/exporttokens/EqContainerwToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/exporttokens/EqContainerwToken.java 2008-09-28 20:15:01 UTC (rev 7828) +++ Trunk/pcgen/code/src/java/plugin/exporttokens/EqContainerwToken.java 2008-09-29 00:36:48 UTC (rev 7829) @@ -29,6 +29,7 @@ import pcgen.core.Equipment; import pcgen.core.Globals; import pcgen.core.PlayerCharacter; +import pcgen.core.analysis.OutputNameFormatting; import pcgen.io.ExportHandler; import pcgen.io.exporttoken.Token; import pcgen.util.BigDecimalHelper; @@ -494,7 +495,7 @@ */ public static String getNameToken(Equipment eq, PlayerCharacter pc) { - return eq.parseOutputName(eq.getOutputName(), pc); + return OutputNameFormatting.parseOutputName(eq.getOutputName(), pc); } /** Modified: Trunk/pcgen/code/src/test/pcgen/core/PObjectTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/PObjectTest.java 2008-09-28 20:15:01 UTC (rev 7828) +++ Trunk/pcgen/code/src/test/pcgen/core/PObjectTest.java 2008-09-29 00:36:48 UTC (rev 7829) @@ -112,13 +112,13 @@ // race.setDR("5/Good"); race.addToListFor(ListKey.DAMAGE_REDUCTION, new DamageReduction("5", "Good")); - assertEquals("Basic DR set.", "5/Good", race.getDRList().get(0) + assertEquals("Basic DR set.", "5/Good", race.getListFor(ListKey.DAMAGE_REDUCTION).get(0) .toString()); race.removeListFor(ListKey.DAMAGE_REDUCTION); // race.setDR("0/-"); race.addToListFor(ListKey.DAMAGE_REDUCTION, new DamageReduction("0", "-")); - assertEquals("Basic DR set.", "0/-", race.getDRList().get(0).toString()); + assertEquals("Basic DR set.", "0/-", race.getListFor(ListKey.DAMAGE_REDUCTION).get(0).toString()); // template.setDR("0/-"); template.addToListFor(ListKey.DAMAGE_REDUCTION, new DamageReduction("0", "-")); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-10-01 22:42:46
|
Revision: 7859 http://pcgen.svn.sourceforge.net/pcgen/?rev=7859&view=rev Author: thpr Date: 2008-10-01 22:42:27 +0000 (Wed, 01 Oct 2008) Log Message: ----------- Move Rank out of Skill into Associations in PlayerCharacter Modified Paths: -------------- Trunk/pcgen/code/src/java/gmgen/plugin/PcgCombatant.java Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/AssociationKey.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/SkillComparator.java Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorPC.java Trunk/pcgen/code/src/java/pcgen/core/analysis/SkillLanguage.java Trunk/pcgen/code/src/java/pcgen/core/analysis/SkillModifier.java Trunk/pcgen/code/src/java/pcgen/core/chooser/SkillsNamedChoiceManager.java Trunk/pcgen/code/src/java/pcgen/core/kit/KitSkill.java Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityClassSkills.java Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilitySkill.java Trunk/pcgen/code/src/java/pcgen/core/npcgen/NPCGenerator.java Trunk/pcgen/code/src/java/pcgen/gui/filter/FilterFactory.java Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoSkills.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/SkillToken.java Trunk/pcgen/code/src/java/pcgen/io/exporttoken/SkillpointsToken.java Trunk/pcgen/code/src/java/plugin/charactersheet/gui/SkillsPane.java Trunk/pcgen/code/src/java/plugin/exporttokens/SkillListModsToken.java Trunk/pcgen/code/src/java/plugin/initiative/OpposedSkillModel.java Trunk/pcgen/code/src/java/plugin/jepcommands/SkillInfoCommand.java Trunk/pcgen/code/src/java/plugin/pretokens/test/PreSkillMultTester.java Trunk/pcgen/code/src/java/plugin/pretokens/test/PreSkillTester.java Trunk/pcgen/code/src/test/pcgen/core/PlayerCharacterTest.java Trunk/pcgen/code/src/test/pcgen/core/prereq/PreMultTest.java Trunk/pcgen/code/src/test/pcgen/core/prereq/PreSkillTest.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/core/analysis/SkillRankControl.java Modified: Trunk/pcgen/code/src/java/gmgen/plugin/PcgCombatant.java =================================================================== --- Trunk/pcgen/code/src/java/gmgen/plugin/PcgCombatant.java 2008-10-01 05:59:34 UTC (rev 7858) +++ Trunk/pcgen/code/src/java/gmgen/plugin/PcgCombatant.java 2008-10-01 22:42:27 UTC (rev 7859) @@ -54,6 +54,7 @@ import pcgen.core.StatList; import pcgen.core.analysis.DescriptionFormatting; import pcgen.core.analysis.SkillModifier; +import pcgen.core.analysis.SkillRankControl; import pcgen.core.character.CharacterSpell; import pcgen.core.spell.Spell; import pcgen.util.Logging; @@ -829,7 +830,7 @@ int temp = SkillModifier.modifier(skill, pc).intValue() - + skill.getTotalRank(pc).intValue(); + + SkillRankControl.getTotalRank(pc, skill).intValue(); statBuf.append("<a href='skill:"); statBuf.append(skill.getOutputName()); //|SKILL.%skill| Modified: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/AssociationKey.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/AssociationKey.java 2008-10-01 05:59:34 UTC (rev 7858) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/AssociationKey.java 2008-10-01 22:42:27 UTC (rev 7859) @@ -30,6 +30,7 @@ import pcgen.base.util.CaseInsensitiveMap; import pcgen.base.util.FixedStringList; +import pcgen.base.util.NamedValue; import pcgen.cdom.base.CDOMObject; import pcgen.core.Ability; import pcgen.core.AbilityCategory; @@ -72,6 +73,8 @@ public static final AssociationKey<Object> ADD = new AssociationKey<Object>(); + public static final AssociationKey<NamedValue> SKILL_RANK = new AssociationKey<NamedValue>(); + private static CaseInsensitiveMap<AssociationKey<?>> map = null; private AssociationKey() Modified: Trunk/pcgen/code/src/java/pcgen/core/PCClass.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-10-01 05:59:34 UTC (rev 7858) +++ Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-10-01 22:42:27 UTC (rev 7859) @@ -67,6 +67,7 @@ import pcgen.cdom.reference.CDOMSingleRef; import pcgen.core.Ability.Nature; import pcgen.core.QualifiedObject.LevelAwareQualifiedObject; +import pcgen.core.analysis.SkillRankControl; import pcgen.core.bonus.Bonus; import pcgen.core.bonus.BonusObj; import pcgen.core.character.CharacterSpell; @@ -3936,7 +3937,7 @@ // for (Skill skill : aPC.getSkillList()) { - skill.setZeroRanks(this, aPC); + SkillRankControl.setZeroRanks(this, aPC, skill); } spMod = skillPool(); Modified: Trunk/pcgen/code/src/java/pcgen/core/PObject.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-10-01 05:59:34 UTC (rev 7858) +++ Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-10-01 22:42:27 UTC (rev 7859) @@ -3098,11 +3098,6 @@ list.add(key); } - public final void clearServesAs() - { - servesAsList =null; - } - //TODO This exposes internal structure - be careful. public final Map<String,List<String>> getServesAs() { Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-10-01 05:59:34 UTC (rev 7858) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-10-01 22:42:27 UTC (rev 7859) @@ -90,6 +90,7 @@ import pcgen.cdom.reference.CDOMSingleRef; import pcgen.core.Ability.Nature; import pcgen.core.analysis.RaceStat; +import pcgen.core.analysis.SkillRankControl; import pcgen.core.analysis.TemplateSR; import pcgen.core.analysis.TemplateSelect; import pcgen.core.analysis.TemplateStat; @@ -2338,16 +2339,15 @@ if (mSkill.getKeyName().equals(fSkill.getKeyName())) { // need higher rank of the two - if (mSkill.getRank().intValue() > fSkill.getRank() + if (SkillRankControl.getRank(mPC, mSkill).intValue() > SkillRankControl.getRank(this, fSkill) .intValue()) { // first zero current - fSkill.setZeroRanks(lcf == null ? null : lcf.getPCClass(), this); + SkillRankControl.setZeroRanks(lcf == null ? null : lcf.getPCClass(), this, fSkill); // We don't pass in a class here so that the real // skills can be distinguished from the ones from // the master. - fSkill.modRanks(mSkill.getRank().doubleValue(), - null, true, this); + SkillRankControl.modRanks(SkillRankControl.getRank(mPC, mSkill).doubleValue(), null, true, this, fSkill); } } @@ -2368,7 +2368,7 @@ // but master does, so add it final Skill newSkill = Globals.getContext().ref.silentlyGetConstructedCDOMObject(Skill.class, skillKey).clone(); final double sr = - mPC.getSkillKeyed(skillKey).getRank().doubleValue(); + SkillRankControl.getRank(mPC, mPC.getSkillKeyed(skillKey)).doubleValue(); if ((newSkill.getChoiceString() != null) && (newSkill.getChoiceString().length() > 0)) @@ -2378,7 +2378,7 @@ // We don't pass in a class here so that the real skills can be // distinguished from the ones form the master. - newSkill.modRanks(sr, null, true, this); + SkillRankControl.modRanks(sr, null, true, this, newSkill); getSkillList().add(newSkill); } } @@ -3071,16 +3071,20 @@ final List<Skill> skillList = new ArrayList<Skill>(getSkillList()); for (Skill aSkill : skillList) { - for (NamedValue sd : aSkill.getRankList()) + List<NamedValue> rankList = getAssocList(aSkill, AssociationKey.SKILL_RANK); + if (rankList != null) { - final PCClass pcClass = getClassKeyed(sd.name); - if (pcClass != null) + for (NamedValue sd : rankList) { - final double curRank = sd.getWeight(); - // Only add the cost for skills associated with a class. - // Skill ranks from feats etc are free. - final int cost = this.getSkillCostForClass(aSkill, pcClass).getCost(); - returnValue -= (int) (cost * curRank); + final PCClass pcClass = getClassKeyed(sd.name); + if (pcClass != null) + { + final double curRank = sd.getWeight(); + // Only add the cost for skills associated with a class. + // Skill ranks from feats etc are free. + final int cost = this.getSkillCostForClass(aSkill, pcClass).getCost(); + returnValue -= (int) (cost * curRank); + } } } } @@ -9749,7 +9753,7 @@ { if (skill.getChoiceString().indexOf("Language") >= 0) { - i += skill.getTotalRank(this).intValue(); + i += SkillRankControl.getTotalRank(this, skill).intValue(); } } } @@ -10014,7 +10018,7 @@ // for (Skill skill : getSkillList()) { - skill.replaceClassRank(aClass.getKeyName(), cl.getKeyName()); + SkillRankControl.replaceClassRank(this, skill, aClass.getKeyName(), cl.getKeyName()); } bClass.setSkillPool(aClass.getSkillPool(this)); @@ -10590,7 +10594,7 @@ } final List<Skill> localSkillList = getSkillList(); - final SkillComparator comparator = new SkillComparator(sort, sortOrder); + final SkillComparator comparator = new SkillComparator(this, sort, sortOrder); int nextOutputIndex = 1; Collections.sort(localSkillList, comparator); @@ -13614,7 +13618,7 @@ private boolean includeSkill(final Skill skill, final int level) { - if (level == 2 || skill.getTotalRank(this).floatValue() > 0) + if (level == 2 || SkillRankControl.getTotalRank(this, skill).floatValue() > 0) { return true; } Modified: Trunk/pcgen/code/src/java/pcgen/core/Skill.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Skill.java 2008-10-01 05:59:34 UTC (rev 7858) +++ Trunk/pcgen/code/src/java/pcgen/core/Skill.java 2008-10-01 22:42:27 UTC (rev 7859) @@ -28,21 +28,17 @@ import java.util.StringTokenizer; import pcgen.base.lang.StringUtil; -import pcgen.base.util.NamedValue; import pcgen.cdom.base.Constants; import pcgen.cdom.base.TransitionChoice; import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; -import pcgen.cdom.enumeration.SkillCost; -import pcgen.core.analysis.SkillLanguage; +import pcgen.core.analysis.SkillRankControl; import pcgen.core.bonus.Bonus; import pcgen.core.bonus.BonusObj; import pcgen.core.levelability.LevelAbility; -import pcgen.core.prereq.PrereqHandler; import pcgen.core.utils.CoreUtility; import pcgen.core.utils.MessageType; import pcgen.core.utils.ShowMessageDelegate; -import pcgen.util.Logging; /** * <code>Skill</code>. @@ -52,8 +48,6 @@ */ public final class Skill extends PObject { - private List<NamedValue> ranks = new ArrayList<NamedValue>(); - private int outputIndex = 0; /** Constructor */ @@ -77,12 +71,12 @@ } /** - * Return the output index, which controls the order in - * which the skills appear on a character sheet - * Note: -1 means hidden and 0 means nto set - * - * <br>author: James Dempsey 14-Jun-02 - * + * Return the output index, which controls the order in which the skills + * appear on a character sheet Note: -1 means hidden and 0 means nto set + * + * <br> + * author: James Dempsey 14-Jun-02 + * * @return the output index for this skill (-1=hidden, 0=not set) */ public int getOutputIndex() @@ -90,36 +84,13 @@ return outputIndex; } - /** returns ranks taken specifically in skill - * @return ranks taken in skill + /** + * Get a count of the sub types + * + * @return count of sub types */ - public Float getRank() + public int getSubtypeCount() { - double rank = 0.0; - - for (NamedValue sd : ranks) - { - rank += sd.getWeight(); - } - - return new Float(rank); - } - - /** - * Get list of ranks - * @return rankList - */ - public List<NamedValue> getRankList() - { - return ranks; - } - - /** - * Get a count of the sub types - * @return count of sub types - */ - public int getSubtypeCount() - { final int i = getMyTypeCount(); if (i == 0) @@ -131,10 +102,11 @@ } /** - * Get an iterator for the sub types - * @return iterator for the sub types + * Get an iterator for the sub types + * + * @return iterator for the sub types */ - public Iterator<String> getSubtypeIterator() + public Iterator<String> getSubtypeIterator() { final Iterator<String> it = getTypeList(false).iterator(); @@ -153,64 +125,6 @@ return it; } - /** - * Returns the total ranks of a skill - * rank + bonus ranks (racial, class, etc bonuses). - * Note that the total ranks could be higher than the max - * ranks if the ranks come from a familiar's master. - * - * @param aPC - * @return rank + bonus ranks (racial, class, etc. bonuses) - */ - public Float getTotalRank(final PlayerCharacter aPC) - { - double baseRanks = getRank().doubleValue(); - double ranks = baseRanks - + (aPC == null ? 0.0 : getSkillRankBonusTo(aPC)); - if (!Globals.checkRule(RuleConstants.SKILLMAX) - && aPC.getClassList().size() > 0) - { - double maxRanks = - aPC.getMaxRank(getKeyName(), aPC.getClassList().get(0)) - .doubleValue(); - maxRanks = Math.max(maxRanks, baseRanks); - ranks = Math.min(maxRanks, ranks); - } - return new Float(ranks); - } - - /** Set the ranks for the specified class to zero - * - * @param aClass - * @param aPC - */ - public void setZeroRanks(final PCClass aClass, final PlayerCharacter aPC) - { - if (aClass == null) - { - return; - } - - final String aCName = aClass.getKeyName(); - for (Iterator<NamedValue> i = ranks.iterator(); i.hasNext();) - { - NamedValue sd = i.next(); - if (sd.name.equals(aCName)) - { - i.remove(); - double curRankCost = sd.getWeight(); - final String aResp = modRanks(-curRankCost, aClass, false, aPC); - - if (aResp.length() != 0) - { - // error or debug? XXX - Logging.debugPrint(aResp); - } - break; - } - } - } - @Override public Skill clone() { @@ -219,147 +133,24 @@ try { newSkill = (Skill) super.clone(); - /* - * TODO Deep clone ranks - */ newSkill.outputIndex = outputIndex; } catch (CloneNotSupportedException exc) { - ShowMessageDelegate.showMessageDialog(exc.getMessage(), Constants.s_APPNAME, MessageType.ERROR); + ShowMessageDelegate.showMessageDialog(exc.getMessage(), + Constants.s_APPNAME, MessageType.ERROR); } return newSkill; } - /** - * Modify the rank - * - * @param rankMod - * @param aClass - * @param aPC - * @return message - */ - public String modRanks(final double rankMod, final PCClass aClass, final PlayerCharacter aPC) - { - return modRanks(rankMod, aClass, false, aPC); - } - - /** - * Modify the rank - * - * @param rankMod - * @param aClass - * @param ignorePrereqs - * @param aPC - * @return message - */ - public String modRanks(double rankMod, final PCClass aClass, final boolean ignorePrereqs, final PlayerCharacter aPC) - { - int i = 0; - - if (!ignorePrereqs) - { - if (aClass == null) - { - return "You must be at least level one before you can purchase skills."; - } - - if ((rankMod > 0.0) && !PrereqHandler.passesAll(getPrerequisiteList(), aPC, this)) - { - return "You do not meet the prerequisites required to take this skill."; - } - - SkillCost sc = aPC.getSkillCostForClass(this, aClass); - - if (sc.equals(SkillCost.EXCLUSIVE)) - { - return "You cannot purchase this exclusive skill."; - } - - if ((rankMod > 0.0) && (aClass.getSkillPool(aPC) < (rankMod * i))) - { - return "You do not have enough skill points."; - } - - final double maxRank = aPC.getMaxRank(keyName, aClass).doubleValue(); - - if (!Globals.checkRule(RuleConstants.SKILLMAX) && (rankMod > 0.0)) - { - final double ttlRank = getTotalRank(aPC).doubleValue(); - - if (ttlRank >= maxRank) - { - return "Skill rank at maximum (" + maxRank + ") for your level."; - } - - if ((ttlRank + rankMod) > maxRank) - { - return "Raising skill would make it above maximum (" + maxRank + ") for your level."; - } - } - } - - if ((getRank().doubleValue() + rankMod) < 0.0) - { - return "Cannot lower rank below 0"; - } - - String classKey = "None"; - - if (aClass != null) - { - classKey = aClass.getKeyName(); - } - - double currentRank = 0.0; - double noneRank = 0.0; - NamedValue active = null; - for (Iterator<NamedValue> it = ranks.iterator(); it.hasNext();) - { - NamedValue sd = it.next(); - if (sd.name.equals(classKey)) - { - currentRank = sd.getWeight(); - active = sd; - break; - } - else if (sd.name.equals("None")) - { - noneRank = sd.getWeight(); - } - } - - if (currentRank <= 0) - { - currentRank = noneRank; - } - - if (CoreUtility.doublesEqual(currentRank, 0.0) && (rankMod < 0.0)) - { - return "No more ranks found for class: " + classKey + ". Try a different one."; - } - - rankMod = modRanks2(rankMod, currentRank, active, classKey, aPC); - - if (!ignorePrereqs) - { - if (aClass != null) - { - aClass.setSkillPool(aClass.getSkillPool(aPC) - (int) (i * rankMod)); - } - - aPC.setSkillPoints(aPC.getSkillPoints() - (int) (i * rankMod)); - } - - return ""; - } - /** - * Get the qualified name - * @param pc TODO - * @return qualified name - */ + * Get the qualified name + * + * @param pc + * TODO + * @return qualified name + */ public String qualifiedName(PlayerCharacter pc) { if (!pc.hasAssociations(this)) @@ -369,111 +160,19 @@ final StringBuilder buffer = new StringBuilder(); buffer.append(this.getOutputName()).append("("); - buffer.append(StringUtil.joinToStringBuffer(pc.getAssociationList(this), ", ")); + buffer.append(StringUtil.joinToStringBuffer( + pc.getAssociationList(this), ", ")); buffer.append(")"); return buffer.toString(); } - void replaceClassRank(final String oldClass, final String newClass) - { - for (Iterator<NamedValue> i = ranks.iterator(); i.hasNext();) - { - NamedValue sd = i.next(); - if (sd.name.equals(oldClass)) - { - i.remove(); - ranks.add(new NamedValue(newClass, sd.getWeight())); - break; - } - } - } - - private double modRanks2(double g, final double curRank, NamedValue active, String classKey, final PlayerCharacter aPC) - { - double newRank = curRank + g; - - if (!aPC.isImporting()) - { - String choiceString = getChoiceString(); - if ((choiceString.length() > 0) && !CoreUtility.doublesEqual(g, 0) - && !CoreUtility.doublesEqual(curRank, (int) newRank)) - { - final double rankAdjustment = 0.0; - String title = ""; - final StringTokenizer aTok = new StringTokenizer(choiceString, "|"); - - if (aTok.hasMoreTokens()) - { - title = aTok.nextToken(); - } - - if (choiceString.startsWith("Language")) - { - active.addWeight(g); - - if (!SkillLanguage.chooseLanguageForSkill(aPC, this)) - { - newRank = curRank; - } - else - { - final int selectedLanguages = aPC.getSelectCorrectedAssociationCount(this); - final int maxLanguages = getTotalRank(aPC).intValue(); - - if (selectedLanguages > maxLanguages) - { - newRank = curRank; - } - } - - g = newRank - curRank; - } - } - } - - // - // Modify for the chosen class - // - if (CoreUtility.doublesEqual(newRank, 0.0)) - { - ranks.remove(active); - } - else if (active != null) - { - active.addWeight(g); - } - else - { - ranks.add(new NamedValue(classKey, g)); - } - - aPC.calcActiveBonuses(); - - return g; - } - - public String getRanksExplanation() - { - final StringBuffer ranksDetails = new StringBuffer(); - - for ( int i = 0; i < getRankList().size(); i++ ) - { - ranksDetails.append(getRankList().get(i)); - if (i + 1 < getRankList().size()) - { - ranksDetails.append(", "); - } - } - - return ranksDetails.toString(); - } - /** - * Get the bonus to a skill rank - * @param aPC - * @return bonus to skill rank - */ + * Get the bonus to a skill rank + * + * @param aPC + * @return bonus to skill rank + */ public double getSkillRankBonusTo(PlayerCharacter aPC) { double bonus = aPC.getTotalBonusTo("SKILLRANK", getKeyName()); @@ -494,15 +193,17 @@ if (laList != null) { int iCount = 0; - for ( LevelAbility la : laList ) + for (LevelAbility la : laList) { iCount += aPC.getDetailedAssociationCount(la); } - if (CoreUtility.doublesEqual(getRank().doubleValue() + bonus, 0.0)) + if (CoreUtility.doublesEqual(SkillRankControl.getRank(aPC, this).doubleValue() + bonus, + 0.0)) { // - // There was a total (because we've applied the ADD's, but now there isn't. + // There was a total (because we've applied the ADD's, but now + // there isn't. // Need to remove the ADDed items // if (iCount != 0) @@ -513,7 +214,8 @@ else { // - // There wasn't a total (because we haven't applied the ADDs), but now there is + // There wasn't a total (because we haven't applied the ADDs), + // but now there is // Need to apply the ADDed items // if (iCount == 0) @@ -525,7 +227,6 @@ } } - // // Overrides PObject.globalChecks // @@ -545,11 +246,10 @@ activateBonuses(aPC); } - - /** * Get the key attribute's description - * @return description + * + * @return description */ public String getKeyStatFromStats() { @@ -583,10 +283,10 @@ } /** - * Get a list of PCStat's that apply a SKILL bonus to this skill. - * Generates (optionally, if typeList is non-null) a list of String's types - * - * @param typeList + * Get a list of PCStat's that apply a SKILL bonus to this skill. Generates + * (optionally, if typeList is non-null) a list of String's types + * + * @param typeList * @return List of stats that apply */ public List<PCStat> getKeyStatList(List<String> typeList) @@ -596,17 +296,20 @@ { for (String aType : this.getTypeList(false)) { - List<PCStat> statList = SettingsHandler.getGame().getUnmodifiableStatList(); + List<PCStat> statList = SettingsHandler.getGame() + .getUnmodifiableStatList(); for (int idx = statList.size() - 1; idx >= 0; --idx) { final PCStat stat = statList.get(idx); // - // Get a list of all BONUS:SKILL|TYPE.<type>|x for this skill that would come from current stat + // Get a list of all BONUS:SKILL|TYPE.<type>|x for this + // skill that would come from current stat // - List<BonusObj> bonusList = getBonusListOfType(stat, Bonus.getBonusTypeFromName("SKILL"), "TYPE." + aType); + List<BonusObj> bonusList = getBonusListOfType(stat, Bonus + .getBonusTypeFromName("SKILL"), "TYPE." + aType); if (bonusList.size() > 0) { - for(int iCount = bonusList.size() - 1; iCount >= 0; --iCount) + for (int iCount = bonusList.size() - 1; iCount >= 0; --iCount) { aList.add(stat); } @@ -622,13 +325,15 @@ } // - // Get a list of all BonusObj's from passed stat that apply a bonus of the passed type and name + // Get a list of all BonusObj's from passed stat that apply a bonus of the + // passed type and name // - private static List<BonusObj> getBonusListOfType(final PCStat aStat, final int iType, final String aName) + private static List<BonusObj> getBonusListOfType(final PCStat aStat, + final int iType, final String aName) { final List<BonusObj> aList = new ArrayList<BonusObj>(); - for ( BonusObj bonus : aStat.getBonusList() ) + for (BonusObj bonus : aStat.getBonusList()) { if (bonus.getTypeOfBonusAsInt() != iType) { @@ -637,7 +342,8 @@ if (bonus.getBonusInfoList().size() > 1) { - final StringTokenizer aTok = new StringTokenizer(bonus.getBonusInfo(), ","); + final StringTokenizer aTok = new StringTokenizer(bonus + .getBonusInfo(), ","); while (aTok.hasMoreTokens()) { @@ -663,4 +369,5 @@ PCStat keyStat = get(ObjectKey.KEY_STAT); return keyStat == null ? "" : keyStat.getAbb(); } + } Modified: Trunk/pcgen/code/src/java/pcgen/core/SkillComparator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/SkillComparator.java 2008-10-01 05:59:34 UTC (rev 7858) +++ Trunk/pcgen/code/src/java/pcgen/core/SkillComparator.java 2008-10-01 22:42:27 UTC (rev 7859) @@ -24,6 +24,8 @@ import java.util.Comparator; +import pcgen.core.analysis.SkillRankControl; + /** * <code>SkillComparator</code> is a comparator interface for sorting skills. * @@ -38,11 +40,13 @@ public static final boolean RESORT_DESCENDING = false; private boolean sortOrder = RESORT_ASCENDING; private int sort = RESORT_NAME; - - public SkillComparator(final int sort, final boolean sortOrder) + private final PlayerCharacter pc; + + public SkillComparator(PlayerCharacter aPC, final int sort, final boolean sortOrder) { this.sort = sort; this.sortOrder = sortOrder; + pc = aPC; } // Comparator will be specific to Skill objects @@ -66,11 +70,11 @@ { case RESORT_TRAINED: - if ((s1.getRank().floatValue() > 0.0f) && (s2.getRank().floatValue() <= 0.0f)) + if ((SkillRankControl.getRank(pc, s1).floatValue() > 0.0f) && (SkillRankControl.getRank(pc, s2).floatValue() <= 0.0f)) { return ((sortOrder == RESORT_ASCENDING) ? (-1) : 1); } - else if ((s1.getRank().floatValue() <= 0.0f) && (s2.getRank().floatValue() > 0.0f)) + else if ((SkillRankControl.getRank(pc, s1).floatValue() <= 0.0f) && (SkillRankControl.getRank(pc, s2).floatValue() > 0.0f)) { return ((sortOrder == RESORT_ASCENDING) ? 1 : (-1)); } Modified: Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorPC.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorPC.java 2008-10-01 05:59:34 UTC (rev 7858) +++ Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorPC.java 2008-10-01 22:42:27 UTC (rev 7859) @@ -32,6 +32,7 @@ import pcgen.cdom.enumeration.StringKey; import pcgen.cdom.reference.CDOMSingleRef; import pcgen.core.analysis.SkillModifier; +import pcgen.core.analysis.SkillRankControl; import pcgen.core.character.Follower; import pcgen.core.spell.Spell; import pcgen.core.utils.CoreUtility; @@ -652,7 +653,7 @@ final Skill aSkill = getPc().getSkillKeyed(valString.substring(10).replace('{', '(').replace('}', ')')); if (aSkill != null) { - valString = aSkill.getRank().toString(); + valString = SkillRankControl.getRank(getPc(), aSkill).toString(); } else { @@ -664,7 +665,7 @@ final Skill aSkill = getPc().getSkillKeyed(valString.substring(11).replace('{', '(').replace('}', ')')); if (aSkill != null) { - valString = Integer.toString(aSkill.getTotalRank(getPc()).intValue() + SkillModifier.modifier(aSkill, getPc()).intValue()); + valString = Integer.toString(SkillRankControl.getTotalRank(getPc(), aSkill).intValue() + SkillModifier.modifier(aSkill, getPc()).intValue()); } else { Modified: Trunk/pcgen/code/src/java/pcgen/core/analysis/SkillLanguage.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/analysis/SkillLanguage.java 2008-10-01 05:59:34 UTC (rev 7858) +++ Trunk/pcgen/code/src/java/pcgen/core/analysis/SkillLanguage.java 2008-10-01 22:42:27 UTC (rev 7859) @@ -88,7 +88,7 @@ return false; } - int numLanguages = languageSkill.getTotalRank(aPC).intValue(); + int numLanguages = SkillRankControl.getTotalRank(aPC, languageSkill).intValue(); List<Language> selected = new ArrayList<Language>(); List<Language> available = new ArrayList<Language>(); List<Language> excludedLangs = new ArrayList<Language>(); Modified: Trunk/pcgen/code/src/java/pcgen/core/analysis/SkillModifier.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/analysis/SkillModifier.java 2008-10-01 05:59:34 UTC (rev 7858) +++ Trunk/pcgen/code/src/java/pcgen/core/analysis/SkillModifier.java 2008-10-01 22:42:27 UTC (rev 7859) @@ -105,8 +105,7 @@ String aString = Globals.getGameModeRankModFormula(); if (aString.length() != 0) { - aString = aString.replaceAll(Pattern.quote("$$RANK$$"), sk - .getTotalRank(aPC).toString()); + aString = aString.replaceAll(Pattern.quote("$$RANK$$"), SkillRankControl.getTotalRank(aPC, sk).toString()); bonus += aPC.getVariableValue(aString, "").intValue(); } @@ -281,8 +280,7 @@ String aString = Globals.getGameModeRankModFormula(); if (aString.length() != 0) { - aString = aString.replaceAll(Pattern.quote("$$RANK$$"), sk - .getTotalRank(aPC).toString()); + aString = aString.replaceAll(Pattern.quote("$$RANK$$"), SkillRankControl.getTotalRank(aPC, sk).toString()); bonus = aPC.getVariableValue(aString, "").intValue(); appendBonusDesc(sk, bonusDetails, bonus, "RANKS"); } Added: Trunk/pcgen/code/src/java/pcgen/core/analysis/SkillRankControl.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/analysis/SkillRankControl.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/core/analysis/SkillRankControl.java 2008-10-01 22:42:27 UTC (rev 7859) @@ -0,0 +1,322 @@ +package pcgen.core.analysis; + +import java.util.List; + +import pcgen.base.lang.StringUtil; +import pcgen.base.util.NamedValue; +import pcgen.cdom.enumeration.AssociationKey; +import pcgen.cdom.enumeration.SkillCost; +import pcgen.core.Globals; +import pcgen.core.PCClass; +import pcgen.core.PlayerCharacter; +import pcgen.core.RuleConstants; +import pcgen.core.Skill; +import pcgen.core.prereq.PrereqHandler; +import pcgen.core.utils.CoreUtility; +import pcgen.util.Logging; + +public class SkillRankControl +{ + + /** + * returns ranks taken specifically in skill + * + * @return ranks taken in skill + */ + public static Float getRank(PlayerCharacter pc, Skill sk) + { + double rank = 0.0; + + List<NamedValue> rankList = pc.getAssocList(sk, AssociationKey.SKILL_RANK); + if (rankList != null) + { + for (NamedValue sd : rankList) + { + rank += sd.getWeight(); + } + } + + return new Float(rank); + } + + /** + * Returns the total ranks of a skill rank + bonus ranks (racial, class, etc + * bonuses). Note that the total ranks could be higher than the max ranks if + * the ranks come from a familiar's master. + * + * @param aPC + * @return rank + bonus ranks (racial, class, etc. bonuses) + */ + public static Float getTotalRank(PlayerCharacter pc, Skill sk) + { + double baseRanks = getRank(pc, sk).doubleValue(); + double ranks = baseRanks + + (pc == null ? 0.0 : sk.getSkillRankBonusTo(pc)); + if (!Globals.checkRule(RuleConstants.SKILLMAX) + && pc.getClassList().size() > 0) + { + double maxRanks = pc.getMaxRank(sk.getKeyName(), + pc.getClassList().get(0)).doubleValue(); + maxRanks = Math.max(maxRanks, baseRanks); + ranks = Math.min(maxRanks, ranks); + } + return new Float(ranks); + } + + /** + * Set the ranks for the specified class to zero + * + * @param aClass + * @param aPC + */ + public static void setZeroRanks(PCClass aClass, PlayerCharacter aPC, + Skill sk) + { + if (aClass == null) + { + return; + } + + String aCName = aClass.getKeyName(); + List<NamedValue> rankList = aPC.getAssocList(sk, AssociationKey.SKILL_RANK); + if (rankList == null) + { + return; + } + for (NamedValue nv : rankList) + { + if (nv.name.equals(aCName)) + { + aPC.removeAssoc(sk, AssociationKey.SKILL_RANK, nv); + double curRankCost = nv.getWeight(); + String aResp = modRanks(-curRankCost, aClass, false, aPC, sk); + + if (aResp.length() != 0) + { + // error or debug? XXX + Logging.debugPrint(aResp); + } + break; + } + } + } + + /** + * Modify the rank + * + * @param rankMod + * @param aClass + * @param aPC + * @return message + */ + public static String modRanks(double rankMod, PCClass aClass, + PlayerCharacter aPC, Skill sk) + { + return modRanks(rankMod, aClass, false, aPC, sk); + } + + /** + * Modify the rank + * + * @param rankMod + * @param aClass + * @param ignorePrereqs + * @param aPC + * @return message + */ + public static String modRanks(double rankMod, PCClass aClass, + boolean ignorePrereqs, PlayerCharacter aPC, Skill sk) + { + int i = 0; + + if (!ignorePrereqs) + { + if (aClass == null) + { + return "You must be at least level one before you can purchase skills."; + } + + if ((rankMod > 0.0) + && !PrereqHandler.passesAll(sk.getPrerequisiteList(), aPC, + sk)) + { + return "You do not meet the prerequisites required to take this skill."; + } + + SkillCost sc = aPC.getSkillCostForClass(sk, aClass); + + if (sc.equals(SkillCost.EXCLUSIVE)) + { + return "You cannot purchase this exclusive skill."; + } + + if ((rankMod > 0.0) && (aClass.getSkillPool(aPC) < (rankMod * i))) + { + return "You do not have enough skill points."; + } + + double maxRank = aPC.getMaxRank(sk.getKeyName(), aClass) + .doubleValue(); + + if (!Globals.checkRule(RuleConstants.SKILLMAX) && (rankMod > 0.0)) + { + double ttlRank = getTotalRank(aPC, sk).doubleValue(); + + if (ttlRank >= maxRank) + { + return "Skill rank at maximum (" + maxRank + + ") for your level."; + } + + if ((ttlRank + rankMod) > maxRank) + { + return "Raising skill would make it above maximum (" + + maxRank + ") for your level."; + } + } + } + + if ((getRank(aPC, sk).doubleValue() + rankMod) < 0.0) + { + return "Cannot lower rank below 0"; + } + + String classKey = "None"; + + if (aClass != null) + { + classKey = aClass.getKeyName(); + } + + double currentRank = 0.0; + double noneRank = 0.0; + NamedValue active = null; + List<NamedValue> rankList = aPC.getAssocList(sk, AssociationKey.SKILL_RANK); + if (rankList != null) + { + for (NamedValue nv : rankList) + { + if (nv.name.equals(classKey)) + { + currentRank = nv.getWeight(); + active = nv; + break; + } + else if (nv.name.equals("None")) + { + noneRank = nv.getWeight(); + } + } + } + + if (currentRank <= 0) + { + currentRank = noneRank; + } + + if (CoreUtility.doublesEqual(currentRank, 0.0) && (rankMod < 0.0)) + { + return "No more ranks found for class: " + classKey + + ". Try a different one."; + } + + rankMod = modRanks2(rankMod, currentRank, active, classKey, aPC, sk); + + if (!ignorePrereqs) + { + if (aClass != null) + { + aClass.setSkillPool(aClass.getSkillPool(aPC) + - (int) (i * rankMod)); + } + + aPC.setSkillPoints(aPC.getSkillPoints() - (int) (i * rankMod)); + } + + return ""; + } + + public static void replaceClassRank(PlayerCharacter pc, Skill sk, + String oldClass, String newClass) + { + List<NamedValue> rankList = pc.getAssocList(sk, AssociationKey.SKILL_RANK); + if (rankList != null) + { + for (NamedValue nv : rankList) + { + if (nv.name.equals(oldClass)) + { + pc.removeAssoc(sk, AssociationKey.SKILL_RANK, nv); + pc.addAssoc(sk, AssociationKey.SKILL_RANK, new NamedValue( + newClass, nv.getWeight())); + break; + } + } + } + } + + private static double modRanks2(double g, double curRank, + NamedValue active, String classKey, PlayerCharacter aPC, Skill sk) + { + double newRank = curRank + g; + + if (!aPC.isImporting()) + { + String choiceString = sk.getChoiceString(); + if ((choiceString.length() > 0) && !CoreUtility.doublesEqual(g, 0) + && !CoreUtility.doublesEqual(curRank, (int) newRank)) + { + if (choiceString.startsWith("Language")) + { + active.addWeight(g); + + if (!SkillLanguage.chooseLanguageForSkill(aPC, sk)) + { + newRank = curRank; + } + else + { + int selectedLanguages = aPC + .getSelectCorrectedAssociationCount(sk); + int maxLanguages = getTotalRank(aPC, sk).intValue(); + + if (selectedLanguages > maxLanguages) + { + newRank = curRank; + } + } + + g = newRank - curRank; + } + } + } + + // + // Modify for the chosen class + // + if (CoreUtility.doublesEqual(newRank, 0.0)) + { + aPC.removeAssoc(sk, AssociationKey.SKILL_RANK, active); + } + else if (active != null) + { + active.addWeight(g); + } + else + { + aPC.addAssoc(sk, AssociationKey.SKILL_RANK, new NamedValue( + classKey, g)); + } + + aPC.calcActiveBonuses(); + + return g; + } + + public static String getRanksExplanation(PlayerCharacter pc, Skill sk) + { + return StringUtil.join(pc.getAssocList(sk, AssociationKey.SKILL_RANK), + ", "); + } + +} Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/SkillsNamedChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/SkillsNamedChoiceManager.java 2008-10-01 05:59:34 UTC (rev 7858) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/SkillsNamedChoiceManager.java 2008-10-01 22:42:27 UTC (rev 7859) @@ -30,6 +30,7 @@ import pcgen.core.PObject; import pcgen.core.PlayerCharacter; import pcgen.core.Skill; +import pcgen.core.analysis.SkillRankControl; import pcgen.util.enumeration.Visibility; /** @@ -110,7 +111,7 @@ final Skill pcSkill = aPc.getSkillKeyed(skill.getKeyName()); if (pcSkill == null - || Double.compare(pcSkill.getRank().doubleValue(), 0.0) == 0) + || Double.compare(SkillRankControl.getRank(aPc, pcSkill).doubleValue(), 0.0) == 0) { availableList.add(skill.getKeyName()); } @@ -124,7 +125,7 @@ final Skill pcSkill = aPc.getSkillKeyed(skill.getKeyName()); if (pcSkill != null - && Double.compare(pcSkill.getRank().doubleValue(), + && Double.compare(SkillRankControl.getRank(aPc, pcSkill).doubleValue(), ranks) >= 0) { availableList.add(skill.getKeyName()); Modified: Trunk/pcgen/code/src/java/pcgen/core/kit/KitSkill.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/kit/KitSkill.java 2008-10-01 05:59:34 UTC (rev 7858) +++ Trunk/pcgen/code/src/java/pcgen/core/kit/KitSkill.java 2008-10-01 22:42:27 UTC (rev 7859) @@ -26,6 +26,7 @@ import java.util.*; import pcgen.core.*; +import pcgen.core.analysis.SkillRankControl; import pcgen.core.pclevelinfo.PCLevelInfo; import pcgen.gui.CharacterInfo; import pcgen.gui.PCGen_Frame1; @@ -268,7 +269,7 @@ { final Skill skill = pc.addSkill(aSkill); - final String aString = skill.modRanks(aRank, pcClass, true, pc); + final String aString = SkillRankControl.modRanks(aRank, pcClass, true, pc, skill); if (aString.length() > 0) { @@ -372,7 +373,7 @@ double curRank = 0.0; if (pcSkill != null) { - curRank = pcSkill.getRank().doubleValue(); + curRank = SkillRankControl.getRank(pc, pcSkill).doubleValue(); } double ranksToAdd = ranksLeftToAdd; if (!Globals.checkRule(RuleConstants.SKILLMAX) && (ranksToAdd > 0.0)) @@ -434,12 +435,12 @@ } final Skill skill = pc.addSkill(aSkill); - String ret = skill.modRanks(ranksToAdd, pcClass, pc); + String ret = SkillRankControl.modRanks(ranksToAdd, pcClass, false, pc, skill); if (ret.length() > 0) { if (isFree && ret.indexOf("You do not have enough skill points.") != -1) { - skill.modRanks(ranksToAdd, pcClass, true, pc); + SkillRankControl.modRanks(ranksToAdd, pcClass, true, pc, skill); } else { Modified: Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityClassSkills.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityClassSkills.java 2008-10-01 05:59:34 UTC (rev 7858) +++ Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityClassSkills.java 2008-10-01 22:42:27 UTC (rev 7859) @@ -24,6 +24,7 @@ import pcgen.cdom.enumeration.ObjectKey; import pcgen.core.*; +import pcgen.core.analysis.SkillRankControl; import pcgen.core.pclevelinfo.PCLevelInfo; import pcgen.util.Logging; import pcgen.util.chooser.ChooserInterface; @@ -311,7 +312,7 @@ if (aPC != null) { aSkill = aPC.addSkill(aSkill); - aSkill.modRanks(1.0, (PCClass) owner, true, aPC); + SkillRankControl.modRanks(1.0, ((PCClass) owner), true, aPC, aSkill); } } } Modified: Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilitySkill.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilitySkill.java 2008-10-01 05:59:34 UTC (rev 7858) +++ Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilitySkill.java 2008-10-01 22:42:27 UTC (rev 7859) @@ -27,6 +27,7 @@ import pcgen.core.PObject; import pcgen.core.PlayerCharacter; import pcgen.core.Skill; +import pcgen.core.analysis.SkillRankControl; import pcgen.core.pclevelinfo.PCLevelInfo; import pcgen.gui.CharacterInfo; import pcgen.gui.PCGen_Frame1; @@ -142,7 +143,7 @@ if (skillToAdd != null) { skillToAdd = aPC.addSkill(skillToAdd); - skillToAdd.modRanks(1.0, null, true, aPC); + SkillRankControl.modRanks(1.0, null, true, aPC, skillToAdd); changed = true; } } Modified: Trunk/pcgen/code/src/java/pcgen/core/npcgen/NPCGenerator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/npcgen/NPCGenerator.java 2008-10-01 05:59:34 UTC (rev 7858) +++ Trunk/pcgen/code/src/java/pcgen/core/npcgen/NPCGenerator.java 2008-10-01 22:42:27 UTC (rev 7859) @@ -48,6 +48,7 @@ import pcgen.core.SettingsHandler; import pcgen.core.Skill; import pcgen.core.SystemCollections; +import pcgen.core.analysis.SkillRankControl; import pcgen.core.character.CharacterSpell; import pcgen.core.pclevelinfo.PCLevelInfo; import pcgen.core.prereq.PrereqHandler; @@ -228,7 +229,7 @@ // we can add this rank to this skill. double maxRanks = aPC.getMaxRank(skill.getKeyName(), aClass). doubleValue(); - double pcRanks = pcSkill == null ? 0.0 : pcSkill.getRank().doubleValue(); + double pcRanks = pcSkill == null ? 0.0 : SkillRankControl.getRank(aPC, pcSkill).doubleValue(); if (pcRanks + ranks > maxRanks) { Logging.debugPrint("NPCGenerator: Skill already at max."); //$NON-NLS-1$ @@ -245,7 +246,7 @@ ranksLeft = true; break; } - if (chkPcSkill.getRank().doubleValue() < aPC.getMaxRank(chkPcSkill.getKeyName(), aClass). + if (SkillRankControl.getRank(aPC, chkPcSkill).doubleValue() < aPC.getMaxRank(chkPcSkill.getKeyName(), aClass). doubleValue()) { ranksLeft = true; @@ -266,7 +267,7 @@ { pcSkill = aPC.addSkill(skill); } - pcSkill.modRanks(ranks, aClass, aPC); + SkillRankControl.modRanks(ranks, aClass, false, aPC, pcSkill); // Add weight to skills we select to try and encourage us to select // them again. skillList.add(choice, 4/cost); Modified: Trunk/pcgen/code/src/java/pcgen/gui/filter/FilterFactory.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/filter/FilterFactory.java 2008-10-01 05:59:34 UTC (rev 7858) +++ Trunk/pcgen/code/src/java/pcgen/gui/filter/FilterFactory.java 2008-10-01 22:42:27 UTC (rev 7859) @@ -55,6 +55,7 @@ import pcgen.core.Skill; import pcgen.core.WeaponProf; import pcgen.core.analysis.SkillModifier; +import pcgen.core.analysis.SkillRankControl; import pcgen.core.prereq.Prerequisite; import pcgen.core.spell.Spell; import pcgen.core.utils.CoreUtility; @@ -1797,7 +1798,7 @@ aSkill = aPC.getSkillKeyed(aSkill.getKeyName()); } - return aSkill.getTotalRank(aPC).doubleValue() > min; + return SkillRankControl.getTotalRank(aPC, aSkill).doubleValue() > min; } return true; @@ -1843,7 +1844,7 @@ aSkill = aPC.getSkillKeyed(aSkill.getKeyName()); } - return (aSkill.getTotalRank(aPC).doubleValue() + SkillModifier.modifier(aSkill, aPC).doubleValue()) > min; + return (SkillRankControl.getTotalRank(aPC, aSkill).doubleValue() + SkillModifier.modifier(aSkill, aPC).doubleValue()) > min; } return true; Modified: Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoSkills.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoSkills.java 2008-10-01 05:59:34 UTC (rev 7858) +++ Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoSkills.java 2008-10-01 22:42:27 UTC (rev 7859) @@ -112,6 +112,7 @@ import pcgen.core.SkillComparator; import pcgen.core.SkillUtilities; import pcgen.core.analysis.SkillModifier; +import pcgen.core.analysis.SkillRankControl; import pcgen.core.pclevelinfo.PCLevelInfo; import pcgen.core.prereq.PrereqHandler; import pcgen.core.prereq.PrerequisiteUtilities; @@ -392,7 +393,7 @@ return available ? new SkillWrapper(skill, Integer.valueOf(0), new Float(0), Integer.valueOf(0), PrereqHandler.passesAll(skill.getPrerequisiteList(), pc, skill)) : - new SkillWrapper(skill, SkillModifier.modifier(skill, pc), skill.getTotalRank(pc), + new SkillWrapper(skill, SkillModifier.modifier(skill, pc), SkillRankControl.getTotalRank(pc, skill), Integer.valueOf(skill.getOutputIndex()), PrereqHandler.passesAll(skill.getPrerequisiteList(), pc, skill)); } @@ -1936,7 +1937,7 @@ if (bSkill != null) { - aString = bSkill.modRanks(rank, aClass, pc); + aString = SkillRankControl.modRanks(rank, aClass, false, pc, bSkill); if ("".equals(aString)) //$NON-NLS-1$ { @@ -1958,7 +1959,7 @@ // Remove the skill from the skill list if we've // just set the rank to zero and it is not untrained // - if (CoreUtility.doublesEqual(bSkill.getRank().doubleValue(), 0.0) + if (CoreUtility.doublesEqual(SkillRankControl.getRank(pc, bSkill).doubleValue(), 0.0) && !bSkill.getSafe(ObjectKey.USE_UNTRAINED)) { pc.getSkillList().remove(bSkill); @@ -2048,7 +2049,7 @@ { return; } - SkillComparator comparator = new SkillComparator(sort, sortOrder); + SkillComparator comparator = new SkillComparator(pc, sort, sortOrder); int nextOutputIndex = 1; List<Skill> skillList = pc.getSkillList(); Collections.sort(skillList, comparator); @@ -2363,7 +2364,7 @@ final Skill pcSkill = pc.getSkillKeyed(aSkill.getKeyName()); if (pcSkill != null) { - bString = pcSkill.getRanksExplanation(); + bString = SkillRankControl.getRanksExplanation(pc, pcSkill); if (bString.length() != 0) { b.append(PropertyFactory.getFormattedString( @@ -3016,7 +3017,7 @@ aSkill.setOutputIndex(outputIndex); skillA = new SkillWrapper(aSkill, SkillModifier.modifier(aSkill, pc), - aSkill.getTotalRank(pc), + SkillRankControl.getTotalRank(pc, aSkill), Integer.valueOf(aSkill.getOutputIndex()), PrereqHandler.passesAll(aSkill.getPrerequisiteList(), pc, aSkill)); fn.setItem(skillA); @@ -4169,13 +4170,13 @@ } } - if ((maxRank > aSkill.getRank().doubleValue()) + if ((maxRank > SkillRankControl.getRank(pc, aSkill).doubleValue()) || Globals.checkRule(RuleConstants.SKILLMAX)) //$NON-NLS-1$ { final int cost = pc.getSkillCostForClass(aSkill, aClass).getCost(); final double pointsNeeded = - Math.floor((maxRank - aSkill.getTotalRank(pc) + Math.floor((maxRank - SkillRankControl.getTotalRank(pc, aSkill) .doubleValue()) * cost); double points = Math.min(pointsNeeded, skillPool); @@ -4270,7 +4271,7 @@ final int cost = pc.getSkillCostForClass(aSkill, getSelectedPCClass()).getCost(); double points = - -aSkill.getTotalRank(pc).doubleValue() * cost; + -SkillRankControl.getTotalRank(pc, aSkill).doubleValue() * cost; if (SkillCost.CLASS.getCost() > 1) { points /= SkillCost.CLASS.getCost(); @@ -4285,7 +4286,7 @@ // Remove the skill from the skill list if we've just set the rank to zero // and it is not an untrained skill // - if ((CoreUtility.doublesEqual(aSkill.getRank() + if ((CoreUtility.doublesEqual(SkillRankControl.getRank(pc, aSkill) .doubleValue(), 0.0)) && !aSkill.getSafe(ObjectKey.USE_UNTRAINED)) { Modified: Trunk/pcgen/code/src/java/pcgen/io/PCGVer0Parser.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/PCGVer0Parser.java 2008-10-01 05:59:34 UTC (rev 7858) +++ Trunk/pcgen/code/src/java/pcgen/io/PCGVer0Parser.java 2008-10-01 22:42:27 UTC (rev 7859) @@ -56,6 +56,7 @@ import pcgen.core.Skill; import pcgen.core.SpecialAbility; import pcgen.core.SpecialProperty; +import pcgen.core.analysis.SkillRankControl; import pcgen.core.character.CharacterSpell; import pcgen.core.character.EquipSet; import pcgen.core.character.Follower; @@ -1916,8 +1917,7 @@ Constants.s_NONE)) { bRank = - aSkill.modRanks(fRank.doubleValue(), - aClass, true, aPC); + SkillRankControl.modRanks(fRank.doubleValue(), aClass, true, aPC, aSkill); if (bRank.length() != 0) { @@ -1934,8 +1934,7 @@ if (pcgVersion < 2) { final String bRank = - aSkill.modRanks(aFloat.doubleValue(), null, - true, aPC); + SkillRankControl.modRanks(aFloat.doubleValue(), null, true, aPC, aSkill); if (bRank.length() != 0) { Modified: Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Creator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Creator.java 2008-10-01 05:59:34 UTC (rev 7858) +++ Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Creator.java 2008-10-01 22:42:27 UTC (rev 7859) @@ -71,6 +71,7 @@ import pcgen.core.Skill; import pcgen.core.SpecialAbility; import pcgen.core.WeaponProf; +import pcgen.core.analysis.SkillRankControl; import pcgen.core.bonus.BonusObj; import pcgen.core.character.CharacterSpell; import pcgen.core.character.EquipSet; @@ -1948,7 +1949,7 @@ new ArrayList<Skill>(thePC.getSkillList()); for (Skill skill : skillList) { - if ((skill.getRank().doubleValue() > 0) + if ((SkillRankControl.getRank(thePC, skill).doubleValue() > 0) || (skill.getOutputIndex() != 0)) { buffer.append(TAG_SKILL).append(':'); @@ -1959,25 +1960,29 @@ buffer.append(skill.getOutputIndex()); buffer.append('|'); - for (NamedValue sd: skill.getRankList()) + List<NamedValue> rankList = thePC.getAssocList(skill, AssociationKey.SKILL_RANK); + if (rankList != null) { - final PCClass pcClass = thePC.getClassKeyed(sd.name); + for (NamedValue sd: rankList) + { + final PCClass pcClass = thePC.getClassKeyed(sd.name); - buffer.append(TAG_CLASSBOUGHT).append(':'); - buffer.append('['); - buffer.append(TAG_CLASS).append(':'); - buffer.append(EntityEncoder.encode(sd.name)); - buffer.append('|'); - buffer.append(TAG_RANKS).append(':'); - buffer.append(sd.getWeight()); - buffer.append('|'); - buffer.append(TAG_COST).append(':'); - buffer.append(Integer.toString(thePC.getSkillCostForClass(skill, pcClass).getCost())); - buffer.append('|'); - buffer.append(TAG_CLASSSKILL).append(':'); - buffer.append((thePC.isClassSkill(skill, pcClass)) ? 'Y' - : 'N'); - buffer.append(']'); + buffer.append(TAG_CLASSBOUGHT).append(':'); + buffer.append('['); + buffer.append(TAG_CLASS).append(':'); + buffer.append(EntityEncoder.encode(sd.name)); + buffer.append('|'); + buffer.append(TAG_RANKS).append(':'); + buffer.append(sd.getWeight()); + buffer.append('|'); + buffer.append(TAG_COST).append(':'); + buffer.append(Integer.toString(thePC.getSkillCostForClass(skill, pcClass).getCost())); + buffer.append('|'); + buffer.append(TAG_CLASSSKILL).append(':'); + buffer.append((thePC.isClassSkill(skill, pcClass)) ? 'Y' + : 'N'); + buffer.append(']'); + } } for (String assoc : thePC.getAssociationList(skill)) Modified: Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Parser.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Parser.java 2008-10-01 05:59:34 UTC (rev 7858) +++ Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Parser.java 2008-10-01 22:42:27 UTC (rev 7859) @@ -72,6 +72,7 @@ import pcgen.core.SubClass; import pcgen.core.SubstitutionClass; import pcgen.core.WeaponProf; +import pcgen.core.analysis.SkillRankControl; import pcgen.core.bonus.Bonus; import pcgen.core.bonus.BonusObj; import pcgen.core.character.CharacterSpell; @@ -3476,7 +3477,7 @@ try { double ranks = Double.parseDouble(childRanks.getText()); - aSkill.modRanks(ranks, aPCClass, true, thePC); + SkillRankControl.modRanks(ranks, aPCClass, true, thePC, aSkill); } catch (NumberFormatException nfe) { Modified: Trunk/pcgen/code/src/java/pcgen/io/exporttoken/SkillToken.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/exporttoken/SkillToken.java 2008-10-01 05:59:34 UTC (rev 7858) +++ Trunk/pcgen/code/src/java/pcgen/io/exporttoken/SkillToken.java 2008-10-01 22:42:27 UTC (rev 7859) @@ -32,6 +32,7 @@ import pcgen.core.SettingsHandler; import pcgen.core.Skill; import pcgen.core.analysis.SkillModifier; +import pcgen.core.analysis.SkillRankControl; import pcgen.io.ExportHandler; import pcgen.util.Logging; import pcgen.util.enumeration.Visibility; @@ -313,13 +314,12 @@ { retValue.append(SettingsHandler.getGame() .getSkillRankDisplayText( - aSkill.getTotalRank(pc).intValue() + SkillRankControl.getTotalRank(pc, aSkill).intValue() + SkillModifier.modifier(aSkill, pc).intValue())); } else { - retValue.append(Integer.toString(aSkill - .getTotalRank(pc).intValue() + retValue.append(Integer.toString(SkillRankControl.getTotalRank(pc, aSkill).intValue() + SkillModifier.modifier(aSkill, pc).intValue())); } break; @@ -329,11 +329,11 @@ { retValue.append(SettingsHandler.getGame() .getSkillRankDisplayText( - aSkill.getTotalRank(pc).intValue())); + SkillRankControl.getTotalRank(pc, aSkill).intValue())); } else { - retValue.append(aSkill.getTotalRank(pc).toString()); + retValue.append(SkillRankControl.getTotalRank(pc, aSkill).toString()); } break; @@ -374,16 +374,14 @@ case SKILL_EXCLUSIVE_TOTAL: retValue .append(Integer - .toString(((aSkill.getSafe(ObjectKey.EXCLUSIVE) || !aSkill.getSafe(ObjectKey.USE_UNTRAINED)) && (aSkill.getTotalRank(pc) + .toString(((aSkill.getSafe(ObjectKey.EXCLUSIVE) || !aSkill.getSafe(ObjectKey.USE_UNTRAINED)) && (SkillRankControl.getTotalRank(pc, aSkill) .intValue() == 0)) ? 0 - : (aSkill.getTotalRank(pc).intValue() + SkillModifier.modifier(aSkill, pc).intValue()))); + : (SkillRankControl.getTotalRank(pc, aSkill).intValue() + SkillModifier.modifier(aSkill, pc).intValue()))); break; case SKILL_TRAINED_TOTAL: retValue.append(Integer - .toString((!aSkill.getSafe(ObjectKey.USE_UNTRAINED) && (aSkill - .getTotalRank(pc).intValue() == 0)) ? 0 : (aSkill - .getTotalRank(pc).intValue() + SkillModifier.modifier(aSkill, pc) + .toString((!aSkill.getSafe(ObjectKey.USE_UNTRAINED) && (SkillRankControl.getTotalRank(pc, aSkill).intValue() == 0)) ? 0 : (SkillRankControl.getTotalRank(pc, aSkill).intValue() + SkillModifier.modifier(aSkill, pc) .intValue()))); break; Modified: Trunk/pcgen/code/src/java/pcgen/io/exporttoken/SkillpointsToken.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/exporttoken/SkillpointsToken.java 2008-10-01 05:59:34 UTC (rev 7858) +++ Trunk/pcgen/code/src/java/pcgen/io/exporttoken/SkillpointsToken.java 2008-10-01 22:42:27 UTC (rev 7859) @@ -31,9 +31,11 @@ import java.util.StringTokenizer; import pcgen.base.util.NamedValue; +import pcgen.cdom.enumeration.AssociationKey; import pcgen.core.PCClass; import pcgen.core.PlayerCharacter; import pcgen.core.Skill; +import pcgen.core.analysis.SkillRankControl; import pcgen.io.ExportHandler; import pcgen.util.BigDecimalHelper; import pcgen.util.Logging; @@ -179,13 +181,15 @@ final List<Skill> skillList = new ArrayList<Skill>(pc.getSkillList()); for (Skill aSkill : skillList) { - if ((aSkill.getRank().doubleValue() > 0) - || (aSkill.getOutputIndex() != 0)) + List<NamedValue> rankList = pc.getAssocList(aSkill, + AssociationKey.SKILL_RANK); + if (rankList != null) { - for (NamedValue sd : aSkill.getRankList()) + for (NamedValue sd : rankList) { PCClass pcClass = pc.getClassKeyed(sd.name); - usedPoints += (sd.getWeight() * pc.getSkillCostForClass(aSkill, pcClass).getCost()); + usedPoints += (sd.getWeight() * pc.getSkillCostForClass( + aSkill, pcClass).getCost()); } } } @@ -209,10 +213,10 @@ final List<Skill> skillList = new ArrayList<Skill>(pc.getSkillList()); for (Skill aSkill : skillList) { - if ((aSkill.getRank().doubleValue() > 0) + if ((SkillRankControl.getRank(pc, aSkill).doubleValue() > 0) || (aSkill.getOutputIndex() != 0)) { - for (NamedValue sd : aSkill.getRankList()) + for (NamedValue sd : pc.getAssocList(aSkill, AssociationKey.SKILL_RANK)) { PCClass pcClass = pc.getClassKeyed(sd.name); if (targetClass == pcClass) Modified: Trunk/pcgen/code/src/java/plugin/charactersheet/gui/SkillsPane.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/charactersheet/gui/SkillsPane.java 2008-10-01 05:59:34 UTC (rev 7858) +++ Trunk/pcgen/code/src/java/plugin/charactersheet/gui/SkillsPane.java 2008-10-01 22:42:27 UTC (rev 7859) @@ -21,6 +21,7 @@ import pcgen.core.Skill; import pcgen.core.SkillUtilities; import pcgen.core.analysis.SkillModifier; +import pcgen.core.analysis.SkillRankControl; import pcgen.util.enumeration.Visibility; import plugin.charactersheet.CharacterSheetUtils; @@ -384,13 +385,13 @@ String name = skill.qualifiedName(pc); String ability = skill.getKeyStatAbb(); String total = - Integer.toString(skill.getTotalRank(pc).intValue() + Integer.toString(SkillRankControl.getTotalRank(pc, skill).intValue() + SkillModifier.modifier(skill, pc).intValue()); StringBuffer abSb = new StringBuffer(); abSb.append(SKILL_TOKEN).append('.').append(i).append('.').append( ABMOD_TOKEN); String abilityMod = pcOut.getExportToken(abSb.toString()); - String ranks = skill.getTotalRank(pc).toString(); + String ranks = SkillRankControl.getTotalRank(pc, skill).toString(); StringBuffer miscSb = new StringBuffer(); miscSb.append(SKILL_TOKEN).append('.').append(i).append('.') .append(MISC_TOKEN); Modified: Trunk/pcgen/code/src/java/plugin/exporttokens/SkillListModsToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/exporttokens/SkillListModsToken.java 2008-10-01 05:59:34 UTC (rev 7858) +++ Trunk/pcgen/code/src/java/plugin/exporttokens/SkillListModsToken.java 2008-10-01 22:42:27 UTC (rev 7859) @@ -4,6 +4,7 @@ import pcgen.core.PlayerCharacter; import pcgen.core.Skill; import pcgen.core.analysis.SkillModifier; +import pcgen.core.analysis.SkillRankControl; import pcgen.io.ExportHandler; import pcgen.io.exporttoken.Token; @@ -46,12 +47,12 @@ aSkill.getKeyStatAbb()); } - if ((aSkill.getTotalRan... [truncated message content] |
From: <th...@us...> - 2008-10-01 22:53:11
|
Revision: 7860 http://pcgen.svn.sourceforge.net/pcgen/?rev=7860&view=rev Author: thpr Date: 2008-10-01 22:52:58 +0000 (Wed, 01 Oct 2008) Log Message: ----------- Move some BONUS processing Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/PCClass.java Trunk/pcgen/code/src/java/pcgen/core/PObject.java Trunk/pcgen/code/src/java/pcgen/core/chooser/SAListChoiceManager.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/test/pcgen/core/PObjectTest.java Added Paths: ----------- Trunk/pcgen/code/src/java/pcgen/core/analysis/BonusAddition.java Modified: Trunk/pcgen/code/src/java/pcgen/core/PCClass.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-10-01 22:42:27 UTC (rev 7859) +++ Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-10-01 22:52:58 UTC (rev 7860) @@ -3819,13 +3819,6 @@ } } - @Override - String makeBonusString(final String bonusString, final String chooseString, - final PlayerCharacter aPC) - { - return "0|" + super.makeBonusString(bonusString, chooseString, aPC); - } - /** * Added to help deal with lower-level spells prepared in higher-level * slots. BUG [569517] Works in conjunction with PlayerCharacter method @@ -5228,4 +5221,10 @@ return getKeyName(); } + //Temporary hack + @Override + public String bonusStringPrefix() + { + return "0|"; + } } Modified: Trunk/pcgen/code/src/java/pcgen/core/PObject.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-10-01 22:42:27 UTC (rev 7859) +++ Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-10-01 22:52:58 UTC (rev 7860) @@ -2678,7 +2678,7 @@ * @param addOnceOnly Should the bonus only be added once irrespective of number of choices * @return true if new bonus is not null */ - private final boolean addBonusList(final String aString, final boolean addOnceOnly) + public final boolean addBonusList(final String aString, final boolean addOnceOnly) { if (bonusList == null) { @@ -3118,4 +3118,9 @@ return result == null ? new ArrayList<String>() : Collections .unmodifiableList(result); } + + public String bonusStringPrefix() + { + return ""; + } } Added: Trunk/pcgen/code/src/java/pcgen/core/analysis/BonusAddition.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/analysis/BonusAddition.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/core/analysis/BonusAddition.java 2008-10-01 22:52:58 UTC (rev 7860) @@ -0,0 +1,145 @@ +package pcgen.core.analysis; + +import pcgen.core.PObject; +import pcgen.core.PlayerCharacter; +import pcgen.core.bonus.Bonus; +import pcgen.core.bonus.BonusObj; +import pcgen.util.Logging; + +public final class BonusAddition +{ + /** + * Apply the bonus to a character. The bonus can optionally only be added + * once no matter how many associated choices this object has. This is + * normally used where a bonus is added for each associated choice. + * + * @param bonusString + * The unparsed bonus to be added. + * @param chooseString + * The choice to be added. + * @param aPC + * The character to apply thr bonus to. + * @param addOnceOnly + * Should the bonus only be added once irrespective of number of + * choices + */ + public static void applyBonus(String bonusString, String chooseString, + PlayerCharacter aPC, PObject target, boolean addOnceOnly) + { + bonusString = target.bonusStringPrefix() + makeBonusString(bonusString, chooseString, aPC); + target.addBonusList(bonusString, addOnceOnly); + target.addSave("BONUS|" + bonusString); + } + + /** + * Remove the bonus from this objects list of bonuses. + * + * @param bonusString + * The string representing the bonus + * @param chooseString + * The choice that was made. + * @param aPC + * The player character to remove th bonus from. + */ + public static void removeBonus(String bonusString, String chooseString, + PlayerCharacter aPC, PObject target) + { + String bonus = target.bonusStringPrefix() + makeBonusString(bonusString, chooseString, aPC); + + int index = -1; + + BonusObj aBonus = Bonus.newBonus(bonus); + String bonusStrRep = String.valueOf(aBonus); + + if (target.getBonusList() != null) + { + int count = 0; + for (BonusObj listBonus : target.getBonusList()) + { + if (listBonus.getCreatorObject().equals(target) + && listBonus.toString().equals(bonusStrRep)) + { + index = count; + } + count++; + } + } + + if (index >= 0) + { + target.getBonusList().remove(index); + } + else + { + Logging.errorPrint("removeBonus: Could not find bonus: " + bonus + + " in bonusList " + target.getBonusList()); + } + + target.removeSave("BONUS|" + bonus); + } + + private static String makeBonusString(String bonusString, + String chooseString, PlayerCharacter aPC) + { + // assumption is that the chooseString is in the form + // class/type[space]level + int i = chooseString.lastIndexOf(' '); + String classString = ""; + String levelString = ""; + + if (bonusString.startsWith("BONUS:")) + { + bonusString = bonusString.substring(6); + } + + boolean lockIt = bonusString.endsWith(".LOCK"); + + if (lockIt) + { + bonusString = bonusString.substring(0, bonusString + .lastIndexOf(".LOCK")); + } + + if (i >= 0) + { + classString = chooseString.substring(0, i); + + if (i < chooseString.length()) + { + levelString = chooseString.substring(i + 1); + } + } + + while (bonusString.lastIndexOf("TYPE=%") >= 0) + { + i = bonusString.lastIndexOf("TYPE=%"); + bonusString = bonusString.substring(0, i + 5) + classString + + bonusString.substring(i + 6); + } + + while (bonusString.lastIndexOf("CLASS=%") >= 0) + { + i = bonusString.lastIndexOf("CLASS=%"); + bonusString = bonusString.substring(0, i + 6) + classString + + bonusString.substring(i + 7); + } + + while (bonusString.lastIndexOf("LEVEL=%") >= 0) + { + i = bonusString.lastIndexOf("LEVEL=%"); + bonusString = bonusString.substring(0, i + 6) + levelString + + bonusString.substring(i + 7); + } + + if (lockIt) + { + i = bonusString.lastIndexOf('|'); + + Float val = aPC.getVariableValue(bonusString.substring(i + 1), ""); + bonusString = bonusString.substring(0, i) + "|" + val; + } + + return bonusString; + } + +} Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/SAListChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/SAListChoiceManager.java 2008-10-01 22:42:27 UTC (rev 7859) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/SAListChoiceManager.java 2008-10-01 22:52:58 UTC (rev 7860) @@ -28,6 +28,7 @@ import pcgen.base.lang.StringUtil; import pcgen.core.PObject; import pcgen.core.PlayerCharacter; +import pcgen.core.analysis.BonusAddition; import pcgen.core.bonus.Bonus; import pcgen.core.bonus.BonusObj; import pcgen.io.PCGIOHandler; @@ -92,7 +93,7 @@ { if (bString.startsWith(prefix)) { - pobject.removeBonus(bString.substring(bString.indexOf('|') + 1), "", aPC); + BonusAddition.removeBonus(bString.substring(bString.indexOf('|') + 1), "", aPC, pobject); break; } Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/SpellLevelChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/SpellLevelChoiceManager.java 2008-10-01 22:42:27 UTC (rev 7859) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/SpellLevelChoiceManager.java 2008-10-01 22:52:58 UTC (rev 7860) @@ -30,6 +30,7 @@ import pcgen.core.PObject; import pcgen.core.PlayerCharacter; +import pcgen.core.analysis.BonusAddition; import pcgen.util.chooser.ChooserInterface; /** @@ -128,7 +129,7 @@ { for ( String bonus : aBonusList ) { - pobject.removeBonus(bonus, assoc, aPc); + BonusAddition.removeBonus(bonus, assoc, aPc, pobject); } } aPc.removeAllAssociations(pobject); @@ -149,7 +150,7 @@ for ( String bString : aBonusList ) { aPc.addAssociation(pobject, name); - pobject.applyBonus(bString, name, aPc, true); + BonusAddition.applyBonus(bString, name, aPc, pobject, true); } } Modified: Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityAbility.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityAbility.java 2008-10-01 22:42:27 UTC (rev 7859) +++ Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityAbility.java 2008-10-01 22:52:58 UTC (rev 7860) @@ -43,6 +43,7 @@ import pcgen.core.PObject; import pcgen.core.PlayerCharacter; import pcgen.core.SettingsHandler; +import pcgen.core.analysis.BonusAddition; import pcgen.core.pclevelinfo.PCLevelInfo; import pcgen.core.prereq.PrereqHandler; import pcgen.util.Logging; @@ -746,7 +747,7 @@ { for ( String bonus : aBonusList ) { - ab.applyBonus(bonus, choice, aPC, false); + BonusAddition.applyBonus(bonus, choice, aPC, ab, false); } } } Modified: Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityFeat.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityFeat.java 2008-10-01 22:42:27 UTC (rev 7859) +++ Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityFeat.java 2008-10-01 22:52:58 UTC (rev 7860) @@ -25,9 +25,23 @@ */ package pcgen.core.levelability; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.StringTokenizer; + import pcgen.cdom.base.Constants; import pcgen.cdom.enumeration.ObjectKey; -import pcgen.core.*; +import pcgen.core.Ability; +import pcgen.core.AbilityCategory; +import pcgen.core.AbilityUtilities; +import pcgen.core.Categorisable; +import pcgen.core.Globals; +import pcgen.core.PCTemplate; +import pcgen.core.PObject; +import pcgen.core.PlayerCharacter; +import pcgen.core.analysis.BonusAddition; import pcgen.core.pclevelinfo.PCLevelInfo; import pcgen.core.prereq.PrereqHandler; import pcgen.core.utils.CoreUtility; @@ -38,8 +52,6 @@ import pcgen.util.chooser.ChooserInterface; import pcgen.util.enumeration.Visibility; -import java.util.*; - /** * Represents a feat that a character gets when gaining a level (an ADD:FEAT * entry in the LST file). @@ -327,7 +339,7 @@ { for ( String bonus : aBonusList ) { - anAbility.applyBonus(bonus, chosenItem, aPC, false); + BonusAddition.applyBonus(bonus, chosenItem, aPC, anAbility, false); } } } Modified: Trunk/pcgen/code/src/test/pcgen/core/PObjectTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/PObjectTest.java 2008-10-01 22:42:27 UTC (rev 7859) +++ Trunk/pcgen/code/src/test/pcgen/core/PObjectTest.java 2008-10-01 22:52:58 UTC (rev 7860) @@ -39,6 +39,7 @@ import pcgen.cdom.enumeration.ObjectKey; import pcgen.cdom.list.AbilityList; import pcgen.core.Ability.Nature; +import pcgen.core.analysis.BonusAddition; import pcgen.core.bonus.BonusObj; import pcgen.persistence.PersistenceLayerException; import pcgen.persistence.lst.AbilityCategoryLoader; @@ -195,20 +196,20 @@ aPC.addFeat(pObj, null); aPC.addAssociation(pObj, "TestPsion 1"); - pObj.applyBonus("SPELLKNOWN|CLASS=TestPsion;LEVEL=1|1", "TestPsion 1", - aPC, false); + BonusAddition.applyBonus("SPELLKNOWN|CLASS=TestPsion;LEVEL=1|1", "TestPsion 1", + aPC, pObj, false); aPC.calcActiveBonuses(); assertEquals("Should get 1 bonus known spells", 1, (int) aPC .getTotalBonusTo("SPELLKNOWN", "CLASS.TestPsion;LEVEL.1")); aPC.addAssociation(pObj, "TestPsion 1"); - pObj.applyBonus("SPELLKNOWN|CLASS=TestPsion;LEVEL=1|1", "TestPsion 1", - aPC, true); + BonusAddition.applyBonus("SPELLKNOWN|CLASS=TestPsion;LEVEL=1|1", "TestPsion 1", + aPC, pObj, true); aPC.calcActiveBonuses(); assertEquals("Should get 3 bonus known spells", (2 * 1) + 1, (int) aPC .getTotalBonusTo("SPELLKNOWN", "CLASS.TestPsion;LEVEL.1")); aPC.addAssociation(pObj, "TestPsion 1"); - pObj.applyBonus("SPELLKNOWN|CLASS=TestPsion;LEVEL=1|1", "TestPsion 1", - aPC, false); + BonusAddition.applyBonus("SPELLKNOWN|CLASS=TestPsion;LEVEL=1|1", "TestPsion 1", + aPC, pObj, false); aPC.calcActiveBonuses(); assertEquals("Should get 7 bonus known spells", (3 * 2) + 1, (int) aPC .getTotalBonusTo("SPELLKNOWN", "CLASS.TestPsion;LEVEL.1")); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-10-01 23:55:44
|
Revision: 7864 http://pcgen.svn.sourceforge.net/pcgen/?rev=7864&view=rev Author: thpr Date: 2008-10-01 23:55:32 +0000 (Wed, 01 Oct 2008) Log Message: ----------- Ability refactoring Modified Paths: -------------- Trunk/pcgen/code/src/java/gmgen/plugin/PlayerCharacterOutput.java Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/StringKey.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/PlayerCharacter.java Trunk/pcgen/code/src/java/pcgen/core/Skill.java Trunk/pcgen/code/src/java/pcgen/core/chooser/ChooserUtilities.java Trunk/pcgen/code/src/java/pcgen/core/chooser/FeatAddChoiceManager.java Trunk/pcgen/code/src/java/pcgen/core/chooser/FeatSelectChoiceManager.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/core/prereq/PrerequisiteUtilities.java Trunk/pcgen/code/src/java/pcgen/gui/tabs/ability/AbilityInfoPanel.java Trunk/pcgen/code/src/java/pcgen/gui/tabs/ability/AbilityModel.java Trunk/pcgen/code/src/java/pcgen/gui/tabs/ability/SelectedAbilityPanel.java Trunk/pcgen/code/src/java/pcgen/gui/utils/PObjectNode.java Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Creator.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/test/pcgen/core/AbilityTest.java Added Paths: ----------- Trunk/pcgen/code/src/java/pcgen/core/BenefitFormatting.java Trunk/pcgen/code/src/java/pcgen/core/analysis/ChoiceModification.java Trunk/pcgen/code/src/java/pcgen/core/analysis/QualifiedName.java Modified: Trunk/pcgen/code/src/java/gmgen/plugin/PlayerCharacterOutput.java =================================================================== --- Trunk/pcgen/code/src/java/gmgen/plugin/PlayerCharacterOutput.java 2008-10-01 23:29:39 UTC (rev 7863) +++ Trunk/pcgen/code/src/java/gmgen/plugin/PlayerCharacterOutput.java 2008-10-01 23:55:32 UTC (rev 7864) @@ -20,6 +20,7 @@ import pcgen.core.SettingsHandler; import pcgen.core.StatList; import pcgen.core.analysis.DescriptionFormatting; +import pcgen.core.analysis.QualifiedName; import pcgen.io.ExportHandler; import pcgen.util.enumeration.AttackType; @@ -207,7 +208,7 @@ } firstLine = false; - sb.append(feat.qualifiedName(pc)); + sb.append(QualifiedName.qualifiedName(pc, feat)); } return sb.toString(); Modified: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/StringKey.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/StringKey.java 2008-10-01 23:29:39 UTC (rev 7863) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/StringKey.java 2008-10-01 23:55:32 UTC (rev 7864) @@ -35,7 +35,7 @@ { 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, + PAGE_USAGE, MINDEVVER, MINVER, 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, TEMP_DESCRIPTION, TRAIT2, TRAIT1, SKIN_COLOR, HAIR_COLOR, SUB_REGION, SPEECH_TENDENCY, PHOBIAS, INTERESTS, RESIDENCE, Modified: Trunk/pcgen/code/src/java/pcgen/core/Ability.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Ability.java 2008-10-01 23:29:39 UTC (rev 7863) +++ Trunk/pcgen/code/src/java/pcgen/core/Ability.java 2008-10-01 23:55:32 UTC (rev 7864) @@ -19,10 +19,7 @@ */ package pcgen.core; -import java.util.ArrayList; -import java.util.List; -import pcgen.base.lang.StringUtil; import pcgen.cdom.base.CDOMReference; import pcgen.cdom.base.CategorizedCDOMObject; import pcgen.cdom.base.Category; @@ -32,15 +29,8 @@ import pcgen.cdom.enumeration.StringKey; import pcgen.cdom.list.AbilityList; import pcgen.cdom.reference.CDOMDirectSingleRef; -import pcgen.core.chooser.ChooserUtilities; -import pcgen.core.levelability.LevelAbility; -import pcgen.core.prereq.PrereqHandler; import pcgen.core.utils.MessageType; import pcgen.core.utils.ShowMessageDelegate; -import pcgen.util.Logging; -import pcgen.util.chooser.ChooserFactory; -import pcgen.util.chooser.ChooserInterface; -import pcgen.util.enumeration.Tab; /** * Definition and games rules for an Ability. @@ -83,61 +73,6 @@ /* default constructor only */ /** - * Set the attribute that controls what this ability adds, e.g. WEAPONPROF, - * TEMPLATE, etc. - * - * @param add what this ability adds, e.g. WEAPONPROF, TEMPLATE, etc. - */ - public void setAddString(final String add) - { - put(StringKey.ADD, add); - } - - /** - * Return the unparsed string that controls what this ability adds, e.g. - * WEAPONPROF, TEMPLATE, etc. - * - * @return return the unparsed string that controls what this ability adds, - * e.g. WEAPONPROF, TEMPLATE, etc. - */ - public String getAddString() - { - final String characteristic = get(StringKey.ADD); - return characteristic == null ? "" : characteristic; - } - - /** - * Get the benefits of this object - * - * @param aPC The PlayerCharacter this object is associated to. - * @return the benefits of this ability - */ - public String getBenefits(final PlayerCharacter aPC) - { - List<Description> theBenefits = getListFor(ListKey.BENEFIT); - if ( theBenefits == null ) - { - return Constants.EMPTY_STRING; - } - final StringBuffer buf = new StringBuffer(); - boolean wrote = false; - for ( final Description desc : theBenefits ) - { - final String str = desc.getDescription(aPC, this); - if ( str.length() > 0 ) - { - if ( wrote ) - { - buf.append(Constants.COMMA); - } - buf.append(str); - wrote = true; - } - } - return buf.toString(); - } - - /** * Set the category of this Ability * * @param category the category of the ability @@ -173,7 +108,7 @@ * @param type The type of this ability (normal, automatic, virtual (see * named constants)) */ - public void setFeatType(final Nature type) + public void setAbilityNature(final Nature type) { if ( type == Nature.ANY ) { @@ -188,25 +123,12 @@ * * @return The nature of this feat. */ - public Nature getFeatType() + public Nature getAbilityNature() { return theNature; } /** - * Returns true if the feat matches the given type (the type is contained in - * the type string of the feat). - * - * @param type the type to test against - * - * @return true if the Ability is of type abilityType - */ - boolean matchesType(final String type) - { - return isType(type); - } - - /** * If this is a "virtual Ability", this property controls whether it will be * saved with the character * @@ -229,19 +151,6 @@ } /** - * Whether we can add newAssociation to the associated list of this - * Ability - * @param pc TODO - * @param newAssociation The thing to be associated with this Ability - * - * @return true if we can add the association - */ - public boolean canAddAssociation(PlayerCharacter pc, final String newAssociation) - { - return this.getSafe(ObjectKey.STACKS) || (this.getSafe(ObjectKey.MULTIPLE_ALLOWED) && !pc.containsAssociated(this, newAssociation)); - } - - /** * Bog standard clone method * * @return a copy of this Ability @@ -273,11 +182,6 @@ txt.append(getDisplayName()); txt.append("\tCATEGORY:").append(getCategory()); - if (getAddString().length() != 0) - { - txt.append("\tADD:").append(getAddString()); - } - if (getChoiceToModify().length() != 0) { txt.append("\tMODIFYABILITYCHOICE:").append(getChoiceToModify()); @@ -288,123 +192,7 @@ return txt.toString(); } - // ///////////////////////////////////////////// - // move to CharacterFeat /** - * 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 - * types other than weapon proficiencies), either appends a count - * of the times the ability is applied e.g. " (3x)", or a list of - * the sub-choices e.g. " (Sub1, Sub2, ...)". - */ - public String qualifiedName(PlayerCharacter pc) - { - // start with the name of the ability - // don't do for Weapon Profs - final StringBuffer aStrBuf = new StringBuffer(getOutputName()); - - if ("[BASE]".equalsIgnoreCase(getOutputName())) - { - return getDisplayName(); - } - if (pc.hasAssociations(this) - && !getKeyName().startsWith("Armor Proficiency") - ) - { - if ((getChoiceString().length() == 0) || (getSafe(ObjectKey.MULTIPLE_ALLOWED) && getSafe(ObjectKey.STACKS))) - { - if (pc.getDetailedAssociationCount(this) > 1) - { - // number of items only (ie stacking), e.g. " (1x)" - aStrBuf.append(" ("); - aStrBuf.append((int) (pc.getDetailedAssociationCount(this) * getSafe(ObjectKey.SELECTION_COST).doubleValue())); - aStrBuf.append("x)"); - } - } - else - { - // has a sub-detail - aStrBuf.append(" ("); - aStrBuf.append(StringUtil.joinToStringBuffer(pc - .getExpandedAssociations(this), ", ")); - aStrBuf.append(')'); - } - } - - return aStrBuf.toString(); - } - - boolean canBeSelectedBy(final PlayerCharacter pc) - { - return PrereqHandler.passesAll(getPrerequisiteList(), pc, this); - } - - /** - * Deal with CHOOSE tags. The actual items the choice will be made from are - * based on this.choiceString, as applied to current character. Choices already - * made (getAssociatedList) are indicated in the selectedList. This method - * always processes the choices. - * - * @param aPC The Player Character that we're opening the chooser for. - * @param addIt Whether to add or remove a choice from this Ability. - * @param category The ability category whose pool is to be charged for the ability. - * - * @return true if the Ability was modified, false otherwise - */ - public boolean modChoices(final PlayerCharacter aPC, final boolean addIt, final AbilityCategory category) - { - final List availableList = new ArrayList(); // available list of choices - final List selectedList = new ArrayList(); // selected list of choices - - return modChoices( - availableList, - selectedList, - true, - aPC, - addIt, - category); - } - - /** - * Deal with CHOOSE tags. The actual items the choice will be made from are - * based on this.choiceString, as applied to current character. Choices already - * made (getAssociatedList) are indicated in the selectedList. This method - * may also be used to build a list of choices available and choices - * already made by passing false in the process parameter - * - * @param availableList the list of things not already chosen - * @param selectedList the list of things already chosen - * @param process if false do not process the choice, just poplate the lists - * @param aPC the PC that owns the Ability - * @param addIt Whether to add or remove a choice from this Ability - * @param category The ability category whose pool is to be charged for the ability. - * - * @return true if we processed the list of choices, false if we used the routine to - * build the list of choices without processing them. - */ - public boolean modChoices( - final List availableList, - final List selectedList, - final boolean process, - final PlayerCharacter aPC, - final boolean addIt, - final AbilityCategory category) - { - return ChooserUtilities.modChoices( - this, - availableList, - selectedList, - process, - aPC, - addIt, - category); - } - - /** * 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 @@ -457,28 +245,6 @@ } /** - * Adds some info that controls what this ability adds, e.g. WEAPONPROF, - * TEMPLATE, etc. - * - * @param aLevel an int (think it represents the character level that - * this ability is granted at) - * @param aString the information about things (templates, weapon profs, - * etc.) this ability adds. - * - * @return The new LevelAbility object if one was created. - */ - @Override - public LevelAbility addAddList(final int aLevel, final String aString) - { - if (aString.startsWith("TEMPLATE|")) - { - setAddString(aString); - return null; - } - return super.addAddList(aLevel, aString); - } - - /** * Simple setter method for a String representing a choice that must be * made when applying this ability * @@ -501,150 +267,6 @@ return characteristic == null ? "" : characteristic; } - /** - * Modify the Ability as per the info from this.getChoiceToModify() and the - * choices made by the user in the GUI. - * - * @param aPC The Player Character object this Ability belongs to. - * - * @return whether we modified the Ability - */ - public boolean modifyChoice(final PlayerCharacter aPC) - { - String abilityName = getChoiceToModify(); - - if (abilityName.length() == 0) - { - return false; - } - - final List<String> abilityList = new ArrayList<String>(); - final List<String> selectedList = new ArrayList<String>(); - - if (abilityName.startsWith("TYPE=") || abilityName.startsWith("TYPE.")) - { - final String anAbilityType = abilityName.substring(5); - - // - // Get a list of all ability possessed by the character that - // are the specified type - // - for ( final PObject ability : aPC.aggregateFeatList() ) - { - if (ability.isType(anAbilityType)) - { - abilityList.add(ability.getKeyName()); - } - } - - // - // Get the user to select one if there is more than 1. - // - switch (abilityList.size()) - { - case 0: - Logging.debugPrint("PC does not have an ability of type: " - + anAbilityType); - return false; // no ability to modify - - case 1: - abilityName = abilityList.get(0); - break; - - default: - - final ChooserInterface chooser = ChooserFactory.getChooserInstance(); - chooser.setPoolFlag(false); // user is not required to make any - - // changes - chooser.setTotalChoicesAvail(1); - - chooser.setTitle("Select a " - + SettingsHandler.getGame().getSingularTabName(Tab.ABILITIES) - + " to modify"); - - Globals.sortChooserLists(abilityList, selectedList); - chooser.setAvailableList(abilityList); - chooser.setSelectedList(selectedList); - chooser.setVisible(true); - - final int selectedSize = chooser.getSelectedList().size(); - - if (selectedSize == 0) - { - return false; // no ability chosen, so nothing was modified - } - - abilityName = (String) chooser.getSelectedList().get(0); - - break; - } - } - - final Ability anAbility = aPC.getFeatNamed(abilityName); - - if (anAbility == null) - { - Logging.debugPrint("PC does not have ability: " + abilityName); - - return false; - } - - // - // Ability doesn't allow choices, so we cannot modify - // - if (!anAbility.getSafe(ObjectKey.MULTIPLE_ALLOWED)) - { - Logging.debugPrint("MULT:NO for: " + abilityName); - - return false; - } - - // build a list of available choices and choices already made. - anAbility.modChoices(abilityList, selectedList, false, aPC, true, - SettingsHandler.getGame().getAbilityCategory(this.getCategory())); - - final int currentSelections = selectedList.size(); - - // - // If nothing to choose, or nothing selected, then leave - // - if ((abilityList.size() == 0) || (currentSelections == 0)) - { - return false; - } - - final ChooserInterface chooser = ChooserFactory.getChooserInstance(); - chooser.setPoolFlag(true); // user is required to use all available - // pool points - chooser.setTotalChoicesAvail(selectedList.size()); // need to remove 1 to add another - - chooser.setTitle("Modify selections for " + abilityName); - Globals.sortChooserLists(abilityList, selectedList); - chooser.setAvailableList(abilityList); - chooser.setSelectedList(selectedList); - chooser.setVisible(true); - - final int selectedSize = chooser.getSelectedList().size(); - - if (selectedSize != currentSelections) - { - return false; // need to have the same number of selections when finished - } - - // replace old selection(s) with new and update bonuses - // - aPC.removeAllAssociations(anAbility); - - for (int i = 0; i < selectedSize; ++i) - { - aPC.addAssociation(anAbility, (String) chooser.getSelectedList().get(i)); - } - - // aPC.calcActiveBonuses(); - return true; - } - /** * Compare an ability (category) to another one * Returns the compare value from String.compareToIgnoreCase @@ -700,17 +322,6 @@ return keyName.hashCode(); } - /** - * Test whether other is the same base ability as this (ignoring any changes - * made to apply either to a PC) - * - * @param that the other ability - * @return true is the abilities are copies of the same base ability - */ - public boolean isSameBaseAbility(Ability that) { - return AbilityUtilities.areSameAbility(this, that); - } - public Category<Ability> getCDOMCategory() { return get(ObjectKey.ABILITY_CAT); Modified: Trunk/pcgen/code/src/java/pcgen/core/AbilityUtilities.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/AbilityUtilities.java 2008-10-01 23:29:39 UTC (rev 7863) +++ Trunk/pcgen/code/src/java/pcgen/core/AbilityUtilities.java 2008-10-01 23:55:32 UTC (rev 7864) @@ -23,17 +23,22 @@ */ package pcgen.core; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.StringTokenizer; + import pcgen.cdom.base.CDOMReference; import pcgen.cdom.base.TransitionChoice; import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; +import pcgen.core.analysis.ChoiceModification; +import pcgen.core.chooser.ChooserUtilities; import pcgen.core.pclevelinfo.PCLevelInfo; import pcgen.core.utils.CoreUtility; import pcgen.util.Logging; -import java.math.BigDecimal; -import java.util.*; - /** * General utilities related to the Ability class. * @@ -59,7 +64,7 @@ { for ( final String choice : choices ) { - if (ability.canAddAssociation(pc, choice)) + if (canAddAssociation(pc, ability, choice)) { pc.addAssociation(ability, choice); } @@ -200,7 +205,7 @@ if (newAbility != null) { - newAbility.setFeatType(Ability.Nature.VIRTUAL); + newAbility.setAbilityNature(Ability.Nature.VIRTUAL); newAbility.clearPrerequisiteList(); if (levelInfo != null) { @@ -380,11 +385,18 @@ if ("".equals(choice) || choice == null) { // Get modChoices to adjust the associated list and Feat Pool - adjustedAbilityPool = ability.modChoices(aPC, addIt, category); + adjustedAbilityPool = ChooserUtilities.modChoices( + ability, + new ArrayList(), + new ArrayList(), + true, + aPC, + addIt, + category); } else if (addIt) { - if (ability.canAddAssociation(aPC, choice)) + if (canAddAssociation(aPC, ability, choice)) { aPC.addAssociation(ability, choice); } @@ -401,7 +413,7 @@ * which doesn't appear to be used anywhere, so this code is totally * redundant. */ - ability.modifyChoice(aPC); + ChoiceModification.modifyChoice(aPC, ability); if (addIt) { @@ -510,7 +522,7 @@ for ( Ability ability : anAbilityList ) { if (AbilityUtilities.areSameAbility(ability, abilityInfo) && - ((abilityType == Ability.Nature.ANY) || (ability.getFeatType() == abilityType))) + ((abilityType == Ability.Nature.ANY) || (ability.getAbilityNature() == abilityType))) { return ability; } @@ -1208,4 +1220,17 @@ return abil; } + /** + * Whether we can add newAssociation to the associated list of this + * Ability + * @param pc TODO + * @param newAssociation The thing to be associated with this Ability + * + * @return true if we can add the association + */ + public static boolean canAddAssociation(PlayerCharacter pc, Ability a, final String newAssociation) + { + return a.getSafe(ObjectKey.STACKS) || (a.getSafe(ObjectKey.MULTIPLE_ALLOWED) && !pc.containsAssociated(a, newAssociation)); + } + } Added: Trunk/pcgen/code/src/java/pcgen/core/BenefitFormatting.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/BenefitFormatting.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/core/BenefitFormatting.java 2008-10-01 23:55:32 UTC (rev 7864) @@ -0,0 +1,36 @@ +package pcgen.core; + +import java.util.List; + +import pcgen.cdom.base.Constants; +import pcgen.cdom.enumeration.ListKey; + +public class BenefitFormatting +{ + + public static String getBenefits(PlayerCharacter aPC, Ability a) + { + List<Description> theBenefits = a.getListFor(ListKey.BENEFIT); + if ( theBenefits == null ) + { + return Constants.EMPTY_STRING; + } + final StringBuffer buf = new StringBuffer(); + boolean wrote = false; + for ( final Description desc : theBenefits ) + { + final String str = desc.getDescription(aPC, a); + if ( str.length() > 0 ) + { + if ( wrote ) + { + buf.append(Constants.COMMA); + } + buf.append(str); + wrote = true; + } + } + return buf.toString(); + } + +} Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-10-01 23:29:39 UTC (rev 7863) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-10-01 23:55:32 UTC (rev 7864) @@ -11090,7 +11090,7 @@ { final Ability anAbility = (Ability) it.next(); - if (anAbility.matchesType(abilityType) + if (anAbility.isType(abilityType) && canSelectAbility(anAbility, autoQualify)) { anAbilityList.add(anAbility); @@ -11136,7 +11136,7 @@ { final Ability anAbility = (Ability) it.next(); - if (anAbility.matchesType(featType) + if (anAbility.isType(featType) && canSelectAbility(anAbility, autoQualify)) { anAbilityList.add(anAbility.getKeyName()); @@ -12330,7 +12330,7 @@ if (isAuto) { - anAbility.setFeatType(Ability.Nature.AUTOMATIC); + anAbility.setAbilityNature(Ability.Nature.AUTOMATIC); } aFeatList.add(anAbility); @@ -13992,7 +13992,7 @@ private boolean qualifiesForFeat(final Ability aFeat) { - return aFeat.canBeSelectedBy(this); + return PrereqHandler.passesAll(aFeat.getPrerequisiteList(), this, aFeat); } private boolean hasSkill(final String aSkillKey) @@ -15805,7 +15805,7 @@ { return false; } - anAbility.setFeatType(Ability.Nature.NORMAL); + anAbility.setAbilityNature(Ability.Nature.NORMAL); List<Ability> abilities = realAbilities.get(aCategory); if (abilities == null) { @@ -17100,7 +17100,7 @@ .addAbilityToListwithChoices(this, ab, choices, abilities); if (added != null) { - added.setFeatType(nature); + added.setAbilityNature(nature); } } } @@ -17132,7 +17132,7 @@ .addAbilityToListwithChoices(this, ab, choices, abilities); if (added != null) { - added.setFeatType(nature); + added.setAbilityNature(nature); } } } @@ -17160,7 +17160,7 @@ abilities, cat, key); if (added != null) { - added.setFeatType(nature); + added.setAbilityNature(nature); for (CDOMReference<PCTemplate> ref : added .getSafeListFor(ListKey.TEMPLATE)) { @@ -17271,7 +17271,7 @@ Constants.FEAT_CATEGORY, aTok.nextToken()); if (added != null) { - added.setFeatType(Ability.Nature.AUTOMATIC); + added.setAbilityNature(Ability.Nature.AUTOMATIC); } } } @@ -17307,7 +17307,7 @@ Constants.FEAT_CATEGORY, aString.substring(idx + 1)); if (added != null) { - added.setFeatType(Ability.Nature.AUTOMATIC); + added.setAbilityNature(Ability.Nature.AUTOMATIC); } } else @@ -17338,7 +17338,7 @@ ab, choices, abilities); if (added != null) { - added.setFeatType(Ability.Nature.AUTOMATIC); + added.setAbilityNature(Ability.Nature.AUTOMATIC); } } } Modified: Trunk/pcgen/code/src/java/pcgen/core/Skill.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Skill.java 2008-10-01 23:29:39 UTC (rev 7863) +++ Trunk/pcgen/code/src/java/pcgen/core/Skill.java 2008-10-01 23:55:32 UTC (rev 7864) @@ -27,7 +27,6 @@ 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; @@ -145,29 +144,6 @@ } /** - * Get the qualified name - * - * @param pc - * TODO - * @return qualified name - */ - public String qualifiedName(PlayerCharacter pc) - { - if (!pc.hasAssociations(this)) - { - return this.getOutputName(); - } - - final StringBuilder buffer = new StringBuilder(); - buffer.append(this.getOutputName()).append("("); - buffer.append(StringUtil.joinToStringBuffer( - pc.getAssociationList(this), ", ")); - buffer.append(")"); - - return buffer.toString(); - } - - /** * Get the bonus to a skill rank * * @param aPC Added: Trunk/pcgen/code/src/java/pcgen/core/analysis/ChoiceModification.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/analysis/ChoiceModification.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/core/analysis/ChoiceModification.java 2008-10-01 23:55:32 UTC (rev 7864) @@ -0,0 +1,171 @@ +package pcgen.core.analysis; + +import java.util.ArrayList; +import java.util.List; + +import pcgen.cdom.enumeration.ObjectKey; +import pcgen.core.Ability; +import pcgen.core.Globals; +import pcgen.core.PObject; +import pcgen.core.PlayerCharacter; +import pcgen.core.SettingsHandler; +import pcgen.core.chooser.ChooserUtilities; +import pcgen.util.Logging; +import pcgen.util.chooser.ChooserFactory; +import pcgen.util.chooser.ChooserInterface; +import pcgen.util.enumeration.Tab; + +public class ChoiceModification +{ + /** + * Modify the Ability as per the info from this.getChoiceToModify() and the + * choices made by the user in the GUI. + * + * @param aPC The Player Character object this Ability belongs to. + * + * @return whether we modified the Ability + */ + public static boolean modifyChoice(PlayerCharacter aPC, Ability a) + { + String abilityName = a.getChoiceToModify(); + + if (abilityName.length() == 0) + { + return false; + } + + final List<String> abilityList = new ArrayList<String>(); + final List<String> selectedList = new ArrayList<String>(); + + if (abilityName.startsWith("TYPE=") || abilityName.startsWith("TYPE.")) + { + final String anAbilityType = abilityName.substring(5); + + // + // Get a list of all ability possessed by the character that + // are the specified type + // + for ( final PObject ability : aPC.aggregateFeatList() ) + { + if (ability.isType(anAbilityType)) + { + abilityList.add(ability.getKeyName()); + } + } + + // + // Get the user to select one if there is more than 1. + // + switch (abilityList.size()) + { + case 0: + Logging.debugPrint("PC does not have an ability of type: " + + anAbilityType); + return false; // no ability to modify + + case 1: + abilityName = abilityList.get(0); + break; + + default: + + final ChooserInterface chooser = ChooserFactory.getChooserInstance(); + chooser.setPoolFlag(false); // user is not required to make any + + // changes + chooser.setTotalChoicesAvail(1); + + chooser.setTitle("Select a " + + SettingsHandler.getGame().getSingularTabName(Tab.ABILITIES) + + " to modify"); + + Globals.sortChooserLists(abilityList, selectedList); + chooser.setAvailableList(abilityList); + chooser.setSelectedList(selectedList); + chooser.setVisible(true); + + final int selectedSize = chooser.getSelectedList().size(); + + if (selectedSize == 0) + { + return false; // no ability chosen, so nothing was modified + } + + abilityName = (String) chooser.getSelectedList().get(0); + + break; + } + } + + final Ability anAbility = aPC.getFeatNamed(abilityName); + + if (anAbility == null) + { + Logging.debugPrint("PC does not have ability: " + abilityName); + + return false; + } + + // + // Ability doesn't allow choices, so we cannot modify + // + if (!anAbility.getSafe(ObjectKey.MULTIPLE_ALLOWED)) + { + Logging.debugPrint("MULT:NO for: " + abilityName); + + return false; + } + + // build a list of available choices and choices already made. + ChooserUtilities.modChoices( + anAbility, + abilityList, + selectedList, + false, + aPC, + true, + SettingsHandler.getGame().getAbilityCategory(a.getCategory())); + + final int currentSelections = selectedList.size(); + + // + // If nothing to choose, or nothing selected, then leave + // + if ((abilityList.size() == 0) || (currentSelections == 0)) + { + return false; + } + + final ChooserInterface chooser = ChooserFactory.getChooserInstance(); + chooser.setPoolFlag(true); // user is required to use all available + // pool points + chooser.setTotalChoicesAvail(selectedList.size()); // need to remove 1 to add another + + chooser.setTitle("Modify selections for " + abilityName); + Globals.sortChooserLists(abilityList, selectedList); + chooser.setAvailableList(abilityList); + chooser.setSelectedList(selectedList); + chooser.setVisible(true); + + final int selectedSize = chooser.getSelectedList().size(); + + if (selectedSize != currentSelections) + { + return false; // need to have the same number of selections when finished + } + + // replace old selection(s) with new and update bonuses + // + aPC.removeAllAssociations(anAbility); + + for (int i = 0; i < selectedSize; ++i) + { + aPC.addAssociation(anAbility, (String) chooser.getSelectedList().get(i)); + } + + // aPC.calcActiveBonuses(); + return true; + } + + +} Added: Trunk/pcgen/code/src/java/pcgen/core/analysis/QualifiedName.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/analysis/QualifiedName.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/core/analysis/QualifiedName.java 2008-10-01 23:55:32 UTC (rev 7864) @@ -0,0 +1,81 @@ +package pcgen.core.analysis; + +import pcgen.base.lang.StringUtil; +import pcgen.cdom.enumeration.ObjectKey; +import pcgen.core.Ability; +import pcgen.core.PlayerCharacter; +import pcgen.core.Skill; + +public class QualifiedName +{ + + /** + * 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 + * types other than weapon proficiencies), either appends a count of + * the times the ability is applied e.g. " (3x)", or a list of the + * sub-choices e.g. " (Sub1, Sub2, ...)". + */ + public static String qualifiedName(PlayerCharacter pc, Ability a) + { + String outputName = a.getOutputName(); + if ("[BASE]".equalsIgnoreCase(outputName)) + { + return a.getDisplayName(); + } + // start with the name of the ability + // don't do for Weapon Profs + final StringBuffer aStrBuf = new StringBuffer(outputName); + + if (pc.hasAssociations(a) + && !a.getKeyName().startsWith("Armor Proficiency")) + { + if ((a.getChoiceString().length() == 0) + || (a.getSafe(ObjectKey.MULTIPLE_ALLOWED) && a + .getSafe(ObjectKey.STACKS))) + { + if (pc.getDetailedAssociationCount(a) > 1) + { + // number of items only (ie stacking), e.g. " (1x)" + aStrBuf.append(" ("); + aStrBuf.append((int) (pc.getDetailedAssociationCount(a) * a + .getSafe(ObjectKey.SELECTION_COST).doubleValue())); + aStrBuf.append("x)"); + } + } + else + { + // has a sub-detail + aStrBuf.append(" ("); + aStrBuf.append(StringUtil.joinToStringBuffer(pc + .getExpandedAssociations(a), ", ")); + aStrBuf.append(')'); + } + } + + return aStrBuf.toString(); + } + + public static String qualifiedName(PlayerCharacter pc, Skill s) + { + if (!pc.hasAssociations(s)) + { + return s.getOutputName(); + } + + final StringBuilder buffer = new StringBuilder(); + buffer.append(s.getOutputName()).append("("); + buffer.append(StringUtil.joinToStringBuffer(pc.getAssociationList(s), + ", ")); + buffer.append(")"); + + return buffer.toString(); + } + +} Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/ChooserUtilities.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/ChooserUtilities.java 2008-10-01 23:29:39 UTC (rev 7863) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/ChooserUtilities.java 2008-10-01 23:55:32 UTC (rev 7864) @@ -216,17 +216,21 @@ } /** - * Deal with CHOOSE tag processing + * Deal with CHOOSE tags. The actual items the choice will be made from are + * based on the choiceString, as applied to current character. Choices already + * made (getAssociatedList) are indicated in the selectedList. This method + * may also be used to build a list of choices available and choices + * already made by passing false in the process parameter * - * @param aPObject - * @param availableList - * @param selectedList - * @param process - * @param aPC - * @param addIt + * @param availableList the list of things not already chosen + * @param selectedList the list of things already chosen + * @param process if false do not process the choice, just poplate the lists + * @param aPC the PC that owns the Ability + * @param addIt Whether to add or remove a choice from this Ability * @param category The AbilityCategory whose pool will be charged for the ability (if any). May be null. * - * @return true if aPObject was modified + * @return true if we processed the list of choices, false if we used the routine to + * build the list of choices without processing them. */ public static final boolean modChoices( final PObject aPObject, Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/FeatAddChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/FeatAddChoiceManager.java 2008-10-01 23:29:39 UTC (rev 7863) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/FeatAddChoiceManager.java 2008-10-01 23:55:32 UTC (rev 7864) @@ -174,8 +174,14 @@ // Retrieve the choices offered by the ability final List tempAvailList = new ArrayList(); final List tempSelList = new ArrayList(); - anAbility.modChoices(tempAvailList, tempSelList, false, aPc, - true, null); + ChooserUtilities.modChoices( + anAbility, + tempAvailList, + tempSelList, + false, + aPc, + true, + null); final List<String> aavailableList = new ArrayList<String>(); // available list of choices final List<String> sselectedList = new ArrayList<String>(); // selected list of choices ChooserUtilities.convertChoiceListToStringList(tempAvailList, aavailableList); Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/FeatSelectChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/FeatSelectChoiceManager.java 2008-10-01 23:29:39 UTC (rev 7863) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/FeatSelectChoiceManager.java 2008-10-01 23:55:32 UTC (rev 7864) @@ -138,7 +138,14 @@ final List<String> xavailableList = new ArrayList<String>(); // available list of choices final List<String> xselectedList = new ArrayList<String>(); // selected list of choices - theAbility.modChoices(xavailableList, xselectedList, false, aPc, true, null); + ChooserUtilities.modChoices( + theAbility, + xavailableList, + xselectedList, + false, + aPc, + true, + null); // // Remove any that don't match Modified: Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityAbility.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityAbility.java 2008-10-01 23:29:39 UTC (rev 7863) +++ Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityAbility.java 2008-10-01 23:55:32 UTC (rev 7864) @@ -43,6 +43,7 @@ import pcgen.core.PObject; import pcgen.core.PlayerCharacter; import pcgen.core.SettingsHandler; +import pcgen.core.chooser.ChooserUtilities; import pcgen.core.analysis.BonusAddition; import pcgen.core.pclevelinfo.PCLevelInfo; import pcgen.core.prereq.PrereqHandler; @@ -343,7 +344,7 @@ { Ability previous = i.next(); - if (anAbility.isSameBaseAbility(previous)) + if (AbilityUtilities.areSameAbility(anAbility, previous)) { x++; } @@ -402,13 +403,14 @@ { final List tempAvailList = new ArrayList(); final List tempSelList = new ArrayList(); - anAbility.modChoices( - tempAvailList, - tempSelList, - false, - aPC, - true, - null); + ChooserUtilities.modChoices( + anAbility, + tempAvailList, + tempSelList, + false, + aPC, + true, + null); // Mod choices may have sent us back weaponprofs, abilities or strings, // so we have to do a conversion here for (Iterator iter = tempAvailList.iterator(); iter.hasNext();) @@ -688,7 +690,14 @@ { final double x = aPC.getRawFeats(false); aPC.setFeats(1); // temporarily assume 1 choice - pcAbility.modChoices(aPC, true, abilityCat); + ChooserUtilities.modChoices( + pcAbility, + new ArrayList(), + new ArrayList(), + true, + aPC, + true, + abilityCat); aPC.setFeats(x); // reset to original count } Modified: Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityFeat.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityFeat.java 2008-10-01 23:29:39 UTC (rev 7863) +++ Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityFeat.java 2008-10-01 23:55:32 UTC (rev 7864) @@ -42,6 +42,7 @@ import pcgen.core.PObject; import pcgen.core.PlayerCharacter; import pcgen.core.analysis.BonusAddition; +import pcgen.core.chooser.ChooserUtilities; import pcgen.core.pclevelinfo.PCLevelInfo; import pcgen.core.prereq.PrereqHandler; import pcgen.core.utils.CoreUtility; @@ -612,13 +613,14 @@ { final List tempAvailList = new ArrayList(); final List tempSelList = new ArrayList(); - anAbility.modChoices( - tempAvailList, - tempSelList, - false, - aPC, - true, - AbilityCategory.FEAT); + ChooserUtilities.modChoices( + anAbility, + tempAvailList, + tempSelList, + false, + aPC, + true, + AbilityCategory.FEAT); // Mod choices may have sent us back weaponprofs, abilities or strings, // so we have to do a conversion here for (Iterator iter = tempAvailList.iterator(); iter.hasNext();) Modified: Trunk/pcgen/code/src/java/pcgen/core/prereq/PrerequisiteUtilities.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/prereq/PrerequisiteUtilities.java 2008-10-01 23:29:39 UTC (rev 7863) +++ Trunk/pcgen/code/src/java/pcgen/core/prereq/PrerequisiteUtilities.java 2008-10-01 23:55:32 UTC (rev 7864) @@ -43,6 +43,7 @@ import pcgen.core.SettingsHandler; import pcgen.core.Skill; import pcgen.core.WeaponProf; +import pcgen.core.chooser.ChooserUtilities; import pcgen.core.spell.Spell; import pcgen.persistence.PersistenceLayerException; import pcgen.persistence.lst.output.prereq.PrerequisiteWriter; @@ -297,8 +298,14 @@ final String aChoiceString = aFeat.getChoiceString(); int runningTotal = 0; - aFeat.modChoices(availableList, selectedList, false, - character, true, null); + ChooserUtilities.modChoices( + aFeat, + availableList, + selectedList, + false, + character, + true, + null); availableList.clear(); if (subKeyIsType) // TYPE syntax Modified: Trunk/pcgen/code/src/java/pcgen/gui/tabs/ability/AbilityInfoPanel.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/tabs/ability/AbilityInfoPanel.java 2008-10-01 23:29:39 UTC (rev 7863) +++ Trunk/pcgen/code/src/java/pcgen/gui/tabs/ability/AbilityInfoPanel.java 2008-10-01 23:55:32 UTC (rev 7864) @@ -48,6 +48,7 @@ import pcgen.cdom.helper.Aspect; import pcgen.core.Ability; import pcgen.core.AbilityCategory; +import pcgen.core.BenefitFormatting; import pcgen.core.PlayerCharacter; import pcgen.core.analysis.DescriptionFormatting; import pcgen.core.prereq.PrerequisiteUtilities; @@ -201,13 +202,13 @@ buff.toString())); } - final String bene = theAbility.getBenefits(thePC); + final String bene = BenefitFormatting.getBenefits(thePC, theAbility); if (bene != null && bene.length() > 0) { sb.append(BR); sb.append(PropertyFactory.getFormattedString( "Ability.Info.Benefit", //$NON-NLS-1$ - theAbility.getBenefits(thePC))); + BenefitFormatting.getBenefits(thePC, theAbility))); } sb.append(PropertyFactory.getFormattedString( Modified: Trunk/pcgen/code/src/java/pcgen/gui/tabs/ability/AbilityModel.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/tabs/ability/AbilityModel.java 2008-10-01 23:29:39 UTC (rev 7863) +++ Trunk/pcgen/code/src/java/pcgen/gui/tabs/ability/AbilityModel.java 2008-10-01 23:55:32 UTC (rev 7864) @@ -475,7 +475,7 @@ PObjectNode aFN = new PObjectNode(); aFN.setParent(root); - switch (ability.getFeatType()) + switch (ability.getAbilityNature()) { case AUTOMATIC: aFN.setColor(SettingsHandler.getFeatAutoColor()); @@ -697,7 +697,7 @@ newNode.setItem(ability); newNode.setParent(parent); - switch (ability.getFeatType()) + switch (ability.getAbilityNature()) { case AUTOMATIC: newNode.setColor(SettingsHandler.getFeatAutoColor()); @@ -750,7 +750,7 @@ { final PObjectNode aFN = new PObjectNode(); - switch (ability.getFeatType()) + switch (ability.getAbilityNature()) { case AUTOMATIC: aFN Modified: Trunk/pcgen/code/src/java/pcgen/gui/tabs/ability/SelectedAbilityPanel.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/tabs/ability/SelectedAbilityPanel.java 2008-10-01 23:29:39 UTC (rev 7863) +++ Trunk/pcgen/code/src/java/pcgen/gui/tabs/ability/SelectedAbilityPanel.java 2008-10-01 23:55:32 UTC (rev 7864) @@ -354,7 +354,7 @@ super.abilitySelected(anAbility); if (anAbility != null) { - setRemoveEnabled(anAbility.getFeatType() == Ability.Nature.NORMAL); + setRemoveEnabled(anAbility.getAbilityNature() == Ability.Nature.NORMAL); } else { Modified: Trunk/pcgen/code/src/java/pcgen/gui/utils/PObjectNode.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/utils/PObjectNode.java 2008-10-01 23:29:39 UTC (rev 7863) +++ Trunk/pcgen/code/src/java/pcgen/gui/utils/PObjectNode.java 2008-10-01 23:55:32 UTC (rev 7864) @@ -592,7 +592,7 @@ { final Ability aFeat = (Ability) item; - switch (aFeat.getFeatType()) + switch (aFeat.getAbilityNature()) { case NORMAL: return handleCheckFeatState(aFeat, itemName); Modified: Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Creator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Creator.java 2008-10-01 23:29:39 UTC (rev 7863) +++ Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Creator.java 2008-10-01 23:55:32 UTC (rev 7864) @@ -1391,7 +1391,7 @@ .append(TAG_SEPARATOR); buffer.append(TAG_TYPE).append(TAG_END); buffer.append( - EntityEncoder.encode(ability.getFeatType().toString())) + EntityEncoder.encode(ability.getAbilityNature().toString())) .append(TAG_SEPARATOR); buffer.append(TAG_CATEGORY).append(TAG_END); buffer.append(EntityEncoder.encode(ability.getCategory())) Modified: Trunk/pcgen/code/src/java/pcgen/io/exporttoken/AbilityListToken.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/exporttoken/AbilityListToken.java 2008-10-01 23:29:39 UTC (rev 7863) +++ Trunk/pcgen/code/src/java/pcgen/io/exporttoken/AbilityListToken.java 2008-10-01 23:55:32 UTC (rev 7864) @@ -32,6 +32,7 @@ import pcgen.core.AbilityCategory; import pcgen.core.PlayerCharacter; import pcgen.core.SettingsHandler; +import pcgen.core.analysis.QualifiedName; import pcgen.io.ExportHandler; /** @@ -154,7 +155,7 @@ } needComma = true; - retString.append(ability.qualifiedName(pc)); + retString.append(QualifiedName.qualifiedName(pc, ability)); } return retString.toString(); Modified: Trunk/pcgen/code/src/java/pcgen/io/exporttoken/AbilityToken.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/exporttoken/AbilityToken.java 2008-10-01 23:29:39 UTC (rev 7863) +++ Trunk/pcgen/code/src/java/pcgen/io/exporttoken/AbilityToken.java 2008-10-01 23:55:32 UTC (rev 7864) @@ -39,9 +39,11 @@ import pcgen.cdom.helper.Aspect; import pcgen.core.Ability; import pcgen.core.AbilityCategory; +import pcgen.core.BenefitFormatting; import pcgen.core.Globals; import pcgen.core.PlayerCharacter; import pcgen.core.SettingsHandler; +import pcgen.core.analysis.QualifiedName; import pcgen.io.ExportHandler; import pcgen.util.enumeration.Visibility; @@ -329,7 +331,7 @@ } else if (tokenSource.endsWith(".BENEFIT")) { - retString += aAbility.getBenefits(pc); + retString += BenefitFormatting.getBenefits(pc, aAbility); } else if (tokenSource.endsWith(".TYPE")) { @@ -376,7 +378,7 @@ // } else { - retString += aAbility.qualifiedName(pc); + retString += QualifiedName.qualifiedName(pc, aAbility); } } else if (eh != null && eh.getExistsOnly()) Modified: Trunk/pcgen/code/src/java/pcgen/io/exporttoken/SkillToken.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/exporttoken/SkillToken.java 2008-10-01 23:29:39 UTC (rev 7863) +++ Trunk/pcgen/code/src/java/pcgen/io/exporttoken/SkillToken.java 2008-10-01 23:55:32 UTC (rev 7864) @@ -31,6 +31,7 @@ import pcgen.core.PlayerCharacter; import pcgen.core.SettingsHandler; import pcgen.core.Skill; +import pcgen.core.analysis.QualifiedName; import pcgen.core.analysis.SkillModifier; import pcgen.core.analysis.SkillRankControl; import pcgen.io.ExportHandler; @@ -306,7 +307,7 @@ switch (property) { case SKILL_NAME: - retValue.append(aSkill.qualifiedName(pc)); + retValue.append(QualifiedName.qualifiedName(pc, aSkill)); break; case SKILL_TOTAL: Modified: Trunk/pcgen/code/src/java/plugin/charactersheet/gui/Page2Panel.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/charactersheet/gui/Page2Panel.java 2008-10-01 23:29:39 UTC (rev 7863) +++ Trunk/pcgen/code/src/java/plugin/charactersheet/gui/Page2Panel.java 2008-10-01 23:55:32 UTC (rev 7864) @@ -23,6 +23,7 @@ import pcgen.core.Language; import pcgen.core.PlayerCharacter; import pcgen.core.WeaponProf; +import pcgen.core.analysis.QualifiedName; import pcgen.io.exporttoken.DomainToken; import pcgen.io.exporttoken.EqToken; import plugin.charactersheet.CharacterSheetUtils; @@ -291,7 +292,7 @@ for (int i = 0; i < feats.size(); i++) { Ability feat = (Ability) feats.get(i); - featMap.put(feat.qualifiedName(aPC), aPC.getDescription(feat)); + featMap.put(QualifiedName.qualifiedName(aPC, feat), aPC.getDescription(feat)); } return featMap; } Modified: Trunk/pcgen/code/src/java/plugin/charactersheet/gui/SkillsPane.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/charactersheet/gui/SkillsPane.java 2008-10-01 23:29:39 UTC (rev 7863) +++ Trunk/pcgen/code/src/java/plugin/charactersheet/gui/SkillsPane.java 2008-10-01 23:55:32 UTC (rev 7864) @@ -20,6 +20,7 @@ import pcgen.core.SettingsHandler; import pcgen.core.Skill; import pcgen.core.SkillUtilities; +import pcgen.core.analysis.QualifiedName; import pcgen.core.analysis.SkillModifier; import pcgen.core.analysis.SkillRankControl; import pcgen.util.enumeration.Visibility; @@ -382,7 +383,7 @@ { check = X; } - String name = skill.qualifiedName(pc); + String name = QualifiedName.qualifiedName(pc, skill); String ability = skill.getKeyStatAbb(); String total = Integer.toString(SkillRankControl.getTotalRank(pc, skill).intValue() Modified: Trunk/pcgen/code/src/test/pcgen/core/AbilityTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/AbilityTest.java 2008-10-01 23:29:39 UTC (rev 7863) +++ Trunk/pcgen/code/src/test/pcgen/core/AbilityTest.java 2008-10-01 23:55:32 UTC (rev 7864) @@ -114,13 +114,13 @@ is(ab7.getKeyName(), strEq("KEY_Weapon Throwing (Tantrum)"), "Ability7 name is correct"); - is(ab1.isSameBaseAbility(ab2), eq(false), + is(AbilityUtilities.areSameAbility(ab1, ab2), eq(false), "Abilities 1 & 2 are not the same"); - is(ab1.isSameBaseAbility(ab3), eq(false), + is(AbilityUtilities.areSameAbility(ab1, ab3), eq(false), "Abilities 1 & 3 are not the same"); - is(ab1.isSameBaseAbility(ab4), eq(false), + is(AbilityUtilities.areSameAbility(ab1, ab4), eq(false), "Abilities 1 & 4 are not the same"); - is(ab5.isSameBaseAbility(ab6), eq(true), "Abilities 5 & 6 are the same"); - is(ab5.isSameBaseAbility(ab7), eq(true), "Abilities 5 & 7 are the same"); + is(AbilityUtilities.areSameAbility(ab5, ab6), eq(true), "Abilities 5 & 6 are the same"); + is(AbilityUtilities.areSameAbility(ab5, ab7), eq(true), "Abilities 5 & 7 are the same"); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-10-02 01:22:03
|
Revision: 7871 http://pcgen.svn.sourceforge.net/pcgen/?rev=7871&view=rev Author: thpr Date: 2008-10-02 01:21:59 +0000 (Thu, 02 Oct 2008) Log Message: ----------- docs & cleanup Modified Paths: -------------- Trunk/pcgen/code/src/java/gmgen/plugin/PlayerCharacterOutput.java Trunk/pcgen/code/src/java/pcgen/base/formula/Formula.java Trunk/pcgen/code/src/java/pcgen/base/util/FixedStringList.java Trunk/pcgen/code/src/java/pcgen/base/util/NamedValue.java Trunk/pcgen/code/src/java/pcgen/core/Globals.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/levelability/LevelAbilitySpellCaster.java Trunk/pcgen/code/src/java/pcgen/rules/context/ReferenceContext.java Trunk/pcgen/code/src/test/pcgen/core/EquipmentTest.java Trunk/pcgen/code/src/test/pcgen/io/exporttoken/AbilityTokenTest.java Trunk/pcgen/code/src/test/pcgen/io/exporttoken/SpellMemTokenTest.java Trunk/pcgen/code/src/test/pcgen/persistence/lst/PObjectLoaderTest.java Trunk/pcgen/code/src/test/plugin/PluginBuildTest.java Trunk/pcgen/code/src/test/plugin/jepcommands/OrCommandTest.java Modified: Trunk/pcgen/code/src/java/gmgen/plugin/PlayerCharacterOutput.java =================================================================== --- Trunk/pcgen/code/src/java/gmgen/plugin/PlayerCharacterOutput.java 2008-10-02 00:39:25 UTC (rev 7870) +++ Trunk/pcgen/code/src/java/gmgen/plugin/PlayerCharacterOutput.java 2008-10-02 01:21:59 UTC (rev 7871) @@ -19,7 +19,6 @@ import pcgen.core.PlayerCharacter; import pcgen.core.SettingsHandler; import pcgen.core.StatList; -import pcgen.core.analysis.DescriptionFormatting; import pcgen.core.analysis.QualifiedName; import pcgen.io.ExportHandler; import pcgen.util.enumeration.AttackType; Modified: Trunk/pcgen/code/src/java/pcgen/base/formula/Formula.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/base/formula/Formula.java 2008-10-02 00:39:25 UTC (rev 7870) +++ Trunk/pcgen/code/src/java/pcgen/base/formula/Formula.java 2008-10-02 01:21:59 UTC (rev 7871) @@ -28,8 +28,16 @@ public interface Formula { + /** + * An Integer for the constant ONE. This is done in order to minimize + * processing time in fetching this constant during formula resolution + */ public static final Integer INT_ONE = Integer.valueOf(1); + /** + * An Integer for the constant ZERO. This is done in order to minimize + * processing time in fetching this constant during formula resolution + */ public static final Integer INT_ZERO = Integer.valueOf(0); /** Modified: Trunk/pcgen/code/src/java/pcgen/base/util/FixedStringList.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/base/util/FixedStringList.java 2008-10-02 00:39:25 UTC (rev 7870) +++ Trunk/pcgen/code/src/java/pcgen/base/util/FixedStringList.java 2008-10-02 01:21:59 UTC (rev 7871) @@ -23,28 +23,91 @@ import java.util.List; import java.util.RandomAccess; +/** + * A FixedStringList is a fixed-length java.util.List<String>. The size of the + * FixedStringList is set at construction and cannot be modified. Entries which + * are not set are null. + * + * A FixedStringList will always report the size defined at construction and + * will always iterate over the null values. + */ public class FixedStringList extends AbstractList<String> implements List<String>, RandomAccess { + /** + * The String array underlying the FixedStringList + */ String[] array; + /** + * Creates a new FixedStringList of the given size. All values in the + * FixedStringList remain the default (null). + * + * @param size + * The size of the FixedStringList to be constructed. + */ public FixedStringList(int size) { array = new String[size]; } + /** + * Creates a new FixedStringList from the given String Collection. The + * FixedStringList will have a size equal to the size of the given + * Collection and the contents of this FixedStringList will match the order + * of the given Collection. null values are allowed and will be included in + * the FixedStringList. + * + * This constructor is value-semantic, in that the given Collection will not + * be modified by this constructor, and no reference to the given Collection + * will be maintained. (References to the Strings within the Collection will + * be maintained, but as Strings are immutable objects, that is a 'safe' + * operation) + * + * @param c + * The String Collection to be used to initialize the size and + * contents of this FixedStringList + */ public FixedStringList(Collection<String> c) { array = c.toArray(new String[c.size()]); } + /** + * Creates a new FixedStringList from the given String Array. The + * FixedStringList will have a size equal to the size of the given Array and + * the contents of this FixedStringList will match the order of the given + * Array. null values are allowed and will be included in the + * FixedStringList. + * + * This constructor is value-semantic, in that the given Array will not be + * modified by this constructor, and no reference to the given Array will be + * maintained. (References to the Strings within the Array will be + * maintained, but as Strings are immutable objects, that is a 'safe' + * operation) + * + * @param c + * The String Array to be used to initialize the size and + * contents of this FixedStringList + */ public FixedStringList(String... a) { array = new String[a.length]; System.arraycopy(a, 0, array, 0, a.length); } + /** + * Adds a new String to this FixedStringList. This new value will replace + * the first null value within the FixedStringList. + * + * Per the java.util.List specification, you should test the return value of + * this method! This method will return false if there is no null value in + * the FixedStringList (indicating that the add failed). No Error or + * Exception will be generated. + * + * @see java.util.AbstractList#add(java.lang.Object) + */ @Override public boolean add(String o) { @@ -59,6 +122,25 @@ return false; } + /** + * Adds a Collection of Strings to this FixedStringList. These values will + * replace the first null values within the FixedStringList (in order + * returned by the Iterator provided by the Collection). + * + * This constructor is value-semantic, in that the given Collection will not + * be modified by this constructor, and no reference to the given Collection + * will be maintained. (References to the Strings within the Collection will + * be maintained, but as Strings are immutable objects, that is a 'safe' + * operation) + * + * Per the java.util.List specification, you should test the return value of + * this method! This method will return false if there is are insufficient + * null values in the FixedStringList to fit all of the contents of the + * given Collection (indicating that the addAll failed). No Error or + * Exception will be generated. + * + * @see java.util.AbstractList#addAll(int, java.util.Collection) + */ @Override public boolean addAll(int index, Collection<? extends String> c) { @@ -72,6 +154,14 @@ return true; } + /** + * Removes the String at the given index from this FixedStringList. The + * value is replaced by null. The contents of the FixedStringList are not + * consolidated, meaning the null value will continue to exist in the + * FixedStringList at exactly the index where the value was removed. + * + * @see java.util.AbstractList#remove(int) + */ @Override public String remove(int index) { @@ -80,6 +170,11 @@ return old; } + /** + * Sets the String at the given index to the given value. + * + * @see java.util.AbstractList#set(int, java.lang.Object) + */ @Override public String set(int index, String element) { @@ -88,18 +183,42 @@ return old; } + /** + * Returns the String at the given index of this FixedStringList (may be + * null if there is no String present at the given index and the index is + * greater than or equal to 0 and less than or equal to the size of this + * FixedStringList minus 1. + * + * @see java.util.AbstractList#get(int) + */ @Override public String get(int arg0) { return array[arg0]; } + /** + * Returns the size of this FixedStringList. Will always be the size defined + * during the construction of this FixedStringList, regardless of how many + * entries in the FixedStringList are set to zero. + * + * @see java.util.AbstractCollection#size() + */ @Override public int size() { return array.length; } + /** + * Returns true is this FixedStringList is equal to the given Object. This + * method is consistent with the equals behavior defined in java.util.List + * (meaning this will return true if this FixedStringList is the same size + * as another java.util.List and has identical contents [in identical + * order]) + * + * @see java.util.AbstractList#equals(java.lang.Object) + */ @Override public boolean equals(Object o) { Modified: Trunk/pcgen/code/src/java/pcgen/base/util/NamedValue.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/base/util/NamedValue.java 2008-10-02 00:39:25 UTC (rev 7870) +++ Trunk/pcgen/code/src/java/pcgen/base/util/NamedValue.java 2008-10-02 01:21:59 UTC (rev 7871) @@ -17,38 +17,82 @@ */ package pcgen.base.util; +/** + * A NamedValue is a String-double pair (similar to a Map.Entry). This is + * designed specifically for use in a setting where a key-value pair is + * necessary, but a hash isn't appropriate (due to only one entry). + * + * This is also can be considered an alternative to a WeightedCollection, in + * that a NamedValue can store double values, whereas a WeightedCollection can + * only store integer values. + */ public final class NamedValue { + /** + * The name of the NamedValue + */ public final String name; + /** + * The (double) value contained in the the NamedValue + */ private double weight; + /** + * Creates a new NamedValue for the given name. The Double value defaults to + * 0.0. + * + * @param s + * The String to be used as the name of the NamedValue. + */ public NamedValue(String s) { name = s; } + /** + * Creates a new NamedValue for the given name and double value. + * + * @param s + * The String to be used as the name of the NamedValue. + * @param d + * The double value of the NamedValue. + */ public NamedValue(String s, double d) { this(s); weight = d; } + /** + * Returns the weight of the NamedValue + * + * @return The double weight of the NamedValue + */ public double getWeight() { return weight; } + /** + * Adds weight to a NamedValue + * + * @param d + * the weight to add to this NamedValue + */ public void addWeight(double d) { weight += d; // CONSIDER what if less than zero? } - + + /** + * Returns a String representation of this NamedValue + */ @Override public String toString() { return name + ":" + weight; } - + } \ No newline at end of file Modified: Trunk/pcgen/code/src/java/pcgen/core/Globals.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Globals.java 2008-10-02 00:39:25 UTC (rev 7870) +++ Trunk/pcgen/code/src/java/pcgen/core/Globals.java 2008-10-02 01:21:59 UTC (rev 7871) @@ -50,7 +50,6 @@ import javax.swing.JFrame; -import pcgen.base.util.MapToList; import pcgen.cdom.base.CDOMObject; import pcgen.cdom.base.CDOMObjectUtilities; import pcgen.cdom.base.Constants; Modified: Trunk/pcgen/code/src/java/pcgen/core/PCTemplate.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PCTemplate.java 2008-10-02 00:39:25 UTC (rev 7870) +++ Trunk/pcgen/code/src/java/pcgen/core/PCTemplate.java 2008-10-02 01:21:59 UTC (rev 7871) @@ -48,10 +48,6 @@ */ public final class PCTemplate extends PObject { - // ///////////////////////////////////////////////////////////////////// - // Static properties - // ///////////////////////////////////////////////////////////////////// - /** * Get the total adjustment to Challenge rating of a character at a given * level (Class and Hit Dice). This will include the absolute adjustment Modified: Trunk/pcgen/code/src/java/pcgen/core/PObject.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-10-02 00:39:25 UTC (rev 7870) +++ Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-10-02 01:21:59 UTC (rev 7871) @@ -51,7 +51,6 @@ import pcgen.cdom.reference.CDOMSingleRef; import pcgen.core.analysis.LanguageSupport; import pcgen.core.analysis.OutputNameFormatting; -import pcgen.core.analysis.SpecialAbilityResolution; import pcgen.core.analysis.WeaponProfType; import pcgen.core.bonus.Bonus; import pcgen.core.bonus.BonusObj; Modified: Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilitySpellCaster.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilitySpellCaster.java 2008-10-02 00:39:25 UTC (rev 7870) +++ Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilitySpellCaster.java 2008-10-02 01:21:59 UTC (rev 7871) @@ -24,7 +24,6 @@ package pcgen.core.levelability; -import pcgen.cdom.base.Constants; import pcgen.cdom.enumeration.StringKey; import pcgen.core.*; import pcgen.core.pclevelinfo.PCLevelInfo; Modified: Trunk/pcgen/code/src/java/pcgen/rules/context/ReferenceContext.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/rules/context/ReferenceContext.java 2008-10-02 00:39:25 UTC (rev 7870) +++ Trunk/pcgen/code/src/java/pcgen/rules/context/ReferenceContext.java 2008-10-02 01:21:59 UTC (rev 7871) @@ -89,10 +89,10 @@ cl, parent); if (parentMfg == null) { - Category parentCat = (Category) parent; + Category parentCat = parent; parentMfg = new CategorizedReferenceManufacturer<T>(cl, - (Category<T>) parentCat); + parentCat); catmap.put(cl, cat, parentMfg); } mfg.setParentCRM(parentMfg); Modified: Trunk/pcgen/code/src/test/pcgen/core/EquipmentTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/EquipmentTest.java 2008-10-02 00:39:25 UTC (rev 7870) +++ Trunk/pcgen/code/src/test/pcgen/core/EquipmentTest.java 2008-10-02 01:21:59 UTC (rev 7871) @@ -41,7 +41,6 @@ import pcgen.cdom.reference.CDOMDirectSingleRef; import pcgen.persistence.lst.CampaignSourceEntry; import pcgen.persistence.lst.GenericLoader; -import pcgen.rules.context.LoadContext; /** * Equipment Test Modified: Trunk/pcgen/code/src/test/pcgen/io/exporttoken/AbilityTokenTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/io/exporttoken/AbilityTokenTest.java 2008-10-02 00:39:25 UTC (rev 7870) +++ Trunk/pcgen/code/src/test/pcgen/io/exporttoken/AbilityTokenTest.java 2008-10-02 01:21:59 UTC (rev 7871) @@ -26,7 +26,6 @@ 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; Modified: Trunk/pcgen/code/src/test/pcgen/io/exporttoken/SpellMemTokenTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/io/exporttoken/SpellMemTokenTest.java 2008-10-02 00:39:25 UTC (rev 7870) +++ Trunk/pcgen/code/src/test/pcgen/io/exporttoken/SpellMemTokenTest.java 2008-10-02 01:21:59 UTC (rev 7871) @@ -34,7 +34,6 @@ import pcgen.core.PCClass; import pcgen.core.PlayerCharacter; import pcgen.core.Race; -import pcgen.core.SettingsHandler; import pcgen.core.bonus.Bonus; import pcgen.core.bonus.BonusObj; import pcgen.core.character.CharacterSpell; Modified: Trunk/pcgen/code/src/test/pcgen/persistence/lst/PObjectLoaderTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/persistence/lst/PObjectLoaderTest.java 2008-10-02 00:39:25 UTC (rev 7870) +++ Trunk/pcgen/code/src/test/pcgen/persistence/lst/PObjectLoaderTest.java 2008-10-02 01:21:59 UTC (rev 7871) @@ -39,11 +39,9 @@ import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.VariableKey; import pcgen.core.Ability; -import pcgen.core.GameMode; import pcgen.core.Globals; import pcgen.core.PCStat; import pcgen.core.PObject; -import pcgen.core.SettingsHandler; import pcgen.core.prereq.Prerequisite; import pcgen.persistence.PersistenceLayerException; import pcgen.rules.context.LoadContext; Modified: Trunk/pcgen/code/src/test/plugin/PluginBuildTest.java =================================================================== --- Trunk/pcgen/code/src/test/plugin/PluginBuildTest.java 2008-10-02 00:39:25 UTC (rev 7870) +++ Trunk/pcgen/code/src/test/plugin/PluginBuildTest.java 2008-10-02 01:21:59 UTC (rev 7871) @@ -95,7 +95,7 @@ srcList.addAll(Arrays.asList(sources)); srcList.remove("PreDefaultMonsterTester.java"); srcList.remove("PreDefaultMonsterWriter.java"); - sources = (String[]) srcList.toArray(sources); + sources = srcList.toArray(sources); String [][] exceptions = new String[][] { { "MoveBonus", "Move" } }; @@ -474,7 +474,7 @@ List<String> srcList = new ArrayList<String>(); srcList.addAll(Arrays.asList(sources)); srcList.remove("PreSkillTotalParser.java"); - sources = (String[]) srcList.toArray(sources); + sources = srcList.toArray(sources); checkPluginJars(jarPrefix, jarFolder, "Parser", sources); } Modified: Trunk/pcgen/code/src/test/plugin/jepcommands/OrCommandTest.java =================================================================== --- Trunk/pcgen/code/src/test/plugin/jepcommands/OrCommandTest.java 2008-10-02 00:39:25 UTC (rev 7870) +++ Trunk/pcgen/code/src/test/plugin/jepcommands/OrCommandTest.java 2008-10-02 01:21:59 UTC (rev 7871) @@ -145,7 +145,7 @@ runOr(s, c); - final Object result = (Boolean) s.pop(); + final Object result = s.pop(); is(result, eq(true), "if (0.0,false,true) returns true"); } @@ -165,7 +165,7 @@ runOr(s, c); - final Object result = (Double) s.pop(); + final Object result = s.pop(); is(result, eq(0.0), "if (false,false,false,false) returns 0.0"); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-10-03 01:31:55
|
Revision: 7879 http://pcgen.svn.sourceforge.net/pcgen/?rev=7879&view=rev Author: thpr Date: 2008-10-03 01:31:47 +0000 (Fri, 03 Oct 2008) Log Message: ----------- Convert Skill Rank to an Association Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/cdom/base/TransitionChoice.java Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/AssociationKey.java Trunk/pcgen/code/src/java/pcgen/core/AssociationSupport.java Trunk/pcgen/code/src/java/pcgen/core/Equipment.java Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java Trunk/pcgen/code/src/java/pcgen/core/Skill.java Trunk/pcgen/code/src/java/pcgen/core/analysis/SkillRankControl.java Trunk/pcgen/code/src/java/pcgen/core/npcgen/ClassData.java Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoSkills.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/SkillToken.java Trunk/pcgen/code/src/java/pcgen/io/exporttoken/SkillpointsToken.java Trunk/pcgen/code/src/test/pcgen/io/ExportHandlerTest.java Added Paths: ----------- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/AssociationListKey.java Removed Paths: ------------- Trunk/pcgen/code/src/java/pcgen/core/AssocStore.java Modified: Trunk/pcgen/code/src/java/pcgen/cdom/base/TransitionChoice.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/base/TransitionChoice.java 2008-10-03 00:15:26 UTC (rev 7878) +++ Trunk/pcgen/code/src/java/pcgen/cdom/base/TransitionChoice.java 2008-10-03 01:31:47 UTC (rev 7879) @@ -22,7 +22,7 @@ import java.util.Set; import pcgen.base.formula.Formula; -import pcgen.cdom.enumeration.AssociationKey; +import pcgen.cdom.enumeration.AssociationListKey; import pcgen.core.PlayerCharacter; import pcgen.util.StringPClassUtil; import pcgen.util.chooser.ChooserFactory; @@ -137,7 +137,7 @@ for (T choice : driveChoice) { choiceActor.applyChoice(choice, apc); - apc.addAssoc(this, AssociationKey.ADD, choice); + apc.addAssoc(this, AssociationListKey.ADD, choice); } } Modified: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/AssociationKey.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/AssociationKey.java 2008-10-03 00:15:26 UTC (rev 7878) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/AssociationKey.java 2008-10-03 01:31:47 UTC (rev 7879) @@ -29,8 +29,6 @@ import java.util.Map; import pcgen.base.util.CaseInsensitiveMap; -import pcgen.base.util.FixedStringList; -import pcgen.base.util.NamedValue; import pcgen.cdom.base.CDOMObject; import pcgen.core.Ability; import pcgen.core.AbilityCategory; @@ -69,12 +67,8 @@ public static final AssociationKey<AbilityCategory> CATEGORY = new AssociationKey<AbilityCategory>(); - public static final AssociationKey<FixedStringList> CHOICES = new AssociationKey<FixedStringList>(); + public static final AssociationKey<Integer> OUTPUT_INDEX = new AssociationKey<Integer>(); - public static final AssociationKey<Object> ADD = new AssociationKey<Object>(); - - public static final AssociationKey<NamedValue> SKILL_RANK = new AssociationKey<NamedValue>(); - private static CaseInsensitiveMap<AssociationKey<?>> map = null; private AssociationKey() Added: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/AssociationListKey.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/AssociationListKey.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/AssociationListKey.java 2008-10-03 01:31:47 UTC (rev 7879) @@ -0,0 +1,148 @@ +/* + * 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.lang.reflect.Modifier; +import java.util.Map; + +import pcgen.base.util.CaseInsensitiveMap; +import pcgen.base.util.FixedStringList; +import pcgen.base.util.NamedValue; + +/** + * @author Tom Parker <th...@us...> + * + * This is a Typesafe enumeration of legal Characteristics of an Association. It + * is designed to act as an index to a specific Objects within an item that + * forms associations. + * + * @see pcgen.cdom.base.AssociatedObject + * + * AssociationKeys are designed to store items in an AssociatedObject in a + * type-safe fashion. Note that it is possible to use the AssociationKey to cast + * the object to the type of object stored by the AssociationKey. (This assists + * with Generics) + * + * @param <T> + * The class of object stored by this AssociationKey. + */ +public final class AssociationListKey<T> +{ + + public static final AssociationListKey<FixedStringList> CHOICES = new AssociationListKey<FixedStringList>(); + + public static final AssociationListKey<Object> ADD = new AssociationListKey<Object>(); + + public static final AssociationListKey<NamedValue> SKILL_RANK = new AssociationListKey<NamedValue>(); + + private static CaseInsensitiveMap<AssociationListKey<?>> map = null; + + private AssociationListKey() + { + // Only allow instantation here + } + + public T cast(Object o) + { + return (T) o; + } + + public static <OT> AssociationListKey<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. + */ + AssociationListKey<OT> o = (AssociationListKey<OT>) map.get(s); + if (o == null) + { + o = new AssociationListKey<OT>(); + map.put(s, o); + } + return o; + } + + private static void buildMap() + { + map = new CaseInsensitiveMap<AssociationListKey<?>>(); + Field[] fields = AssociationListKey.class.getDeclaredFields(); + for (int i = 0; i < fields.length; i++) + { + int mod = fields[i].getModifiers(); + + if (Modifier.isStatic(mod) && Modifier.isFinal(mod) + && Modifier.isPublic(mod)) + { + try + { + Object o = fields[i].get(null); + if (o instanceof AssociationListKey) + { + map.put(fields[i].getName(), (AssociationListKey<?>) o); + } + } + catch (IllegalArgumentException e) + { + throw new InternalError(); + } + catch (IllegalAccessException e) + { + throw new InternalError(); + } + } + } + } + + @Override + public String toString() + { + if (map == null) + { + buildMap(); + } + /* + * CONSIDER Should this find a way to do a Two-Way Map or something to + * that effect? + */ + for (Map.Entry<?, AssociationListKey<?>> me : map.entrySet()) + { + if (me.getValue() == this) + { + return me.getKey().toString(); + } + } + // Error + return ""; + } +} Deleted: Trunk/pcgen/code/src/java/pcgen/core/AssocStore.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/AssocStore.java 2008-10-03 00:15:26 UTC (rev 7878) +++ Trunk/pcgen/code/src/java/pcgen/core/AssocStore.java 2008-10-03 01:31:47 UTC (rev 7879) @@ -1,39 +0,0 @@ -/* - * Copyright 2008 (C) Tom Parker <th...@us...> - * - * This library is free software; you can redistribute it and/or modify it under - * the terms of the GNU Lesser General Public License as published by the Free - * Software Foundation; either version 2.1 of the License, or (at your option) - * any later version. - * - * This library is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more - * details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this library; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package pcgen.core; - -import java.util.List; - -import pcgen.cdom.enumeration.AssociationKey; - -public interface AssocStore -{ - public <T> void addAssoc(Object obj, AssociationKey<T> ak, T o); - - public <T> void removeAssoc(Object obj, AssociationKey<T> ak, T o); - - public <T> List<T> removeAllAssocs(Object obj, AssociationKey<T> ak); - - public int getAssocCount(Object obj, AssociationKey<?> ak); - - public boolean hasAssocs(Object obj, AssociationKey<?> ak); - - public <T> List<T> getAssocList(Object obj, AssociationKey<T> ak); - - public <T> boolean containsAssoc(Object obj, AssociationKey<T> ak, T o); -} Modified: Trunk/pcgen/code/src/java/pcgen/core/AssociationSupport.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/AssociationSupport.java 2008-10-03 00:15:26 UTC (rev 7878) +++ Trunk/pcgen/code/src/java/pcgen/core/AssociationSupport.java 2008-10-03 01:31:47 UTC (rev 7879) @@ -20,46 +20,69 @@ import java.util.IdentityHashMap; import java.util.List; +import pcgen.base.util.DoubleKeyMap; import pcgen.base.util.DoubleKeyMapToList; import pcgen.cdom.enumeration.AssociationKey; +import pcgen.cdom.enumeration.AssociationListKey; -public class AssociationSupport implements AssocStore +public class AssociationSupport { - private final DoubleKeyMapToList assocMap = new DoubleKeyMapToList(IdentityHashMap.class, IdentityHashMap.class); + private final DoubleKeyMapToList assocMTL = new DoubleKeyMapToList(IdentityHashMap.class, IdentityHashMap.class); + private final DoubleKeyMap assocMap = new DoubleKeyMap(IdentityHashMap.class, IdentityHashMap.class); - public <T> void addAssoc(Object obj, AssociationKey<T> ak, T o) + public <T> void addAssoc(Object obj, AssociationListKey<T> ak, T o) { - assocMap.addToListFor(obj, ak, o); + assocMTL.addToListFor(obj, ak, o); } - public <T> void removeAssoc(Object obj, AssociationKey<T> ak, T o) + public <T> void removeAssoc(Object obj, AssociationListKey<T> ak, T o) { - assocMap.removeFromListFor(obj, ak, o); + assocMTL.removeFromListFor(obj, ak, o); } - public <T> List<T> removeAllAssocs(Object obj, AssociationKey<T> ak) + public <T> List<T> removeAllAssocs(Object obj, AssociationListKey<T> ak) { - return assocMap.removeListFor(obj, ak); + return assocMTL.removeListFor(obj, ak); } - public int getAssocCount(Object obj, AssociationKey<?> ak) + public int getAssocCount(Object obj, AssociationListKey<?> ak) { - return assocMap.sizeOfListFor(obj, ak); + return assocMTL.sizeOfListFor(obj, ak); } - public boolean hasAssocs(Object obj, AssociationKey<?> ak) + public boolean hasAssocs(Object obj, AssociationListKey<?> ak) { - return assocMap.containsListFor(obj, ak); + return assocMTL.containsListFor(obj, ak); } - public <T> List<T> getAssocList(Object obj, AssociationKey<T> ak) + public <T> List<T> getAssocList(Object obj, AssociationListKey<T> ak) { - return assocMap.getListFor(obj, ak); + return assocMTL.getListFor(obj, ak); } - public <T> boolean containsAssoc(Object obj, AssociationKey<T> ak, T o) + public <T> boolean containsAssoc(Object obj, AssociationListKey<T> ak, T o) { - return assocMap.containsInList(obj, ak, o); + return assocMTL.containsInList(obj, ak, o); } + + public <T> void setAssoc(Object obj, AssociationKey<T> ak, T o) + { + assocMap.put(obj, ak, o); + } + + public <T> void removeAssoc(Object obj, AssociationKey<T> ak) + { + assocMap.remove(obj, ak); + } + + public boolean hasAssocs(Object obj, AssociationKey<?> ak) + { + return assocMap.containsKey(obj, ak); + } + + public <T> T getAssoc(Object obj, AssociationKey<T> ak) + { + return (T) assocMap.get(obj, ak); + } } Modified: Trunk/pcgen/code/src/java/pcgen/core/Equipment.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Equipment.java 2008-10-03 00:15:26 UTC (rev 7878) +++ Trunk/pcgen/code/src/java/pcgen/core/Equipment.java 2008-10-03 01:31:47 UTC (rev 7879) @@ -46,7 +46,7 @@ import pcgen.base.util.FixedStringList; import pcgen.cdom.base.CDOMObject; import pcgen.cdom.base.Constants; -import pcgen.cdom.enumeration.AssociationKey; +import pcgen.cdom.enumeration.AssociationListKey; import pcgen.cdom.enumeration.EqModFormatCat; import pcgen.cdom.enumeration.FormulaKey; import pcgen.cdom.enumeration.IntegerKey; @@ -6047,22 +6047,22 @@ public void addAssociation(CDOMObject obj, String o) { - assocSupt.addAssoc(obj, AssociationKey.CHOICES, new FixedStringList(o)); + assocSupt.addAssoc(obj, AssociationListKey.CHOICES, new FixedStringList(o)); } public void addAssociation(CDOMObject obj, FixedStringList o) { - assocSupt.addAssoc(obj, AssociationKey.CHOICES, o); + assocSupt.addAssoc(obj, AssociationListKey.CHOICES, o); } public boolean containsAssociated(CDOMObject obj, String o) { - return assocSupt.containsAssoc(obj, AssociationKey.CHOICES, new FixedStringList(o)); + return assocSupt.containsAssoc(obj, AssociationListKey.CHOICES, new FixedStringList(o)); } public boolean containsAssociated(CDOMObject obj, FixedStringList o) { - return assocSupt.containsAssoc(obj, AssociationKey.CHOICES, o); + return assocSupt.containsAssoc(obj, AssociationListKey.CHOICES, o); } public int getSelectCorrectedAssociationCount(CDOMObject obj) @@ -6070,14 +6070,14 @@ //TODO Null here is probably a problem for the PC :/ int select = obj.getSafe(FormulaKey.SELECT).resolve(this, true, null, "").intValue(); - return assocSupt.getAssocCount(obj, AssociationKey.CHOICES) / select; + return assocSupt.getAssocCount(obj, AssociationListKey.CHOICES) / select; } public List<String> getAssociationList(CDOMObject obj) { List<String> list = new ArrayList<String>(); List<FixedStringList> assocList = assocSupt.getAssocList(obj, - AssociationKey.CHOICES); + AssociationListKey.CHOICES); if (assocList != null) { for (FixedStringList ac : assocList) @@ -6098,30 +6098,30 @@ public boolean hasAssociations(CDOMObject obj) { - return assocSupt.hasAssocs(obj, AssociationKey.CHOICES); + return assocSupt.hasAssocs(obj, AssociationListKey.CHOICES); } public List<String> removeAllAssociations(CDOMObject obj) { List<String> list = getAssociationList(obj); - assocSupt.removeAllAssocs(obj, AssociationKey.CHOICES); + assocSupt.removeAllAssocs(obj, AssociationListKey.CHOICES); return list; } public void removeAssociation(CDOMObject obj, String o) { - assocSupt.removeAssoc(obj, AssociationKey.CHOICES, new FixedStringList(o)); + assocSupt.removeAssoc(obj, AssociationListKey.CHOICES, new FixedStringList(o)); } public void removeAssociation(CDOMObject obj, FixedStringList o) { - assocSupt.removeAssoc(obj, AssociationKey.CHOICES, o); + assocSupt.removeAssoc(obj, AssociationListKey.CHOICES, o); } public int getDetailedAssociationCount(CDOMObject obj) { List<FixedStringList> assocs = assocSupt.getAssocList(obj, - AssociationKey.CHOICES); + AssociationListKey.CHOICES); int count = 0; if (assocs != null) { @@ -6135,13 +6135,13 @@ public List<FixedStringList> getDetailedAssociations(CDOMObject obj) { - return assocSupt.getAssocList(obj, AssociationKey.CHOICES); + return assocSupt.getAssocList(obj, AssociationListKey.CHOICES); } public List<String> getExpandedAssociations(CDOMObject obj) { List<FixedStringList> assocs = assocSupt.getAssocList(obj, - AssociationKey.CHOICES); + AssociationListKey.CHOICES); List<String> list = new ArrayList<String>(); if (assocs != null) { @@ -6158,7 +6158,7 @@ public String getFirstAssociation(CDOMObject obj) { - return assocSupt.getAssocList(obj, AssociationKey.CHOICES).get(0).get(0); + return assocSupt.getAssocList(obj, AssociationListKey.CHOICES).get(0).get(0); } /** Map of the bonuses for the object */ Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-10-03 00:15:26 UTC (rev 7878) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-10-03 01:31:47 UTC (rev 7879) @@ -69,6 +69,7 @@ import pcgen.cdom.content.LevelCommandFactory; import pcgen.cdom.content.Modifier; import pcgen.cdom.enumeration.AssociationKey; +import pcgen.cdom.enumeration.AssociationListKey; import pcgen.cdom.enumeration.FormulaKey; import pcgen.cdom.enumeration.Gender; import pcgen.cdom.enumeration.IntegerKey; @@ -91,8 +92,8 @@ import pcgen.core.Ability.Nature; import pcgen.core.analysis.DomainApplication; import pcgen.core.analysis.RaceStat; +import pcgen.core.analysis.SkillRankControl; import pcgen.core.analysis.SpecialAbilityResolution; -import pcgen.core.analysis.SkillRankControl; import pcgen.core.analysis.TemplateSR; import pcgen.core.analysis.TemplateSelect; import pcgen.core.analysis.TemplateStat; @@ -2988,6 +2989,7 @@ public ArrayList<Skill> getSkillListInOutputOrder( final ArrayList<Skill> sortedList) { + final PlayerCharacter pc = this; Collections.sort(sortedList, new Comparator<Skill>() { /** @@ -2995,16 +2997,16 @@ */ public int compare(final Skill skill1, final Skill skill2) { - int obj1Index = skill1.getOutputIndex(); - int obj2Index = skill2.getOutputIndex(); + Integer obj1Index = pc.getAssoc(skill1, AssociationKey.OUTPUT_INDEX); + Integer obj2Index = pc.getAssoc(skill2, AssociationKey.OUTPUT_INDEX); // Force unset items (index of 0) to appear at the end - if (obj1Index == 0) + if (obj1Index == null || obj1Index == 0) { obj1Index = 999; } - if (obj2Index == 0) + if (obj2Index == null || obj2Index == 0) { obj2Index = 999; } @@ -3031,7 +3033,8 @@ final Skill bSkill = i.next(); Visibility skVis = bSkill.getSafe(ObjectKey.VISIBILITY); - if (bSkill.getOutputIndex() == -1 + Integer outputIndex = this.getAssoc(bSkill, AssociationKey.OUTPUT_INDEX); + if (outputIndex != null && outputIndex == -1 || skVis.equals(Visibility.HIDDEN) || skVis.equals(Visibility.DISPLAY_ONLY)) { @@ -3073,7 +3076,7 @@ final List<Skill> skillList = new ArrayList<Skill>(getSkillList()); for (Skill aSkill : skillList) { - List<NamedValue> rankList = getAssocList(aSkill, AssociationKey.SKILL_RANK); + List<NamedValue> rankList = getAssocList(aSkill, AssociationListKey.SKILL_RANK); if (rankList != null) { for (NamedValue sd : rankList) @@ -10614,9 +10617,10 @@ for (Skill skill : localSkillList) { - if (skill.getOutputIndex() >= 0) + Integer outputIndex = this.getAssoc(skill, AssociationKey.OUTPUT_INDEX); + if (outputIndex == null || outputIndex >= 0) { - skill.setOutputIndex(nextOutputIndex++); + this.setAssoc(skill, AssociationKey.OUTPUT_INDEX, nextOutputIndex++); } } } @@ -17899,27 +17903,27 @@ public void addAssociation(CDOMObject obj, String o) { - assocSupt.addAssoc(obj, AssociationKey.CHOICES, new FixedStringList(o)); + assocSupt.addAssoc(obj, AssociationListKey.CHOICES, new FixedStringList(o)); } public void addAssociation(CDOMObject obj, FixedStringList o) { - assocSupt.addAssoc(obj, AssociationKey.CHOICES, o); + assocSupt.addAssoc(obj, AssociationListKey.CHOICES, o); } public boolean containsAssociated(CDOMObject obj, String o) { - return assocSupt.containsAssoc(obj, AssociationKey.CHOICES, new FixedStringList(o)); + return assocSupt.containsAssoc(obj, AssociationListKey.CHOICES, new FixedStringList(o)); } public boolean containsAssociated(CDOMObject obj, FixedStringList o) { - return assocSupt.containsAssoc(obj, AssociationKey.CHOICES, o); + return assocSupt.containsAssoc(obj, AssociationListKey.CHOICES, o); } public int getSelectCorrectedAssociationCount(CDOMObject obj) { - return assocSupt.getAssocCount(obj, AssociationKey.CHOICES) + return assocSupt.getAssocCount(obj, AssociationListKey.CHOICES) / obj.getSafe(FormulaKey.SELECT).resolve(this, "").intValue(); } @@ -17927,7 +17931,7 @@ { List<String> list = new ArrayList<String>(); List<FixedStringList> assocList = assocSupt.getAssocList(obj, - AssociationKey.CHOICES); + AssociationListKey.CHOICES); if (assocList != null) { for (FixedStringList ac : assocList) @@ -17948,30 +17952,30 @@ public boolean hasAssociations(CDOMObject obj) { - return assocSupt.hasAssocs(obj, AssociationKey.CHOICES); + return assocSupt.hasAssocs(obj, AssociationListKey.CHOICES); } public List<String> removeAllAssociations(CDOMObject obj) { List<String> list = getAssociationList(obj); - assocSupt.removeAllAssocs(obj, AssociationKey.CHOICES); + assocSupt.removeAllAssocs(obj, AssociationListKey.CHOICES); return list; } public void removeAssociation(CDOMObject obj, String o) { - assocSupt.removeAssoc(obj, AssociationKey.CHOICES, new FixedStringList(o)); + assocSupt.removeAssoc(obj, AssociationListKey.CHOICES, new FixedStringList(o)); } public void removeAssociation(CDOMObject obj, FixedStringList o) { - assocSupt.removeAssoc(obj, AssociationKey.CHOICES, o); + assocSupt.removeAssoc(obj, AssociationListKey.CHOICES, o); } public int getDetailedAssociationCount(CDOMObject obj) { List<FixedStringList> assocs = assocSupt.getAssocList(obj, - AssociationKey.CHOICES); + AssociationListKey.CHOICES); int count = 0; if (assocs != null) { @@ -17985,13 +17989,13 @@ public List<FixedStringList> getDetailedAssociations(CDOMObject obj) { - return assocSupt.getAssocList(obj, AssociationKey.CHOICES); + return assocSupt.getAssocList(obj, AssociationListKey.CHOICES); } public List<String> getExpandedAssociations(CDOMObject obj) { List<FixedStringList> assocs = assocSupt.getAssocList(obj, - AssociationKey.CHOICES); + AssociationListKey.CHOICES); List<String> list = new ArrayList<String>(); if (assocs != null) { @@ -18008,44 +18012,64 @@ public String getFirstAssociation(CDOMObject obj) { - return assocSupt.getAssocList(obj, AssociationKey.CHOICES).get(0).get(0); + return assocSupt.getAssocList(obj, AssociationListKey.CHOICES).get(0).get(0); } - public <T> void addAssoc(Object obj, AssociationKey<T> ak, T o) + public <T> void addAssoc(Object obj, AssociationListKey<T> ak, T o) { assocSupt.addAssoc(obj, ak, o); } - public <T> boolean containsAssoc(Object obj, AssociationKey<T> ak, T o) + public <T> boolean containsAssoc(Object obj, AssociationListKey<T> ak, T o) { return assocSupt.containsAssoc(obj, ak, o); } - public int getAssocCount(Object obj, AssociationKey<?> ak) + public int getAssocCount(Object obj, AssociationListKey<?> ak) { return assocSupt.getAssocCount(obj, ak); } - public <T> List<T> getAssocList(Object obj, AssociationKey<T> ak) + public <T> List<T> getAssocList(Object obj, AssociationListKey<T> ak) { return assocSupt.getAssocList(obj, ak); } - public boolean hasAssocs(Object obj, AssociationKey<?> ak) + public boolean hasAssocs(Object obj, AssociationListKey<?> ak) { return assocSupt.hasAssocs(obj, ak); } - public <T> List<T> removeAllAssocs(Object obj, AssociationKey<T> ak) + public <T> List<T> removeAllAssocs(Object obj, AssociationListKey<T> ak) { return assocSupt.removeAllAssocs(obj, ak); } - public <T> void removeAssoc(Object obj, AssociationKey<T> ak, T o) + public <T> void removeAssoc(Object obj, AssociationListKey<T> ak, T o) { assocSupt.removeAssoc(obj, ak, o); } + public <T> T getAssoc(Object obj, AssociationKey<T> ak) + { + return assocSupt.getAssoc(obj, ak); + } + + public boolean hasAssocs(Object obj, AssociationKey<?> ak) + { + return assocSupt.hasAssocs(obj, ak); + } + + public <T> void removeAssoc(Object obj, AssociationKey<T> ak) + { + assocSupt.removeAssoc(obj, ak); + } + + public <T> void setAssoc(Object obj, AssociationKey<T> ak, T o) + { + assocSupt.setAssoc(obj, ak, 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-10-03 00:15:26 UTC (rev 7878) +++ Trunk/pcgen/code/src/java/pcgen/core/Skill.java 2008-10-03 01:31:47 UTC (rev 7879) @@ -47,7 +47,6 @@ */ public final class Skill extends PObject { - private int outputIndex = 0; /** Constructor */ public Skill() @@ -56,34 +55,6 @@ } /** - * Set this skill's output index, which controls the order - * in which the skills appear on a character sheet. - * Note: -1 means hidden and 0 means nto set - * - * <br>author: James Dempsey 14-Jun-02 - * - * @param newIndex the new output index for this skill (-1=hidden, 0=not set) - */ - public void setOutputIndex(final int newIndex) - { - outputIndex = newIndex; - } - - /** - * Return the output index, which controls the order in which the skills - * appear on a character sheet Note: -1 means hidden and 0 means nto set - * - * <br> - * author: James Dempsey 14-Jun-02 - * - * @return the output index for this skill (-1=hidden, 0=not set) - */ - public int getOutputIndex() - { - return outputIndex; - } - - /** * Get a count of the sub types * * @return count of sub types @@ -132,7 +103,6 @@ try { newSkill = (Skill) super.clone(); - newSkill.outputIndex = outputIndex; } catch (CloneNotSupportedException exc) { Modified: Trunk/pcgen/code/src/java/pcgen/core/analysis/SkillRankControl.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/analysis/SkillRankControl.java 2008-10-03 00:15:26 UTC (rev 7878) +++ Trunk/pcgen/code/src/java/pcgen/core/analysis/SkillRankControl.java 2008-10-03 01:31:47 UTC (rev 7879) @@ -23,7 +23,7 @@ import pcgen.base.lang.StringUtil; import pcgen.base.util.NamedValue; -import pcgen.cdom.enumeration.AssociationKey; +import pcgen.cdom.enumeration.AssociationListKey; import pcgen.cdom.enumeration.SkillCost; import pcgen.core.Globals; import pcgen.core.PCClass; @@ -46,7 +46,7 @@ { double rank = 0.0; - List<NamedValue> rankList = pc.getAssocList(sk, AssociationKey.SKILL_RANK); + List<NamedValue> rankList = pc.getAssocList(sk, AssociationListKey.SKILL_RANK); if (rankList != null) { for (NamedValue sd : rankList) @@ -97,7 +97,7 @@ } String aCName = aClass.getKeyName(); - List<NamedValue> rankList = aPC.getAssocList(sk, AssociationKey.SKILL_RANK); + List<NamedValue> rankList = aPC.getAssocList(sk, AssociationListKey.SKILL_RANK); if (rankList == null) { return; @@ -106,7 +106,7 @@ { if (nv.name.equals(aCName)) { - aPC.removeAssoc(sk, AssociationKey.SKILL_RANK, nv); + aPC.removeAssoc(sk, AssociationListKey.SKILL_RANK, nv); double curRankCost = nv.getWeight(); String aResp = modRanks(-curRankCost, aClass, false, aPC, sk); @@ -210,7 +210,7 @@ double currentRank = 0.0; double noneRank = 0.0; NamedValue active = null; - List<NamedValue> rankList = aPC.getAssocList(sk, AssociationKey.SKILL_RANK); + List<NamedValue> rankList = aPC.getAssocList(sk, AssociationListKey.SKILL_RANK); if (rankList != null) { for (NamedValue nv : rankList) @@ -258,15 +258,15 @@ public static void replaceClassRank(PlayerCharacter pc, Skill sk, String oldClass, String newClass) { - List<NamedValue> rankList = pc.getAssocList(sk, AssociationKey.SKILL_RANK); + List<NamedValue> rankList = pc.getAssocList(sk, AssociationListKey.SKILL_RANK); if (rankList != null) { for (NamedValue nv : rankList) { if (nv.name.equals(oldClass)) { - pc.removeAssoc(sk, AssociationKey.SKILL_RANK, nv); - pc.addAssoc(sk, AssociationKey.SKILL_RANK, new NamedValue( + pc.removeAssoc(sk, AssociationListKey.SKILL_RANK, nv); + pc.addAssoc(sk, AssociationListKey.SKILL_RANK, new NamedValue( newClass, nv.getWeight())); break; } @@ -315,7 +315,7 @@ // if (CoreUtility.doublesEqual(newRank, 0.0)) { - aPC.removeAssoc(sk, AssociationKey.SKILL_RANK, active); + aPC.removeAssoc(sk, AssociationListKey.SKILL_RANK, active); } else if (active != null) { @@ -323,7 +323,7 @@ } else { - aPC.addAssoc(sk, AssociationKey.SKILL_RANK, new NamedValue( + aPC.addAssoc(sk, AssociationListKey.SKILL_RANK, new NamedValue( classKey, g)); } @@ -334,7 +334,7 @@ public static String getRanksExplanation(PlayerCharacter pc, Skill sk) { - return StringUtil.join(pc.getAssocList(sk, AssociationKey.SKILL_RANK), + return StringUtil.join(pc.getAssocList(sk, AssociationListKey.SKILL_RANK), ", "); } Modified: Trunk/pcgen/code/src/java/pcgen/core/npcgen/ClassData.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/npcgen/ClassData.java 2008-10-03 00:15:26 UTC (rev 7878) +++ Trunk/pcgen/code/src/java/pcgen/core/npcgen/ClassData.java 2008-10-03 01:31:47 UTC (rev 7879) @@ -387,8 +387,7 @@ final PCClass pcClass = Globals.getContext().ref.silentlyGetConstructedCDOMObject(PCClass.class, theClassKey); if (pcClass != null) { - final List<SubClass> subClasses = pcClass.getSubClassList(); - for ( final SubClass subClass : subClasses ) + for ( final SubClass subClass : pcClass.getSubClassList() ) { addSubClass( subClass.getKeyName(), 1 ); } Modified: Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoSkills.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoSkills.java 2008-10-03 00:15:26 UTC (rev 7878) +++ Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoSkills.java 2008-10-03 01:31:47 UTC (rev 7879) @@ -99,6 +99,7 @@ import pcgen.base.lang.StringUtil; import pcgen.cdom.base.Constants; +import pcgen.cdom.enumeration.AssociationKey; import pcgen.cdom.enumeration.ObjectKey; import pcgen.cdom.enumeration.SkillCost; import pcgen.core.GameMode; @@ -390,11 +391,16 @@ public static SkillWrapper createSkillWrapper(boolean available, Skill skill, PlayerCharacter pc) { + Integer outputIndex = pc.getAssoc(skill, AssociationKey.OUTPUT_INDEX); + if (outputIndex == null) + { + outputIndex = Integer.valueOf(0); + } return available ? new SkillWrapper(skill, Integer.valueOf(0), new Float(0), Integer.valueOf(0), PrereqHandler.passesAll(skill.getPrerequisiteList(), pc, skill)) : new SkillWrapper(skill, SkillModifier.modifier(skill, pc), SkillRankControl.getTotalRank(pc, skill), - Integer.valueOf(skill.getOutputIndex()), + outputIndex, PrereqHandler.passesAll(skill.getPrerequisiteList(), pc, skill)); } @@ -538,9 +544,10 @@ final List<Skill> skillList = new ArrayList<Skill>(pc.getSkillList()); for (Skill bSkill : skillList) { - if (bSkill.getOutputIndex() > maxOutputIndex) + Integer outputIndex = pc.getAssoc(bSkill, AssociationKey.OUTPUT_INDEX); + if (outputIndex != null && outputIndex > maxOutputIndex) { - maxOutputIndex = bSkill.getOutputIndex(); + maxOutputIndex = outputIndex; } } @@ -1926,9 +1933,10 @@ } else { - if (bSkill.getOutputIndex() == 0) + Integer outputIndex = pc.getAssoc(bSkill, AssociationKey.OUTPUT_INDEX); + if (outputIndex == null || outputIndex == 0) { - bSkill.setOutputIndex(getHighestOutputIndex() + 1); + pc.setAssoc(bSkill, AssociationKey.OUTPUT_INDEX, getHighestOutputIndex() + 1); } } } @@ -2056,9 +2064,10 @@ for (Skill aSkill : skillList) { - if (aSkill.getOutputIndex() >= 0) + Integer outputIndex = pc.getAssoc(aSkill, AssociationKey.OUTPUT_INDEX); + if (outputIndex == null || outputIndex >= 0) { - aSkill.setOutputIndex(nextOutputIndex++); + pc.setAssoc(aSkill, AssociationKey.OUTPUT_INDEX, nextOutputIndex++); } } @@ -2964,6 +2973,11 @@ if (aSkill != null) { + Integer outi = pc.getAssoc(aSkill, AssociationKey.OUTPUT_INDEX); + if (outi == null) + { + outi = Integer.valueOf(0); + } switch (column) { case 5: @@ -2983,10 +2997,10 @@ for (Skill bSkill : pc.getSkillListInOutputOrder()) { - if ((bSkill.getOutputIndex() > -1) - && (bSkill != aSkill)) + Integer oi = pc.getAssoc(bSkill, AssociationKey.OUTPUT_INDEX); + if ((oi == null || oi > -1) && (bSkill != aSkill)) { - bSkill.setOutputIndex(outputIndex++); + pc.setAssoc(bSkill, AssociationKey.OUTPUT_INDEX, outputIndex++); } } @@ -3006,19 +3020,19 @@ workingIndex++; } - if ((bSkill.getOutputIndex() > -1) - && (bSkill != aSkill)) + Integer oi = pc.getAssoc(bSkill, AssociationKey.OUTPUT_INDEX); + if ((oi == null || oi > -1) && (bSkill != aSkill)) { - bSkill.setOutputIndex(workingIndex++); + pc.setAssoc(bSkill, AssociationKey.OUTPUT_INDEX, workingIndex++); } } } - aSkill.setOutputIndex(outputIndex); + pc.setAssoc(aSkill, AssociationKey.OUTPUT_INDEX, outputIndex); skillA = new SkillWrapper(aSkill, SkillModifier.modifier(aSkill, pc), SkillRankControl.getTotalRank(pc, aSkill), - Integer.valueOf(aSkill.getOutputIndex()), + outi, PrereqHandler.passesAll(aSkill.getPrerequisiteList(), pc, aSkill)); fn.setItem(skillA); Modified: Trunk/pcgen/code/src/java/pcgen/io/PCGVer0Parser.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/PCGVer0Parser.java 2008-10-03 00:15:26 UTC (rev 7878) +++ Trunk/pcgen/code/src/java/pcgen/io/PCGVer0Parser.java 2008-10-03 01:31:47 UTC (rev 7879) @@ -33,6 +33,7 @@ import java.util.StringTokenizer; import pcgen.cdom.base.Constants; +import pcgen.cdom.enumeration.AssociationKey; import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; import pcgen.cdom.list.CompanionList; @@ -1943,7 +1944,7 @@ } } - aSkill.setOutputIndex(outputIndex.intValue()); + aPC.setAssoc(aSkill, AssociationKey.OUTPUT_INDEX, outputIndex.intValue()); } else { Modified: Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Creator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Creator.java 2008-10-03 00:15:26 UTC (rev 7878) +++ Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Creator.java 2008-10-03 01:31:47 UTC (rev 7879) @@ -45,6 +45,7 @@ import pcgen.cdom.base.Constants; import pcgen.cdom.base.TransitionChoice; import pcgen.cdom.enumeration.AssociationKey; +import pcgen.cdom.enumeration.AssociationListKey; import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; import pcgen.cdom.list.ClassSpellList; @@ -1949,18 +1950,19 @@ new ArrayList<Skill>(thePC.getSkillList()); for (Skill skill : skillList) { + Integer outputIndex = thePC.getAssoc(skill, AssociationKey.OUTPUT_INDEX); if ((SkillRankControl.getRank(thePC, skill).doubleValue() > 0) - || (skill.getOutputIndex() != 0)) + || (outputIndex != null && outputIndex != 0)) { buffer.append(TAG_SKILL).append(':'); buffer.append(EntityEncoder.encode(skill.getKeyName())); buffer.append('|'); buffer.append(TAG_OUTPUTORDER).append(':'); - buffer.append(skill.getOutputIndex()); + buffer.append(outputIndex == null ? 0 : outputIndex); buffer.append('|'); - List<NamedValue> rankList = thePC.getAssocList(skill, AssociationKey.SKILL_RANK); + List<NamedValue> rankList = thePC.getAssocList(skill, AssociationListKey.SKILL_RANK); if (rankList != null) { for (NamedValue sd: rankList) @@ -2591,7 +2593,7 @@ } for (TransitionChoice<?> tc : addList) { - List<Object> assocList = thePC.getAssocList(tc, AssociationKey.ADD); + List<Object> assocList = thePC.getAssocList(tc, AssociationListKey.ADD); if (assocList == null) { continue; Modified: Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Parser.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Parser.java 2008-10-03 00:15:26 UTC (rev 7878) +++ Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Parser.java 2008-10-03 01:31:47 UTC (rev 7879) @@ -41,6 +41,7 @@ import pcgen.cdom.base.TransitionChoice; import pcgen.cdom.content.LevelCommandFactory; import pcgen.cdom.enumeration.AssociationKey; +import pcgen.cdom.enumeration.AssociationListKey; import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; import pcgen.cdom.enumeration.StringKey; @@ -1819,7 +1820,7 @@ } else { - thePC.addAssoc(tc, AssociationKey.ADD, obj); + thePC.addAssoc(tc, AssociationListKey.ADD, obj); } } } @@ -3420,7 +3421,7 @@ // Maybe warn the user? } - aSkill.setOutputIndex(outputindex); + thePC.setAssoc(aSkill, AssociationKey.OUTPUT_INDEX, outputindex); } else if (TAG_CLASSBOUGHT.equals(tag)) { Modified: Trunk/pcgen/code/src/java/pcgen/io/exporttoken/SkillToken.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/exporttoken/SkillToken.java 2008-10-03 00:15:26 UTC (rev 7878) +++ Trunk/pcgen/code/src/java/pcgen/io/exporttoken/SkillToken.java 2008-10-03 01:31:47 UTC (rev 7879) @@ -23,6 +23,7 @@ */ package pcgen.io.exporttoken; +import java.util.ArrayList; import java.util.List; import java.util.StringTokenizer; Modified: Trunk/pcgen/code/src/java/pcgen/io/exporttoken/SkillpointsToken.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/exporttoken/SkillpointsToken.java 2008-10-03 00:15:26 UTC (rev 7878) +++ Trunk/pcgen/code/src/java/pcgen/io/exporttoken/SkillpointsToken.java 2008-10-03 01:31:47 UTC (rev 7879) @@ -32,6 +32,7 @@ import pcgen.base.util.NamedValue; import pcgen.cdom.enumeration.AssociationKey; +import pcgen.cdom.enumeration.AssociationListKey; import pcgen.core.PCClass; import pcgen.core.PlayerCharacter; import pcgen.core.Skill; @@ -182,7 +183,7 @@ for (Skill aSkill : skillList) { List<NamedValue> rankList = pc.getAssocList(aSkill, - AssociationKey.SKILL_RANK); + AssociationListKey.SKILL_RANK); if (rankList != null) { for (NamedValue sd : rankList) @@ -213,10 +214,11 @@ final List<Skill> skillList = new ArrayList<Skill>(pc.getSkillList()); for (Skill aSkill : skillList) { + Integer outputIndex = pc.getAssoc(aSkill, AssociationKey.OUTPUT_INDEX); if ((SkillRankControl.getRank(pc, aSkill).doubleValue() > 0) - || (aSkill.getOutputIndex() != 0)) + || (outputIndex != null && outputIndex != 0)) { - for (NamedValue sd : pc.getAssocList(aSkill, AssociationKey.SKILL_RANK)) + for (NamedValue sd : pc.getAssocList(aSkill, AssociationListKey.SKILL_RANK)) { PCClass pcClass = pc.getClassKeyed(sd.name); if (targetClass == pcClass) Modified: Trunk/pcgen/code/src/test/pcgen/io/ExportHandlerTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/io/ExportHandlerTest.java 2008-10-03 00:15:26 UTC (rev 7878) +++ Trunk/pcgen/code/src/test/pcgen/io/ExportHandlerTest.java 2008-10-03 01:31:47 UTC (rev 7879) @@ -35,6 +35,7 @@ import junit.framework.TestSuite; import pcgen.AbstractCharacterTestCase; import pcgen.cdom.base.FormulaFactory; +import pcgen.cdom.enumeration.AssociationKey; import pcgen.cdom.enumeration.FormulaKey; import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; @@ -144,7 +145,7 @@ knowledge[0].setName("KNOWLEDGE (ARCANA)"); knowledge[0].setTypeInfo("KNOWLEDGE.INT"); knowledge[0].put(ObjectKey.KEY_STAT, intStat); - knowledge[0].setOutputIndex(2); + character.setAssoc(knowledge[0], AssociationKey.OUTPUT_INDEX, 2); Globals.getContext().ref.importObject(knowledge[0]); Skill ks0 = character.addSkill(knowledge[0]); SkillRankControl.modRanks(8.0, myClass, true, character, ks0); @@ -154,7 +155,7 @@ knowledge[1].setName("KNOWLEDGE (RELIGION)"); knowledge[1].setTypeInfo("KNOWLEDGE.INT"); knowledge[1].put(ObjectKey.KEY_STAT, intStat); - knowledge[1].setOutputIndex(3); + character.setAssoc(knowledge[1], AssociationKey.OUTPUT_INDEX, 3); Globals.getContext().ref.importObject(knowledge[1]); Skill ks1 = character.addSkill(knowledge[1]); SkillRankControl.modRanks(5.0, myClass, true, character, ks1); @@ -164,7 +165,7 @@ tumble.setName("Tumble"); tumble.setTypeInfo("DEX"); tumble.put(ObjectKey.KEY_STAT, dexStat); - tumble.setOutputIndex(4); + character.setAssoc(tumble, AssociationKey.OUTPUT_INDEX, 4); Globals.getContext().ref.importObject(tumble); Skill ts = character.addSkill(tumble); SkillRankControl.modRanks(7.0, myClass, true, character, ts); @@ -174,7 +175,7 @@ balance.setName("Balance"); balance.setTypeInfo("DEX"); balance.put(ObjectKey.KEY_STAT, dexStat); - balance.setOutputIndex(1); + character.setAssoc(balance, AssociationKey.OUTPUT_INDEX, 1); balance .addBonusList("SKILL|Balance|2|PRESKILL:1,Tumble=5|TYPE=Synergy.STACK"); Globals.getContext().ref.importObject(balance); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-10-03 20:45:45
|
Revision: 7891 http://pcgen.svn.sourceforge.net/pcgen/?rev=7891&view=rev Author: thpr Date: 2008-10-03 20:45:40 +0000 (Fri, 03 Oct 2008) Log Message: ----------- convert spell list choice, skill list choice and spell key cache to associations Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/AssociationKey.java Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/AssociationListKey.java Trunk/pcgen/code/src/java/pcgen/core/Domain.java Trunk/pcgen/code/src/java/pcgen/core/PCClass.java Trunk/pcgen/code/src/java/pcgen/core/PObject.java Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java Trunk/pcgen/code/src/java/pcgen/core/SpellSupport.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/kit/KitClass.java Trunk/pcgen/code/src/java/pcgen/core/kit/KitSpells.java Trunk/pcgen/code/src/java/pcgen/core/npcgen/NPCGenerator.java Trunk/pcgen/code/src/java/pcgen/gui/tabs/spells/InfoSpellsSubTab.java Trunk/pcgen/code/src/java/pcgen/gui/tabs/spells/SpellModel.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/test/pcgen/core/prereq/PreSubClassTest.java Modified: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/AssociationKey.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/AssociationKey.java 2008-10-03 20:05:46 UTC (rev 7890) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/AssociationKey.java 2008-10-03 20:45:40 UTC (rev 7891) @@ -69,6 +69,8 @@ public static final AssociationKey<Integer> OUTPUT_INDEX = new AssociationKey<Integer>(); + public static final AssociationKey<String> SPELL_KEY_CACHE = new AssociationKey<String>(); + private static CaseInsensitiveMap<AssociationKey<?>> map = null; private AssociationKey() Modified: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/AssociationListKey.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/AssociationListKey.java 2008-10-03 20:05:46 UTC (rev 7890) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/AssociationListKey.java 2008-10-03 20:45:40 UTC (rev 7891) @@ -30,6 +30,9 @@ import pcgen.base.util.CaseInsensitiveMap; import pcgen.base.util.FixedStringList; import pcgen.base.util.NamedValue; +import pcgen.cdom.base.CDOMListObject; +import pcgen.cdom.list.ClassSkillList; +import pcgen.core.spell.Spell; /** * @author Tom Parker <th...@us...> @@ -57,6 +60,10 @@ public static final AssociationListKey<NamedValue> SKILL_RANK = new AssociationListKey<NamedValue>(); + public static final AssociationListKey<ClassSkillList> CLASSSKILLLIST = new AssociationListKey<ClassSkillList>(); + + public static final AssociationListKey<CDOMListObject<Spell>> CLASSSPELLLIST = new AssociationListKey<CDOMListObject<Spell>>(); + private static CaseInsensitiveMap<AssociationListKey<?>> map = null; private AssociationListKey() Modified: Trunk/pcgen/code/src/java/pcgen/core/Domain.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Domain.java 2008-10-03 20:05:46 UTC (rev 7890) +++ Trunk/pcgen/code/src/java/pcgen/core/Domain.java 2008-10-03 20:45:40 UTC (rev 7891) @@ -38,7 +38,7 @@ public final class Domain extends PObject { @Override - public String getSpellKey() + public String getSpellKey(PlayerCharacter pc) { return "DOMAIN|" + keyName; } Modified: Trunk/pcgen/code/src/java/pcgen/core/PCClass.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-10-03 20:05:46 UTC (rev 7890) +++ Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-10-03 20:45:40 UTC (rev 7891) @@ -50,6 +50,8 @@ import pcgen.cdom.content.LevelCommandFactory; import pcgen.cdom.content.LevelExchange; import pcgen.cdom.content.Modifier; +import pcgen.cdom.enumeration.AssociationKey; +import pcgen.cdom.enumeration.AssociationListKey; import pcgen.cdom.enumeration.FormulaKey; import pcgen.cdom.enumeration.IntegerKey; import pcgen.cdom.enumeration.ListKey; @@ -146,30 +148,6 @@ private int skillPool = 0; /* - * FUTURETYPESAFETY Dependent upon classSkillChoices being type safe, which - * in turn is dependent on the Chooser system being type safe :/ - */ - /* - * FINALPCCLASSLEVELONLY - * FINALALLCLASSLEVELS classSkillList is part of PCClassLevel (they are the - * selections the character takes at a given level) - triggered by - * addLevel - */ - private List<ClassSkillList> classSkillList = null; - - /* - * FUTURETYPESAFETY Dependent upon classSpellChoices being type safe, which - * in turn is dependent on the Chooser system being type safe :/ - */ - /* - * FINALPCCLASSLEVELONLY - * FINALALLCLASSLEVELS classSpellList is part of PCClassLevel (they are the - * selections the character takes at a given level) - triggered by - * addLevel - */ - private List<CDOMListObject<Spell>> classSpellList = null; - - /* * TYPESAFETY This should be working with Skill objects, not Strings */ /* @@ -206,15 +184,6 @@ private List<String> prohibitedSchools = null; /* - * PCCLASSLEVELONLY Since this is not part of a tag and is related to how - * spells are related to a PCClassLevel - * - * Actually, I may want to DELETEVARIABLE - this is really a cache, and - * need to consider how valuable it is to have a cache vs. not have it. - */ - private String stableSpellKey = null; - - /* * ALLCLASSLEVELS This goes into each PCClassLevel from PCClass in order to * store what the sublevel actually is. This is NOT set by a tag, so it is * PCCLASSLEVELONLY @@ -695,9 +664,9 @@ * FINALPCCLASSLEVELONLY This is only part of the level, as the spell list is * calculated based on other factors, it is not a Tag */ - public final List<CDOMListObject<Spell>> getClassSpellList() + public final List<CDOMListObject<Spell>> getClassSpellList(PlayerCharacter pc) { - return classSpellList; + return pc.getAssocList(this, AssociationListKey.CLASSSPELLLIST); } /* @@ -989,17 +958,23 @@ * calculated based on other factors, it is not a Tag */ @Override - public String getSpellKey() + public String getSpellKey(PlayerCharacter pc) { + String stableSpellKey = pc.getAssoc(this, AssociationKey.SPELL_KEY_CACHE); if (stableSpellKey != null) { return stableSpellKey; } + List<CDOMListObject<Spell>> classSpellList = pc.getAssocList(this, + AssociationListKey.CLASSSPELLLIST); if (classSpellList == null) { - chooseClassSpellList(); + chooseClassSpellList(pc); + classSpellList = pc.getAssocList(this, + AssociationListKey.CLASSSPELLLIST); + if (classSpellList == null) { stableSpellKey = "CLASS" + Constants.PIPE + keyName; @@ -1374,7 +1349,7 @@ * the PCClassLevel (called during construction) this is only required * in the level objects, not PCClass */ - public void setSubClassKey(final String aKey) + public void setSubClassKey(PlayerCharacter pc, final String aKey) { subClassKey = aKey; @@ -1388,8 +1363,8 @@ } } - stableSpellKey = null; - getSpellKey(); + pc.removeAssoc(this, AssociationKey.SPELL_KEY_CACHE); + getSpellKey(pc); } /* @@ -1587,7 +1562,7 @@ } } - chooseClassSkillList(); + chooseClassSkillList(aPC); } if (!aPC.isImporting()) @@ -1599,7 +1574,7 @@ if ((level == 1) && !aPC.isImporting() && (curLevel == 0)) { checkForSubClass(aPC); - getSpellKey(); + getSpellKey(aPC); } if (!aPC.isImporting() && (curLevel < level)) @@ -1630,7 +1605,7 @@ */ protected void removeKnownSpellsForClassLevel(final PlayerCharacter aPC) { - final String spellKey = getSpellKey(); + final String spellKey = getSpellKey(aPC); if (!containsListFor(ListKey.KNOWN_SPELLS) || aPC.isImporting() || !aPC.getAutoSpells()) @@ -1689,7 +1664,7 @@ { // Get every spell that can be cast by this class. final List<Spell> cspelllist = - Globals.getSpellsIn(-1, getSpellKey(), + Globals.getSpellsIn(-1, getSpellKey(aPC), Constants.EMPTY_STRING); if (cspelllist.isEmpty()) { @@ -1704,7 +1679,7 @@ final int _maxLevel = getMaxCastLevel(); // Get the key for this class (i.e. "CLASS|Cleric") - final String spellKey = getSpellKey(); + final String spellKey = getSpellKey(aPC); // For every spell that this class can ever cast. for (Spell spell : cspelllist) @@ -2052,61 +2027,22 @@ } /* - * FINALPCCLASSLEVELONLY This is only part of the level, as the skill list is - * calculated based on other factors, it is not a Tag - */ - public void addClassSkill(ClassSkillList csl) - { - if (classSkillList == null) - { - classSkillList = new ArrayList<ClassSkillList>(); - } - classSkillList.add(csl); - } - - /* - * FINALPCCLASSLEVELONLY This is only part of the level, as the skill list is - * calculated based on other factors, it is not a Tag - */ - public void clearClassSkillList() - { - classSkillList = null; - } - - /* * FINALPCCLASSLEVELONLY This is only part of the level, as the spell list is * calculated based on other factors, it is not a Tag */ - public void addClassSpellList(CDOMListObject<Spell> list) + public void addClassSpellList(CDOMListObject<Spell> list, PlayerCharacter pc) { - if (classSpellList == null) - { - classSpellList = new ArrayList<CDOMListObject<Spell>>(); - } - classSpellList.add(list); - /* - * CONSIDER I have taken out classSpellString = null; which is now the - * equivalent of classSpellChoices = null; ... I don't understand why in - * this unique situation of Player Character Import that resetting this - * produces better behavior than adding a class (which doesn't delete - * the list). Seems to me a case of unnecessary (and confusing) - * deletion... - thpr 10/29/06 - */ - /* - * CONSIDER This is a confusing side-effect - this really needs to be - * identified better as a cached variable (transient) so that it is - * recognized that this is simply making a 'cache' dirty - thpr 11/4/06 - */ - stableSpellKey = null; + pc.addAssoc(this, AssociationListKey.CLASSSPELLLIST, list); + pc.removeAssoc(this, AssociationKey.SPELL_KEY_CACHE); } /* * FINALPCCLASSLEVELONLY This is only part of the level, as the spell list is * calculated based on other factors, it is not a Tag */ - public void clearClassSpellList() + public void clearClassSpellList(PlayerCharacter pc) { - classSpellList = null; + pc.removeAllAssocs(this, AssociationListKey.CLASSSPELLLIST); } /* @@ -2346,7 +2282,6 @@ try { aClass = (PCClass) super.clone(); - aClass.setSubClassKey(getSubClassKey()); if (prohibitedSchools != null) { @@ -2362,10 +2297,6 @@ // TODO - Why is this not copying the skillList from the master? aClass.skillList = null; - aClass.classSkillList = null; - aClass.classSpellList = null; - aClass.stableSpellKey = null; - List<KnownSpellIdentifier> ksl = getListFor(ListKey.KNOWN_SPELLS); if (ksl != null) { @@ -2415,26 +2346,6 @@ } /* - * FINALPCCLASSANDLEVEL This is required in PCClassLevel and PCClass, since it is a Tag - * - * Need to look into the details of stableSpellKey to figure out the appropriate - * place for that - */ - @Override - public void setName(final String newName) - { - super.setName(newName); - /* - * CONSIDER This (below) is a bit of a confusing side effect - needs to be - * far more explicit that stableSpellKey is a cache, and that there are - * also side effects to getSpellKey (side effects are bad :( ) - - * thpr 11/4/06 - */ - stableSpellKey = null; - getSpellKey(); - } - - /* * PCCLASSLEVELONLY since the specialty list is created during PCClassLevel * creation (in the factory) */ @@ -2455,6 +2366,7 @@ */ public boolean hasClassSkill(PlayerCharacter pc, final String aString) { + List<ClassSkillList> classSkillList = pc.getAssocList(this, AssociationListKey.CLASSSKILLLIST); if ((classSkillList == null) || classSkillList.isEmpty()) { return false; @@ -2705,8 +2617,9 @@ * FINALPCCLASSLEVELONLY This is only part of the level, as the skill list is * calculated based on other factors, it is not a Tag */ - public final List<ClassSkillList> getClassSkillList() + public final List<ClassSkillList> getClassSkillList(PlayerCharacter pc) { + List<ClassSkillList> classSkillList = pc.getAssocList(this, AssociationListKey.CLASSSKILLLIST); if (classSkillList == null) { List<ClassSkillList> returnList = new ArrayList<ClassSkillList>(2); @@ -3633,7 +3546,7 @@ if (newLevel == 0) { - setSubClassKey(Constants.s_NONE); + setSubClassKey(aPC, Constants.s_NONE); // // Remove all skills associated with this class @@ -4176,7 +4089,7 @@ choiceList.add(columnList); } - setSubClassKey(sc.getKeyName()); + setSubClassKey(aPC, sc.getKeyName()); if (sc.getChoice().length() > 0) { @@ -4283,7 +4196,7 @@ * PCCLASSONLY Since this is a choice of ClassSkillList, this is part of the * PCClass factory of PCClassLevels?? */ - private void chooseClassSkillList() + private void chooseClassSkillList(PlayerCharacter pc) { TransitionChoice<ClassSkillList> csc = get(ObjectKey.SKILLLIST_CHOICE); // if no entry or no choices, just return @@ -4292,10 +4205,10 @@ return; } - clearClassSkillList(); + pc.removeAllAssocs(this, AssociationListKey.CLASSSKILLLIST); for (ClassSkillList st : csc.driveChoice(null)) { - addClassSkill(st); + pc.addAssoc(pc, AssociationListKey.CLASSSKILLLIST, st); } } @@ -4303,7 +4216,7 @@ * PCCLASSONLY Since this is part of the construction of a PCClassLevel, * this is only part of PCClass... */ - private void chooseClassSpellList() + private void chooseClassSpellList(PlayerCharacter pc) { TransitionChoice<CDOMListObject<Spell>> csc = get(ObjectKey.SPELLLIST_CHOICE); // if no entry or no choices, just return @@ -4312,10 +4225,10 @@ return; } - clearClassSpellList(); + clearClassSpellList(pc); for (CDOMListObject<Spell> st : csc.driveChoice(null)) { - addClassSpellList(st); + addClassSpellList(st, pc); } } Modified: Trunk/pcgen/code/src/java/pcgen/core/PObject.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-10-03 20:05:46 UTC (rev 7890) +++ Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-10-03 20:45:40 UTC (rev 7891) @@ -757,9 +757,10 @@ /** * Returns a hardcoded "POBJECT|" + name of this object + * @param pc TODO * @return "POBJECT|" + name of this object */ - public String getSpellKey() + public String getSpellKey(PlayerCharacter pc) { return "POBJECT|" + getKeyName(); //$NON-NLS-1$ } Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-10-03 20:05:46 UTC (rev 7890) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-10-03 20:45:40 UTC (rev 7891) @@ -5939,7 +5939,7 @@ for (PCClass pcClass : getClassList()) { - final String aKey = pcClass.getSpellKey(); + final String aKey = pcClass.getSpellKey(this); final int temp = aSpell.getFirstLevelForKey(aKey, this); anInt = Math.min(anInt, temp); } @@ -13568,7 +13568,7 @@ { boolean flag = false; - String src = obj.getSpellKey(); + String src = obj.getSpellKey(this); for (VariableKey vk : obj.getVariableKeys()) { Modified: Trunk/pcgen/code/src/java/pcgen/core/SpellSupport.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/SpellSupport.java 2008-10-03 20:05:46 UTC (rev 7890) +++ Trunk/pcgen/code/src/java/pcgen/core/SpellSupport.java 2008-10-03 20:45:40 UTC (rev 7891) @@ -322,7 +322,7 @@ if (pcClass.getSpellType().equals(spellType) || ALL.equals(spellType)) { StringBuffer tempSb = new StringBuffer(); - tempSb.append(pcClass.getSpellKey()) + tempSb.append(pcClass.getSpellKey(pc)) .append(PIPE) .append(key.substring(key.lastIndexOf(PIPE) + 1)); tempMap.put(tempSb.toString(), levelInt); @@ -372,7 +372,7 @@ { if (pcClass.getSpellType().equals(spellType) || ALL.equals(spellType)) { - tempMap.put(pcClass.getSpellKey(), si.level); + tempMap.put(pcClass.getSpellKey(pc), si.level); } } } Modified: Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorPC.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorPC.java 2008-10-03 20:05:46 UTC (rev 7890) +++ Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorPC.java 2008-10-03 20:45:40 UTC (rev 7891) @@ -554,7 +554,7 @@ for (PCClass spClass : getPc().getClassList()) { StringTokenizer st = - new StringTokenizer(spClass.getSpellKey(), + new StringTokenizer(spClass.getSpellKey(getPc()), Constants.PIPE); while (st.hasMoreTokens()) { Modified: Trunk/pcgen/code/src/java/pcgen/core/analysis/SkillCostCalc.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/analysis/SkillCostCalc.java 2008-10-03 20:05:46 UTC (rev 7890) +++ Trunk/pcgen/code/src/java/pcgen/core/analysis/SkillCostCalc.java 2008-10-03 20:45:40 UTC (rev 7891) @@ -179,7 +179,7 @@ { for (CDOMReference<ClassSkillList> ref : classes) { - for (ClassSkillList csl : aClass.getClassSkillList()) + for (ClassSkillList csl : aClass.getClassSkillList(aPC)) { if (ref.contains(csl)) { Modified: Trunk/pcgen/code/src/java/pcgen/core/kit/KitClass.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/kit/KitClass.java 2008-10-03 20:05:46 UTC (rev 7890) +++ Trunk/pcgen/code/src/java/pcgen/core/kit/KitClass.java 2008-10-03 20:45:40 UTC (rev 7891) @@ -129,7 +129,7 @@ if (getSubClass() != null) { // try and set a subclass too. - theClass.setSubClassKey(getSubClass()); + theClass.setSubClassKey(aPC, getSubClass()); } if (!PrereqHandler.passesAll(theClass.getPrerequisiteList(), aPC, aKit)) @@ -152,7 +152,7 @@ public void apply(PlayerCharacter aPC) { addLevel(aPC, theLevel, theClass, doLevelAbilities); - theClass.setSubClassKey(theOrigSubClass); + theClass.setSubClassKey(aPC, theOrigSubClass); theClass = null; } Modified: Trunk/pcgen/code/src/java/pcgen/core/kit/KitSpells.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/kit/KitSpells.java 2008-10-03 20:05:46 UTC (rev 7890) +++ Trunk/pcgen/code/src/java/pcgen/core/kit/KitSpells.java 2008-10-03 20:45:40 UTC (rev 7891) @@ -380,7 +380,7 @@ for (CharacterDomain cd : pc.getCharacterDomainList()) { Domain domain = cd.getDomain(); - final String key = domain.getSpellKey(); + final String key = domain.getSpellKey(pc); int newLevel = spell.getFirstLevelForKey(key, pc); if (newLevel > 0 && newLevel < spLevel) { @@ -392,7 +392,7 @@ if (spLevel == 99) { - spLevel = spell.getFirstLevelForKey(pcClass.getSpellKey(), pc); + spLevel = spell.getFirstLevelForKey(pcClass.getSpellKey(pc), pc); owner = pcClass; } Modified: Trunk/pcgen/code/src/java/pcgen/core/npcgen/NPCGenerator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/npcgen/NPCGenerator.java 2008-10-03 20:05:46 UTC (rev 7890) +++ Trunk/pcgen/code/src/java/pcgen/core/npcgen/NPCGenerator.java 2008-10-03 20:45:40 UTC (rev 7891) @@ -542,7 +542,7 @@ WeightedCollection<String> subClasses = theConfiguration.getSubClassWeights( aClass.getKeyName() ); if (subClasses != null && subClasses.size() > 0) { - aClass.setSubClassKey( subClasses.getRandomValue() ); + aClass.setSubClassKey( aPC, subClasses.getRandomValue() ); } } Modified: Trunk/pcgen/code/src/java/pcgen/gui/tabs/spells/InfoSpellsSubTab.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/tabs/spells/InfoSpellsSubTab.java 2008-10-03 20:05:46 UTC (rev 7890) +++ Trunk/pcgen/code/src/java/pcgen/gui/tabs/spells/InfoSpellsSubTab.java 2008-10-03 20:45:40 UTC (rev 7891) @@ -820,7 +820,7 @@ { Integer[] levels = - aSpell.levelForKey(cs.getOwner().getSpellKey(), pc); + aSpell.levelForKey(cs.getOwner().getSpellKey(pc), pc); for (Integer level : levels) { Modified: Trunk/pcgen/code/src/java/pcgen/gui/tabs/spells/SpellModel.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/tabs/spells/SpellModel.java 2008-10-03 20:05:46 UTC (rev 7890) +++ Trunk/pcgen/code/src/java/pcgen/gui/tabs/spells/SpellModel.java 2008-10-03 20:45:40 UTC (rev 7891) @@ -602,7 +602,7 @@ { Spell aSpell = (Spell) o; - if (!aSpell.levelForKeyContains(obj.getSpellKey(), iLev, pc)) + if (!aSpell.levelForKeyContains(obj.getSpellKey(pc), iLev, pc)) { continue; } @@ -789,7 +789,7 @@ aClass = classList.get(pindex); primaryMatch = spell.levelForKeyContains(aClass - .getSpellKey(), iLev, pc); + .getSpellKey(pc), iLev, pc); if (cs != null) { if (aClass instanceof Race) @@ -888,7 +888,7 @@ spellMatch = primaryMatch && (spell.getFirstLevelForKey( - aClass.getSpellKey(), pc) >= 0); + aClass.getSpellKey(pc), pc) >= 0); break; case GuiConstants.INFOSPELLS_VIEW_LEVEL: // By Level iLev = sindex; @@ -909,7 +909,7 @@ { spellMatch = spell.levelForKeyContains( - aClass.getSpellKey(), + aClass.getSpellKey(pc), iLev, pc); } else @@ -1001,7 +1001,7 @@ theObject = cs.getOwner(); spellMatch = spell.levelForKeyContains(theObject - .getSpellKey(), theLevel, pc); + .getSpellKey(pc), theLevel, pc); } if (spellMatch && si == null && !knownSpellsOnly) { @@ -1130,7 +1130,7 @@ if (spellListType != GuiConstants.INFOSPELLS_AVAIL_KNOWN) { for (Spell s : Globals.getSpellsIn(-1, - aClass.getSpellKey(), "")) //$NON-NLS-1$ + aClass.getSpellKey(pc), "")) //$NON-NLS-1$ { if (!spellList.contains(s) && spellTab.shouldDisplayThis(s)) Modified: Trunk/pcgen/code/src/java/pcgen/io/PCGVer0Parser.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/PCGVer0Parser.java 2008-10-03 20:05:46 UTC (rev 7890) +++ Trunk/pcgen/code/src/java/pcgen/io/PCGVer0Parser.java 2008-10-03 20:45:40 UTC (rev 7891) @@ -590,7 +590,7 @@ aPC.getClassList().add(aClass); } - aClass.setSubClassKey(subClassKey); + aClass.setSubClassKey(aPC, subClassKey); PCClassLstToken token = (PCClassLstToken) TokenStore.inst().getTokenMap( PCClassLstToken.class).get("PROHIBITED"); @@ -1663,7 +1663,7 @@ aObject = aClass; } - int sLevel = aSpell.getFirstLevelForKey(aObject.getSpellKey(), aPC); + int sLevel = aSpell.getFirstLevelForKey(aObject.getSpellKey(aPC), aPC); if (sLevel == -1) { @@ -2048,7 +2048,7 @@ } final int level = - aSpell.getFirstLevelForKey(aObject.getSpellKey(), aPC); + aSpell.getFirstLevelForKey(aObject.getSpellKey(aPC), aPC); if (level == -1) { Modified: Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Creator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Creator.java 2008-10-03 20:05:46 UTC (rev 7890) +++ Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Creator.java 2008-10-03 20:45:40 UTC (rev 7891) @@ -2066,7 +2066,7 @@ { for (SpellInfo spellInfo : cSpell.getInfoList()) { - final String spellKey = cSpell.getOwner().getSpellKey(); + final String spellKey = cSpell.getOwner().getSpellKey(thePC); if (spellInfo.getBook().equals( Globals.getDefaultSpellBook()) @@ -2148,13 +2148,13 @@ { for (PCClass pcClass : thePC.getClassList()) { - if ((pcClass.getClassSpellList() != null) - && (pcClass.getClassSpellList().size() > 0)) + if ((pcClass.getClassSpellList(thePC) != null) + && (pcClass.getClassSpellList(thePC).size() > 0)) { buffer.append(TAG_SPELLLIST).append(':'); buffer.append(pcClass.getKeyName()); - for (CDOMListObject<Spell> spell : pcClass.getClassSpellList()) + for (CDOMListObject<Spell> spell : pcClass.getClassSpellList(thePC)) { buffer.append('|'); if (ClassSpellList.class.equals(spell.getClass())) Modified: Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Parser.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Parser.java 2008-10-03 20:05:46 UTC (rev 7890) +++ Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Parser.java 2008-10-03 20:45:40 UTC (rev 7891) @@ -1915,7 +1915,7 @@ } } } - aPCClass.setSubClassKey(subClassKey); + aPCClass.setSubClassKey(thePC, subClassKey); } if (TAG_LEVEL.equals(tag)) @@ -3772,7 +3772,7 @@ // first see if it's the class if (((aPCClass != null) && objectKey.equals(aPCClass .getKeyName())) - || (aPCClass.getSpellKey().indexOf( + || (aPCClass.getSpellKey(thePC).indexOf( typeName + '|' + objectKey) >= 0)) { source = aPCClass; @@ -3825,7 +3825,7 @@ { // valid spell has a non-negative spell level if ((spell != null) - && (spell.getFirstLevelForKey(source.getSpellKey(), thePC) >= 0)) + && (spell.getFirstLevelForKey(source.getSpellKey(thePC), thePC) >= 0)) { aSpell = spell; break; @@ -3851,7 +3851,7 @@ final SpellBook book = thePC.getSpellBookByName(spellBook); final Integer[] spellLevels = - aSpell.levelForKey(source.getSpellKey(), thePC); + aSpell.levelForKey(source.getSpellKey(thePC), thePC); boolean found = false; for (int sindex = 0; sindex < spellLevels.length; ++sindex) @@ -3983,14 +3983,14 @@ ClassSpellList csl = refContext .silentlyGetConstructedCDOMObject(ClassSpellList.class, tok.substring(6)); - aClass.addClassSpellList(csl); + aClass.addClassSpellList(csl, thePC); } else if (tok.startsWith("DOMAIN.")) { DomainSpellList dsl = refContext .silentlyGetConstructedCDOMObject( DomainSpellList.class, tok.substring(7)); - aClass.addClassSpellList(dsl); + aClass.addClassSpellList(dsl, thePC); } else { @@ -4007,12 +4007,12 @@ DomainSpellList.class, tok); if (dsl != null) { - aClass.addClassSpellList(dsl); + aClass.addClassSpellList(dsl, thePC); } } else { - aClass.addClassSpellList(csl); + aClass.addClassSpellList(csl, thePC); /* * TODO This makes no sense to me - WHY do we have to add * the spells by hand? - look at Rev 6416 and older for this Modified: Trunk/pcgen/code/src/test/pcgen/core/prereq/PreSubClassTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/prereq/PreSubClassTest.java 2008-10-03 20:05:46 UTC (rev 7890) +++ Trunk/pcgen/code/src/test/pcgen/core/prereq/PreSubClassTest.java 2008-10-03 20:45:40 UTC (rev 7891) @@ -74,10 +74,10 @@ pcClass.setName("MyClass"); pcClass.setKeyName("KEY_MyClass"); pcClass.put(StringKey.SPELLTYPE, "ARCANE"); - pcClass.setSubClassKey("MySubClass"); final PlayerCharacter character = getCharacter(); character.incrementClassLevel(3, pcClass); + character.getClassKeyed("KEY_MyClass").setSubClassKey(character, "MySubClass"); final Prerequisite prereq = new Prerequisite(); prereq.setKind("subclass"); @@ -102,11 +102,11 @@ final PCClass pcClass2 = new PCClass(); pcClass2.setName("Other Class"); - pcClass2.setSubClassKey("OtherSubClass"); final PlayerCharacter character = getCharacter(); character.incrementClassLevel(1, pcClass); character.incrementClassLevel(2, pcClass2); + character.getClassKeyed("Other Class").setSubClassKey(character, "OtherSubClass"); final Prerequisite prereq = new Prerequisite(); prereq.setKind("subclass"); @@ -128,15 +128,15 @@ final PCClass pcClass = new PCClass(); pcClass.setName("MyClass"); pcClass.put(StringKey.SPELLTYPE, "ARCANE"); - pcClass.setSubClassKey("MySubClass"); final PCClass pcClass2 = new PCClass(); pcClass2.setName("Other Class"); - pcClass2.setSubClassKey("OtherSubClass"); final PlayerCharacter character = getCharacter(); character.incrementClassLevel(1, pcClass); + character.getClassKeyed("MyClass").setSubClassKey(character, "MySubClass"); character.incrementClassLevel(2, pcClass2); + character.getClassKeyed("Other Class").setSubClassKey(character, "OtherSubClass"); final Prerequisite prereq = new Prerequisite(); prereq.setKind("subclass"); @@ -182,10 +182,10 @@ final PCClass pcClass = new PCClass(); pcClass.setName("MyClass"); pcClass.put(StringKey.SPELLTYPE, "ARCANE"); - pcClass.setSubClassKey("MySubClass"); final PlayerCharacter character = getCharacter(); character.incrementClassLevel(1, pcClass); + character.getClassKeyed("MyClass").setSubClassKey(character, "MySubClass"); final Prerequisite prereq = new Prerequisite(); prereq.setKind("subclass"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-09-27 16:32:46
|
Revision: 7806 http://pcgen.svn.sourceforge.net/pcgen/?rev=7806&view=rev Author: thpr Date: 2008-09-27 16:32:32 +0000 (Sat, 27 Sep 2008) Log Message: ----------- COMPANIONLIST and FOLLOWERS token updates Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java Trunk/pcgen/code/src/java/pcgen/cdom/reference/AbstractReferenceManufacturer.java Trunk/pcgen/code/src/java/pcgen/cdom/reference/ReferenceManufacturer.java Trunk/pcgen/code/src/java/pcgen/cdom/reference/ReferenceUtilities.java Trunk/pcgen/code/src/java/pcgen/core/FollowerOption.java Trunk/pcgen/code/src/java/pcgen/core/Globals.java Trunk/pcgen/code/src/java/pcgen/core/PObject.java Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorPC.java Trunk/pcgen/code/src/java/pcgen/core/character/Follower.java Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoResources.java Trunk/pcgen/code/src/java/pcgen/gui/tabs/resources/AvailableFollowerModel.java Trunk/pcgen/code/src/java/pcgen/gui/tabs/resources/SelectedFollowerModel.java Trunk/pcgen/code/src/java/pcgen/io/ExportHandler.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/rules/context/AbstractReferenceContext.java Trunk/pcgen/code/src/java/plugin/exporttokens/FollowerTypeToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/CompanionListLst.java Trunk/pcgen/code/src/java/plugin/lsttokens/FollowersLst.java Added Paths: ----------- Trunk/pcgen/code/src/java/pcgen/cdom/helper/FollowerLimit.java Trunk/pcgen/code/src/java/pcgen/cdom/list/CompanionList.java Trunk/pcgen/code/src/java/pcgen/cdom/reference/ObjectMatchingReference.java Trunk/pcgen/code/src/utest/plugin/lsttokens/CompanionListLstTest.java Trunk/pcgen/code/src/utest/plugin/lsttokens/FollowersLstTest.java Modified: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java 2008-09-27 14:52:39 UTC (rev 7805) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java 2008-09-27 16:32:32 UTC (rev 7806) @@ -32,6 +32,7 @@ import pcgen.cdom.content.LevelCommandFactory; import pcgen.cdom.helper.Aspect; import pcgen.cdom.helper.AttackCycle; +import pcgen.cdom.helper.FollowerLimit; import pcgen.cdom.helper.PointCost; import pcgen.cdom.helper.Qualifier; import pcgen.cdom.helper.Quality; @@ -46,11 +47,12 @@ import pcgen.core.Domain; import pcgen.core.Equipment; import pcgen.core.EquipmentModifier; +import pcgen.core.FollowerOption; import pcgen.core.Kit; import pcgen.core.Language; +import pcgen.core.Movement; import pcgen.core.PCClass; import pcgen.core.PCStat; -import pcgen.core.Movement; import pcgen.core.PCTemplate; import pcgen.core.QualifiedObject; import pcgen.core.SpecialAbility; @@ -217,6 +219,8 @@ 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>(); + public static final ListKey<FollowerOption> COMPANIONLIST = new ListKey<FollowerOption>(); + public static final ListKey<FollowerLimit> FOLLOWERS = new ListKey<FollowerLimit>(); /** Private constructor to prevent instantiation of this class */ private ListKey() { Added: Trunk/pcgen/code/src/java/pcgen/cdom/helper/FollowerLimit.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/helper/FollowerLimit.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/cdom/helper/FollowerLimit.java 2008-09-27 16:32:32 UTC (rev 7806) @@ -0,0 +1,56 @@ +package pcgen.cdom.helper; + +import pcgen.base.formula.Formula; +import pcgen.cdom.list.CompanionList; +import pcgen.cdom.reference.CDOMSingleRef; + +public class FollowerLimit +{ + + private final CDOMSingleRef<CompanionList> ref; + private final Formula f; + + public FollowerLimit(CDOMSingleRef<CompanionList> cl, Formula limit) + { + if (cl == null) + { + throw new IllegalArgumentException( + "Reference for FollowerLimit cannot be null"); + } + if (limit == null) + { + throw new IllegalArgumentException( + "Formula for FollowerLimit cannot be null"); + } + ref = cl; + f = limit; + } + + public CDOMSingleRef<CompanionList> getCompanionList() + { + return ref; + } + + public Formula getValue() + { + return f; + } + + @Override + public int hashCode() + { + return ref.hashCode() * 31 + f.hashCode(); + } + + @Override + public boolean equals(Object o) + { + if (o instanceof FollowerLimit) + { + FollowerLimit other = (FollowerLimit) o; + return ref.equals(other.ref) && f.equals(other.f); + } + return false; + } + +} Added: Trunk/pcgen/code/src/java/pcgen/cdom/list/CompanionList.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/list/CompanionList.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/cdom/list/CompanionList.java 2008-09-27 16:32:32 UTC (rev 7806) @@ -0,0 +1,25 @@ +package pcgen.cdom.list; + +import pcgen.cdom.base.CDOMListObject; +import pcgen.core.Race; + +public class CompanionList extends CDOMListObject<Race> +{ + + public Class<Race> getListClass() + { + return Race.class; + } + + /** + * Lists never have a Type, so this returns false + */ + @Override + public boolean isType(String str) + { + return false; + } + + // No additional Functionality :) + +} Modified: Trunk/pcgen/code/src/java/pcgen/cdom/reference/AbstractReferenceManufacturer.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/reference/AbstractReferenceManufacturer.java 2008-09-27 14:52:39 UTC (rev 7805) +++ Trunk/pcgen/code/src/java/pcgen/cdom/reference/AbstractReferenceManufacturer.java 2008-09-27 16:32:32 UTC (rev 7806) @@ -921,4 +921,15 @@ arm.constructIfNecessary(s); } } + + + public T constructNowIfNecessary(String name) + { + T obj = active.get(name); + if (obj == null) + { + obj = constructObject(name); + } + return obj; + } } Added: Trunk/pcgen/code/src/java/pcgen/cdom/reference/ObjectMatchingReference.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/reference/ObjectMatchingReference.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/cdom/reference/ObjectMatchingReference.java 2008-09-27 16:32:32 UTC (rev 7806) @@ -0,0 +1,256 @@ +/* + * 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.reference; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import pcgen.cdom.base.CDOMObject; +import pcgen.cdom.base.CDOMReference; +import pcgen.cdom.enumeration.ObjectKey; + +/** + * A ObjectMatchingReference is a CDOMReference that matches objects based on a + * an ObjectKey and an expected value. + * + * An underlying start list is provided during construction of the + * ObjectMatchingReference. Generally, this will be the CDOMAllRef for the class + * of object underlying this ObjectMatchingReference. + * + * @param <T> + * The class of object underlying this ObjectMatchingReference. + * @param <V> + * The class of object stored by the Object Key used by this + * ObjectMatchingReference. + */ +public class ObjectMatchingReference<T extends CDOMObject, V> extends + CDOMReference<T> +{ + + /** + * The CDOMGroupRef containing the underlying list of objects from which + * this ObjectMatchingReference will draw. + */ + private final CDOMGroupRef<T> all; + + private final ObjectKey<V> key; + + private final V value; + + /* + * CONSIDER is it necessary/useful to cache the results of the pattern + * match? If that is done, under what conditions does the cache need to be + * invalidated (how can the underlying CDOMGroupRef be known to not have + * been modified)? + */ + + /** + * Constructs a new ObjectMatchingReference + * + * @param cl + * The Class of the underlying objects contained by this + * reference. + * @param start + * The underlying list of objects from which this + * ObjectMatchingReference will draw. + * @throws IllegalArgumentException + * if the starting group is null or the provided pattern does + * not end with the PCGen pattern characters + */ + public ObjectMatchingReference(Class<T> cl, CDOMGroupRef<T> start, + ObjectKey<V> targetKey, V expectedValue) + { + super(cl, "*Object"); + if (start == null) + { + throw new IllegalArgumentException( + "Starting Group cannot be null in ObjectMatchingReference"); + } + if (targetKey == null) + { + throw new IllegalArgumentException( + "Target Key cannot be null in ObjectMatchingReference"); + } + all = start; + key = targetKey; + value = expectedValue; + } + + /** + * Throws an exception. This method may not be called because a + * ObjectMatchingReference is resolved based on the pattern provided at + * construction. + * + * @param obj + * ignored + * @throws IllegalStateException + * because a ObjectMatchingReference is resolved based on the + * key/value pair provided at construction. + */ + @Override + public void addResolution(T obj) + { + throw new IllegalStateException( + "Cannot add resolution to ObjectMatchingReference"); + } + + /** + * Returns true if the given Object is included in the Collection of Objects + * to which this ObjectMatchingReference refers. + * + * Note that the behavior of this class is undefined if the CDOMGroupRef + * underlying this ObjectMatchingReference has not yet been resolved. + * + * @param obj + * The object to be tested to see if it is referred to by this + * ObjectMatchingReference. + * @return true if the given Object is included in the Collection of Objects + * to which this ObjectMatchingReference refers; false otherwise. + */ + @Override + public boolean contains(T obj) + { + if (!all.contains(obj)) + { + return false; + } + V actual = obj.get(key); + if (value == null) + { + return actual == null; + } + return value.equals(actual); + } + + /** + * Returns a Collection containing the Objects to which this + * ObjectMatchingReference refers. + * + * This method is reference-semantic, meaning that ownership of the + * Collection returned by this method is transferred to the calling object. + * Modification of the returned Collection should not result in modifying + * the ObjectMatchingReference, and modifying the ObjectMatchingReference + * after the Collection is returned should not modify the Collection. + * + * Note that the behavior of this class is undefined if the CDOMGroupRef + * underlying this ObjectMatchingReference has not yet been resolved. + * + * @return A Collection containing the Objects to which this + * ObjectMatchingReference refers. + */ + @Override + public Collection<T> getContainedObjects() + { + List<T> list = new ArrayList<T>(); + for (T obj : all.getContainedObjects()) + { + V actual = obj.get(key); + if (value == null && actual == null || value != null + && value.equals(actual)) + { + list.add(obj); + } + } + return list; + } + + /** + * Returns a representation of this ObjectMatchingReference, suitable for + * storing in an LST file. + * + * Note that this will return the pattern String provided during + * construction of the ObjectMatchingReference. + * + * @see pcgen.cdom.base.CDOMReference#getLSTformat() + */ + @Override + public String getLSTformat() + { + return getName(); + } + + /** + * Returns the count of the number of objects included in the Collection of + * Objects to which this ObjectMatchingReference refers. + * + * Note that the behavior of this class is undefined if the CDOMGroupRef + * underlying this ObjectMatchingReference has not yet been resolved. + * + * @return The count of the number of objects included in the Collection of + * Objects to which this ObjectMatchingReference refers. + */ + @Override + public int getObjectCount() + { + int count = 0; + for (T obj : all.getContainedObjects()) + { + V actual = obj.get(key); + if (value == null && actual == null || value != null + && value.equals(actual)) + { + count++; + } + } + return count; + } + + /** + * Returns true if this ObjectMatchingReference is equal to the given + * Object. Equality is defined as being another ObjectMatchingReference + * object with equal Class represented by the reference, an equal staring + * CDOMGroupRef and an equal pattern. This may or may not be a deep .equals, + * depending on the behavior of the underlying CDOMGroupRef. You should + * check the documentation for the .equals(Object) method of that class to + * establish the actual behavior of this method. + * + * @see java.lang.Object#equals(java.lang.Object) + */ + @Override + public boolean equals(Object o) + { + if (o instanceof ObjectMatchingReference) + { + ObjectMatchingReference<?, ?> other = (ObjectMatchingReference<?, ?>) o; + if (getReferenceClass().equals(other.getReferenceClass()) + && all.equals(other.all) && key.equals(other.key)) + { + if (value == null) + { + return other.value == null; + } + return value.equals(other.value); + } + } + return false; + } + + /** + * Returns the consistent-with-equals hashCode for this + * ObjectMatchingReference + * + * @see java.lang.Object#hashCode() + */ + @Override + public int hashCode() + { + return getReferenceClass().hashCode() ^ key.hashCode() + + (value == null ? -1 : value.hashCode()); + } +} Modified: Trunk/pcgen/code/src/java/pcgen/cdom/reference/ReferenceManufacturer.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/reference/ReferenceManufacturer.java 2008-09-27 14:52:39 UTC (rev 7805) +++ Trunk/pcgen/code/src/java/pcgen/cdom/reference/ReferenceManufacturer.java 2008-09-27 16:32:32 UTC (rev 7806) @@ -270,4 +270,6 @@ * @return true if the ReferenceManufacturer is "valid"; false otherwise. */ public boolean validate(); + + public T constructNowIfNecessary(String name); } Modified: Trunk/pcgen/code/src/java/pcgen/cdom/reference/ReferenceUtilities.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/reference/ReferenceUtilities.java 2008-09-27 14:52:39 UTC (rev 7805) +++ Trunk/pcgen/code/src/java/pcgen/cdom/reference/ReferenceUtilities.java 2008-09-27 16:32:32 UTC (rev 7806) @@ -17,6 +17,7 @@ */ package pcgen.cdom.reference; +import java.text.Collator; import java.util.Collection; import java.util.Comparator; import java.util.Set; @@ -33,6 +34,8 @@ public final class ReferenceUtilities { + private final static Collator COLLATOR = Collator.getInstance(); + public static final Comparator<CDOMReference<?>> REFERENCE_SORTER = new Comparator<CDOMReference<?>>() { @@ -140,12 +143,12 @@ { return -1; } - return arg0.getName().compareTo(arg1.getName()); + return COLLATOR.compare(arg0.getName(), arg1.getName()); } if (arg1 instanceof CDOMSingleRef) { return 1; } - return arg0.getName().compareTo(arg1.getName()); + return COLLATOR.compare(arg0.getName(), arg1.getName()); } } Modified: Trunk/pcgen/code/src/java/pcgen/core/FollowerOption.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/FollowerOption.java 2008-09-27 14:52:39 UTC (rev 7805) +++ Trunk/pcgen/code/src/java/pcgen/core/FollowerOption.java 2008-09-27 16:32:32 UTC (rev 7806) @@ -22,153 +22,71 @@ */ package pcgen.core; -import java.text.Collator; import java.util.ArrayList; import java.util.Collection; -import java.util.HashSet; import java.util.List; +import pcgen.cdom.base.CDOMReference; import pcgen.cdom.base.ConcretePrereqObject; -import pcgen.cdom.enumeration.ObjectKey; -import pcgen.cdom.enumeration.RaceType; +import pcgen.cdom.list.CompanionList; +import pcgen.cdom.reference.CDOMDirectSingleRef; +import pcgen.cdom.reference.CDOMSingleRef; +import pcgen.cdom.reference.ReferenceUtilities; /** - * This class represents a possible choice for a follower. This is basically - * a Race with a "FOLLOWERADJUSTMENT" that modifies the owner's effective - * level when selecting a follower of this type. Prereqs can also be specified + * This class represents a possible choice for a follower. This is basically a + * Race with a "FOLLOWERADJUSTMENT" that modifies the owner's effective level + * when selecting a follower of this type. Prereqs can also be specified * * @author boomer70 */ -public class FollowerOption extends ConcretePrereqObject implements Comparable<FollowerOption> +public class FollowerOption extends ConcretePrereqObject implements + Comparable<FollowerOption> { - private String theRaceKey; - private Race theRace = null; private int theAdjustment = 0; - private String theType = null; - - private static final String ANY_RACE = "ANY"; //$NON-NLS-1$ - private static final String RACETYPE = "RACETYPE"; //$NON-NLS-1$ + private final CDOMReference<Race> ref; + private final CDOMSingleRef<CompanionList> list; - /** - * Creates a FollowerOption of the specified race with no adjustment and - * an unknown type. - * @param aRace The race key of this companion - */ - public FollowerOption( final String aRace ) + public FollowerOption(CDOMReference<Race> race, + CDOMSingleRef<CompanionList> listref) { - theRaceKey = aRace.toUpperCase(); - theRace = Globals.getContext().ref.silentlyGetConstructedCDOMObject(Race.class, theRaceKey); + ref = race; + list = listref; } - + /** - * Creates a FollowerOption of the specified race with no adjustment and - * an unknown type. - * @param aRace The race of this companion - */ - public FollowerOption( final Race aRace ) - { - theRace = aRace; - theRaceKey = aRace.getKeyName(); - } - - /** - * Returns the race associated with this option. If this option represents - * a group of races this method will return null. + * Returns the race associated with this option. If this option represents a + * group of races this method will return null. + * * @return The Race associated or null */ public Race getRace() { - if ( theRace == null ) - { - if ( theRaceKey.startsWith( RACETYPE ) - || theRaceKey.equals(ANY_RACE) ) - { - return null; - } - theRace = Globals.getContext().ref - .silentlyGetConstructedCDOMObject(Race.class, theRaceKey); - } - return theRace; + Collection<Race> races = ref.getContainedObjects(); + return races.size() == 1 ? races.iterator().next() : null; } - - /** - * Separates into indivual FollowerOptions this option. If this option - * does not represent multiple races it will simply return itself. - * Otherwise the method returns a list of FollowerOptions with the same - * options one for each Race that qualifies. - * @return The expanded list of FollowerOptions - */ - public Collection<FollowerOption> getExpandedOptions() + + public CDOMReference<Race> getRaceRef() { - final List<FollowerOption> options = new ArrayList<FollowerOption>(); - if ( theRace != null ) - { - options.add( this ); - return options; - } - Collection<Race> raceSet = null; - if ( theRaceKey.startsWith( RACETYPE ) ) - { - raceSet = new HashSet<Race>(); - RaceType raceType = RaceType.getConstant(theRaceKey.substring(9)); - final Collection<Race> allRaces = Globals.getContext().ref.getConstructedCDOMObjects(Race.class); - for ( final Race r : allRaces ) - { - if (raceType.equals(r.get(ObjectKey.RACETYPE))) - { - raceSet.add( r ); - } - } - } - else if ( theRaceKey.equals( ANY_RACE ) ) - { - raceSet = new HashSet<Race>(); - raceSet.addAll( Globals.getContext().ref.getConstructedCDOMObjects(Race.class) ); - } - if ( raceSet != null ) - { - for ( final Race r : raceSet ) - { - final FollowerOption opt = new FollowerOption( r ); - opt.setAdjustment( getAdjustment() ); - opt.addAllPrerequisites(getPrerequisiteList()); - options.add( opt ); - } - } - return options; + return ref; } - + /** - * Sets the Follower type for this option. - * @param aType The follower type to set e.g. Familiar - */ - public void setType( final String aType ) - { - theType = aType; - } - - /** - * Gets the Follower type for this option. - * @return The Follower type e.g. Familiar - */ - public String getType() - { - return theType; - } - - /** - * Sets the variable adjustment for a master selecting this option. For + * Sets the variable adjustment for a master selecting this option. For * example an adjustment of -3 would mean the master's level would be 3 * lower for purposes of applying companion mods. - * @param anAdjustment Amount to modify the master's level by + * + * @param anAdjustment + * Amount to modify the master's level by */ - public void setAdjustment( final int anAdjustment ) + public void setAdjustment(final int anAdjustment) { theAdjustment = anAdjustment; } - + /** * Returns the adjustment to the master's level for this option. + * * @return The adjustment to the master's level */ public int getAdjustment() @@ -177,48 +95,64 @@ } /** - * This method is overridden to also check that a master has enough + * This method is overridden to also check that a master has enough * effective levels to have a positive level after applying any adjustment - * for this follower. For example, if a follower has an adjustment of -3 + * for this follower. For example, if a follower has an adjustment of -3 * then the master must have at least 4 levels to qualify for this follower * (4 - 3 > 0) + * * @see pcgen.cdom.base.PrereqObject#qualifies(pcgen.core.PlayerCharacter) */ @Override - public boolean qualifies( final PlayerCharacter aPC ) + public boolean qualifies(final PlayerCharacter aPC) { - if ( theAdjustment != 0 ) + if (theAdjustment != 0) { - final int lvl = aPC.getEffectiveCompanionLevel( theType ); - if ( lvl + theAdjustment <= 0 ) + final int lvl = aPC.getEffectiveCompanionLevel(list.resolvesTo()); + if (lvl + theAdjustment <= 0) { return false; } } - - return super.qualifies( aPC ); + + return super.qualifies(aPC); } - + /** - * Compares this FollowerOption to another. This uses the race name of the + * Compares this FollowerOption to another. This uses the race name of the * option to do the comparison. - * @param anO The FollowerOption to compare to. + * + * @param anO + * The FollowerOption to compare to. * @return The comparison between the objects * @see java.lang.Comparable#compareTo(java.lang.Object) */ public int compareTo(FollowerOption anO) { - final Collator col = Collator.getInstance(); - String s1 = theRaceKey; - String s2 = anO.theRaceKey; - if ( this.theRace != null ) + return ReferenceUtilities.compareRefs(ref, anO.ref); + } + + public CDOMSingleRef<CompanionList> getListRef() + { + return list; + } + + public Collection<FollowerOption> getExpandedOptions() + { + final List<FollowerOption> options = new ArrayList<FollowerOption>(); + if (ref.getObjectCount() == 1) { - s1 = theRace.getDisplayName(); + options.add( this ); + return options; } - if ( anO.theRace != null ) + for (Race r : ref.getContainedObjects()) { - s2 = anO.theRace.getDisplayName(); + final FollowerOption opt = new FollowerOption(CDOMDirectSingleRef + .getRef(r), list); + opt.setAdjustment(getAdjustment()); + opt.addAllPrerequisites(getPrerequisiteList()); + options.add(opt); } - return col.compare( s1, s2); + return options; } } Modified: Trunk/pcgen/code/src/java/pcgen/core/Globals.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Globals.java 2008-09-27 14:52:39 UTC (rev 7805) +++ Trunk/pcgen/code/src/java/pcgen/core/Globals.java 2008-09-27 16:32:32 UTC (rev 7806) @@ -52,11 +52,13 @@ import pcgen.base.util.MapToList; import pcgen.cdom.base.CDOMObject; +import pcgen.cdom.base.CDOMObjectUtilities; import pcgen.cdom.base.Constants; import pcgen.cdom.base.MasterListInterface; import pcgen.cdom.enumeration.ObjectKey; import pcgen.cdom.enumeration.Pantheon; import pcgen.cdom.enumeration.RaceType; +import pcgen.cdom.list.CompanionList; import pcgen.core.character.CompanionMod; import pcgen.core.character.EquipSlot; import pcgen.core.spell.Spell; @@ -125,7 +127,7 @@ * Does need to be sorted? If not, change to HashMap.*/ private static Map<String, Object> spellMap = new TreeMap<String, Object>(); private static Map<String, String> eqSlotMap = new HashMap<String, String>(); - private static Map<String, List<CompanionMod>> companionModMap = new TreeMap<String, List<CompanionMod>>(); + private static Map<CompanionList, List<CompanionMod>> companionModMap = new TreeMap<CompanionList, List<CompanionMod>>(CDOMObjectUtilities.CDOM_SORTER); /** We use lists for efficient iteration */ private static List<Campaign> campaignList = new ArrayList<Campaign>(85); @@ -417,25 +419,28 @@ * * @since 5.11 */ - public static void addCompanionMod( final CompanionMod aMod ) + public static void addCompanionMod(final CompanionMod aMod) { - final String type = aMod.getType().toUpperCase(); - List<CompanionMod> mods = companionModMap.get( type ); - if ( mods == null ) + CompanionList cList = Globals.getContext().ref.constructNowIfNecessary( + CompanionList.class, aMod.getType()); + List<CompanionMod> mods = companionModMap.get(cList); + if (mods == null) { mods = new ArrayList<CompanionMod>(); - companionModMap.put( type, mods ); + companionModMap.put(cList, mods); } - mods.add( aMod ); + mods.add(aMod); } /** * Removes a <tt>CompanionMod</tt> from the system registry. * - * <p>This method is used by the .FORGET logic to remove a CompanionMod + * <p> + * This method is used by the .FORGET logic to remove a CompanionMod * previously loaded by another set. * - * @param aMod A <tt>CompanionMod</tt> to remove + * @param aMod + * A <tt>CompanionMod</tt> to remove * * @author boomer70 <boo...@ya...> * @@ -460,21 +465,6 @@ } /** - * Returns all types of followers for which a <code>CompanionMod</code> - * has been defined. - * - * @return Collection of Follower types. - * - * @author boomer70 <boo...@ya...> - * - * @since 5.11 - */ - public static Collection<String> getFollowerTypes() - { - return Collections.unmodifiableSet( companionModMap.keySet() ); - } - - /** * Gets all the <code>CompanionMod</code>s for the specified type of * follower. * @@ -485,15 +475,15 @@ * * @since 5.11 */ - public static Collection<CompanionMod> getCompanionMods( final String aType ) + public static Collection<CompanionMod> getCompanionMods( + final CompanionList cList) { - final String type = aType.toUpperCase(); - final List<CompanionMod> cMods = companionModMap.get( type ); - if ( cMods == null ) + final List<CompanionMod> cMods = companionModMap.get(cList); + if (cMods == null) { return Collections.emptyList(); } - return Collections.unmodifiableList( companionModMap.get( type ) ); + return Collections.unmodifiableList(companionModMap.get(cList)); } /** @@ -1961,7 +1951,7 @@ //unitSet.clear(); ////////////////////////////////////// abilityStore = new CategorisableStore(); - companionModMap = new TreeMap<String, List<CompanionMod>>(); + companionModMap = new TreeMap<CompanionList, List<CompanionMod>>(CDOMObjectUtilities.CDOM_SORTER); saSet = new TreeSet<SpecialAbility>(); // Clear Maps (not strictly necessary, but done for consistency) Modified: Trunk/pcgen/code/src/java/pcgen/core/PObject.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-09-27 14:52:39 UTC (rev 7805) +++ Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-09-27 16:32:32 UTC (rev 7806) @@ -125,11 +125,6 @@ private String chooseLanguageAutos = Constants.EMPTY_STRING; - /** Number of followers of each type allowed */ - private Map<String, List<String>> followerNumbers = null; - /** List of followers of a type allowed to be selected. */ - private Map<String, List<FollowerOption>> theAvailableFollowers = null; - private List<Description> theDescriptions = null; private HashMap<String,List<String>> servesAsList =null; @@ -914,15 +909,6 @@ retVal.levelAbilityList.add(ab); } } - if ( followerNumbers != null ) - { - retVal.followerNumbers = new HashMap<String,List<String>>(followerNumbers); - } - if ( theAvailableFollowers != null ) - { - retVal.theAvailableFollowers = new HashMap<String, List<FollowerOption>>( theAvailableFollowers ); - } - if ( this.theDescriptions != null ) { retVal.theDescriptions = new ArrayList<Description>(theDescriptions); @@ -3178,94 +3164,6 @@ * End methods for the KeyedListContainer Interface * ************************************************/ - /** - * Adds a formula to use to calculate the maximum number of followers of a - * given type for the character. - * @param aType Name of the follower type e.g. Familiar - * @param aFormula Formula, variable or number represent the max number - */ - public void setNumFollowers( final String aType, final String aFormula) - { - if ( followerNumbers == null ) - { - followerNumbers = new HashMap<String, List<String>>(); - } - List<String> numFollowers = followerNumbers.get( aType ); - if ( numFollowers == null ) - { - numFollowers = new ArrayList<String>(); - followerNumbers.put( aType.toUpperCase(), numFollowers ); - } - - numFollowers.add( aFormula ); - } - - public List<String> getNumFollowers( final String aType ) - { - if ( followerNumbers == null ) - { - return null; - } - final List<String> formulas = followerNumbers.get( aType.toUpperCase() ); - if ( formulas == null ) - { - return null; - } - return Collections.unmodifiableList( formulas ); - } - - public void addToFollowerList( final String aType, final FollowerOption anOption ) - { - final String ucType = aType.toUpperCase(); - if ( theAvailableFollowers == null ) - { - theAvailableFollowers = new HashMap<String, List<FollowerOption>>(); - } - List<FollowerOption> followers = theAvailableFollowers.get( ucType ); - if ( followers == null ) - { - followers = new ArrayList<FollowerOption>(); - theAvailableFollowers.put( ucType, followers ); - } - followers.add( anOption ); - } - - /** - * Gets the list of potential followers of a given type. - * @param aType Type of follower to retrieve list for e.g. Familiar - * @return A List of FollowerOption objects representing the possible list - * of follower choices. - */ - public List<FollowerOption> getPotentialFollowers( final String aType ) - { - if ( theAvailableFollowers == null ) - { - return null; - } - final String ucType = aType.toUpperCase(); - List<FollowerOption> options = theAvailableFollowers.get( ucType ); - if ( options != null ) - { - for ( int i = options.size() - 1; i >= 0; i-- ) - { - FollowerOption opt = options.get(i); - if ( opt.getRace() == null ) - { - // This FollowerOption references more than one race. - // We need to get the expanded versions and throw this one - // away - final Collection<FollowerOption> newOpts = opt.getExpandedOptions(); - if ( newOpts != null ) - { - options.addAll( newOpts ); - } - options.remove(i); - } - } - } - return options; - } - private DoubleKeyMap<AbilityCategory, Ability.Nature, List<QualifiedObject<String>>> theAbilities = new DoubleKeyMap<AbilityCategory, Ability.Nature, List<QualifiedObject<String>>>(); Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-09-27 14:52:39 UTC (rev 7805) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-09-27 16:32:32 UTC (rev 7806) @@ -79,12 +79,14 @@ import pcgen.cdom.enumeration.SkillCost; import pcgen.cdom.enumeration.StringKey; import pcgen.cdom.enumeration.VariableKey; +import pcgen.cdom.helper.FollowerLimit; import pcgen.cdom.helper.Qualifier; import pcgen.cdom.helper.StatLock; import pcgen.cdom.inst.EquipmentHead; import pcgen.cdom.inst.ObjectCache; import pcgen.cdom.inst.PCClassLevel; import pcgen.cdom.list.AbilityList; +import pcgen.cdom.list.CompanionList; import pcgen.cdom.reference.CDOMSingleRef; import pcgen.core.Ability.Nature; import pcgen.core.analysis.RaceStat; @@ -964,15 +966,16 @@ for (Follower aF : getFollowerList()) { - final String rType = aF.getType().toUpperCase(); + final CompanionList cList = aF.getType(); + final String rType = cList.getKeyName(); final String rName = aF.getRace().toUpperCase(); - for (CompanionMod cm : Globals.getCompanionMods(rType)) + for (CompanionMod cm : Globals.getCompanionMods(cList)) { - final String aType = cm.getType().toUpperCase(); + final String aType = cm.getType(); final int iRace = cm.getLevel(rName); - if (aType.equals(rType) && (iRace == 1)) + if (aType.equalsIgnoreCase(rType) && (iRace == 1)) { // Found race and type of follower // so add bonus to the master @@ -2156,7 +2159,7 @@ * A type of companion to get level for * @return The effective level for this companion type */ - public int getEffectiveCompanionLevel(final String compType) + public int getEffectiveCompanionLevel(final CompanionList compType) { final Collection<CompanionMod> mods = Globals.getCompanionMods(compType); @@ -2431,32 +2434,29 @@ * The follower type to check e.g. Familiar * @return The max number of followers -1 for any number */ - public int getMaxFollowers(final String aType) + public int getMaxFollowers(CompanionList cList) { int ret = -1; - List<? extends PObject> pobjList = getPObjectList(); - for (PObject pobj : pobjList) + List<? extends CDOMObject> cdomObjs = getCDOMObjectList(); + for (CDOMObject cdo : cdomObjs) { - if (pobj == null) + List<FollowerLimit> limits = cdo.getListFor(ListKey.FOLLOWERS); + if (limits != null) { - continue; + for (FollowerLimit fl : limits) + { + if (fl.getCompanionList().resolvesTo().equals(cList)) + { + int val = fl.getValue().resolve(this, + Constants.EMPTY_STRING).intValue(); + ret = Math.max(ret, val); + } + } } - - final List<String> formulas = pobj.getNumFollowers(aType); - if (formulas == null) - { - continue; - } - for (String formula : formulas) - { - final int val = - this.getVariableValue(formula, Constants.EMPTY_STRING, - this).intValue(); - ret = Math.max(ret, val); - } } + String aType = cList.getKeyName(); if (ret != -1) { // ret += (int)getBonusValue("FOLLOWERS", aType.toUpperCase()); @@ -2467,7 +2467,7 @@ // Old way of handling this // If the character qualifies for any companion mod of this type // they can take unlimited number of them. - for (CompanionMod cMod : Globals.getCompanionMods(aType)) + for (CompanionMod cMod : Globals.getCompanionMods(cList)) { for (String varName : cMod.getVarMap().keySet()) { @@ -2506,19 +2506,16 @@ { final List<FollowerOption> ret = new ArrayList<FollowerOption>(); - final List<? extends PObject> pobjList = getPObjectList(); - for (PObject pobj : pobjList) + for (CDOMObject cdo : getCDOMObjectList()) { - if (pobj == null) - { - continue; - } - - final List<FollowerOption> followers = - pobj.getPotentialFollowers(aType); + List<FollowerOption> followers = cdo + .getListFor(ListKey.COMPANIONLIST); if (followers != null) { - ret.addAll(followers); + for (FollowerOption fo : followers) + { + ret.addAll(fo.getExpandedOptions()); + } } } @@ -5400,7 +5397,12 @@ { for (CompanionMod cMod : companionModList) { - if (cMod.getType().equalsIgnoreCase(getMaster().getType())) + /* + * TODO This is the "slow" method - proper solution here is to + * get TYPE in CompanionMod to be "special" and actually store + * a CompanionList object, not a String + */ + if (cMod.getType().equalsIgnoreCase(getMaster().getType().getKeyName())) { if (cMod.getCopyMasterBAB() != null) { @@ -5416,7 +5418,7 @@ { for (CompanionMod cMod : companionModList) { - if (cMod.getType().equalsIgnoreCase(getMaster().getType())) + if (cMod.getType().equalsIgnoreCase(getMaster().getType().getKeyName())) { if (cMod.getCopyMasterCheck() != null) { @@ -5432,7 +5434,7 @@ { for (CompanionMod cMod : companionModList) { - if (cMod.getType().equalsIgnoreCase(getMaster().getType())) + if (cMod.getType().equalsIgnoreCase(getMaster().getType().getKeyName())) { if (cMod.getCopyMasterHP() != null) { @@ -7133,7 +7135,7 @@ { for (CompanionMod cMod : companionModList) { - if (cMod.getType().equalsIgnoreCase(getMaster().getType())) + if (cMod.getType().equalsIgnoreCase(getMaster().getType().getKeyName())) { if (cMod.getUseMasterSkill()) { Modified: Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorPC.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorPC.java 2008-09-27 14:52:39 UTC (rev 7805) +++ Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorPC.java 2008-09-27 16:32:32 UTC (rev 7806) @@ -1286,7 +1286,7 @@ for ( Follower follower : getPc().getFollowerList() ) { - if (follower.getType().equalsIgnoreCase(bString)) + if (follower.getType().getKeyName().equalsIgnoreCase(bString)) { ++countFollower; } @@ -1336,7 +1336,7 @@ for ( Follower follower : followers ) { - if (follower.getType().equalsIgnoreCase(typeString)) + if (follower.getType().getKeyName().equalsIgnoreCase(typeString)) { aList.add(follower); } Modified: Trunk/pcgen/code/src/java/pcgen/core/character/Follower.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/character/Follower.java 2008-09-27 14:52:39 UTC (rev 7805) +++ Trunk/pcgen/code/src/java/pcgen/core/character/Follower.java 2008-09-27 16:32:32 UTC (rev 7806) @@ -28,6 +28,7 @@ import pcgen.base.lang.UnreachableError; import pcgen.cdom.base.Constants; +import pcgen.cdom.list.CompanionList; import pcgen.core.SettingsHandler; /** @@ -53,7 +54,7 @@ private String fileName = Constants.EMPTY_STRING; private String name = Constants.EMPTY_STRING; private String race = Constants.EMPTY_STRING; - private String type = Constants.EMPTY_STRING; + private CompanionList type = null; private int usedHD; private int theAdjustment = 0; @@ -63,7 +64,7 @@ * @param aName * @param aType */ - public Follower(final String fName, final String aName, final String aType) + public Follower(final String fName, final String aName, final CompanionList aType) { fileName = fName; name = aName; @@ -159,7 +160,7 @@ * Set type * @param x */ - public void setType(final String x) + public void setType(final CompanionList x) { type = x; } @@ -168,7 +169,7 @@ * Get type * @return type */ - public String getType() + public CompanionList getType() { return type; } Modified: Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoResources.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoResources.java 2008-09-27 14:52:39 UTC (rev 7805) +++ Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoResources.java 2008-09-27 16:32:32 UTC (rev 7806) @@ -26,6 +26,21 @@ *************************************************************************/ package pcgen.gui.tabs; +import static pcgen.gui.HTMLUtils.BOLD; +import static pcgen.gui.HTMLUtils.BR; +import static pcgen.gui.HTMLUtils.END_BOLD; +import static pcgen.gui.HTMLUtils.END_FONT; +import static pcgen.gui.HTMLUtils.END_HTML; +import static pcgen.gui.HTMLUtils.END_ITALIC; +import static pcgen.gui.HTMLUtils.END_LI; +import static pcgen.gui.HTMLUtils.END_UL; +import static pcgen.gui.HTMLUtils.FONT_PLUS_1; +import static pcgen.gui.HTMLUtils.HTML; +import static pcgen.gui.HTMLUtils.ITALIC; +import static pcgen.gui.HTMLUtils.LI; +import static pcgen.gui.HTMLUtils.PARA; +import static pcgen.gui.HTMLUtils.UL; + import java.awt.BorderLayout; import java.awt.Component; import java.awt.FlowLayout; @@ -79,6 +94,7 @@ import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; import pcgen.cdom.enumeration.RaceType; +import pcgen.cdom.list.CompanionList; import pcgen.core.Equipment; import pcgen.core.FollowerOption; import pcgen.core.GameMode; @@ -121,8 +137,6 @@ import pcgen.util.PropertyFactory; import pcgen.util.enumeration.Tab; -import static pcgen.gui.HTMLUtils.*; - /** * <code>InfoResources</code> creates a new tabbed panel that is used to * allow creating/adding familiars, cohorts, companions, intelligent items @@ -279,7 +293,8 @@ public List<String> getToDos() { List<String> toDoList = new ArrayList<String>(); - for (String compType : Globals.getFollowerTypes()) + for (CompanionList compType : Globals.getContext().ref + .getConstructedCDOMObjects(CompanionList.class)) { // Check if we have a number set for this type int maxVal = pc.getMaxFollowers(compType); @@ -287,7 +302,7 @@ { for (Follower aF : pc.getFollowerList()) { - if (compType.equalsIgnoreCase(aF.getType())) + if (compType.equals(aF.getType())) { maxVal--; } @@ -585,7 +600,6 @@ } String nName; - String aType; Logging .debugPrint("addButton:race: " + race.getDisplayName() + " -> " + target); //$NON-NLS-1$ //$NON-NLS-2$ @@ -657,15 +671,15 @@ newPC.setRace(race); newPC.setDirty(true); - aType = target.getType(); + CompanionList cList = target.getType(); final Follower newMaster = - new Follower(pc.getFileName(), pc.getName(), aType); + new Follower(pc.getFileName(), pc.getName(), cList); newMaster.setAdjustment(opt.getAdjustment()); newPC.setMaster(newMaster); final Follower newFollower = - new Follower(file.getAbsolutePath(), nName, aType); + new Follower(file.getAbsolutePath(), nName, cList); newFollower.setRace(newPC.getRace().getKeyName()); pc.addFollower(newFollower); pc.setDirty(true); @@ -741,8 +755,6 @@ return; } - String aType; - File file = null; file = findPCGFile(); @@ -782,14 +794,14 @@ return; } } - aType = target.getType(); + CompanionList cList = target.getType(); Follower newMaster = - new Follower(oldPC.getFileName(), oldPC.getName(), aType); + new Follower(oldPC.getFileName(), oldPC.getName(), cList); newPC.setMaster(newMaster); Follower newFollower = - new Follower(file.getAbsolutePath(), newPC.getName(), aType); + new Follower(file.getAbsolutePath(), newPC.getName(), cList); newFollower.setRace(newPC.getRace().getKeyName()); oldPC.addFollower(newFollower); oldPC.setDirty(true); Modified: Trunk/pcgen/code/src/java/pcgen/gui/tabs/resources/AvailableFollowerModel.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/tabs/resources/AvailableFollowerModel.java 2008-09-27 14:52:39 UTC (rev 7805) +++ Trunk/pcgen/code/src/java/pcgen/gui/tabs/resources/AvailableFollowerModel.java 2008-09-27 16:32:32 UTC (rev 7806) @@ -15,6 +15,7 @@ import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; import pcgen.cdom.enumeration.RaceType; +import pcgen.cdom.list.CompanionList; import pcgen.core.FollowerOption; import pcgen.core.Globals; import pcgen.core.Movement; @@ -352,13 +353,15 @@ setRoot(avaRoot); final String qFilter = this.getQFilter(); - for (String compType : Globals.getFollowerTypes()) + for (CompanionList compList : Globals.getContext().ref + .getConstructedCDOMObjects(CompanionList.class)) { // Check if we have a number set for this type - final int maxVal = pc.getMaxFollowers(compType); + final int maxVal = pc.getMaxFollowers(compList); if (maxVal != 0) { final PObjectNode node = new PObjectNode(); + String compType = compList.getKeyName(); node .setDisplayName(CoreUtility.capitalizeFirstLetter(compType)); avaRoot.addChild(node); Modified: Trunk/pcgen/code/src/java/pcgen/gui/tabs/resources/SelectedFollowerModel.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/tabs/resources/SelectedFollowerModel.java 2008-09-27 14:52:39 UTC (rev 7805) +++ Trunk/pcgen/code/src/java/pcgen/gui/tabs/resources/SelectedFollowerModel.java 2008-09-27 16:32:32 UTC (rev 7806) @@ -1,5 +1,6 @@ package pcgen.gui.tabs.resources; +import pcgen.cdom.list.CompanionList; import pcgen.core.Globals; import pcgen.core.PlayerCharacter; import pcgen.core.Race; @@ -197,7 +198,7 @@ if (fObj != null) { - sRet = fObj.getType(); + sRet = fObj.getType().getKeyName(); } break; @@ -278,7 +279,7 @@ for (Follower aF : pc.getFollowerList()) { - if (!followerType.getType().equalsIgnoreCase(aF.getType())) + if (!followerType.getType().equals(aF.getType())) { continue; } @@ -301,19 +302,14 @@ */ public class FollowerType { - private String theTypeName; + private CompanionList theType; private int theMaxNumber = -1; private int theSelectedNumber = 0; private boolean theDisplayNumberFlag = true; - public FollowerType(final String aName) + public FollowerType(final CompanionList compType, final int aMax) { - theTypeName = aName; - } - - public FollowerType(final String aName, final int aMax) - { - theTypeName = aName; + theType = compType; theMaxNumber = aMax; } @@ -322,9 +318,9 @@ theDisplayNumberFlag = yesNo; } - public String getType() + public CompanionList getType() { - return theTypeName; + return theType; } public void incrementFollowerCount(final int aCount) @@ -350,7 +346,7 @@ public String toString() { final StringBuffer buf = new StringBuffer(); - buf.append(CoreUtility.capitalizeFirstLetter(theTypeName)); + buf.append(CoreUtility.capitalizeFirstLetter(theType.getDisplayName())); if (theDisplayNumberFlag) { buf.append(" ("); //$NON-NLS-1$ @@ -377,16 +373,11 @@ { ArrayList<FollowerType> selectedList = new ArrayList<FollowerType>(); - String followerType = "Followers"; - int maxVal = pc.getMaxFollowers(followerType); - if (maxVal != 0) + for (CompanionList compType : Globals.getContext().ref + .getConstructedCDOMObjects(CompanionList.class)) { - selectedList.add(new FollowerType(followerType, maxVal)); - } - for (String compType : Globals.getFollowerTypes()) - { // Check if we have a number set for this type - maxVal = pc.getMaxFollowers(compType); + int maxVal = pc.getMaxFollowers(compType); if (maxVal != 0) { selectedList.add(new FollowerType(compType, maxVal)); Modified: Trunk/pcgen/code/src/java/pcgen/io/ExportHandler.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/ExportHandler.java 2008-09-27 14:52:39 UTC (rev 7805) +++ Trunk/pcgen/code/src/java/pcgen/io/ExportHandler.java 2008-09-27 16:32:32 UTC (rev 7806) @@ -1748,7 +1748,7 @@ { final Follower fol = aList.get(i); - if (!fol.getType().equalsIgnoreCase(typeString)) + if (!fol.getType().getKeyName().equalsIgnoreCase(typeString)) { aList.remove(i); } Modified: Trunk/pcgen/code/src/java/pcgen/io/PCGVer0Parser.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/PCGVer0Parser.java 2008-09-27 14:52:39 UTC (rev 7805) +++ Trunk/pcgen/code/src/java/pcgen/io/PCGVer0Parser.java 2008-09-27 16:32:32 UTC (rev 7806) @@ -35,6 +35,7 @@ import pcgen.cdom.base.Constants; import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; +import pcgen.cdom.list.CompanionList; import pcgen.core.Ability; import pcgen.core.AbilityUtilities; import pcgen.core.Campaign; @@ -1273,17 +1274,27 @@ String fName = aTok.nextToken(); String aName = aTok.nextToken(); String aType = aTok.nextToken(); - int usedHD = Integer.parseInt(aTok.nextToken()); - Follower aF = new Follower(fName, aName, aType); - aF.setUsedHD(usedHD); - - if ("FOLLOWER".equals(who)) + CompanionList cList = Globals.getContext().ref + .silentlyGetConstructedCDOMObject(CompanionList.class, + aType); + if (cList == null) { - aPC.addFollower(aF); + Logging.errorPrint("Cannot find CompanionList: " + aType); } - else if ("MASTER".equals(who)) + else { - aPC.setMaster(aF); + int usedHD = Integer.parseInt(aTok.nextToken()); + Follower aF = new Follower(fName, aName, cList); + aF.setUsedHD(usedHD); + + if ("FOLLOWER".equals(who)) + { + aPC.addFollower(aF); + } + else if ("MASTER".equals(who)) + { + aPC.setMaster(aF); + } } i++; Modified: Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Creator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Creator.java 2008-09-27 14:52:39 UTC (rev 7805) +++ Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Creator.java 2008-09-27 16:32:32 UTC (rev 7806) @@ -1458,7 +1458,7 @@ buffer.append(EntityEncoder.encode(aMaster.getName())); buffer.append('|'); buffer.append(TAG_TYPE).append(':'); - buffer.append(EntityEncoder.encode(aMaster.getType())); + buffer.append(EntityEncoder.encode(aMaster.getType().getKeyName())); buffer.append('|'); buffer.append(TAG_HITDICE).append(':'); buffer.append(aMaster.getUsedHD()); @@ -1481,7 +1481,7 @@ buffer.append(EntityEncoder.encode(follower.getName())); buffer.append('|'); buffer.append(TAG_TYPE).append(':'); - buffer.append(EntityEncoder.encode(follower.getType())); + buffer.append(EntityEncoder.encode(follower.getType().getKeyName())); buffer.append('|'); buffer.append(TAG_RACE).append(':'); buffer.append(EntityEncoder.encode(follower.getRace() Modified: Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Parser.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Parser.java 2008-09-27 14:52:39 UTC (rev 7805) +++ Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Parser.java 2008-09-27 16:32:32 UTC (rev 7806) @@ -43,6 +43,7 @@ import pcgen.cdom.enumeration.ObjectKey; import pcgen.cdom.enumeration.StringKey; import pcgen.cdom.list.ClassSpellList; +import pcgen.cdom.list.CompanionList; import pcgen.cdom.list.DomainSpellList; import pcgen.core.Ability; import pcgen.core.AbilityCategory; @@ -2705,7 +2706,7 @@ final Follower aFollower = new Follower(Constants.EMPTY_STRING, Constants.EMPTY_STRING, - Constants.EMPTY_STRING); + null); for (final PCGElement element : tokens.getElements()) { @@ -2717,7 +2718,18 @@ } else if (TAG_TYPE.equals(tag)) { - aFollower.setType(EntityEncoder.decode(element.getText())); + String cType = EntityEncoder.decode(element.getText()); + CompanionList cList = Globals.getContext().ref + .silentlyGetConstructedCDOMObject(CompanionList.class, + cType); + if (cList == null) + { + Logging.errorPrint("Cannot find CompanionList: " + cType); + } + else + { + aFollower.setType(cList); + } } else if (TAG_RACE.equals(tag)) { @@ -2939,7 +2951,7 @@ final Follower aMaster = new Follower(Constants.EMPTY_STRING, Constants.EMPTY_STRING, - Constants.EMPTY_STRING); + null); for (PCGElement element : tokens.getElements()) { @@ -2951,7 +2963,18 @@ } else if (TAG_TYPE.equals(tag)) { - aMaster.setType(EntityEncoder.decode(element.getText())); + String cType = EntityEncoder.decode(element.getText()); + CompanionList cList = Globals.getContext().ref + .silentlyGetConstructedCDOMObject(CompanionList.class, + cType); + if (cList == null) + { + Logging.errorPrint("Cannot find CompanionList: " + cType); + } + else + { + aMaster.setType(cList); + } } else if (TAG_HITDICE.equals(tag)) { Modified: Trunk/pcgen/code/src/java/pcgen/rules/context/AbstractReferenceContext.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/rules/context/AbstractReferenceContext.java 2008-09-27 14:52:39 UTC (rev 7805) +++ Trunk/pcgen/code/src/java/pcgen/rules/context/AbstractReferenceContext.java 2008-09-27 16:32:32 UTC (rev 7806) @@ -415,6 +415,11 @@ } } + public <T extends CDOMObject> T constructNowIfNecessary(Class<T> cl, String name) + { + return getManufacturer(cl).constructNowIfNecessary(name); + } + // public <T extends CDOMObject> CDOMAddressedSingleRef<T> // getAddressedReference( // CDOMObject obj, Class<T> name, String addressName) Modified: Trunk/pcgen/code/src/java/plugin/exporttokens/FollowerTypeToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/exporttokens/FollowerTypeToken.java 2008-09-27 14:52:39 UTC (rev 7805) +++ Trunk/pcgen/code/src/java/plugin/exporttokens/FollowerTypeToken.java 2008-09-27 16:32:32 UTC (rev 7806) @@ -154,7 +154,7 @@ { final Follower fol = followers.get(i); - if (fol.getType().equalsIgnoreCase(typeString)) + if (fol.getType().getKeyName().equalsIgnoreCase(typeString)) { aList.add(fol); } Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/CompanionListLst.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/CompanionListLst.java 2008-09-27 14:52:39 UTC (rev 7805) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/CompanionListLst.java 2008-09-27 16:32:32 UTC (rev 7806) @@ -23,174 +23,345 @@ package plugin.lsttokens; import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.StringTokenizer; -import java.util.HashSet; +import java.util.TreeSet; +import pcgen.base.util.TripleKeyMapToList; +import pcgen.cdom.base.CDOMList; +import pcgen.cdom.base.CDOMObject; +import pcgen.cdom.base.CDOMReference; +import pcgen.cdom.base.Constants; +import pcgen.cdom.enumeration.ListKey; +import pcgen.cdom.enumeration.ObjectKey; +import pcgen.cdom.enumeration.RaceType; +import pcgen.cdom.list.CompanionList; +import pcgen.cdom.reference.CDOMSingleRef; +import pcgen.cdom.reference.ObjectMatchingReference; +import pcgen.cdom.reference.ReferenceUtilities; import pcgen.core.FollowerOption; -import pcgen.core.PObject; +import pcgen.core.Race; import pcgen.core.prereq.Prerequisite; import pcgen.persistence.PersistenceLayerException; -import pcgen.persistence.lst.GlobalLstToken; import pcgen.persistence.lst.LstUtils; -import pcgen.persistence.lst.prereq.PreParserFactory; +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; -import pcgen.util.PropertyFactory; /** * This class implments the parsing for the COMPANIONLIST token. - * <p /><b>Tag Name</b>: <code>COMPANIONLIST</code>:x|y,y|z - * <p /><b>Variables Used (x)</b>: <i>Text</i> (The type of companion list to - * add to).<br /> - * <b>Variables Used (y)</b>: <i>Text</i> (A race of companion to allow to - * the character).<br /> - * <b>Variables Used (y)</b>: <code>RACETYPE</code>=<i>Text</i> (all races with - * the specified <code>RACETYPE</code> are available as this type of companion). - * <br /> - * <b>Variables Used (y)</b>: <code>ANY</code> (Any race can be a companion of - * this type).<br /> - * <b>Variables Used (z)</b>: <code>FOLLOWERADJUSTMENT</code>=<i>Number</i> + * <p /> + * <b>Tag Name</b>: <code>COMPANIONLIST</code>:x|y,y|z + * <p /> + * <b>Variables Used (x)</b>: <i>Text</i> (The type of companion list to add + * to).<br /> + * <b>Variables Used (y)</b>: <i>Text</i> (A race of companion to allow to the + * character).<br /> + * <b>Variables Used (y)</b>: <code>RACETYPE</code>=<i>Text</i> (all races + * with the specified <code>RACETYPE</code> are available as this type of + * companion). <br /> + * <b>Variables Used (y)</b>: <code>ANY</code> (Any race can be a companion + * of this type).<br /> + * <b>Variables Used (z)</b>: <code>FOLLOWERADJUSTMENT</code>=<i>Number</i> * (Adjustment to the follower level variable). - * <p /><b>What it does:</b> + * <p /> + * <b>What it does:</b> * <ul> * <li>Adds a specific race or races to the list of available companions for * the specified companion type.</li> * <li>PRExxx tags can be added at the end of COMPANIONLIST tags, PRExxx tags * are checked against the master.</li> - * <li>If the master does not meet the prereqs the companion will be displayed + * <li>If the master does not meet the prereqs the companion will be displayed * in the list but will be listed in red and cannot be added as a companion. * </li> * </ul> - * <p /><b>Examples:</b><br /> + * <p /> + * <b>Examples:</b><br /> * <code>COMPANIONLIST:Familiar|Bat,Cat,Hawk,Lizard,Owl,Rat,Raven, * Snake (Tiny/Viper),Toad,Weasel</code><br /> - * Would build the list of standard familiars available to a Sorcerer or - * Wizard. - * <p /><code>COMPANIONLIST:Pet|RACETYPE=Animal</code><br /> + * Would build the list of standard familiars available to a Sorcerer or Wizard. + * <p /> + * <code>COMPANIONLIST:Pet|RACETYPE=Animal</code><br /> * Would build a list of all animals to available as a Pet. - * <p /><code>COMPANIONLIST:Familiar|Quasit|PREFEAT:1,Special Familiar| + * <p /> + * <code>COMPANIONLIST:Familiar|Quasit|PREFEAT:1,Special Familiar| * PREALIGN:CE</code><br /> * A Quasit can be chosen as a Familiar but only if the master is evil and has * the Special Familiar feat. - * <p /><code>COMPANIONLIST:Animal Companion|Ape|FOLLOWERADJUSTMENT:-3</code> - * <br />An Ape companion to a 4th level Druid gains the benefits normally - * granted to a companion of a 1st level Druid. - * + * <p /> + * <code>COMPANIONLIST:Animal Companion|Ape|FOLLOWERADJUSTMENT:-3</code> + * <br /> + * An Ape companion to a 4th level Druid gains the benefits normally granted to + * a companion of a 1st level Druid. + * * @author divaa01 - * + * */ -public class CompanionListLst implements GlobalLstToken +public class CompanionListLst extends AbstractToken implements + CDOMPrimaryToken<CDOMObject> { private static final String COMPANIONLIST = "COMPANIONL... [truncated message content] |
From: <th...@us...> - 2008-09-27 17:26:13
|
Revision: 7808 http://pcgen.svn.sourceforge.net/pcgen/?rev=7808&view=rev Author: thpr Date: 2008-09-27 17:26:08 +0000 (Sat, 27 Sep 2008) Log Message: ----------- Additional Association Changes 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/core/Ability.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/bonus/BonusObj.java Trunk/pcgen/code/src/java/pcgen/gui/ChooseSpellDialog.java Trunk/pcgen/code/src/java/pcgen/gui/utils/PObjectNode.java Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Creator.java Trunk/pcgen/code/src/test/pcgen/persistence/lst/utils/FeatParserTest.java Modified: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/EqModNameOpt.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/EqModNameOpt.java 2008-09-27 17:12:09 UTC (rev 7807) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/EqModNameOpt.java 2008-09-27 17:26:08 UTC (rev 7808) @@ -25,7 +25,6 @@ import pcgen.base.lang.UnreachableError; import pcgen.base.util.CaseInsensitiveMap; import pcgen.cdom.base.Constants; -import pcgen.core.AssociatedChoice; import pcgen.core.Equipment; import pcgen.core.EquipmentModifier; import pcgen.core.Globals; @@ -65,7 +64,7 @@ StringBuilder sb = new StringBuilder(100); sb.append(mod.getDisplayName()); sb.append(" ("); - sb.append(mod.associatedList()); + sb.append(associatedList(parent.getAssociationList(mod))); sb.append(')'); return sb.toString().trim().replace('|', ' '); } @@ -85,7 +84,7 @@ { StringBuilder sb = new StringBuilder(100); sb.append(mod.getDisplayName()); - sb.append(mod.associatedList()); + sb.append(associatedList(parent.getAssociationList(mod))); return sb.toString().trim().replace('|', ' '); } }, @@ -228,7 +227,7 @@ } } - public String associatedList(List<AssociatedChoice<String>> associatedList) + public String associatedList(List<String> associatedList) { if (associatedList == null) { @@ -238,25 +237,23 @@ { StringBuilder sb = new StringBuilder(); boolean first = true; - for (AssociatedChoice<String> choice : associatedList) + for (String choice : associatedList) { if (!first) { sb.append(", "); } first = false; - final String choiceStr = choice.getDefaultChoice(); - if (choiceStr.equals(Constants.EMPTY_STRING)) + if (choice == null) { sb.append('*'); } else { - sb.append(choiceStr); + sb.append(choice); } } 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-27 17:12:09 UTC (rev 7807) +++ Trunk/pcgen/code/src/java/pcgen/cdom/helper/Aspect.java 2008-09-27 17:26:08 UTC (rev 7808) @@ -25,6 +25,7 @@ import java.util.ArrayList; import java.util.List; +import pcgen.base.lang.StringUtil; import pcgen.cdom.base.Constants; import pcgen.cdom.enumeration.AspectName; import pcgen.core.Ability; @@ -269,28 +270,26 @@ { if (theOwner != null && aPC.hasAssociations(theOwner)) { - buf.append(theOwner.getAssociated(0)); + buf.append(aPC.getFirstAssociation(theOwner)); } } else if ( var.equals(VAR_LIST) ) { if ( theOwner != null ) { - for ( int i = 0; i < aPC.getDetailedAssociationCount(theOwner); i++ ) + List<String> assocList = aPC.getExpandedAssociations(theOwner); + String joinString; + if (assocList.size() == 2) { - if ( i > 0 ) - { - if (aPC.getDetailedAssociationCount(theOwner) != 2) - { - buf.append(Constants.COMMA + ' '); - } - if (i == aPC.getDetailedAssociationCount(theOwner) - 1) - { - buf.append(" and "); - } - } - buf.append(theOwner.getAssociated(i, true)); + joinString = " and "; } + else + { + joinString = ", "; + } + buf.append(StringUtil.joinToStringBuffer(aPC + .getExpandedAssociations(theOwner), + joinString)); } } else if ( var.startsWith(VAR_FEATS) ) Modified: Trunk/pcgen/code/src/java/pcgen/core/Ability.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Ability.java 2008-09-27 17:12:09 UTC (rev 7807) +++ Trunk/pcgen/code/src/java/pcgen/core/Ability.java 2008-09-27 17:26:08 UTC (rev 7808) @@ -22,6 +22,7 @@ import java.util.ArrayList; import java.util.List; +import pcgen.base.lang.StringUtil; import pcgen.cdom.base.CDOMReference; import pcgen.cdom.base.CategorizedCDOMObject; import pcgen.cdom.base.Category; @@ -345,21 +346,8 @@ { // has a sub-detail aStrBuf.append(" ("); - - int i = 0; - - // list of items in associatedList, e.g. " (Sub1, Sub2, ...)" - for (int e = 0; e < pc.getDetailedAssociationCount(this); ++e) - { - if (i > 0) - { - aStrBuf.append(", "); - } - - aStrBuf.append(getAssociated(e, true)); - ++i; - } - + aStrBuf.append(StringUtil.joinToStringBuffer(pc + .getExpandedAssociations(this), ", ")); aStrBuf.append(')'); } } Modified: Trunk/pcgen/code/src/java/pcgen/core/AssociationStore.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/AssociationStore.java 2008-09-27 17:12:09 UTC (rev 7807) +++ Trunk/pcgen/code/src/java/pcgen/core/AssociationStore.java 2008-09-27 17:26:08 UTC (rev 7808) @@ -20,4 +20,9 @@ public int getDetailedAssociationCount(PObject obj); + public List<String[]> getDetailedAssociations(PObject obj); + + public List<String> getExpandedAssociations(PObject obj); + + public String getFirstAssociation(PObject obj); } Modified: Trunk/pcgen/code/src/java/pcgen/core/Description.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Description.java 2008-09-27 17:12:09 UTC (rev 7807) +++ Trunk/pcgen/code/src/java/pcgen/core/Description.java 2008-09-27 17:26:08 UTC (rev 7808) @@ -25,6 +25,7 @@ import java.util.ArrayList; import java.util.List; +import pcgen.base.lang.StringUtil; import pcgen.cdom.base.ConcretePrereqObject; import pcgen.cdom.base.Constants; import pcgen.persistence.PersistenceLayerException; @@ -192,28 +193,26 @@ { if ( theOwner != null && aPC.hasAssociations(theOwner) ) { - buf.append(theOwner.getAssociated(0)); + buf.append(aPC.getFirstAssociation(theOwner)); } } else if ( var.equals(VAR_LIST) ) { if ( theOwner != null ) { - for ( int i = 0; i < aPC.getDetailedAssociationCount(theOwner); i++ ) + List<String> assocList = aPC.getExpandedAssociations(theOwner); + String joinString; + if (assocList.size() == 2) { - if ( i > 0 ) - { - if (aPC.getDetailedAssociationCount(theOwner) != 2) - { - buf.append(Constants.COMMA + ' '); - } - if (i == aPC.getDetailedAssociationCount(theOwner) - 1) - { - buf.append(" and "); - } - } - buf.append(theOwner.getAssociated(i, true)); + joinString = " and "; } + else + { + joinString = ", "; + } + buf.append(StringUtil.joinToStringBuffer(aPC + .getExpandedAssociations(theOwner), + joinString)); } } else if ( var.startsWith(VAR_FEATS) ) Modified: Trunk/pcgen/code/src/java/pcgen/core/Equipment.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Equipment.java 2008-09-27 17:12:09 UTC (rev 7807) +++ Trunk/pcgen/code/src/java/pcgen/core/Equipment.java 2008-09-27 17:26:08 UTC (rev 7808) @@ -767,7 +767,7 @@ Matcher mat; if (hasAssociations(eqMod) - && !costFormula.equals(eqMod.getCost(eqMod.getAssociated(0)))) { + && !costFormula.equals(eqMod.getCost(getFirstAssociation(eqMod)))) { eqModCost = BigDecimal.ZERO; for (String assoc : getAssociationList(eqMod)) @@ -6108,4 +6108,41 @@ { return obj.tempGetAssociatedCount(true); } + + public List<String[]> getDetailedAssociations(PObject obj) + { + ArrayList<AssociatedChoice<String>> assocs = obj.getAssociatedList(); + List<String[]> list = new ArrayList<String[]>(); + for (AssociatedChoice<String> choice : assocs) + { + String[] array = new String[choice.size()]; + array[0] = choice.getDefaultChoice(); + for (int i = 1; i < array.length; i++) + { + array[i] = choice.getChoice(Integer.toString(i)); + } + list.add(array); + } + return list; + } + + public List<String> getExpandedAssociations(PObject obj) + { + ArrayList<AssociatedChoice<String>> assocs = obj.getAssociatedList(); + List<String> list = new ArrayList<String>(); + for (AssociatedChoice<String> choice : assocs) + { + list.add(choice.getDefaultChoice()); + for (int i = 1; i < choice.size(); i++) + { + list.add(choice.getChoice(Integer.toString(i))); + } + } + return list; + } + + public String getFirstAssociation(PObject obj) + { + return obj.getAssociatedList().get(0).toString(); + } } Modified: Trunk/pcgen/code/src/java/pcgen/core/EquipmentModifier.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/EquipmentModifier.java 2008-09-27 17:12:09 UTC (rev 7807) +++ Trunk/pcgen/code/src/java/pcgen/core/EquipmentModifier.java 2008-09-27 17:26:08 UTC (rev 7808) @@ -369,7 +369,7 @@ if ("%CHOICE".equals(getSRFormula()) && parent.hasAssociations(this)) { - return Delta.parseInt(getAssociatedObject(0).toString()); + return Delta.parseInt(parent.getFirstAssociation(this)); } final String srFormula = getSRFormula(); @@ -819,7 +819,7 @@ { if (parent.hasAssociations(this)) { - return getSpellInfo(getAssociated(0), s_CHARGES); + return getSpellInfo(parent.getFirstAssociation(this), s_CHARGES); } return 0; Modified: Trunk/pcgen/code/src/java/pcgen/core/PObject.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-09-27 17:12:09 UTC (rev 7807) +++ Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-09-27 17:26:08 UTC (rev 7808) @@ -142,54 +142,6 @@ * ************/ /** - * Get the associated item, without expanding the list - * @param idx - * @return the associated item - */ - public final String getAssociated(final int idx) - { - return getAssociated(idx, false); - } - - /** - * Get the associated item - * @param idx - * @param expand - whether to expand the choice - * @return associated item - */ - public final String getAssociated(int idx, final boolean expand) - { - if (associatedList == null) - { - return Constants.EMPTY_STRING; - } - - if (expand) - { - int currentCount = 0; - for ( final AssociatedChoice<String> choice : associatedList ) - { - final int choiceInd = choice.size() - 1; - if ( idx <= (currentCount + choiceInd) ) - { - if ( choiceInd == 0 ) - { - return choice.getDefaultChoice(); - } - return choice.getChoice(String.valueOf(idx - currentCount)); - } - currentCount += choice.size(); - } - } - else if (associatedList.get(idx) instanceof FeatMultipleChoice) - { - return associatedList.get(idx).toString(); - } - - return associatedList.get(idx).getDefaultChoice(); - } - - /** * Get associated count, without expanding * @return associated count */ @@ -623,38 +575,6 @@ associatedList.add(aFeatChoices); } - public 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(); - } - } - - /** * Add to the 'save' for the character list * @param aString @@ -2915,14 +2835,6 @@ return associatedList.remove(i); } - final void sortAssociated() - { - if (associatedList != null) - { - Collections.sort(associatedList); - } - } - /** * rephrase parenthetical name components, if appropriate * @return pre formatted output name @@ -4051,14 +3963,4 @@ return result == null ? new ArrayList<String>() : Collections .unmodifiableList(result); } - - public String getCompressedChoice(AssociatedChoice<String> c) - { - if (c instanceof FeatMultipleChoice) - { - return c.toString(); - } - - return c.getDefaultChoice(); - } } Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-09-27 17:12:09 UTC (rev 7807) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-09-27 17:26:08 UTC (rev 7808) @@ -12290,7 +12290,6 @@ && !containsAssociated(anAbility, aString)) { addAssociation(anAbility, aString); - anAbility.sortAssociated(); } } else @@ -17952,6 +17951,43 @@ return obj.tempGetAssociatedCount(true); } + public List<String[]> getDetailedAssociations(PObject obj) + { + ArrayList<AssociatedChoice<String>> assocs = obj.getAssociatedList(); + List<String[]> list = new ArrayList<String[]>(); + for (AssociatedChoice<String> choice : assocs) + { + String[] array = new String[choice.size()]; + array[0] = choice.getDefaultChoice(); + for (int i = 1; i < array.length; i++) + { + array[i] = choice.getChoice(Integer.toString(i)); + } + list.add(array); + } + return list; + } + + public List<String> getExpandedAssociations(PObject obj) + { + ArrayList<AssociatedChoice<String>> assocs = obj.getAssociatedList(); + List<String> list = new ArrayList<String>(); + for (AssociatedChoice<String> choice : assocs) + { + list.add(choice.getDefaultChoice()); + for (int i = 1; i < choice.size(); i++) + { + list.add(choice.getChoice(Integer.toString(i))); + } + } + return list; + } + + public String getFirstAssociation(PObject obj) + { + return obj.getAssociatedList().get(0).toString(); + } + public void addAssoc(Object obj, Object o) { assocSupt.addAssoc(obj, o); @@ -18036,5 +18072,4 @@ { selectedFavoredClass = sfc; } - } Modified: Trunk/pcgen/code/src/java/pcgen/core/bonus/BonusObj.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/bonus/BonusObj.java 2008-09-27 17:12:09 UTC (rev 7807) +++ Trunk/pcgen/code/src/java/pcgen/core/bonus/BonusObj.java 2008-09-27 17:26:08 UTC (rev 7808) @@ -966,8 +966,7 @@ if (name.indexOf(VALUE_TOKEN_REPLACEMENT) >= 0) { thisName = - name.replaceAll(VALUE_TOKEN_PATTERN, anObj - .getCompressedChoice(assoc)); + name.replaceAll(VALUE_TOKEN_PATTERN, assoc.toString()); } else { @@ -986,12 +985,11 @@ } else if (info.indexOf(VAR_TOKEN_REPLACEMENT) >= 0) { - infoList.add(name.replaceAll(VAR_TOKEN_PATTERN, anObj - .getCompressedChoice(assoc))); + infoList.add(name.replaceAll(VAR_TOKEN_PATTERN, assoc.toString())); } else if (info.equals(LIST_TOKEN_REPLACEMENT)) { - infoList.add(anObj.getCompressedChoice(assoc)); + infoList.add(assoc.toString()); } else { @@ -1013,8 +1011,7 @@ if (listIndex >= 0) { thisValue = - value.replaceAll(VALUE_TOKEN_PATTERN, anObj - .getCompressedChoice(assoc)); + value.replaceAll(VALUE_TOKEN_PATTERN, assoc.toString()); } newFormula = FormulaFactory.getFormulaFor(thisValue); } Modified: Trunk/pcgen/code/src/java/pcgen/gui/ChooseSpellDialog.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/ChooseSpellDialog.java 2008-09-27 17:12:09 UTC (rev 7807) +++ Trunk/pcgen/code/src/java/pcgen/gui/ChooseSpellDialog.java 2008-09-27 17:26:08 UTC (rev 7808) @@ -345,7 +345,7 @@ } else { - final PCClass aClass = Globals.getContext().ref.silentlyGetConstructedCDOMObject(PCClass.class, castingClass.getAssociated(0)); + final PCClass aClass = Globals.getContext().ref.silentlyGetConstructedCDOMObject(PCClass.class, pc.getFirstAssociation(castingClass)); if (aClass != null) { Modified: Trunk/pcgen/code/src/java/pcgen/gui/utils/PObjectNode.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/utils/PObjectNode.java 2008-09-27 17:12:09 UTC (rev 7807) +++ Trunk/pcgen/code/src/java/pcgen/gui/utils/PObjectNode.java 2008-09-27 17:26:08 UTC (rev 7808) @@ -18,9 +18,22 @@ */ package pcgen.gui.utils; +import java.awt.Color; +import java.util.ArrayList; +import java.util.ListIterator; + +import pcgen.base.lang.StringUtil; import pcgen.cdom.base.Constants; import pcgen.cdom.enumeration.ObjectKey; -import pcgen.core.*; +import pcgen.core.Ability; +import pcgen.core.Deity; +import pcgen.core.Domain; +import pcgen.core.Equipment; +import pcgen.core.PCClass; +import pcgen.core.PObject; +import pcgen.core.PlayerCharacter; +import pcgen.core.Race; +import pcgen.core.SettingsHandler; import pcgen.core.character.CharacterSpell; import pcgen.core.character.SpellInfo; import pcgen.core.prereq.PrereqHandler; @@ -29,10 +42,6 @@ import pcgen.util.Logging; import pcgen.util.ResetableListIterator; -import java.awt.Color; -import java.util.ArrayList; -import java.util.ListIterator; - /** * <code>PObjectNode</code> -- No, binkley isn't really the author, I * it is Bryan, but <em>somebody</em> has got to take code ownership and @@ -270,7 +279,7 @@ // final int subCount = aPC.getDetailedAssociationCount(aFeat); if ((subCount > 1) - && (aFeat.getAssociated(0, true).length() == 0)) + && (aFeat.getChoiceString().endsWith("NOCHOICE"))) { aString.append('('); aString.append(subCount); @@ -278,19 +287,8 @@ } else { - for (int i = 0; i < aPC.getDetailedAssociationCount(aFeat); i++) - { - if (addComma) - { - aString.append(','); - } - else - { - addComma = true; - } - - aString.append(aFeat.getAssociated(i, true)); - } + aString.append(StringUtil.joinToStringBuffer(aPC + .getExpandedAssociations(aFeat), ",")); } } } Modified: Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Creator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Creator.java 2008-09-27 17:12:09 UTC (rev 7807) +++ Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Creator.java 2008-09-27 17:26:08 UTC (rev 7808) @@ -53,7 +53,6 @@ import pcgen.core.Description; import pcgen.core.Domain; import pcgen.core.Equipment; -import pcgen.core.FeatMultipleChoice; import pcgen.core.GameMode; import pcgen.core.Globals; import pcgen.core.Kit; @@ -1399,18 +1398,22 @@ if (ability.getSafe(ObjectKey.MULTIPLE_ALLOWED)) { buffer.append(TAG_APPLIEDTO).append(TAG_END); - if (ability.getAssociatedObject(0) instanceof FeatMultipleChoice) - { - buffer.append(TAG_MULTISELECT).append(':'); - } + List<String[]> assocList = thePC.getDetailedAssociations(ability); boolean first = true; - for (String assoc : thePC.getAssociationList(ability)) + for (String[] assocArray : assocList) { - if (!first) + if (assocArray.length > 1) { - buffer.append(Constants.COMMA); + buffer.append(TAG_MULTISELECT).append(':'); } - buffer.append(EntityEncoder.encode(assoc)); + for (String assoc : assocArray) + { + if (!first) + { + buffer.append(Constants.COMMA); + } + buffer.append(EntityEncoder.encode(assoc)); + } } buffer.append(TAG_SEPARATOR); } @@ -2632,14 +2635,10 @@ .append('[').append(TAG_PROMPT).append(':').append( EntityEncoder.encode(la.getTagData())); - for (int j = 0; j < thePC.getDetailedAssociationCount(la); ++j) + for (String s : thePC.getExpandedAssociations(la)) { - buffer - .append('|') - .append(TAG_CHOICE) - .append(':') - .append( - EntityEncoder.encode(la.getAssociated(j, true))); + buffer.append('|').append(TAG_CHOICE).append(':'); + buffer.append(EntityEncoder.encode(s)); } buffer.append(']'); Modified: Trunk/pcgen/code/src/test/pcgen/persistence/lst/utils/FeatParserTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/persistence/lst/utils/FeatParserTest.java 2008-09-27 17:12:09 UTC (rev 7807) +++ Trunk/pcgen/code/src/test/pcgen/persistence/lst/utils/FeatParserTest.java 2008-09-27 17:26:08 UTC (rev 7808) @@ -20,9 +20,11 @@ */ package pcgen.persistence.lst.utils; +import java.util.ArrayList; import java.util.List; import pcgen.AbstractCharacterTestCase; import pcgen.core.Ability; +import pcgen.core.AssociatedChoice; import pcgen.core.Globals; import pcgen.core.prereq.Prerequisite; import pcgen.core.prereq.PrerequisiteOperator; @@ -131,9 +133,10 @@ is((feats.get(1)).getDisplayName(), strEq("Weapon Finesse"), "Second feat is correct"); - is((feats.get(1)).getAssociated(0), strEq("Bite"), - "First choice is correct"); - is((feats.get(1)).getAssociated(1), strEq("Claws"), - "Second choice is correct"); + ArrayList<AssociatedChoice<String>> list = feats.get(1) + .getAssociatedList(); + + is(list.get(0).toString(), strEq("Bite"), "First choice is correct"); + is(list.get(1).toString(), strEq("Claws"), "Second choice is correct"); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-09-27 19:06:52
|
Revision: 7809 http://pcgen.svn.sourceforge.net/pcgen/?rev=7809&view=rev Author: thpr Date: 2008-09-27 19:06:44 +0000 (Sat, 27 Sep 2008) Log Message: ----------- flatten associations Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/AssociationStore.java Trunk/pcgen/code/src/java/pcgen/core/Equipment.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/bonus/BonusObj.java Trunk/pcgen/code/src/java/pcgen/core/chooser/AbstractBasicChoiceManager.java Trunk/pcgen/code/src/java/pcgen/core/chooser/ChoiceManagerList.java Trunk/pcgen/code/src/java/pcgen/core/chooser/ChooserUtilities.java Trunk/pcgen/code/src/java/pcgen/core/chooser/NoChoiceChoiceManager.java Trunk/pcgen/code/src/java/pcgen/core/chooser/SpellListChoiceManager.java Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Parser.java Trunk/pcgen/code/src/test/pcgen/core/analysis/SkillModifierTest.java Trunk/pcgen/code/src/test/pcgen/persistence/lst/utils/FeatParserTest.java Removed Paths: ------------- Trunk/pcgen/code/src/java/pcgen/core/AssociatedChoice.java Trunk/pcgen/code/src/java/pcgen/core/FeatMultipleChoice.java Deleted: Trunk/pcgen/code/src/java/pcgen/core/AssociatedChoice.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/AssociatedChoice.java 2008-09-27 17:26:08 UTC (rev 7808) +++ Trunk/pcgen/code/src/java/pcgen/core/AssociatedChoice.java 2008-09-27 19:06:44 UTC (rev 7809) @@ -1,200 +0,0 @@ -/* - * AssociatedChoice.java - * Copyright 2006 (C) Aaron Divinsky <boo...@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 - * - * Current Ver: $Revision$ - * Last Editor: $Author: $ - * Last Edited: $Date$ - */ -package pcgen.core; - -import java.util.Collection; -import java.util.HashMap; - -/** - * This class represents the result of a single selection from a chooser. The - * class implements a key-based store so that multiple values can be returned - * for a single choice. Functionality is provided to work with the default - * choice to maintain backward compatibility. - * - * @author Aaron Divinsky (boomer70) - * @version $Revision$ - * @param <T> - */ -public class AssociatedChoice <T extends Comparable<T>> implements Comparable<AssociatedChoice<T>> -{ - /** A map of key, value pairs for this choice. */ - protected HashMap<String, T> choices = new HashMap<String, T>(); - - /** The "default" key to allow functionality to pretend it is a single - * string value. */ - public static final String DEFAULT_KEY = "CHOICE"; //$NON-NLS-1$ - - /** - * Empty constructor. No choices are associated yet. - */ - public AssociatedChoice() - { - // Do Nothing - } - - /** - * Constructs a simple choice object with a single choice - * @param aChoice The selected item to associate - */ - public AssociatedChoice( final T aChoice ) - { - // Convience method to add just a single choice - choices.put( DEFAULT_KEY, aChoice ); - } - - /** - * Adds a list of choices keyed by the order returned by the collection's - * iterator. - * @param aGroup A list of choices to associate - */ - public AssociatedChoice( final Collection<T> aGroup ) - { - int count = 0; - for ( T val : aGroup ) - { - choices.put( String.valueOf(++count), val ); - } - } - - /** - * Construct a choice with a specific key - * @param aKey Key used to reference this choice option - * @param aChoice The value to associate with this choice key - */ - public AssociatedChoice( final String aKey, final T aChoice ) - { - choices.put( aKey, aChoice ); - } - - /** - * Adds a choice to the default key - * @param aChoice The value to associate - */ - public void addChoice( final T aChoice ) - { - choices.put( DEFAULT_KEY, aChoice ); - } - - /** - * Adds a choice with the specified key - * @param aKey Key to use for this choice - * @param aChoice Value of the choice - */ - public void addChoice( final String aKey, final T aChoice ) - { - choices.put( aKey, aChoice ); - } - - /** - * Get the choice for the specified key - * @param aKey Key to retreive choice for - * @return The choice associated with the specified key - */ - public T getChoice( final String aKey ) - { - return choices.get( aKey ); - } - - /** - * Returns the choice for the "default" key. - * @return The choice or null if no choice was set. - */ - public T getDefaultChoice() - { - return choices.get( DEFAULT_KEY ); - } - - /** - * Returns all the values for all keys in the choice. - * @return Collection of values. - */ - public Collection<T> getChoices() - { - return choices.values(); - } - - /** - * Clears the choice associated with the specified key. - * @param aKey The key to clear. - * @return True if the choice was cleared. - */ - public boolean remove( final String aKey ) - { - return choices.remove( aKey ) == null ? false : true; - } - - /** - * Clears the default choice if it matches the specified choice. - * @param aChoice A choice to match against. - * @return True if the choice was cleared, false otherwise. - */ - public boolean removeDefaultChoice( final T aChoice ) - { - T result = choices.get( DEFAULT_KEY ); - if ( result != null ) - { - if ( result.equals( aChoice ) ) - { - choices.remove( DEFAULT_KEY ); - return true; - } - } - return false; - } - - /** - * Returns the number of choices made - * @return Number of choices - */ - public int size() - { - return choices.size(); - } - - /** - * Compares two choices. - * - * @param o The choice to compare with. - * @return See compareTo - * @see java.lang.Comparable#compareTo(java.lang.Object) - */ - public int compareTo(AssociatedChoice<T> other) - { - T defaultValue = getDefaultChoice(); - if ( defaultValue != null ) - { - T otherDefault = other.getDefaultChoice(); - if ( otherDefault != null ) - { - return defaultValue.compareTo(otherDefault); - } - } - return 1; - } - - @Override - public String toString() - { - return getDefaultChoice().toString(); - } -} Modified: Trunk/pcgen/code/src/java/pcgen/core/AssociationStore.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/AssociationStore.java 2008-09-27 17:26:08 UTC (rev 7808) +++ Trunk/pcgen/code/src/java/pcgen/core/AssociationStore.java 2008-09-27 19:06:44 UTC (rev 7809) @@ -4,9 +4,9 @@ public interface AssociationStore { - public void addAssociation(PObject obj, String o); + public void addAssociation(PObject obj, String... o); - public void removeAssociation(PObject obj, String o); + public void removeAssociation(PObject obj, String... o); public List<String> removeAllAssociations(PObject obj); Modified: Trunk/pcgen/code/src/java/pcgen/core/Equipment.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Equipment.java 2008-09-27 17:26:08 UTC (rev 7808) +++ Trunk/pcgen/code/src/java/pcgen/core/Equipment.java 2008-09-27 19:06:44 UTC (rev 7809) @@ -6048,7 +6048,7 @@ return null; } - public void addAssociation(PObject obj, String o) + public void addAssociation(PObject obj, String... o) { obj.tempAddAssociated(o); } @@ -6068,13 +6068,13 @@ public List<String> getAssociationList(PObject obj) { List<String> list = new ArrayList<String>(); - ArrayList<AssociatedChoice<String>> assocList = obj.getAssociatedList(); + ArrayList<String[]> assocList = obj.getAssociatedList(); if (assocList != null) { - for (AssociatedChoice<?> ac : assocList) + for (String[] ac : assocList) { - final String choiceStr = ac.toString(); - if (choiceStr.equals(Constants.EMPTY_STRING)) + final String choiceStr = ac[0]; + if (Constants.EMPTY_STRING.equals(choiceStr)) { list.add(null); } @@ -6099,7 +6099,7 @@ return list; } - public void removeAssociation(PObject obj, String o) + public void removeAssociation(PObject obj, String... o) { obj.tempRemoveAssociated(o); } @@ -6111,31 +6111,18 @@ public List<String[]> getDetailedAssociations(PObject obj) { - ArrayList<AssociatedChoice<String>> assocs = obj.getAssociatedList(); - List<String[]> list = new ArrayList<String[]>(); - for (AssociatedChoice<String> choice : assocs) - { - String[] array = new String[choice.size()]; - array[0] = choice.getDefaultChoice(); - for (int i = 1; i < array.length; i++) - { - array[i] = choice.getChoice(Integer.toString(i)); - } - list.add(array); - } - return list; + return new ArrayList<String[]>(obj.getAssociatedList()); } public List<String> getExpandedAssociations(PObject obj) { - ArrayList<AssociatedChoice<String>> assocs = obj.getAssociatedList(); + ArrayList<String[]> assocs = obj.getAssociatedList(); List<String> list = new ArrayList<String>(); - for (AssociatedChoice<String> choice : assocs) + for (String[] choice : assocs) { - list.add(choice.getDefaultChoice()); - for (int i = 1; i < choice.size(); i++) + for (String s : choice) { - list.add(choice.getChoice(Integer.toString(i))); + list.add(s); } } return list; @@ -6143,6 +6130,6 @@ public String getFirstAssociation(PObject obj) { - return obj.getAssociatedList().get(0).toString(); + return obj.getAssociatedList().get(0)[0]; } } Deleted: Trunk/pcgen/code/src/java/pcgen/core/FeatMultipleChoice.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/FeatMultipleChoice.java 2008-09-27 17:26:08 UTC (rev 7808) +++ Trunk/pcgen/code/src/java/pcgen/core/FeatMultipleChoice.java 2008-09-27 19:06:44 UTC (rev 7809) @@ -1,141 +0,0 @@ -/* - * FeatMultipleChoice.java - * Copyright 2002 (C) Greg Bingleman <by...@ho...> - * - * 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 24, 2002, 12:35 AM - * - * $Id$ - */ -package pcgen.core; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.List; - -/** - * Spell Mastery allows wizards a choice of a number of spells equal to their intelligence - * modifier at the time the feat is taken. As this modifier can change, this class is used - * to keep track of the maximum number of choices allowed and the specific choices made in - * order to allow editing of the feat's selection(s) at later dates. - * - * @author Greg Bingleman <by...@ho...> - * @version $Revision$ - */ -public final class FeatMultipleChoice extends AssociatedChoice<String> implements Serializable -{ - private static final long serialVersionUID = 1; - private int maxChoices = 0; - - /** - * Constructor - */ - public FeatMultipleChoice() - { - super(); - } - - /** - * Set the maximum number of choices allowed. - * @param argMaxChoices - */ - public void setMaxChoices(final int argMaxChoices) - { - maxChoices = argMaxChoices; - } - - /** - * Add a choice to the list - * @param aChoice - */ - @Override - public void addChoice(final String aChoice) - { - addChoice( String.valueOf( size() ), aChoice ); - } - - /** - * Returns a string representation of the instance. - * <max choices>:<# choices>[:<choice 1>[:<choice 2>[:....[:<choice n>]]]] - * - * @return String - */ - @Override - public String toString() - { - final StringBuffer sb = new StringBuffer(50); - sb.append(maxChoices).append(':'); - - if (size() > 0) - { - sb.append( size() ); - - for (int i = 0; i < choices.size(); ++i) - { - sb.append(':').append(getChoice(i)); - } - } - else - { - sb.append('0'); - } - - return sb.toString(); - } - - /** - * Get the choice at index 'idx' . - * @param idx - * @return String - */ - public String getChoice(final int idx) - { - if ((choices != null) && (idx < choices.size())) - { - return choices.get(String.valueOf(idx)); - } - - return ""; - } - - /** - * Get the number of choices made. - * @return number of choices - */ - public int getChoiceCount() - { - return size(); - } - - /** - * Get the list of chosen items. - * @return choices - */ - @Override - public List<String> getChoices() - { - return new ArrayList<String>(choices.values()); - } - - /** - * Get the maximum number of choices allowed. - * @return maximum choices - */ - public int getMaxChoices() - { - return maxChoices; - } -} Modified: Trunk/pcgen/code/src/java/pcgen/core/PObject.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-09-27 17:26:08 UTC (rev 7808) +++ Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-09-27 19:06:44 UTC (rev 7809) @@ -99,8 +99,7 @@ protected final MapKeyMapToList mapListChar = new MapKeyMapToList(); /** List of associated items for the object */ - // TODO Contains strings or FeatMultipleObjects - private ArrayList<AssociatedChoice<String>> associatedList = null; + private ArrayList<String[]> assocList = null; /** List of Level Abilities for the object */ private List<LevelAbility> levelAbilityList = null; @@ -157,7 +156,7 @@ */ public final int tempGetAssociatedCount(final boolean expand) { - if (associatedList == null) + if (assocList == null) { return 0; } @@ -165,31 +164,17 @@ if (expand) { int count = 0; - for ( AssociatedChoice<String> choice : associatedList ) + for ( String[] choice : assocList ) { - count += choice.size(); + count += choice.length; } return count; } - return associatedList.size(); + return assocList.size(); } /** - * Get the associated object - * @param idx - * @return the associated object - */ - public final Object getAssociatedObject(final int idx) - { - if (associatedList == null) - { - return Constants.EMPTY_STRING; - } - return associatedList.get(idx); - } - - /** * Adds entry to the CSkill list * @param entry skill to add */ @@ -551,31 +536,17 @@ * Add the item to the associated list for this object * @param aString the string to add to the associated list */ - public final void tempAddAssociated(final String aString) + public final void tempAddAssociated(final String... aString) { - if (associatedList == null) + if (assocList == null) { - associatedList = new ArrayList<AssociatedChoice<String>>(); + assocList = new ArrayList<String[]>(); } - associatedList.add(new AssociatedChoice<String>(aString)); + assocList.add(aString); } /** - * Add a feat choice to the associated list for this object - * @param aFeatChoices - */ - public final void addAssociated(final AssociatedChoice<String> aFeatChoices) - { - if (associatedList == null) - { - associatedList = new ArrayList<AssociatedChoice<String>>(); - } - - associatedList.add(aFeatChoices); - } - - /** * Add to the 'save' for the character list * @param aString */ @@ -721,14 +692,14 @@ */ public final boolean tempContainsAssociated(final String associated) { - if (associatedList == null) + if (assocList == null) { return false; } - for ( AssociatedChoice<String> choice : associatedList ) + for ( String[] choice : assocList ) { - for ( String val : choice.getChoices() ) + for ( String val : choice ) { if ( val.equalsIgnoreCase(associated) ) { @@ -755,7 +726,7 @@ */ public final void tempClearAssociated() { - associatedList = null; + assocList = null; } /** @@ -797,9 +768,9 @@ retVal.changeProfMap = new HashMap<String, String>(changeProfMap); - if (associatedList != null) + if (assocList != null) { - retVal.associatedList = new ArrayList<AssociatedChoice<String>>(associatedList); + retVal.assocList = new ArrayList<String[]>(assocList); } if (bonusList != null) @@ -1398,30 +1369,25 @@ * @param associated * @return true if successful */ - public final boolean tempRemoveAssociated(final String associated) + public final boolean tempRemoveAssociated(final String... associated) { boolean ret = false; - if (associatedList == null) + if (assocList == null) { return ret; } - for ( Iterator<AssociatedChoice<String>> i = associatedList.iterator(); i.hasNext(); ) + for ( Iterator<String[]> i = assocList.iterator(); i.hasNext(); ) { - AssociatedChoice<String> choice = i.next(); - ret = choice.removeDefaultChoice( associated ); - if (ret ) + if (i.next() == associated) { - if ( choice.size() == 0 ) - { - i.remove(); - } + i.remove(); } } - if (associatedList.size() == 0) + if (assocList.size() == 0) { - associatedList = null; + assocList = null; } return ret; @@ -2326,13 +2292,13 @@ * Get the associated list * @return the associated list */ - public final ArrayList<AssociatedChoice<String>> getAssociatedList() + public final ArrayList<String[]> getAssociatedList() { - if (associatedList == null) + if (assocList == null) { - return new ArrayList<AssociatedChoice<String>>(); + return new ArrayList<String[]>(); } - return associatedList; + return assocList; } /** @@ -2825,16 +2791,6 @@ return 0; } - public final Object removeAssociated(final int i) - { - if (associatedList == null) - { - throw new IndexOutOfBoundsException("size is 0, i=" + i); - } - - return associatedList.remove(i); - } - /** * rephrase parenthetical name components, if appropriate * @return pre formatted output name Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-09-27 17:26:08 UTC (rev 7808) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-09-27 19:06:44 UTC (rev 7809) @@ -14582,9 +14582,9 @@ && bonus.getCreatorObject() instanceof PObject) { PObject creator = (PObject) bonus.getCreatorObject(); - for (AssociatedChoice<String> assoc : creator.getAssociatedList()) + for (String[] assoc : creator.getAssociatedList()) { - if (assoc.getChoices().contains(statAbbr)) + if (Arrays.binarySearch(assoc, statAbbr) >= 0) { found = true; break; @@ -17891,7 +17891,7 @@ return cache.getSkillCost(this, sk, cl); } - public void addAssociation(PObject obj, String o) + public void addAssociation(PObject obj, String... o) { obj.tempAddAssociated(o); } @@ -17910,13 +17910,13 @@ public List<String> getAssociationList(PObject obj) { List<String> list = new ArrayList<String>(); - ArrayList<AssociatedChoice<String>> assocList = obj.getAssociatedList(); + ArrayList<String[]> assocList = obj.getAssociatedList(); if (assocList != null) { - for (AssociatedChoice<String> ac : assocList) + for (String[] ac : assocList) { - final String choiceStr = ac.getDefaultChoice(); - if (choiceStr.equals(Constants.EMPTY_STRING)) + final String choiceStr = ac[0]; + if (Constants.EMPTY_STRING.equals(choiceStr)) { list.add(null); } @@ -17941,7 +17941,7 @@ return list; } - public void removeAssociation(PObject obj, String o) + public void removeAssociation(PObject obj, String... o) { obj.tempRemoveAssociated(o); } @@ -17953,31 +17953,18 @@ public List<String[]> getDetailedAssociations(PObject obj) { - ArrayList<AssociatedChoice<String>> assocs = obj.getAssociatedList(); - List<String[]> list = new ArrayList<String[]>(); - for (AssociatedChoice<String> choice : assocs) - { - String[] array = new String[choice.size()]; - array[0] = choice.getDefaultChoice(); - for (int i = 1; i < array.length; i++) - { - array[i] = choice.getChoice(Integer.toString(i)); - } - list.add(array); - } - return list; + return new ArrayList<String[]>(obj.getAssociatedList()); } public List<String> getExpandedAssociations(PObject obj) { - ArrayList<AssociatedChoice<String>> assocs = obj.getAssociatedList(); + ArrayList<String[]> assocs = obj.getAssociatedList(); List<String> list = new ArrayList<String>(); - for (AssociatedChoice<String> choice : assocs) + for (String[] choice : assocs) { - list.add(choice.getDefaultChoice()); - for (int i = 1; i < choice.size(); i++) + for (String s : choice) { - list.add(choice.getChoice(Integer.toString(i))); + list.add(s); } } return list; @@ -17985,7 +17972,7 @@ public String getFirstAssociation(PObject obj) { - return obj.getAssociatedList().get(0).toString(); + return obj.getAssociatedList().get(0)[0]; } public void addAssoc(Object obj, Object o) Modified: Trunk/pcgen/code/src/java/pcgen/core/bonus/BonusObj.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/bonus/BonusObj.java 2008-09-27 17:26:08 UTC (rev 7808) +++ Trunk/pcgen/code/src/java/pcgen/core/bonus/BonusObj.java 2008-09-27 19:06:44 UTC (rev 7809) @@ -38,7 +38,6 @@ import pcgen.cdom.base.ConcretePrereqObject; import pcgen.cdom.base.Constants; import pcgen.cdom.base.FormulaFactory; -import pcgen.core.AssociatedChoice; import pcgen.core.Equipment; import pcgen.core.PObject; import pcgen.core.PlayerCharacter; @@ -895,9 +894,9 @@ private static final String VAR_TOKEN_REPLACEMENT = "%VAR"; //$NON-NLS-1$ private static final String VAR_TOKEN_PATTERN = Pattern.quote(VAR_TOKEN_REPLACEMENT); - private static final AssociatedChoice<String> NO_ASSOC = new AssociatedChoice<String>(""); - - private static final List<AssociatedChoice<String>> NO_ASSOC_LIST = Collections + private static final String[] NO_ASSOC = new String[] { "" }; + + private static final List<String[]> NO_ASSOC_LIST = Collections .singletonList(NO_ASSOC); /** @@ -914,7 +913,7 @@ { List<BonusPair> bonusList = new ArrayList<BonusPair>(); - List<AssociatedChoice<String>> associatedList; + List<String[]> associatedList; PObject anObj = null; if (creatorObj instanceof PObject) { @@ -960,13 +959,35 @@ } else { - for (AssociatedChoice<String> assoc : associatedList) + for (String[] assoc : associatedList) { + StringBuilder asb = new StringBuilder(); + if (assoc.length == 1) + { + asb.append(assoc[0]); + } + else + { + asb.append(assoc.length).append(':'); + int loc = asb.length(); + int count = 0; + for (String s : assoc) + { + if (s != null) + { + count++; + asb.append(':').append(s); + } + } + asb.insert(loc, count); + } + String assocString = asb.toString(); + String thisName; if (name.indexOf(VALUE_TOKEN_REPLACEMENT) >= 0) { thisName = - name.replaceAll(VALUE_TOKEN_PATTERN, assoc.toString()); + name.replaceAll(VALUE_TOKEN_PATTERN, assocString); } else { @@ -977,7 +998,7 @@ { if (info.indexOf(VALUE_TOKEN_REPLACEMENT) >= 0) { - for (String expInfo : assoc.getChoices()) + for (String expInfo : assoc) { infoList.add(info.replaceAll(VALUE_TOKEN_PATTERN, expInfo)); @@ -985,11 +1006,11 @@ } else if (info.indexOf(VAR_TOKEN_REPLACEMENT) >= 0) { - infoList.add(name.replaceAll(VAR_TOKEN_PATTERN, assoc.toString())); + infoList.add(name.replaceAll(VAR_TOKEN_PATTERN, assocString)); } else if (info.equals(LIST_TOKEN_REPLACEMENT)) { - infoList.add(assoc.toString()); + infoList.add(assocString); } else { @@ -1011,7 +1032,7 @@ if (listIndex >= 0) { thisValue = - value.replaceAll(VALUE_TOKEN_PATTERN, assoc.toString()); + value.replaceAll(VALUE_TOKEN_PATTERN, assocString); } newFormula = FormulaFactory.getFormulaFor(thisValue); } Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/AbstractBasicChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/AbstractBasicChoiceManager.java 2008-09-27 17:26:08 UTC (rev 7808) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/AbstractBasicChoiceManager.java 2008-09-27 19:06:44 UTC (rev 7809) @@ -30,7 +30,6 @@ import pcgen.cdom.enumeration.ObjectKey; import pcgen.core.Ability; import pcgen.core.AbilityCategory; -import pcgen.core.AssociatedChoice; import pcgen.core.Globals; import pcgen.core.PObject; import pcgen.core.PlayerCharacter; @@ -136,7 +135,7 @@ * @return list */ public List<T> doChooser(PlayerCharacter aPc, final List<T> availableList, - final List<T> selectedList, final List<AssociatedChoice> reservedList) + final List<T> selectedList, final List<String> reservedList) { int selectedPoolValue = (selectedList.size() + (choicesPerUnitCost - 1)) / choicesPerUnitCost; @@ -154,9 +153,9 @@ chooser.setAllowsDups(dupsAllowed); if (!dupsAllowed) { - for (AssociatedChoice o : reservedList) + for (String o : reservedList) { - availableList.remove(o.getDefaultChoice()); + availableList.remove(o); } } @@ -203,7 +202,7 @@ * @param selectedList */ public void doChooserRemove(PlayerCharacter aPC, List<T> availableList, - List<T> selectedList, List<AssociatedChoice> reservedList) + List<T> selectedList, List<String> reservedList) { final List<T> newSelections = doChooser(aPC, availableList, selectedList, reservedList); Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/ChoiceManagerList.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/ChoiceManagerList.java 2008-09-27 17:26:08 UTC (rev 7808) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/ChoiceManagerList.java 2008-09-27 19:06:44 UTC (rev 7809) @@ -25,7 +25,6 @@ import java.util.List; -import pcgen.core.AssociatedChoice; import pcgen.core.PlayerCharacter; /** @@ -62,7 +61,7 @@ PlayerCharacter aPc, final List<T> availableList, final List<T> selectedList, - final List<AssociatedChoice> reservedList); + final List<String> reservedList); /** * Do chooser for removing a choice @@ -74,7 +73,7 @@ PlayerCharacter aPc, final List<T> availableList, final List<T> selectedList, - final List<AssociatedChoice> reservedList); + final List<String> reservedList); /** Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/ChooserUtilities.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/ChooserUtilities.java 2008-09-27 17:26:08 UTC (rev 7808) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/ChooserUtilities.java 2008-09-27 19:06:44 UTC (rev 7809) @@ -340,7 +340,7 @@ final List newSelections = aMan.doChooser(aPC, availableList, selectedList, - new ArrayList()); + new ArrayList<String>()); aMan.applyChoices(aPC, newSelections); } Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/NoChoiceChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/NoChoiceChoiceManager.java 2008-09-27 17:26:08 UTC (rev 7808) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/NoChoiceChoiceManager.java 2008-09-27 19:06:44 UTC (rev 7809) @@ -4,7 +4,6 @@ import java.util.List; import pcgen.cdom.base.Constants; -import pcgen.core.AssociatedChoice; import pcgen.core.PObject; import pcgen.core.PlayerCharacter; @@ -29,7 +28,7 @@ @Override public List<String> doChooser(PlayerCharacter pc, List<String> availableList, List<String> selectedList, - List<AssociatedChoice> reservedList) + List<String> reservedList) { int choiceLimit = getNumberOfChoices(); if (choiceLimit == -1 || choiceLimit > reservedList.size()) @@ -42,7 +41,7 @@ @Override public void doChooserRemove(PlayerCharacter apc, List<String> availableList, List<String> selectedList, - List<AssociatedChoice> reservedList) + List<String> reservedList) { selectedList.remove(0); applyChoices(apc, selectedList); Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/SpellListChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/SpellListChoiceManager.java 2008-09-27 17:26:08 UTC (rev 7808) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/SpellListChoiceManager.java 2008-09-27 19:06:44 UTC (rev 7809) @@ -30,8 +30,6 @@ import pcgen.cdom.base.Constants; import pcgen.cdom.enumeration.ObjectKey; import pcgen.core.Ability; -import pcgen.core.AssociatedChoice; -import pcgen.core.FeatMultipleChoice; import pcgen.core.Globals; import pcgen.core.PCClass; import pcgen.core.PCStat; @@ -48,8 +46,8 @@ */ public class SpellListChoiceManager extends AbstractBasicStringChoiceManager { - int idxSelected = -1; - FeatMultipleChoice fmc = null; + String[] selected = null; + String[] fmc = null; int maxSpellListSelections = 0; @@ -88,10 +86,10 @@ // Set up remaining choices for pre-existing selection - if (idxSelected >= 0) + if (selected != null) { - fmc = (FeatMultipleChoice) pobject.getAssociatedObject(idxSelected); - setMaxChoices(fmc.getMaxChoices()); + fmc = selected; + setMaxChoices(fmc.length); } } else @@ -111,9 +109,9 @@ PlayerCharacter aPc, int size) { - if (idxSelected >= 0) + if (selected != null) { - pobject.removeAssociated(idxSelected); + aPc.removeAssociation(pobject, selected); if (size == 0) { @@ -145,12 +143,18 @@ { if (fmc == null) { - fmc = new FeatMultipleChoice(); - fmc.setMaxChoices(maxSpellListSelections); - pobject.addAssociated(fmc); + fmc = new String[maxSpellListSelections]; + aPc.addAssociation(pobject, fmc); } - fmc.addChoice(item); + for (int i = 0; i < fmc.length; i++) + { + if (fmc[i] == null) + { + fmc[i] = item; + break; + } + } } /** @@ -182,27 +186,38 @@ private boolean chooseAbility(PlayerCharacter pc) { Ability anAbility = (Ability) pobject; - int i; final List<String> aList = new ArrayList<String>(); aList.add("New"); final StringBuffer sb = new StringBuffer(100); - for (int j = 0; j < pc.getSelectCorrectedAssociationCount(anAbility); ++j) + List<String[]> origList = pc.getDetailedAssociations(anAbility); + for (String[] assoc : origList) { - fmc = (FeatMultipleChoice) anAbility.getAssociatedList().get(j); sb.append(anAbility.getKeyName()).append(" ("); - sb.append(fmc.getChoiceCount()); - sb.append(" of ").append(fmc.getMaxChoices()).append(") "); + int chosen = 0; + for (String s : assoc) + { + if (s != null) + { + chosen++; + } + } + sb.append(chosen); + sb.append(" of ").append(assoc.length).append(") "); - for (i = 0; i < fmc.getChoiceCount(); ++i) + boolean needComma = false; + for (String a : assoc) { - if (i != 0) + if (a != null) { - sb.append(','); + if (needComma) + { + sb.append(','); + } + needComma = true; + sb.append(a); } - - sb.append(fmc.getChoice(i)); } aList.add(sb.toString()); @@ -234,7 +249,11 @@ return false; } - idxSelected = aList.indexOf(selectedValue) - 1; + int idxSelected = aList.indexOf(selectedValue) - 1; + if (idxSelected > 0) + { + selected = origList.get(idxSelected); + } return true; } @@ -339,30 +358,28 @@ // Remove all previously selected items from the available list - final List<AssociatedChoice<String>> assocList = pobject.getAssociatedList(); - - if (assocList != null) + for (String[] assoc : aPC.getDetailedAssociations(pobject)) { - for (int j = 0; j < assocList.size(); ++j) + if (assoc == selected) { - final FeatMultipleChoice featMultChoice = (FeatMultipleChoice) assocList.get(j); - final List<String> fmcChoices = featMultChoice.getChoices(); - - if (fmcChoices != null) + for (String s : assoc) { - for (int k = 0; k < fmcChoices.size(); ++k) + if (s != null) { - if (j == idxSelected) - { - selectedList.add(fmcChoices.get(k)); - } - else - { - availableList.remove(fmcChoices.get(k)); - } + selectedList.add(s); } } } + else + { + for (String s : assoc) + { + if (s != null) + { + availableList.remove(s); + } + } + } } } } Modified: Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Parser.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Parser.java 2008-09-27 17:26:08 UTC (rev 7808) +++ Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Parser.java 2008-09-27 19:06:44 UTC (rev 7809) @@ -53,7 +53,6 @@ import pcgen.core.Deity; import pcgen.core.Domain; import pcgen.core.Equipment; -import pcgen.core.FeatMultipleChoice; import pcgen.core.GameMode; import pcgen.core.Globals; import pcgen.core.Kit; @@ -2359,15 +2358,15 @@ Integer.parseInt(sTok.nextToken()); sTok.nextToken(); // toss this--number of choices made - final FeatMultipleChoice fmc = new FeatMultipleChoice(); - fmc.setMaxChoices(maxChoices); + final String[] array = new String[maxChoices]; + int index = 0; while (sTok.hasMoreTokens()) { - fmc.addChoice(sTok.nextToken()); + array[index++] = sTok.nextToken(); } - ability.addAssociated(fmc); + thePC.addAssociation(ability, array); } else { @@ -2627,19 +2626,19 @@ { sTok.nextToken(); // should be TAG_MULTISELECT - final int maxChoices = - Integer.parseInt(sTok.nextToken()); + final int maxChoices = Integer.parseInt(sTok + .nextToken()); sTok.nextToken(); // toss this--number of choices made - final FeatMultipleChoice fmc = new FeatMultipleChoice(); - fmc.setMaxChoices(maxChoices); + final String[] array = new String[maxChoices]; + int index = 0; while (sTok.hasMoreTokens()) { - fmc.addChoice(sTok.nextToken()); + array[index++] = sTok.nextToken(); } - aFeat.addAssociated(fmc); + thePC.addAssociation(aFeat, array); } else { Modified: Trunk/pcgen/code/src/test/pcgen/core/analysis/SkillModifierTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/analysis/SkillModifierTest.java 2008-09-27 17:26:08 UTC (rev 7808) +++ Trunk/pcgen/code/src/test/pcgen/core/analysis/SkillModifierTest.java 2008-09-27 19:06:44 UTC (rev 7809) @@ -29,7 +29,6 @@ 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; @@ -121,7 +120,7 @@ assertEquals("Initial state", "", SkillModifier.getModifierExplanation( bluff, pc, false)); - skillFocus.addAssociated(new AssociatedChoice<String>("KEY_Bluff")); + pc.addAssociation(skillFocus, "KEY_Bluff"); pc.addAbility(AbilityCategory.FEAT, skillFocus, null); assertEquals("Bonus after skill focus", "+3[Skill Focus]", SkillModifier.getModifierExplanation(bluff, pc, false)); Modified: Trunk/pcgen/code/src/test/pcgen/persistence/lst/utils/FeatParserTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/persistence/lst/utils/FeatParserTest.java 2008-09-27 17:26:08 UTC (rev 7808) +++ Trunk/pcgen/code/src/test/pcgen/persistence/lst/utils/FeatParserTest.java 2008-09-27 19:06:44 UTC (rev 7809) @@ -22,9 +22,9 @@ import java.util.ArrayList; import java.util.List; + import pcgen.AbstractCharacterTestCase; import pcgen.core.Ability; -import pcgen.core.AssociatedChoice; import pcgen.core.Globals; import pcgen.core.prereq.Prerequisite; import pcgen.core.prereq.PrerequisiteOperator; @@ -133,10 +133,10 @@ is((feats.get(1)).getDisplayName(), strEq("Weapon Finesse"), "Second feat is correct"); - ArrayList<AssociatedChoice<String>> list = feats.get(1) + ArrayList<String[]> list = feats.get(1) .getAssociatedList(); - is(list.get(0).toString(), strEq("Bite"), "First choice is correct"); - is(list.get(1).toString(), strEq("Claws"), "Second choice is correct"); + is(list.get(0)[0], strEq("Bite"), "First choice is correct"); + is(list.get(1)[0], strEq("Claws"), "Second choice is correct"); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <nu...@us...> - 2008-10-04 17:49:03
|
Revision: 7913 http://pcgen.svn.sourceforge.net/pcgen/?rev=7913&view=rev Author: nuance Date: 2008-10-04 17:48:54 +0000 (Sat, 04 Oct 2008) Log Message: ----------- Add some helper functions and tests (haven't commited the code that uses these yet so they look orphaned). Added Paths: ----------- Trunk/pcgen/code/src/java/pcgen/util/TermUtilities.java Trunk/pcgen/code/src/test/pcgen/util/TermUtilitiesTest.java Added: Trunk/pcgen/code/src/java/pcgen/util/TermUtilities.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/util/TermUtilities.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/util/TermUtilities.java 2008-10-04 17:48:54 UTC (rev 7913) @@ -0,0 +1,206 @@ +/** + * pcgen.util.TermUtilities.java + * Copyright \xA9 2008 Andrew Wilson <nu...@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 13 August 2008 + * + * Current Ver: $Revision:$ + * Last Editor: $Author:$ + * Last Edited: $Date:$ + * + */ + +package pcgen.util; + +import java.util.regex.Pattern; +import java.util.regex.Matcher; + +import pcgen.base.term.VariableEvaulatorException; + +public class TermUtilities { + public static String dString = "(?:NOT|ADD|IS)"; + public static Pattern dPat = Pattern.compile(dString); + public static String sString = "(?:EQUIPPED|NOTEQUIPPED)"; + public static Pattern sPat = Pattern.compile(sString); + public static String resString = "(?:CONTAINER|WEAPON|ACITEM)"; + public static Pattern restrictEquipmentPat = Pattern.compile(resString); + + public static void checkEqtypesTypesArray( + String originalText, + String[] types, + int first) throws VariableEvaulatorException + { + int cur = first; + + // "(?:CONTAINER|WEAPON|ACITEM)" + if (restrictEquipmentPat.matcher(types[cur]).matches()) + { + cur++; + } + + while (cur < types.length) + { + // "(?:NOT|ADD|IS)" + if (dPat.matcher(types[cur]).matches()) + { + cur++; + if (cur >= types.length) + { + StringBuilder sB = new StringBuilder(); + sB.append(types[cur-1]); + sB.append(" must be followed by a type in "); + sB.append(originalText); + throw new VariableEvaulatorException(sB.toString()); + } + cur++; + } + // "(?:EQUIPPED|NOTEQUIPPED)" + else if (sPat.matcher(types[cur]).matches() || + "".equalsIgnoreCase(types[cur])) + { + cur++; + } + else + { + StringBuilder sB = new StringBuilder(); + sB.append("Spurious type \""); + sB.append(types[cur-1]); + sB.append("\" in "); + sB.append(originalText); + throw new VariableEvaulatorException(sB.toString()); + } + } + } + + public static void checkEquipmentTypesArray( + String originalText, + String[] types, + int first) throws VariableEvaulatorException + { + int cur = first; + + // "(?:CONTAINER|WEAPON|ACITEM)" + + // Count[EQUIPTYPE takes these but COUNT[EQUIPMENT doesn't for + // some reason better known to the original writer of the + // VariableProcessorPC class that this code is based on + Matcher rMat = restrictEquipmentPat.matcher(types[first]); + if (rMat.matches()) + { + StringBuilder sB = new StringBuilder(); + sB.append("Found \""); + sB.append(rMat.group()); + sB.append("\" in formula "); + sB.append(originalText); + sB.append("\nShould be COUNT[EQTYPE, not COUNT[EQUIPMENT"); + + throw new VariableEvaulatorException(sB.toString()); + } + + while (cur < types.length) + { + // "(?:NOT|ADD|IS)" + if (dPat.matcher(types[cur]).matches()) + { + cur++; + if (cur >= types.length) + { + StringBuilder sB = new StringBuilder(); + sB.append(types[cur-1]); + sB.append(" must be followed by a type in "); + sB.append(originalText); + throw new VariableEvaulatorException(sB.toString()); + } + cur++; + } + else if ("".equalsIgnoreCase(types[cur])) + { + cur++; + } + else + { + StringBuilder sB = new StringBuilder(); + sB.append("Spurious type \""); + sB.append(types[cur]); + sB.append("\" in "); + sB.append(originalText); + throw new VariableEvaulatorException(sB.toString()); + } + } + } + + public static String extractContentsOfBrackets( + String expressionString, + String src, + int fixed) throws VariableEvaulatorException + { + int expEnd = expressionString.lastIndexOf("]"); + + if (expEnd != expressionString.length() - 1) + { + StringBuilder sB = new StringBuilder(); + sB.append("Badly formed formula "); + sB.append(expressionString); + sB.append("\n in "); + sB.append(src); + sB.append("\n following \""); + sB.append(expressionString.substring(0, fixed)); + throw new VariableEvaulatorException(sB.toString()); + } + + // The string inside the brackets + return expressionString.substring(fixed, expEnd); + } + + public static int[] splitAndConvertIntegers( + final String source, int numOfFields) + { + int[] fields = new int[numOfFields]; + + int index = 0; + for (String field : source.split("\\.", numOfFields)) + { + fields[index++] = Integer.parseInt(field); + } + + return fields; + } + + public static int[] convertToIntegers( + String expressionString, + String intString, + int fixed, + int numToExtract) throws VariableEvaulatorException + { + int[] nums; + try + { + nums = splitAndConvertIntegers(intString, numToExtract); + } + catch (NumberFormatException n) + { + StringBuilder sB = new StringBuilder(); + sB.append("Invalid string following "); + sB.append(expressionString.substring(0, fixed)); + sB.append("\n in "); + sB.append(expressionString); + sB.append("\n"); + throw new VariableEvaulatorException(sB.toString()); + } + return nums; + } +} Added: Trunk/pcgen/code/src/test/pcgen/util/TermUtilitiesTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/util/TermUtilitiesTest.java (rev 0) +++ Trunk/pcgen/code/src/test/pcgen/util/TermUtilitiesTest.java 2008-10-04 17:48:54 UTC (rev 7913) @@ -0,0 +1,578 @@ +package pcgen.util; + +import pcgen.PCGenTestCase; +import pcgen.base.term.VariableEvaulatorException; +import pcgen.util.TestHelper; + +/** + * TermUtilities Tester. + * Copyright \xA9 2008 Andrew Wilson <nu...@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 10/04/2008 + * + * Current Ver: $Revision:$ + * Last Editor: $Author:$ + * Last Edited: $Date:$ + */ + +public class TermUtilitiesTest extends PCGenTestCase { + + public TermUtilitiesTest(String name) { + super(name); + } + + public void setUp() throws Exception { + super.setUp(); + } + + public void tearDown() throws Exception { + super.tearDown(); + } + + /** + * Method: checkEquipmentTypesArray(String originalText, String[] types, int first) + */ + public void testcheckEquipmentTypesArray01() { + boolean ok; + try + { + ok = true; + String[] types = new String[]{"EQUIPPED"}; + TermUtilities.checkEquipmentTypesArray("COUNT[EQTYPE.EQUIPPED]", types, 0); + } + catch (VariableEvaulatorException e) + { + ok = false; + } + is(ok, eq(false), "EquipmentTypesArray01 Single Type EQUIPPED"); + } + + /** + * Method: checkEquipmentTypesArray(String originalText, String[] types, int first) + */ + public void testcheckEquipmentTypesArray02() { + boolean ok; + try + { + ok = true; + String[] types = new String[]{"NOTEQUIPPED"}; + TermUtilities.checkEquipmentTypesArray("COUNT[EQTYPE.NOTEQUIPPED]", types, 0); + } + catch (VariableEvaulatorException e) + { + ok = false; + } + is(ok, eq(false), "EquipmentTypesArray02 Single Type NOTEQUIPPED"); + } + + /** + * Method: checkEquipmentTypesArray(String originalText, String[] types, int first) + */ + public void testcheckEquipmentTypesArray03() { + boolean ok; + try + { + ok = true; + String[] types = new String[]{"EQUIPPED", "FOO"}; + TermUtilities.checkEquipmentTypesArray("COUNT[EQTYPE.EQUIPPED.FOO]", types, 0); + } + catch (VariableEvaulatorException e) + { + ok = false; + } + is(ok, eq(false), "EquipmentTypesArray03 EQUIPPED with spurious type"); + } + + /** + * Method: checkEquipmentTypesArray(String originalText, String[] types, int first) + */ + public void testcheckEquipmentTypesArray04() { + boolean ok; + try + { + ok = true; + String[] types = new String[]{"NOT", "FOO"}; + TermUtilities.checkEquipmentTypesArray("COUNT[EQTYPE.NOT.FOO]", types, 0); + } + catch (VariableEvaulatorException e) + { + ok = false; + } + is(ok, eq(true), "EquipmentTypesArray04 Exclude FOO"); + } + + /** + * Method: checkEquipmentTypesArray(String originalText, String[] types, int first) + */ + public void testcheckEquipmentTypesArray05() { + boolean ok; + try + { + ok = true; + String[] types = new String[]{"ADD", "FOO"}; + TermUtilities.checkEquipmentTypesArray("COUNT[EQTYPE.ADD.FOO]", types, 0); + } + catch (VariableEvaulatorException e) + { + ok = false; + } + is(ok, eq(true), "EquipmentTypesArray05 Include FOO"); + } + + /** + * Method: checkEquipmentTypesArray(String originalText, String[] types, int first) + */ + public void testcheckEquipmentTypesArray06() { + boolean ok; + try + { + ok = true; + String[] types = new String[]{"IS", "FOO"}; + TermUtilities.checkEquipmentTypesArray("COUNT[EQTYPE.IS.FOO]", types, 0); + } + catch (VariableEvaulatorException e) + { + ok = false; + } + is(ok, eq(true), "EquipmentTypesArray06 Only FOO"); + } + + /** + * Method: checkEquipmentTypesArray(String originalText, String[] types, int first) + */ + public void testcheckEquipmentTypesArray07() { + boolean ok; + try + { + ok = true; + String[] types = new String[]{"NOT", "FOO", "ADD", "BAR", "IS", "BAZ"}; + TermUtilities.checkEquipmentTypesArray("COUNT[EQTYPE.NOT.FOO.ADD.BAR.IS.BAZ]", types, 0); + } + catch (VariableEvaulatorException e) + { + ok = false; + } + is(ok, eq(true), "EquipmentTypesArray07 All options"); + } + + /** + * Method: checkEquipmentTypesArray(String originalText, String[] types, int first) + */ + public void testcheckEquipmentTypesArray08() { + boolean ok; + try + { + ok = true; + String[] types = new String[]{"NOT", "FOO", "ADD", "BAR", "IS", "BAZ", "QUX"}; + TermUtilities.checkEquipmentTypesArray("COUNT[EQTYPE.NOT.FOO.ADD.BAR.IS.BAZ.QUX]", types, 0); + } + catch (VariableEvaulatorException e) + { + ok = false; + } + is(ok, eq(false), "EquipmentTypesArray08 All options with spurious"); + } + + + /** + * Method: checkEqtypesTypesArray(String originalText, String[] types, int first) + */ + public void testcheckEqtypesTypesArray01() { + boolean ok; + try + { + ok = true; + String[] types = new String[]{"EQUIPPED"}; + TermUtilities.checkEqtypesTypesArray("COUNT[EQTYPE.EQUIPPED]", types, 0); + } + catch (VariableEvaulatorException e) + { + ok = false; + } + is(ok, eq(true), "EqtypesTypesArray01 Single Type EQUIPPED"); + } + + /** + * Method: checkEqtypesTypesArray(String originalText, String[] types, int first) + */ + public void testcheckEqtypesTypesArray02() { + boolean ok; + try + { + ok = true; + String[] types = new String[]{"NOTEQUIPPED"}; + TermUtilities.checkEqtypesTypesArray("COUNT[EQTYPE.NOTEQUIPPED]", types, 0); + } + catch (VariableEvaulatorException e) + { + ok = false; + } + is(ok, eq(true), "EqtypesTypesArray02 Single Type NOTEQUIPPED"); + } + + /** + * Method: checkEqtypesTypesArray(String originalText, String[] types, int first) + */ + public void testcheckEqtypesTypesArray03() { + boolean ok; + try + { + ok = true; + String[] types = new String[]{"EQUIPPED", "FOO"}; + TermUtilities.checkEqtypesTypesArray("COUNT[EQTYPE.EQUIPPED.FOO]", types, 0); + } + catch (VariableEvaulatorException e) + { + ok = false; + } + is(ok, eq(false), "EqtypesTypesArray03 EQUIPPED with spurious type"); + } + + /** + * Method: checkEqtypesTypesArray(String originalText, String[] types, int first) + */ + public void testcheckEqtypesTypesArray04() { + boolean ok; + try + { + ok = true; + String[] types = new String[]{"NOT", "FOO"}; + TermUtilities.checkEqtypesTypesArray("COUNT[EQTYPE.NOT.FOO]", types, 0); + } + catch (VariableEvaulatorException e) + { + ok = false; + } + is(ok, eq(true), "EqtypesTypesArray04 Exclude FOO"); + } + + /** + * Method: checkEqtypesTypesArray(String originalText, String[] types, int first) + */ + public void testcheckEqtypesTypesArray05() { + boolean ok; + try + { + ok = true; + String[] types = new String[]{"ADD", "FOO"}; + TermUtilities.checkEqtypesTypesArray("COUNT[EQTYPE.ADD.FOO]", types, 0); + } + catch (VariableEvaulatorException e) + { + ok = false; + } + is(ok, eq(true), "EqtypesTypesArray05 Include FOO"); + } + + /** + * Method: checkEqtypesTypesArray(String originalText, String[] types, int first) + */ + public void testcheckEqtypesTypesArray06() { + boolean ok; + try + { + ok = true; + String[] types = new String[]{"IS", "FOO"}; + TermUtilities.checkEqtypesTypesArray("COUNT[EQTYPE.IS.FOO]", types, 0); + } + catch (VariableEvaulatorException e) + { + ok = false; + } + is(ok, eq(true), "EqtypesTypesArray06 Only FOO"); + } + + /** + * Method: checkEqtypesTypesArray(String originalText, String[] types, int first) + */ + public void testcheckEqtypesTypesArray07() { + boolean ok; + try + { + ok = true; + String[] types = new String[]{"NOT", "FOO", "ADD", "BAR", "IS", "BAZ"}; + TermUtilities.checkEqtypesTypesArray("COUNT[EQTYPE.NOT.FOO.ADD.BAR.IS.BAZ]", types, 0); + } + catch (VariableEvaulatorException e) + { + ok = false; + } + is(ok, eq(true), "EqtypesTypesArray07 All options"); + } + + /** + * Method: checkEqtypesTypesArray(String originalText, String[] types, int first) + */ + public void testcheckEqtypesTypesArray08() { + boolean ok; + try + { + ok = true; + String[] types = new String[]{"NOT", "FOO", "ADD", "BAR", "IS", "BAZ", "QUX"}; + TermUtilities.checkEqtypesTypesArray("COUNT[EQTYPE.NOT.FOO.ADD.BAR.IS.BAZ.QUX]", types, 0); + } + catch (VariableEvaulatorException e) + { + ok = false; + } + is(ok, eq(false), "EqtypesTypesArray08 All options with spurious"); + } + + /** + * Method: splitAndConvertIntegers(final String source, int numOfFields) + */ + public void testSplitAndConvertIntegers01() { + boolean ok; + int[] nums = new int[1]; + try + { + ok = true; + nums = TermUtilities.splitAndConvertIntegers("3", 1); + } + catch (NumberFormatException e) + { + ok = false; + } + is(ok, eq(true), "one int is ok"); + is(nums[0], eq(3), "one int is ok:first"); + } + + /** + * Method: splitAndConvertIntegers(final String source, int numOfFields) + */ + public void testSplitAndConvertIntegers02() { + boolean ok; + int[] nums = new int[1]; + try + { + ok = true; + nums = TermUtilities.splitAndConvertIntegers("3.57", 2); + } + catch (NumberFormatException e) + { + ok = false; + } + is(ok, eq(true), "two ints is ok"); + is(nums[0], eq(3), "two ints is ok:first"); + is(nums[1], eq(57), "two ints is ok:second"); + } + + /** + * Method: splitAndConvertIntegers(final String source, int numOfFields) + */ + public void testSplitAndConvertIntegers03() { + boolean ok; + int[] nums = new int[1]; + try + { + ok = true; + nums = TermUtilities.splitAndConvertIntegers("3.57.67", 3); + } + catch (NumberFormatException e) + { + ok = false; + } + is(ok, eq(true), "three ints is ok"); + is(nums[0], eq(3), "three ints is ok:first"); + is(nums[1], eq(57), "three ints is ok:second"); + is(nums[2], eq(67), "three ints is ok:second"); + } + + /** + * Method: splitAndConvertIntegers(final String source, int numOfFields) + */ + public void testSplitAndConvertIntegers04() { + boolean ok; + try + { + ok = true; + TermUtilities.splitAndConvertIntegers("3.57.67.foo", 3); + } + catch (NumberFormatException e) + { + ok = false; + } + is(ok, eq(false), "three ints plus spurious non-int fails"); + } + + /** + * Method: extractContentsOfBrackets(String expressionString, String src, int fixed) + */ + public void testExtractContentsOfBrackets01() { + String orig = "COUNT[MARSHMALLOWS.FOO]"; + String inside = ""; + int length = orig.indexOf('['); + + boolean ok; + try + { + ok = true; + inside = TermUtilities.extractContentsOfBrackets(orig, "CLASS:Foo Bar", length + 1); + } + catch (VariableEvaulatorException e) + { + ok = false; + } + + is(ok, eq(true), "Extracts Text correctly"); + is(inside, strEq("MARSHMALLOWS.FOO"), "Text is correct ExtractContentsOfBrackets01"); + } + + /** + * Method: extractContentsOfBrackets(String expressionString, String src, int fixed) + */ + public void testExtractContentsOfBrackets02() { + String orig = "COUNT[MARSHMALLOWS.FOO"; + int length = orig.indexOf('['); + + boolean ok; + try + { + ok = true; + TermUtilities.extractContentsOfBrackets(orig, "CLASS:Foo Bar", length + 1); + } + catch (VariableEvaulatorException e) + { + ok = false; + } + + is(ok, eq(false), "Fail, no ] found"); + } + + /** + * Method: extractContentsOfBrackets(String expressionString, String src, int fixed) + */ + public void testExtractContentsOfBrackets03() { + String orig = "COUNT[MARSHMALLOWS.FOO]B"; + int length = orig.indexOf('['); + + boolean ok; + try + { + ok = true; + TermUtilities.extractContentsOfBrackets(orig, "CLASS:Foo Bar", length + 1); + } + catch (VariableEvaulatorException e) + { + ok = false; + } + + is(ok, eq(false), "Fail, ] not the last char"); + } + + + /** + * Method: splitAndConvertIntegers(final String source, int numOfFields) + */ + public void testConvertToIntegers01() { + boolean ok; + int[] nums = new int[1]; + try + { + ok = true; + String orig = "COUNT[MARSHMALLOWS.1]"; + nums = TermUtilities.convertToIntegers(orig, "1", 6, 1); + } + catch (VariableEvaulatorException e) + { + ok = false; + } + is(ok, eq(true), "ConvertToIntegers: one int is ok"); + is(nums[0], eq(1), "ConvertToIntegers: one int is ok - first"); + } + + /** + * Method: splitAndConvertIntegers(final String source, int numOfFields) + */ + public void testConvertToIntegers02() { + boolean ok; + int[] nums = new int[1]; + try + { + ok = true; + String orig = "COUNT[MARSHMALLOWS.1.2]"; + nums = TermUtilities.convertToIntegers(orig, "1.2", 6, 2); + } + catch (VariableEvaulatorException e) + { + ok = false; + } + is(ok, eq(true), "ConvertToIntegers: two ints is ok"); + is(nums[0], eq(1), "ConvertToIntegers: two ints is ok:first"); + is(nums[1], eq(2), "ConvertToIntegers: two ints is ok:second"); + } + + /** + * Method: splitAndConvertIntegers(final String source, int numOfFields) + */ + public void testConvertToIntegers03() { + boolean ok; + int[] nums = new int[1]; + try + { + ok = true; + String orig = "COUNT[MARSHMALLOWS.1.2.3]"; + nums = TermUtilities.convertToIntegers(orig, "1.2.3", 6, 3); + } + catch (VariableEvaulatorException e) + { + ok = false; + } + is(ok, eq(true), "ConvertToIntegers: three ints is ok"); + is(nums[0], eq(1), "ConvertToIntegers: three ints is ok:first"); + is(nums[1], eq(2), "ConvertToIntegers: three ints is ok:second"); + is(nums[2], eq(3), "ConvertToIntegers: three ints is ok:third"); + } + + /** + * Method: splitAndConvertIntegers(final String source, int numOfFields) + */ + public void testConvertToIntegers04() { + boolean ok; + try + { + ok = true; + String orig = "COUNT[MARSHMALLOWS.1.2.3.foo]"; + TermUtilities.convertToIntegers(orig, "1.2.3.foo", 6, 4); + } + catch (VariableEvaulatorException e) + { + ok = false; + } + is(ok, eq(false), "ConvertToIntegers: three ints plus spurious non-int fails"); + } + + /** + * Method: splitAndConvertIntegers(final String source, int numOfFields) + */ + public void testConvertToIntegers05() { + boolean ok; + try + { + ok = true; + String orig = "COUNT[MARSHMALLOWS.1.2.3.4]"; + TermUtilities.convertToIntegers(orig, "1.2.3.4", 6, 3); + } + catch (VariableEvaulatorException e) + { + ok = false; + } + is(ok, eq(false), "ConvertToIntegers: ask for three with four present fails"); + } + + +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <nu...@us...> - 2008-10-04 19:39:43
|
Revision: 7918 http://pcgen.svn.sourceforge.net/pcgen/?rev=7918&view=rev Author: nuance Date: 2008-10-04 19:39:29 +0000 (Sat, 04 Oct 2008) Log Message: ----------- Rename exception to something more appropriate. Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/util/TermUtilities.java Trunk/pcgen/code/src/test/pcgen/util/TermUtilitiesTest.java Added Paths: ----------- Trunk/pcgen/code/src/java/pcgen/base/term/TermEvaulatorException.java Removed Paths: ------------- Trunk/pcgen/code/src/java/pcgen/base/term/VariableEvaulatorException.java Copied: Trunk/pcgen/code/src/java/pcgen/base/term/TermEvaulatorException.java (from rev 7917, Trunk/pcgen/code/src/java/pcgen/base/term/VariableEvaulatorException.java) =================================================================== --- Trunk/pcgen/code/src/java/pcgen/base/term/TermEvaulatorException.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/base/term/TermEvaulatorException.java 2008-10-04 19:39:29 UTC (rev 7918) @@ -0,0 +1,60 @@ +/** + * pcgen.base.term.TermEvaulatorException.java + * Copyright \xA9 2008 Andrew Wilson <nu...@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 06-Aug-2008 06:09:49 + * + * Current Ver: $Revision:$ + * Last Editor: $Author:$ + * Last Edited: $Date:$ + * + */ + +package pcgen.base.term; + +import pcgen.exception.PcgenException; + +public class TermEvaulatorException extends PcgenException{ + /** + * Creates a new instance of <code>TermEvaulatorException</code> without detail message. + */ + public TermEvaulatorException() + { + super(); + } + + /** + * Constructs an instance of <code>TermEvaulatorException</code> with the specified detail message. + * @param msg the detail message. + */ + public TermEvaulatorException(String msg) + { + super(msg); + } + + /** + * Constructs an instance of <code>TermEvaulatorException</code> + * with the specified {@link Throwable rootCause} + * and the specified detail message. + * @param rootCause the root cause of the exception. + * @param msg the detail message. + */ + public TermEvaulatorException(Throwable rootCause, String msg) + { + super(rootCause, msg); + } +} Deleted: Trunk/pcgen/code/src/java/pcgen/base/term/VariableEvaulatorException.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/base/term/VariableEvaulatorException.java 2008-10-04 19:32:55 UTC (rev 7917) +++ Trunk/pcgen/code/src/java/pcgen/base/term/VariableEvaulatorException.java 2008-10-04 19:39:29 UTC (rev 7918) @@ -1,60 +0,0 @@ -/** - * pcgen.base.term.VariableEvaulatorException.java - * Copyright \xA9 2008 Andrew Wilson <nu...@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 06-Aug-2008 06:09:49 - * - * Current Ver: $Revision:$ - * Last Editor: $Author:$ - * Last Edited: $Date:$ - * - */ - -package pcgen.base.term; - -import pcgen.exception.PcgenException; - -public class VariableEvaulatorException extends PcgenException{ - /** - * Creates a new instance of <code>VariableEvaulatorException</code> without detail message. - */ - public VariableEvaulatorException() - { - super(); - } - - /** - * Constructs an instance of <code>VariableEvaulatorException</code> with the specified detail message. - * @param msg the detail message. - */ - public VariableEvaulatorException(String msg) - { - super(msg); - } - - /** - * Constructs an instance of <code>VariableEvaulatorException</code> - * with the specified {@link Throwable rootCause} - * and the specified detail message. - * @param rootCause the root cause of the exception. - * @param msg the detail message. - */ - public VariableEvaulatorException(Throwable rootCause, String msg) - { - super(rootCause, msg); - } -} Modified: Trunk/pcgen/code/src/java/pcgen/util/TermUtilities.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/util/TermUtilities.java 2008-10-04 19:32:55 UTC (rev 7917) +++ Trunk/pcgen/code/src/java/pcgen/util/TermUtilities.java 2008-10-04 19:39:29 UTC (rev 7918) @@ -29,7 +29,7 @@ import java.util.regex.Pattern; import java.util.regex.Matcher; -import pcgen.base.term.VariableEvaulatorException; +import pcgen.base.term.TermEvaulatorException; public class TermUtilities { public static String dString = "(?:NOT|ADD|IS)"; @@ -42,7 +42,7 @@ public static void checkEqtypesTypesArray( String originalText, String[] types, - int first) throws VariableEvaulatorException + int first) throws TermEvaulatorException { int cur = first; @@ -64,7 +64,7 @@ sB.append(types[cur-1]); sB.append(" must be followed by a type in "); sB.append(originalText); - throw new VariableEvaulatorException(sB.toString()); + throw new TermEvaulatorException(sB.toString()); } cur++; } @@ -81,7 +81,7 @@ sB.append(types[cur-1]); sB.append("\" in "); sB.append(originalText); - throw new VariableEvaulatorException(sB.toString()); + throw new TermEvaulatorException(sB.toString()); } } } @@ -89,7 +89,7 @@ public static void checkEquipmentTypesArray( String originalText, String[] types, - int first) throws VariableEvaulatorException + int first) throws TermEvaulatorException { int cur = first; @@ -108,7 +108,7 @@ sB.append(originalText); sB.append("\nShould be COUNT[EQTYPE, not COUNT[EQUIPMENT"); - throw new VariableEvaulatorException(sB.toString()); + throw new TermEvaulatorException(sB.toString()); } while (cur < types.length) @@ -123,7 +123,7 @@ sB.append(types[cur-1]); sB.append(" must be followed by a type in "); sB.append(originalText); - throw new VariableEvaulatorException(sB.toString()); + throw new TermEvaulatorException(sB.toString()); } cur++; } @@ -138,7 +138,7 @@ sB.append(types[cur]); sB.append("\" in "); sB.append(originalText); - throw new VariableEvaulatorException(sB.toString()); + throw new TermEvaulatorException(sB.toString()); } } } @@ -146,7 +146,7 @@ public static String extractContentsOfBrackets( String expressionString, String src, - int fixed) throws VariableEvaulatorException + int fixed) throws TermEvaulatorException { int expEnd = expressionString.lastIndexOf("]"); @@ -159,7 +159,7 @@ sB.append(src); sB.append("\n following \""); sB.append(expressionString.substring(0, fixed)); - throw new VariableEvaulatorException(sB.toString()); + throw new TermEvaulatorException(sB.toString()); } // The string inside the brackets @@ -184,7 +184,7 @@ String expressionString, String intString, int fixed, - int numToExtract) throws VariableEvaulatorException + int numToExtract) throws TermEvaulatorException { int[] nums; try @@ -199,7 +199,7 @@ sB.append("\n in "); sB.append(expressionString); sB.append("\n"); - throw new VariableEvaulatorException(sB.toString()); + throw new TermEvaulatorException(sB.toString()); } return nums; } Modified: Trunk/pcgen/code/src/test/pcgen/util/TermUtilitiesTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/util/TermUtilitiesTest.java 2008-10-04 19:32:55 UTC (rev 7917) +++ Trunk/pcgen/code/src/test/pcgen/util/TermUtilitiesTest.java 2008-10-04 19:39:29 UTC (rev 7918) @@ -1,8 +1,7 @@ package pcgen.util; import pcgen.PCGenTestCase; -import pcgen.base.term.VariableEvaulatorException; -import pcgen.util.TestHelper; +import pcgen.base.term.TermEvaulatorException; /** * TermUtilities Tester. @@ -54,7 +53,7 @@ String[] types = new String[]{"EQUIPPED"}; TermUtilities.checkEquipmentTypesArray("COUNT[EQTYPE.EQUIPPED]", types, 0); } - catch (VariableEvaulatorException e) + catch (TermEvaulatorException e) { ok = false; } @@ -72,7 +71,7 @@ String[] types = new String[]{"NOTEQUIPPED"}; TermUtilities.checkEquipmentTypesArray("COUNT[EQTYPE.NOTEQUIPPED]", types, 0); } - catch (VariableEvaulatorException e) + catch (TermEvaulatorException e) { ok = false; } @@ -90,7 +89,7 @@ String[] types = new String[]{"EQUIPPED", "FOO"}; TermUtilities.checkEquipmentTypesArray("COUNT[EQTYPE.EQUIPPED.FOO]", types, 0); } - catch (VariableEvaulatorException e) + catch (TermEvaulatorException e) { ok = false; } @@ -108,7 +107,7 @@ String[] types = new String[]{"NOT", "FOO"}; TermUtilities.checkEquipmentTypesArray("COUNT[EQTYPE.NOT.FOO]", types, 0); } - catch (VariableEvaulatorException e) + catch (TermEvaulatorException e) { ok = false; } @@ -126,7 +125,7 @@ String[] types = new String[]{"ADD", "FOO"}; TermUtilities.checkEquipmentTypesArray("COUNT[EQTYPE.ADD.FOO]", types, 0); } - catch (VariableEvaulatorException e) + catch (TermEvaulatorException e) { ok = false; } @@ -144,7 +143,7 @@ String[] types = new String[]{"IS", "FOO"}; TermUtilities.checkEquipmentTypesArray("COUNT[EQTYPE.IS.FOO]", types, 0); } - catch (VariableEvaulatorException e) + catch (TermEvaulatorException e) { ok = false; } @@ -162,7 +161,7 @@ String[] types = new String[]{"NOT", "FOO", "ADD", "BAR", "IS", "BAZ"}; TermUtilities.checkEquipmentTypesArray("COUNT[EQTYPE.NOT.FOO.ADD.BAR.IS.BAZ]", types, 0); } - catch (VariableEvaulatorException e) + catch (TermEvaulatorException e) { ok = false; } @@ -180,7 +179,7 @@ String[] types = new String[]{"NOT", "FOO", "ADD", "BAR", "IS", "BAZ", "QUX"}; TermUtilities.checkEquipmentTypesArray("COUNT[EQTYPE.NOT.FOO.ADD.BAR.IS.BAZ.QUX]", types, 0); } - catch (VariableEvaulatorException e) + catch (TermEvaulatorException e) { ok = false; } @@ -199,7 +198,7 @@ String[] types = new String[]{"EQUIPPED"}; TermUtilities.checkEqtypesTypesArray("COUNT[EQTYPE.EQUIPPED]", types, 0); } - catch (VariableEvaulatorException e) + catch (TermEvaulatorException e) { ok = false; } @@ -217,7 +216,7 @@ String[] types = new String[]{"NOTEQUIPPED"}; TermUtilities.checkEqtypesTypesArray("COUNT[EQTYPE.NOTEQUIPPED]", types, 0); } - catch (VariableEvaulatorException e) + catch (TermEvaulatorException e) { ok = false; } @@ -235,7 +234,7 @@ String[] types = new String[]{"EQUIPPED", "FOO"}; TermUtilities.checkEqtypesTypesArray("COUNT[EQTYPE.EQUIPPED.FOO]", types, 0); } - catch (VariableEvaulatorException e) + catch (TermEvaulatorException e) { ok = false; } @@ -253,7 +252,7 @@ String[] types = new String[]{"NOT", "FOO"}; TermUtilities.checkEqtypesTypesArray("COUNT[EQTYPE.NOT.FOO]", types, 0); } - catch (VariableEvaulatorException e) + catch (TermEvaulatorException e) { ok = false; } @@ -271,7 +270,7 @@ String[] types = new String[]{"ADD", "FOO"}; TermUtilities.checkEqtypesTypesArray("COUNT[EQTYPE.ADD.FOO]", types, 0); } - catch (VariableEvaulatorException e) + catch (TermEvaulatorException e) { ok = false; } @@ -289,7 +288,7 @@ String[] types = new String[]{"IS", "FOO"}; TermUtilities.checkEqtypesTypesArray("COUNT[EQTYPE.IS.FOO]", types, 0); } - catch (VariableEvaulatorException e) + catch (TermEvaulatorException e) { ok = false; } @@ -307,7 +306,7 @@ String[] types = new String[]{"NOT", "FOO", "ADD", "BAR", "IS", "BAZ"}; TermUtilities.checkEqtypesTypesArray("COUNT[EQTYPE.NOT.FOO.ADD.BAR.IS.BAZ]", types, 0); } - catch (VariableEvaulatorException e) + catch (TermEvaulatorException e) { ok = false; } @@ -325,7 +324,7 @@ String[] types = new String[]{"NOT", "FOO", "ADD", "BAR", "IS", "BAZ", "QUX"}; TermUtilities.checkEqtypesTypesArray("COUNT[EQTYPE.NOT.FOO.ADD.BAR.IS.BAZ.QUX]", types, 0); } - catch (VariableEvaulatorException e) + catch (TermEvaulatorException e) { ok = false; } @@ -423,7 +422,7 @@ ok = true; inside = TermUtilities.extractContentsOfBrackets(orig, "CLASS:Foo Bar", length + 1); } - catch (VariableEvaulatorException e) + catch (TermEvaulatorException e) { ok = false; } @@ -445,7 +444,7 @@ ok = true; TermUtilities.extractContentsOfBrackets(orig, "CLASS:Foo Bar", length + 1); } - catch (VariableEvaulatorException e) + catch (TermEvaulatorException e) { ok = false; } @@ -466,7 +465,7 @@ ok = true; TermUtilities.extractContentsOfBrackets(orig, "CLASS:Foo Bar", length + 1); } - catch (VariableEvaulatorException e) + catch (TermEvaulatorException e) { ok = false; } @@ -487,7 +486,7 @@ String orig = "COUNT[MARSHMALLOWS.1]"; nums = TermUtilities.convertToIntegers(orig, "1", 6, 1); } - catch (VariableEvaulatorException e) + catch (TermEvaulatorException e) { ok = false; } @@ -507,7 +506,7 @@ String orig = "COUNT[MARSHMALLOWS.1.2]"; nums = TermUtilities.convertToIntegers(orig, "1.2", 6, 2); } - catch (VariableEvaulatorException e) + catch (TermEvaulatorException e) { ok = false; } @@ -528,7 +527,7 @@ String orig = "COUNT[MARSHMALLOWS.1.2.3]"; nums = TermUtilities.convertToIntegers(orig, "1.2.3", 6, 3); } - catch (VariableEvaulatorException e) + catch (TermEvaulatorException e) { ok = false; } @@ -549,7 +548,7 @@ String orig = "COUNT[MARSHMALLOWS.1.2.3.foo]"; TermUtilities.convertToIntegers(orig, "1.2.3.foo", 6, 4); } - catch (VariableEvaulatorException e) + catch (TermEvaulatorException e) { ok = false; } @@ -567,7 +566,7 @@ String orig = "COUNT[MARSHMALLOWS.1.2.3.4]"; TermUtilities.convertToIntegers(orig, "1.2.3.4", 6, 3); } - catch (VariableEvaulatorException e) + catch (TermEvaulatorException e) { ok = false; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jde...@us...> - 2008-10-05 09:58:49
|
Revision: 7935 http://pcgen.svn.sourceforge.net/pcgen/?rev=7935&view=rev Author: jdempsey Date: 2008-10-05 09:54:24 +0000 (Sun, 05 Oct 2008) Log Message: ----------- Fix bug: Ability Objects are not properly resolved Issue#: 2147169 Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/cdom/helper/Aspect.java Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java Trunk/pcgen/code/src/test/pcgen/core/PlayerCharacterTest.java Modified: Trunk/pcgen/code/src/java/pcgen/cdom/helper/Aspect.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/helper/Aspect.java 2008-10-05 07:16:18 UTC (rev 7934) +++ Trunk/pcgen/code/src/java/pcgen/cdom/helper/Aspect.java 2008-10-05 09:54:24 UTC (rev 7935) @@ -243,10 +243,13 @@ { final StringBuffer buf = new StringBuffer(); - Ability pcAbility = aPC.getAbilityMatching(theOwner); - if (pcAbility != null) + if (theOwner != null) { - theOwner = pcAbility; + Ability pcAbility = aPC.getAbilityMatching(theOwner); + if (pcAbility != null) + { + theOwner = pcAbility; + } } for ( final String comp : theComponents ) { Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-10-05 07:16:18 UTC (rev 7934) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-10-05 09:54:24 UTC (rev 7935) @@ -5930,7 +5930,7 @@ public Ability getAbilityMatching(final Ability anAbility) { return AbilityUtilities.getAbilityFromList(new ArrayList<Ability>( - getFullAbilitySet()), anAbility); + getFullAbilityList()), anAbility, anAbility.getAbilityNature()); } public int getFirstSpellLevel(final Spell aSpell) Modified: Trunk/pcgen/code/src/test/pcgen/core/PlayerCharacterTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/PlayerCharacterTest.java 2008-10-05 07:16:18 UTC (rev 7934) +++ Trunk/pcgen/code/src/test/pcgen/core/PlayerCharacterTest.java 2008-10-05 09:54:24 UTC (rev 7935) @@ -52,6 +52,7 @@ import pcgen.cdom.inst.PCClassLevel; import pcgen.cdom.list.ClassSkillList; import pcgen.cdom.reference.CDOMDirectSingleRef; +import pcgen.core.Ability.Nature; import pcgen.core.analysis.SkillRankControl; import pcgen.core.bonus.Bonus; import pcgen.core.bonus.BonusObj; @@ -896,12 +897,15 @@ Ability resToAcid = TestHelper.makeAbility("Resistance To Acid", specialAbilityCat .getKeyName(), "Foo"); + resToAcid.setAbilityNature(Nature.AUTOMATIC); Ability resToAcidOutputVirt = TestHelper.makeAbility("Resistance To Acid Output Virt", specialAbilityCat.getKeyName(), "Foo"); + resToAcidOutputVirt.setAbilityNature(Nature.VIRTUAL); Ability resToAcidOutputAuto = TestHelper.makeAbility("Resistance To Acid Output Auto", specialAbilityCat.getKeyName(), "Foo"); + resToAcidOutputAuto.setAbilityNature(Nature.AUTOMATIC); PlayerCharacter pc = getCharacter(); pc.setRace(human); assertEquals("PC should now have a race of human", human, pc.getRace()); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <nu...@us...> - 2008-10-05 12:09:31
|
Revision: 7939 http://pcgen.svn.sourceforge.net/pcgen/?rev=7939&view=rev Author: nuance Date: 2008-10-05 12:08:31 +0000 (Sun, 05 Oct 2008) Log Message: ----------- Made splitAndConvertIntegers throw an exception if it doesn't get a string of exactly the correct number of integers separated by dots. Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/util/TermUtilities.java Trunk/pcgen/code/src/test/pcgen/util/TermUtilitiesTest.java Modified: Trunk/pcgen/code/src/java/pcgen/util/TermUtilities.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/util/TermUtilities.java 2008-10-05 10:12:16 UTC (rev 7938) +++ Trunk/pcgen/code/src/java/pcgen/util/TermUtilities.java 2008-10-05 12:08:31 UTC (rev 7939) @@ -78,7 +78,7 @@ { StringBuilder sB = new StringBuilder(); sB.append("Spurious type \""); - sB.append(types[cur-1]); + sB.append(types[cur]); sB.append("\" in "); sB.append(originalText); throw new TermEvaulatorException(sB.toString()); @@ -155,9 +155,11 @@ StringBuilder sB = new StringBuilder(); sB.append("Badly formed formula "); sB.append(expressionString); - sB.append("\n in "); - sB.append(src); - sB.append("\n following \""); + if (!"".equals(src)) { + sB.append(" in "); + sB.append(src); + } + sB.append(" following \""); sB.append(expressionString.substring(0, fixed)); throw new TermEvaulatorException(sB.toString()); } @@ -167,12 +169,28 @@ } public static int[] splitAndConvertIntegers( - final String source, int numOfFields) + String expressionString, + final String clause, + int numOfFields) throws TermEvaulatorException { + final String[] sA = clause.split("\\.", numOfFields); + if (sA.length < numOfFields) + { + StringBuilder sB = new StringBuilder(); + sB.append("Invalid string "); + sB.append(clause); + sB.append(" following "); + sB.append(expressionString); + sB.append(" should be "); + sB.append(numOfFields); + sB.append(" integers separated by dots"); + throw new TermEvaulatorException(sB.toString()); + } + int[] fields = new int[numOfFields]; int index = 0; - for (String field : source.split("\\.", numOfFields)) + for (String field : clause.split("\\.", numOfFields)) { fields[index++] = Integer.parseInt(field); } @@ -188,17 +206,19 @@ { int[] nums; try - { - nums = splitAndConvertIntegers(intString, numToExtract); + { + nums = splitAndConvertIntegers( + expressionString, + intString, + numToExtract); } catch (NumberFormatException n) { StringBuilder sB = new StringBuilder(); sB.append("Invalid string following "); sB.append(expressionString.substring(0, fixed)); - sB.append("\n in "); + sB.append(" in "); sB.append(expressionString); - sB.append("\n"); throw new TermEvaulatorException(sB.toString()); } return nums; Modified: Trunk/pcgen/code/src/test/pcgen/util/TermUtilitiesTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/util/TermUtilitiesTest.java 2008-10-05 10:12:16 UTC (rev 7938) +++ Trunk/pcgen/code/src/test/pcgen/util/TermUtilitiesTest.java 2008-10-05 12:08:31 UTC (rev 7939) @@ -340,12 +340,16 @@ try { ok = true; - nums = TermUtilities.splitAndConvertIntegers("3", 1); + nums = TermUtilities.splitAndConvertIntegers("Test:3", "3", 1); } catch (NumberFormatException e) { ok = false; } + catch (TermEvaulatorException e) + { + ok = false; + } is(ok, eq(true), "one int is ok"); is(nums[0], eq(3), "one int is ok:first"); } @@ -359,12 +363,17 @@ try { ok = true; - nums = TermUtilities.splitAndConvertIntegers("3.57", 2); + nums = TermUtilities.splitAndConvertIntegers("Test:3.57", "3.57", 2); } catch (NumberFormatException e) { ok = false; } + catch (TermEvaulatorException e) + { + ok = false; + } + is(ok, eq(true), "two ints is ok"); is(nums[0], eq(3), "two ints is ok:first"); is(nums[1], eq(57), "two ints is ok:second"); @@ -379,12 +388,17 @@ try { ok = true; - nums = TermUtilities.splitAndConvertIntegers("3.57.67", 3); + nums = TermUtilities.splitAndConvertIntegers("Test.3.57.67", "3.57.67", 3); } catch (NumberFormatException e) { ok = false; } + catch (TermEvaulatorException e) + { + ok = false; + } + is(ok, eq(true), "three ints is ok"); is(nums[0], eq(3), "three ints is ok:first"); is(nums[1], eq(57), "three ints is ok:second"); @@ -399,12 +413,18 @@ try { ok = true; - TermUtilities.splitAndConvertIntegers("3.57.67.foo", 3); + TermUtilities.splitAndConvertIntegers( + "Test.3.57.67.foo", "3.57.67.foo", 3); } catch (NumberFormatException e) { ok = false; } + catch (TermEvaulatorException e) + { + ok = false; + } + is(ok, eq(false), "three ints plus spurious non-int fails"); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <nu...@us...> - 2008-10-05 17:35:21
|
Revision: 7948 http://pcgen.svn.sourceforge.net/pcgen/?rev=7948&view=rev Author: nuance Date: 2008-10-05 17:35:18 +0000 (Sun, 05 Oct 2008) Log Message: ----------- Add in the basis of the term evaluators Added Paths: ----------- Trunk/pcgen/code/src/java/pcgen/base/term/BaseEQTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/BasePCCountAbilitiesNatureTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/BasePCCountAbilitiesTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/BasePCCountAbilitiesTypeTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/BasePCTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/ConstantZeroTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/EQACCheckTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/EQBaseCostTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/EQCritMultTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/EQDamageDiceTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/EQDamageDieTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/EQEquipSizeTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/EQHandsTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/EQRaceReachTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/EQRangeTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/EQReachMultTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/EQReachTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/EQSizeTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/EQSpellFailureTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/EQWeightTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/EvaluatorFactory.java Trunk/pcgen/code/src/java/pcgen/base/term/PCACcheckTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCArmourACcheckTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCBABTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCBLTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCBaseSpellStatTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCCLBeforeLevelTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCCLTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCCarriedWeightTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCCasterLevelClassTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCCasterLevelRaceTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCCasterLevelTotalTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCCountAbilitiesNatureAllTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCCountAbilitiesNatureAutoTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCCountAbilitiesNatureNormalTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCCountAbilitiesNatureVirtualTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCCountAbilitiesTypeNatureAllTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCCountAbilitiesTypeNatureAutoTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCCountAbilitiesTypeNatureVirtualTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCCountAbilityNameTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCCountAttacksTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCCountChecksTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCCountClassesTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCCountContainersTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCCountDomainsTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCCountEquipmentTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCCountFollowerTypeTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCCountFollowerTypeTransitiveTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCCountFollowersTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCCountLanguagesTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCCountMiscCompanionsTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCCountMiscFundsTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCCountMiscMagicTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCCountMoveTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCCountNotesTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCCountRaceSubTypesTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCCountSABTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCCountSkillsTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCCountSpellClassesTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCCountSpellRaceTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCCountSpellTimesTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCCountSpellbookTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCCountSpellsInbookTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCCountSpellsKnownTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCCountSpellsLevelsInBookTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCCountStatsTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCCountTempBonusNamesTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCCountTemplatesTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCCountVisibleTemplatesTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCCountVisionTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCEncumberanceTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCEqTypeTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCHDTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCHasClassTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCHasDeityTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCHasFeatTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCHeightTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCMaxCastableAnyTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCMaxCastableClassTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCMaxCastableDomainTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCMaxCastableSpellTypeTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCModEquipTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCMoveBaseTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCMovementTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCProfACCheckTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCRaceSizeTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCSPellBaseStatScoreEvaluatorTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCSPellBaseStatTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCScoreTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCShieldACcheckTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCSizeModEvaluatorTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCSizeTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCSkillRankTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCSkillTotalTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCSkillTypeTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCSpellLevelTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCStatBaseTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCStatModTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCStatTotalTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCTLTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCTotalWeightTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCVarDefinedTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCVerbatimTextTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/PCWeightTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/TermEvaluator.java Trunk/pcgen/code/src/java/pcgen/base/term/TermEvaluatorBuilder.java Trunk/pcgen/code/src/java/pcgen/base/term/TermEvaluatorBuilderEQVar.java Trunk/pcgen/code/src/java/pcgen/base/term/TermEvaluatorBuilderPCStat.java Trunk/pcgen/code/src/java/pcgen/base/term/TermEvaluatorBuilderPCVar.java Trunk/pcgen/code/src/test/pcgen/base/ Trunk/pcgen/code/src/test/pcgen/base/term/ Trunk/pcgen/code/src/test/pcgen/base/term/EvaluatorFactoryTest.java Added: Trunk/pcgen/code/src/java/pcgen/base/term/BaseEQTermEvaluator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/base/term/BaseEQTermEvaluator.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/base/term/BaseEQTermEvaluator.java 2008-10-05 17:35:18 UTC (rev 7948) @@ -0,0 +1,65 @@ +/** + * pcgen.base.term.BaseEQTermEvaluator.java + * Copyright 2008 Andrew Wilson <nu...@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 03 October 2008 + * + * Current Ver: $Revision:$ + * Last Editor: $Author:$ + * Last Edited: $Date:$ + * + */ + +package pcgen.base.term; + +import pcgen.core.PlayerCharacter; +import pcgen.core.Equipment; +import pcgen.core.spell.Spell; + +public abstract class BaseEQTermEvaluator +{ + protected String originalText; + + public String evaluate(PlayerCharacter pc) { + return Float.toString(resolve(pc)); + } + + public Float resolve(PlayerCharacter pc) + { + return 0f; + } + + public Float resolve(PlayerCharacter pc, final Spell aSpell) { + return resolve(pc); + } + + public Float getDefault () + { + return 1f; + } + + public String getOriginal () + { + return originalText; + } + + public int getLength () + { + return originalText.length(); + } +} + Added: Trunk/pcgen/code/src/java/pcgen/base/term/BasePCCountAbilitiesNatureTermEvaluator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/base/term/BasePCCountAbilitiesNatureTermEvaluator.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/base/term/BasePCCountAbilitiesNatureTermEvaluator.java 2008-10-05 17:35:18 UTC (rev 7948) @@ -0,0 +1,51 @@ +/** + * pcgen.base.term.PCCountAbilitiesNatureBaseEvaluator.java + * Copyright \xA9 2008 Andrew Wilson <nu...@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 09-Aug-2008 19:06:01 + * + * Current Ver: $Revision:$ + * Last Editor: $Author:$ + * Last Edited: $Date:$ + * + */ + +package pcgen.base.term; + +import java.util.List; + +import pcgen.core.PlayerCharacter; +import pcgen.core.Ability; +import pcgen.core.spell.Spell; + +public abstract class BasePCCountAbilitiesNatureTermEvaluator + extends BasePCCountAbilitiesTermEvaluator +{ + protected boolean visible; + protected boolean hidden; + + public BasePCCountAbilitiesNatureTermEvaluator() + { + } + + public Float resolve(PlayerCharacter pc) + { + List<Ability> lAb = getAbilities(pc); + + return countVisibleAbilities(pc, lAb, visible, hidden); + } +} Added: Trunk/pcgen/code/src/java/pcgen/base/term/BasePCCountAbilitiesTermEvaluator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/base/term/BasePCCountAbilitiesTermEvaluator.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/base/term/BasePCCountAbilitiesTermEvaluator.java 2008-10-05 17:35:18 UTC (rev 7948) @@ -0,0 +1,118 @@ +/** + * pcgen.base.term.PCCountFeatsBaseEvaluator.java + * Copyright \xA9 2008 Andrew Wilson <nu...@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 09-Aug-2008 16:08:40 + * + * Current Ver: $Revision:$ + * Last Editor: $Author:$ + * Last Edited: $Date:$ + * + */ + +package pcgen.base.term; + +import java.util.List; + +import pcgen.core.Ability; +import pcgen.core.PlayerCharacter; +import pcgen.core.AbilityCategory; +import pcgen.core.AssociationStore; +import pcgen.cdom.enumeration.ObjectKey; +import pcgen.util.enumeration.Visibility; + +public abstract class BasePCCountAbilitiesTermEvaluator extends BasePCTermEvaluator +{ + protected AbilityCategory abCat; + protected boolean visible; + protected boolean hidden; + + abstract List<Ability> getAbilities(PlayerCharacter pc); + + /** + * This function takes a list of feats and returns the number of visible, + * or hidden feats that are in the list The visible flag determines if + * the result should be the number of hidden feats, or the number of + * visible feats + * + * @param pc the Character with the abilities + * @param aList a list of the feats to look through. + * @param visible Count visible abilities + * @param hidden Count hidden abilities @return An int containing the number of feats in the list + * @return the number of matching abilities + */ + protected Float countVisibleAbilities( + AssociationStore pc, + final Iterable<Ability> aList, + final boolean visible, + final boolean hidden) + { + Float count = 0f; + + for (Ability ability : aList) + { + count += countVisibleAbility(pc, ability, visible, hidden, true); + } + + return count; + } + + /** + * Count the number of times the character has the ability. This can be + * limited to either hidden or visible Abilities, and can be limited to only + * counting once per ability rather than once per time taken (e.g. + * Weapon Specialisation in two weapons would count as 2 unless the onceOnly + * flag was true). + * + * @param pc the Character with the abilities + * @param ability The feat to be counted. + * @param visible Should it be counted if it is visible? + * @param hidden Should it be counted if it is hidden? + * @param onceOnly Should it be counted as one if was taken multiple times? + * @return The number of occurrences of the ability. + */ + protected Float countVisibleAbility( + AssociationStore pc, + final Ability ability, + final boolean visible, + final boolean hidden, + final boolean onceOnly) + { + Visibility v = ability.getSafe(ObjectKey.VISIBILITY); + + boolean abilityInvisibile = (v == Visibility.DISPLAY_ONLY) || + (v == Visibility.HIDDEN); + int count = 0; + + if (abilityInvisibile) + { + if (hidden) + { + count += (onceOnly) ? 1 : Math.max(1, pc.getSelectCorrectedAssociationCount(ability)); + } + } + else + { + if (visible) + { + count += (onceOnly) ? 1 : Math.max(1, pc.getSelectCorrectedAssociationCount(ability)); + } + } + + return (float) count; + } +} Added: Trunk/pcgen/code/src/java/pcgen/base/term/BasePCCountAbilitiesTypeTermEvaluator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/base/term/BasePCCountAbilitiesTypeTermEvaluator.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/base/term/BasePCCountAbilitiesTypeTermEvaluator.java 2008-10-05 17:35:18 UTC (rev 7948) @@ -0,0 +1,61 @@ +/** + * pcgen.base.term.PCCountAbilitiesTypeBaseEvaluator.java + * Copyright \xA9 2008 Andrew Wilson <nu...@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 09-Aug-2008 19:37:53 + * + * Current Ver: $Revision:$ + * Last Editor: $Author:$ + * Last Edited: $Date:$ + * + */ + +package pcgen.base.term; + +import java.util.List; + +import pcgen.core.PlayerCharacter; +import pcgen.core.Ability; + +public abstract class BasePCCountAbilitiesTypeTermEvaluator extends BasePCCountAbilitiesTermEvaluator +{ + protected String[] types; + + public Float resolve(PlayerCharacter pc) + { + Float count = 0f; + + List<Ability> abilityList = getAbilities(pc); + + for ( Ability anAbility : abilityList ) + { + // for each feat, look to see if it has any of the required types. + for ( String type : types) + { + if (anAbility.isType(type)) + { + count += countVisibleAbility( + pc, anAbility, visible, hidden, false); + + break; + } + } + } + + return count; + } +} Added: Trunk/pcgen/code/src/java/pcgen/base/term/BasePCTermEvaluator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/base/term/BasePCTermEvaluator.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/base/term/BasePCTermEvaluator.java 2008-10-05 17:35:18 UTC (rev 7948) @@ -0,0 +1,68 @@ +/** + * pcgen.base.term.BasePCTermEvaluator.java + * Copyright \xA9 2008 Andrew Wilson <nu...@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 07-Aug-2008 20:49:05 + * + * Current Ver: $Revision:$ + * Last Editor: $Author:$ + * Last Edited: $Date:$ + * + */ + +package pcgen.base.term; + +import pcgen.core.PlayerCharacter; +import pcgen.core.Equipment; +import pcgen.core.spell.Spell; + +public abstract class BasePCTermEvaluator +{ + protected String originalText; + + public String evaluate(PlayerCharacter pc) { + return Float.toString(resolve(pc)); + } + + public abstract Float resolve(PlayerCharacter pc); + + public Float resolve(PlayerCharacter pc, final Spell aSpell) { + return resolve(pc); + } + + public Float resolve( + Equipment equipment, + boolean primary, + PlayerCharacter pc) { + return resolve(pc); + } + + public Float getDefault () + { + return 1.0f; + } + + public String getOriginal () + { + return originalText; + } + + public int getLength () + { + return originalText.length(); + } +} Added: Trunk/pcgen/code/src/java/pcgen/base/term/ConstantZeroTermEvaluator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/base/term/ConstantZeroTermEvaluator.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/base/term/ConstantZeroTermEvaluator.java 2008-10-05 17:35:18 UTC (rev 7948) @@ -0,0 +1,51 @@ +/** + * pcgen.base.term.ConstantZeroTermEvaluator.java + * Copyright \xA9 2008 Andrew Wilson <nu...@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 22-Sep-2008 01:31:27 + * + * Current Ver: $Revision:$ + * Last Editor: $Author:$ + * Last Edited: $Date:$ + * + */ + +package pcgen.base.term; + +import pcgen.core.PlayerCharacter; + +public class ConstantZeroTermEvaluator + extends BasePCTermEvaluator implements TermEvaluator { + + public ConstantZeroTermEvaluator(String originalText) + { + this.originalText = originalText; + } + + public Float resolve(PlayerCharacter pc) { + return 0f; + } + + public boolean isSourceDependant() { + return false; + } + + public boolean isStatic() + { + return true; + } +} Added: Trunk/pcgen/code/src/java/pcgen/base/term/EQACCheckTermEvaluator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/base/term/EQACCheckTermEvaluator.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/base/term/EQACCheckTermEvaluator.java 2008-10-05 17:35:18 UTC (rev 7948) @@ -0,0 +1,58 @@ +/** + * pcgen.base.term.EQACCheckTermEvaluator.java + * Copyright \xA9 2008 Andrew Wilson <nu...@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 03-Oct-2008 02:38:19 + * + * Current Ver: $Revision:$ + * Last Editor: $Author:$ + * Last Edited: $Date:$ + * + */ + +package pcgen.base.term; + +import pcgen.core.Equipment; +import pcgen.core.PlayerCharacter; +import pcgen.cdom.enumeration.IntegerKey; + +public class EQACCheckTermEvaluator extends BaseEQTermEvaluator implements TermEvaluator +{ + public EQACCheckTermEvaluator(String expressionString) + { + this.originalText = expressionString; + } + + public Float resolve( + Equipment eq, + boolean primary, + PlayerCharacter pc) + { + return (float) eq.getSafe(IntegerKey.AC_CHECK); + } + + public boolean isSourceDependant() + { + return false; + } + + public boolean isStatic() + { + return false; + } +} + Added: Trunk/pcgen/code/src/java/pcgen/base/term/EQBaseCostTermEvaluator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/base/term/EQBaseCostTermEvaluator.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/base/term/EQBaseCostTermEvaluator.java 2008-10-05 17:35:18 UTC (rev 7948) @@ -0,0 +1,58 @@ +/** + * pcgen.base.term.EQBaseCostTermEvaluator.java + * Copyright \xA9 2008 Andrew Wilson <nu...@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 03-Oct-2008 01:55:27 + * + * Current Ver: $Revision:$ + * Last Editor: $Author:$ + * Last Edited: $Date:$ + * + */ + +package pcgen.base.term; + +import pcgen.cdom.enumeration.ObjectKey; +import pcgen.core.Equipment; +import pcgen.core.PlayerCharacter; + +public class EQBaseCostTermEvaluator + extends BaseEQTermEvaluator implements TermEvaluator +{ + public EQBaseCostTermEvaluator(String expressionString) + { + this.originalText = expressionString; + } + + public Float resolve( + Equipment eq, + boolean primary, + PlayerCharacter pc) + { + return eq.getSafe(ObjectKey.COST).floatValue(); + } + + public boolean isSourceDependant() + { + return false; + } + + public boolean isStatic() + { + return false; + } +} Added: Trunk/pcgen/code/src/java/pcgen/base/term/EQCritMultTermEvaluator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/base/term/EQCritMultTermEvaluator.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/base/term/EQCritMultTermEvaluator.java 2008-10-05 17:35:18 UTC (rev 7948) @@ -0,0 +1,61 @@ +/** + * pcgen.base.term.EQCritMultTermEvaluator.java + * Copyright \xA9 2008 Andrew Wilson <nu...@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 03-Oct-2008 02:14:17 + * + * Current Ver: $Revision:$ + * Last Editor: $Author:$ + * Last Edited: $Date:$ + * + */ + +package pcgen.base.term; + +import pcgen.core.Equipment; +import pcgen.core.PlayerCharacter; + +public class EQCritMultTermEvaluator extends BaseEQTermEvaluator implements TermEvaluator +{ + public EQCritMultTermEvaluator(String expressionString) + { + this.originalText = expressionString; + } + + public Float resolve( + Equipment eq, + boolean primary, + PlayerCharacter pc) + { + if (primary) + { + return (float) eq.getCritMultiplier(); + } + + return (float) eq.getAltCritMultiplier(); + } + + public boolean isSourceDependant() + { + return false; + } + + public boolean isStatic() + { + return false; + } +} Added: Trunk/pcgen/code/src/java/pcgen/base/term/EQDamageDiceTermEvaluator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/base/term/EQDamageDiceTermEvaluator.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/base/term/EQDamageDiceTermEvaluator.java 2008-10-05 17:35:18 UTC (rev 7948) @@ -0,0 +1,57 @@ +/** + * pcgen.base.term.EQDamageDiceTermEvaluator.java + * Copyright \xA9 2008 Andrew Wilson <nu...@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 03-Oct-2008 02:23:47 + * + * Current Ver: $Revision:$ + * Last Editor: $Author:$ + * Last Edited: $Date:$ + * + */ + +package pcgen.base.term; + +import pcgen.core.Equipment; +import pcgen.core.PlayerCharacter; +import pcgen.core.RollInfo; + +public class EQDamageDiceTermEvaluator extends BaseEQTermEvaluator implements TermEvaluator +{ + public EQDamageDiceTermEvaluator(String expressionString) + { + this.originalText = expressionString; + } + + public Float resolve( + Equipment eq, + boolean primary, + PlayerCharacter pc) + { + return (float) new RollInfo(eq.getDamage(pc)).getTimes(); + } + + public boolean isSourceDependant() + { + return false; + } + + public boolean isStatic() + { + return false; + } +} Added: Trunk/pcgen/code/src/java/pcgen/base/term/EQDamageDieTermEvaluator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/base/term/EQDamageDieTermEvaluator.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/base/term/EQDamageDieTermEvaluator.java 2008-10-05 17:35:18 UTC (rev 7948) @@ -0,0 +1,57 @@ +/** + * pcgen.base.term.EQDamageDieTermEvaluator.java + * Copyright \xA9 2008 Andrew Wilson <nu...@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 03-Oct-2008 02:36:29 + * + * Current Ver: $Revision:$ + * Last Editor: $Author:$ + * Last Edited: $Date:$ + * + */ + +package pcgen.base.term; + +import pcgen.core.Equipment; +import pcgen.core.PlayerCharacter; +import pcgen.core.RollInfo; + +public class EQDamageDieTermEvaluator extends BaseEQTermEvaluator implements TermEvaluator +{ + public EQDamageDieTermEvaluator(String expressionString) + { + this.originalText = expressionString; + } + + public Float resolve( + Equipment eq, + boolean primary, + PlayerCharacter pc) + { + return (float) new RollInfo(eq.getDamage(pc)).getSides(); + } + + public boolean isSourceDependant() + { + return false; + } + + public boolean isStatic() + { + return false; + } +} Added: Trunk/pcgen/code/src/java/pcgen/base/term/EQEquipSizeTermEvaluator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/base/term/EQEquipSizeTermEvaluator.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/base/term/EQEquipSizeTermEvaluator.java 2008-10-05 17:35:18 UTC (rev 7948) @@ -0,0 +1,56 @@ +/** + * pcgen.base.term.EQEquipSizeTermEvaluator.java + * Copyright \xA9 2008 Andrew Wilson <nu...@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 03-Oct-2008 02:45:23 + * + * Current Ver: $Revision:$ + * Last Editor: $Author:$ + * Last Edited: $Date:$ + * + */ + +package pcgen.base.term; + +import pcgen.core.Equipment; +import pcgen.core.PlayerCharacter; + +public class EQEquipSizeTermEvaluator extends BaseEQTermEvaluator implements TermEvaluator +{ + public EQEquipSizeTermEvaluator(String expressionString) + { + this.originalText = expressionString; + } + + public Float resolve( + Equipment eq, + boolean primary, + PlayerCharacter pc) + { + return Float.valueOf(eq.getSize()); + } + + public boolean isSourceDependant() + { + return false; + } + + public boolean isStatic() + { + return false; + } +} Added: Trunk/pcgen/code/src/java/pcgen/base/term/EQHandsTermEvaluator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/base/term/EQHandsTermEvaluator.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/base/term/EQHandsTermEvaluator.java 2008-10-05 17:35:18 UTC (rev 7948) @@ -0,0 +1,58 @@ +/** + * pcgen.base.term.EQHandsTermEvaluator.java + * Copyright \xA9 2008 Andrew Wilson <nu...@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 03-Oct-2008 02:40:23 + * + * Current Ver: $Revision:$ + * Last Editor: $Author:$ + * Last Edited: $Date:$ + * + */ + +package pcgen.base.term; + +import pcgen.core.Equipment; +import pcgen.core.PlayerCharacter; +import pcgen.cdom.enumeration.IntegerKey; + +public class EQHandsTermEvaluator extends BaseEQTermEvaluator implements TermEvaluator +{ + public EQHandsTermEvaluator(String expressionString) + { + this.originalText = expressionString; + } + + public Float resolve( + Equipment eq, + boolean primary, + PlayerCharacter pc) + { + return (float) eq.getSafe(IntegerKey.SLOTS); + } + + public boolean isSourceDependant() + { + return false; + } + + public boolean isStatic() + { + return false; + } + +} Added: Trunk/pcgen/code/src/java/pcgen/base/term/EQRaceReachTermEvaluator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/base/term/EQRaceReachTermEvaluator.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/base/term/EQRaceReachTermEvaluator.java 2008-10-05 17:35:18 UTC (rev 7948) @@ -0,0 +1,59 @@ +/** + * pcgen.base.term.EQRaceReachTermEvaluator.java + * Copyright \xA9 2008 Andrew Wilson <nu...@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 03-Oct-2008 02:51:58 + * + * Current Ver: $Revision:$ + * Last Editor: $Author:$ + * Last Edited: $Date:$ + * + */ + +package pcgen.base.term; + +import pcgen.core.Equipment; +import pcgen.core.PlayerCharacter; + +public class EQRaceReachTermEvaluator extends BaseEQTermEvaluator implements TermEvaluator +{ + private final String source; + + public EQRaceReachTermEvaluator(String expressionString, String src) + { + this.originalText = expressionString; + this.source = src; + } + + public Float resolve( + Equipment eq, + boolean primary, + PlayerCharacter pc) + { + return pc.getVariableValue("REACH.VAL", source); + } + + public boolean isSourceDependant() + { + return true; + } + + public boolean isStatic() + { + return false; + } +} Added: Trunk/pcgen/code/src/java/pcgen/base/term/EQRangeTermEvaluator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/base/term/EQRangeTermEvaluator.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/base/term/EQRangeTermEvaluator.java 2008-10-05 17:35:18 UTC (rev 7948) @@ -0,0 +1,57 @@ +/** + * pcgen.base.term.EQRangeTermEvaluator.java + * Copyright \xA9 2008 Andrew Wilson <nu...@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 03-Oct-2008 02:57:13 + * + * Current Ver: $Revision:$ + * Last Editor: $Author:$ + * Last Edited: $Date:$ + * + */ + +package pcgen.base.term; + +import pcgen.core.Equipment; +import pcgen.core.PlayerCharacter; +import pcgen.cdom.enumeration.IntegerKey; + +public class EQRangeTermEvaluator extends BaseEQTermEvaluator implements TermEvaluator +{ + public EQRangeTermEvaluator(String expressionString) + { + this.originalText = expressionString; + } + + public Float resolve( + Equipment eq, + boolean primary, + PlayerCharacter pc) + { + return (float) eq.getSafe(IntegerKey.RANGE); + } + + public boolean isSourceDependant() + { + return true; + } + + public boolean isStatic() + { + return false; + } +} Added: Trunk/pcgen/code/src/java/pcgen/base/term/EQReachMultTermEvaluator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/base/term/EQReachMultTermEvaluator.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/base/term/EQReachMultTermEvaluator.java 2008-10-05 17:35:18 UTC (rev 7948) @@ -0,0 +1,57 @@ +/** + * pcgen.base.term.EQReachMultTermEvaluator.java + * Copyright \xA9 2008 Andrew Wilson <nu...@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 03-Oct-2008 03:01:55 + * + * Current Ver: $Revision:$ + * Last Editor: $Author:$ + * Last Edited: $Date:$ + * + */ + +package pcgen.base.term; + +import pcgen.core.Equipment; +import pcgen.core.PlayerCharacter; +import pcgen.cdom.enumeration.IntegerKey; + +public class EQReachMultTermEvaluator extends BaseEQTermEvaluator implements TermEvaluator +{ + public EQReachMultTermEvaluator(String expressionString) + { + this.originalText = expressionString; + } + + public Float resolve( + Equipment eq, + boolean primary, + PlayerCharacter pc) + { + return (float) eq.getSafe(IntegerKey.REACH_MULT); + } + + public boolean isSourceDependant() + { + return true; + } + + public boolean isStatic() + { + return false; + } +} Added: Trunk/pcgen/code/src/java/pcgen/base/term/EQReachTermEvaluator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/base/term/EQReachTermEvaluator.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/base/term/EQReachTermEvaluator.java 2008-10-05 17:35:18 UTC (rev 7948) @@ -0,0 +1,56 @@ +/** + * pcgen.base.term.EQReachTermEvaluator.java + * Copyright \xA9 2008 Andrew Wilson <nu...@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 03-Oct-2008 02:59:53 + * + * Current Ver: $Revision:$ + * Last Editor: $Author:$ + * Last Edited: $Date:$ + * + */ + +package pcgen.base.term; + +import pcgen.core.Equipment; +import pcgen.core.PlayerCharacter; +import pcgen.cdom.enumeration.IntegerKey; + +public class EQReachTermEvaluator extends BaseEQTermEvaluator implements TermEvaluator +{ + public EQReachTermEvaluator(String expressionString) + { + this.originalText = expressionString; + } + public Float resolve( + Equipment eq, + boolean primary, + PlayerCharacter pc) + { + return (float) eq.getSafe(IntegerKey.REACH); + } + + public boolean isSourceDependant() + { + return true; + } + + public boolean isStatic() + { + return false; + } +} Added: Trunk/pcgen/code/src/java/pcgen/base/term/EQSizeTermEvaluator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/base/term/EQSizeTermEvaluator.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/base/term/EQSizeTermEvaluator.java 2008-10-05 17:35:18 UTC (rev 7948) @@ -0,0 +1,57 @@ +/** + * pcgen.base.term.EQSizeTermEvaluator.java + * Copyright \xA9 2008 Andrew Wilson <nu...@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 03-Oct-2008 03:03:04 + * + * Current Ver: $Revision:$ + * Last Editor: $Author:$ + * Last Edited: $Date:$ + * + */ + +package pcgen.base.term; + +import pcgen.core.Equipment; +import pcgen.core.PlayerCharacter; +import pcgen.cdom.enumeration.IntegerKey; + +public class EQSizeTermEvaluator extends BaseEQTermEvaluator implements TermEvaluator +{ + public EQSizeTermEvaluator(String expressionString) + { + this.originalText = expressionString; + } + + public Float resolve( + Equipment eq, + boolean primary, + PlayerCharacter pc) + { + return (float) eq.sizeInt(); + } + + public boolean isSourceDependant() + { + return true; + } + + public boolean isStatic() + { + return false; + } +} Added: Trunk/pcgen/code/src/java/pcgen/base/term/EQSpellFailureTermEvaluator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/base/term/EQSpellFailureTermEvaluator.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/base/term/EQSpellFailureTermEvaluator.java 2008-10-05 17:35:18 UTC (rev 7948) @@ -0,0 +1,57 @@ +/** + * pcgen.base.term.EQSpellFailureTermEvaluator.java + * Copyright \xA9 2008 Andrew Wilson <nu...@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 03-Oct-2008 02:42:03 + * + * Current Ver: $Revision:$ + * Last Editor: $Author:$ + * Last Edited: $Date:$ + * + */ + +package pcgen.base.term; + +import pcgen.core.Equipment; +import pcgen.core.PlayerCharacter; +import pcgen.cdom.enumeration.IntegerKey; + +public class EQSpellFailureTermEvaluator extends BaseEQTermEvaluator implements TermEvaluator +{ + public EQSpellFailureTermEvaluator(String expressionString) + { + this.originalText =expressionString; + } + + public Float resolve( + Equipment eq, + boolean primary, + PlayerCharacter pc) + { + return (float) eq.getSafe(IntegerKey.SPELL_FAILURE); + } + + public boolean isSourceDependant() + { + return false; + } + + public boolean isStatic() + { + return false; + } +} Added: Trunk/pcgen/code/src/java/pcgen/base/term/EQWeightTermEvaluator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/base/term/EQWeightTermEvaluator.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/base/term/EQWeightTermEvaluator.java 2008-10-05 17:35:18 UTC (rev 7948) @@ -0,0 +1,75 @@ +/** + * pcgen.base.term.EQWeightTermEvaluator.java + * Copyright \xA9 2008 Andrew Wilson <nu...@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 03-Oct-2008 03:10:04 + * + * Current Ver: $Revision:$ + * Last Editor: $Author:$ + * Last Edited: $Date:$ + * + */ + +package pcgen.base.term; + +import java.math.BigDecimal; + +import pcgen.core.Equipment; +import pcgen.core.PlayerCharacter; +import pcgen.cdom.enumeration.IntegerKey; + +public class EQWeightTermEvaluator extends BaseEQTermEvaluator implements TermEvaluator +{ + public EQWeightTermEvaluator(String expressionString) + { + this.originalText = expressionString; + } + + public Float resolve( + Equipment eq, + boolean primary, + PlayerCharacter pc) + { + if (eq.isCalculatingCost() && eq.isWeightAlreadyUsed()) + { + return 0f; + } + + BigDecimal weightInPounds = eq.getWeightInPounds(); + + if (eq.isCalculatingCost() && eq.isAmmunition()) + { + Float unitWeight = weightInPounds.floatValue(); + unitWeight /= eq.getSafe(IntegerKey.BASE_QUANTITY); + eq.setWeightAlreadyUsed(true); + return unitWeight; + } + + eq.setWeightAlreadyUsed(true); + return weightInPounds.floatValue(); + } + + public boolean isSourceDependant() + { + return true; + } + + public boolean isStatic() + { + return false; + } +} Added: Trunk/pcgen/code/src/java/pcgen/base/term/EvaluatorFactory.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/base/term/EvaluatorFactory.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/base/term/EvaluatorFactory.java 2008-10-05 17:35:18 UTC (rev 7948) @@ -0,0 +1,198 @@ +/** + * pcgen.base.term.EvaluatorFactory.java + * Copyright \xA9 2008 Andrew Wilson <nu...@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 03-Oct-2008 17:46:37 + * + * Current Ver: $Revision:$ + * Last Editor: $Author:$ + * Last Edited: $Date:$ + * + */ + +package pcgen.base.term; + +import java.util.regex.Pattern; +import java.util.regex.Matcher; +import java.util.Map; +import java.util.TreeMap; +import java.util.HashMap; + +import pcgen.core.GameMode; +import pcgen.core.SettingsHandler; + +public class EvaluatorFactory { + + Pattern internalVarPattern; + Map<String, TermEvaluatorBuilder> BuilderStore; + + private Map<String, TermEvaluator> SrcNeutralEvaluatorStore = + new HashMap<String, TermEvaluator>(); + private Map<String, Map<String, TermEvaluator>> SrcDependantEvaluatorStore = + new HashMap<String, Map<String, TermEvaluator>>(); + + + public static EvaluatorFactory PC = + new EvaluatorFactory(true, TermEvaluatorBuilderPCVar.values()); + + public static EvaluatorFactory EQ = + new EvaluatorFactory(false, TermEvaluatorBuilderEQVar.values()); + + private EvaluatorFactory ( + boolean addStats, + final TermEvaluatorBuilder[] termEvaluatorBuilders) + { + TermEvaluatorBuilder[] evals = (addStats) ? + addStatBuilder(termEvaluatorBuilders) : + termEvaluatorBuilders; + + BuilderStore = new TreeMap<String, TermEvaluatorBuilder>(); + StringBuilder sb = new StringBuilder("^("); + + boolean add = false; + + for (TermEvaluatorBuilder e : evals) { + if (add) { + sb.append("|"); + } else { + add = true; + } + sb.append(e.getTermConstructorPattern()); + + String[] keys = e.getTermConstructorKeys(); + for (String k : keys) { + BuilderStore.put(k, e); + } + } + + sb.append(")"); + internalVarPattern = Pattern.compile(sb.toString()); + } + + private static TermEvaluatorBuilder[] addStatBuilder( + TermEvaluatorBuilder[] builderArray) + { + int end = builderArray.length; + + TermEvaluatorBuilder[] tempArray = new TermEvaluatorBuilder[end + 1]; + + System.arraycopy(builderArray, 0, tempArray, 0, end); + + tempArray[end] = makeStatBuilder(); + + return tempArray; + } + + private static TermEvaluatorBuilder makeStatBuilder() + { + GameMode game = SettingsHandler.getGame(); + int num = game.s_ATTRIBSHORT.length; + String[] s = new String[num]; + + StringBuffer pSt = new StringBuffer(num * 4 + 6); + + pSt.append("(?:"); + boolean add1 = false; + for (int x = 0; x < num; ++x) + { + if (add1) { + pSt.append("|"); + } else { + add1 = true; + } + pSt.append(game.s_ATTRIBSHORT[x]); + s[x] = game.s_ATTRIBSHORT[x]; + } + pSt.append(")"); + + return new TermEvaluatorBuilderPCStat(pSt.toString(), s, false); + } + + private TermEvaluator makeTermEvaluator( + String term, + String source) { + + Matcher mat = internalVarPattern.matcher(term); + + if (mat.find()) { + String matchedPortion = mat.group(1); + TermEvaluatorBuilder f = BuilderStore.get(matchedPortion); + + try + { + if (f.isEntireTerm() && + (term.length() != matchedPortion.length())) + { + return null; + } + else + { + return f.getTermEvaluator(term, source, matchedPortion); + } + } + catch (TermEvaulatorException e) + { + e.printStackTrace(); + } + } + + return null; + } + + public TermEvaluator getTermEvaluator ( + String term, + String source) { + + Map<String, TermEvaluator> inner = SrcDependantEvaluatorStore.get(term); + + if (inner == null) + { + TermEvaluator evaluator = SrcNeutralEvaluatorStore.get(term); + if (evaluator != null) { + return evaluator; + } + } + else + { + TermEvaluator evaluator = inner.get(source); + if (evaluator != null) { + return evaluator; + } + } + + TermEvaluator evaluator = makeTermEvaluator(term, source); + + if (evaluator == null) + { + return null; + } + + if (evaluator.isSourceDependant()) + { + Map<String, TermEvaluator> i = SrcDependantEvaluatorStore.get(term); + Map<String, TermEvaluator> j = (i == null) ? new HashMap<String, TermEvaluator>() : i; + j.put(source, evaluator); + SrcDependantEvaluatorStore.put(term, j); + } + else + { + SrcNeutralEvaluatorStore.put(term, evaluator); + } + + return evaluator; + } +} Added: Trunk/pcgen/code/src/java/pcgen/base/term/PCACcheckTermEvaluator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/base/term/PCACcheckTermEvaluator.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/base/term/PCACcheckTermEvaluator.java 2008-10-05 17:35:18 UTC (rev 7948) @@ -0,0 +1,67 @@ +/** + * pcgen.base.term.PCACcheckTermEvaluator.java + * Copyright \xA9 2008 Andrew Wilson <nu...@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 03-Aug-2008 21:30:46 + * + * Current Ver: $Revision:$ + * Last Editor: $Author:$ + * Last Edited: $Date:$ + * + */ + +package pcgen.base.term; + +import pcgen.core.Equipment; +import pcgen.core.PlayerCharacter; + +public class PCACcheckTermEvaluator + extends BasePCTermEvaluator implements TermEvaluator { + + PCACcheckTermEvaluator( + final String originalText) + { + this.originalText = originalText; + } + + public Float resolve(PlayerCharacter pc) + { + int maxCheck = 0; + + for ( Equipment eq : pc.getEquipmentOfType("Armor", 1) ) + { + maxCheck += eq.acCheck(pc); + } + + for ( Equipment eq : pc.getEquipmentOfType("Shield", 1) ) + { + maxCheck += eq.acCheck(pc); + } + + return (float) maxCheck; + } + + public boolean isSourceDependant() + { + return false; + } + + public boolean isStatic() + { + return false; + } +} Added: Trunk/pcgen/code/src/java/pcgen/base/term/PCArmourACcheckTermEvaluator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/base/term/PCArmourACcheckTermEvaluator.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/base/term/PCArmourACcheckTermEvaluator.java 2008-10-05 17:35:18 UTC (rev 7948) @@ -0,0 +1,61 @@ +/** + * pcgen.base.term.PCArmourACcheckTermEvaluator.java + * Copyright \xA9 2008 Andrew Wilson <nu...@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 03-Aug-2008 22:25:54 + * + * Current Ver: $Revision:$ + * Last Editor: $Author:$ + * Last Edited: $Date:$ + * + */ + +package pcgen.base.term; + +import pcgen.core.Equipment; +import pcgen.core.PlayerCharacter; + +public class PCArmourACcheck... [truncated message content] |
From: <th...@us...> - 2008-10-05 19:21:26
|
Revision: 7951 http://pcgen.svn.sourceforge.net/pcgen/?rev=7951&view=rev Author: thpr Date: 2008-10-05 19:21:21 +0000 (Sun, 05 Oct 2008) Log Message: ----------- SERVESAS 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/prereq/PrerequisiteUtilities.java Trunk/pcgen/code/src/java/pcgen/util/StringPClassUtil.java Trunk/pcgen/code/src/java/plugin/lsttokens/ServesAsToken.java Trunk/pcgen/code/src/java/plugin/pretokens/test/PreAbilityTester.java Trunk/pcgen/code/src/java/plugin/pretokens/test/PreCSkillTester.java Trunk/pcgen/code/src/java/plugin/pretokens/test/PreClassTester.java Trunk/pcgen/code/src/java/plugin/pretokens/test/PreRaceTester.java Trunk/pcgen/code/src/java/plugin/pretokens/test/PreSkillTester.java Trunk/pcgen/code/src/test/pcgen/core/prereq/PreAbilityTest.java Trunk/pcgen/code/src/test/pcgen/core/prereq/PreCSkillTest.java Trunk/pcgen/code/src/test/pcgen/core/prereq/PreClassTest.java Trunk/pcgen/code/src/test/pcgen/core/prereq/PreRaceTest.java Trunk/pcgen/code/src/test/pcgen/core/prereq/PreSkillTest.java Modified: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java 2008-10-05 18:47:13 UTC (rev 7950) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java 2008-10-05 19:21:21 UTC (rev 7951) @@ -61,6 +61,8 @@ import pcgen.core.PCStat; import pcgen.core.PCTemplate; import pcgen.core.QualifiedObject; +import pcgen.core.Race; +import pcgen.core.Skill; import pcgen.core.SpecialAbility; import pcgen.core.SpecialProperty; import pcgen.core.SpellProhibitor; @@ -235,6 +237,10 @@ public static final ListKey<SubClass> SUB_CLASS = new ListKey<SubClass>(); public static final ListKey<SubstitutionClass> SUBSTITUTION_CLASS = new ListKey<SubstitutionClass>(); public static final ListKey<DeferredLine> SUB_CLASS_LEVEL = new ListKey<DeferredLine>(); + public static final ListKey<CDOMReference<Skill>> SERVES_AS_SKILL = new ListKey<CDOMReference<Skill>>(); + public static final ListKey<CDOMReference<Race>> SERVES_AS_RACE = new ListKey<CDOMReference<Race>>(); + public static final ListKey<CDOMReference<PCClass>> SERVES_AS_CLASS = new ListKey<CDOMReference<PCClass>>(); + public static final ListKey<CDOMReference<Ability>> SERVES_AS_ABILITY = new ListKey<CDOMReference<Ability>>(); private static CaseInsensitiveMap<ListKey<?>> map = null; Modified: Trunk/pcgen/code/src/java/pcgen/core/PObject.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-10-05 18:47:13 UTC (rev 7950) +++ Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-10-05 19:21:21 UTC (rev 7951) @@ -31,7 +31,6 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; -import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.List; @@ -114,8 +113,6 @@ private String chooseLanguageAutos = Constants.EMPTY_STRING; - private HashMap<String,List<String>> servesAsList =null; - private URI sourceURI = null; private Set<String> types = new LinkedHashSet<String>(); @@ -2851,42 +2848,6 @@ levelAbilityList.clear(); } - public void putServesAs( final String key, final String category) - { - if (servesAsList == null) - { - servesAsList = new HashMap<String,List<String>>(); - } - List<String> list = servesAsList.get(category); - if (list == null) - { - list = new ArrayList<String>(); - servesAsList.put(category, list); - } - list.add(key); - } - - //TODO This exposes internal structure - be careful. - public final Map<String,List<String>> getServesAs() - { - if (servesAsList == null) - { - servesAsList = new HashMap<String,List<String>>(); - } - return servesAsList; - } - - public final List<String> getServesAs(String category) - { - if (servesAsList == null) - { - servesAsList = new HashMap<String,List<String>>(); - } - List<String> result = servesAsList.get(category); - return result == null ? new ArrayList<String>() : Collections - .unmodifiableList(result); - } - public String bonusStringPrefix() { return ""; Modified: Trunk/pcgen/code/src/java/pcgen/core/prereq/PrerequisiteUtilities.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/prereq/PrerequisiteUtilities.java 2008-10-05 18:47:13 UTC (rev 7950) +++ Trunk/pcgen/code/src/java/pcgen/core/prereq/PrerequisiteUtilities.java 2008-10-05 19:21:21 UTC (rev 7951) @@ -29,9 +29,10 @@ import java.util.Collection; import java.util.Iterator; import java.util.List; -import java.util.Map; import java.util.StringTokenizer; +import pcgen.cdom.base.CDOMReference; +import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; import pcgen.core.Ability; import pcgen.core.AbilityCategory; @@ -411,22 +412,13 @@ { for (Ability ability : character.getAggregateAbilityList(aCat)) { - final Map<String, List<String>> servesAsMap = ability.getServesAs(); - for (String cat : servesAsMap.keySet()) + for(CDOMReference<Ability> ref: ability.getSafeListFor(ListKey.SERVES_AS_ABILITY)) { - if (categoryName == null || categoryName.equals(cat)) + for (Ability ab : ref.getContainedObjects()) { - for (String abilityKey : servesAsMap.get(cat)) + if (categoryName == null || categoryName.equals(ab.getCategory())) { - AbilityCategory saCat = - SettingsHandler.getGame() - .getAbilityCategory(cat); - Ability saAbility = - Globals.getAbilityKeyed(saCat, abilityKey); - if (saAbility != null) - { - abilityList.add(saAbility); - } + abilityList.add(ab); } } } Modified: Trunk/pcgen/code/src/java/pcgen/util/StringPClassUtil.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/util/StringPClassUtil.java 2008-10-05 18:47:13 UTC (rev 7950) +++ Trunk/pcgen/code/src/java/pcgen/util/StringPClassUtil.java 2008-10-05 19:21:21 UTC (rev 7951) @@ -19,6 +19,8 @@ import pcgen.core.Race; import pcgen.core.SettingsHandler; import pcgen.core.Skill; +import pcgen.core.SubClass; +import pcgen.core.SubstitutionClass; import pcgen.core.WeaponProf; import pcgen.core.spell.Spell; @@ -58,6 +60,10 @@ stringMap.put(Skill.class, "SKILL"); stringMap.put(PCTemplate.class, "TEMPLATE"); stringMap.put(WeaponProf.class, "WEAPONPROF"); + + //Hacks for ServesAs + stringMap.put(SubClass.class, "CLASS"); + stringMap.put(SubstitutionClass.class, "CLASS"); } public static Class<? extends PObject> getClassFor(String key) Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/ServesAsToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/ServesAsToken.java 2008-10-05 18:47:13 UTC (rev 7950) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/ServesAsToken.java 2008-10-05 19:21:21 UTC (rev 7951) @@ -1,88 +1,175 @@ package plugin.lsttokens; +import java.util.ArrayList; 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.lang.StringUtil; +import pcgen.base.util.TreeMapToList; +import pcgen.cdom.base.CDOMObject; +import pcgen.cdom.base.CDOMReference; +import pcgen.cdom.base.CategorizedCDOMObject; import pcgen.cdom.base.Constants; +import pcgen.cdom.enumeration.ListKey; +import pcgen.cdom.reference.CDOMSingleRef; +import pcgen.cdom.reference.CategorizedCDOMReference; +import pcgen.cdom.reference.ReferenceManufacturer; import pcgen.core.Ability; +import pcgen.core.AbilityCategory; import pcgen.core.PCClass; import pcgen.core.PObject; import pcgen.core.Race; +import pcgen.core.SettingsHandler; import pcgen.core.Skill; -import pcgen.persistence.lst.GlobalLstToken; +import pcgen.persistence.PersistenceLayerException; +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; import pcgen.util.StringPClassUtil; /** * Deals with the SERVESAS token for Abilities */ -public class ServesAsToken implements GlobalLstToken +public class ServesAsToken extends AbstractToken implements + CDOMPrimaryToken<CDOMObject> { + @Override public String getTokenName() { return "SERVESAS"; } - public boolean parse(PObject obj, String value, int anInt) + public List<Class<? extends PObject>> getLegalTypes() { - if (!getLegalTypes().contains(obj.getClass())) { + return Arrays.asList( + + PCClass.class, Ability.class, Skill.class, Race.class + // Ability.class, Deity.class, Domain.class,Equipment.class, + // Race.class, Skill.class,Spell.class, PCTemplate.class, + // WeaponProf.class + ); + } + + public boolean parse(LoadContext context, CDOMObject obj, String value) + throws PersistenceLayerException + { + if (!getLegalTypes().contains(obj.getClass())) + { Logging.errorPrint("Cannot use SERVESAS on a " + obj.getClass()); Logging.errorPrint(" bad use found in " - + obj.getClass().getSimpleName() + " " - + obj.getKeyName()); + + obj.getClass().getSimpleName() + " " + obj.getKeyName()); return false; } + if (isEmpty(value) || hasIllegalSeparator('|', value)) + { + return false; + } StringTokenizer st = new StringTokenizer(value, Constants.PIPE); - String key = st.hasMoreTokens() ? st.nextToken() : ""; - Class c; - String category = ""; + String key = st.nextToken(); int equalLoc = key.indexOf('='); - if (equalLoc == -1) { - if ("ABILITY".equals(key)) { + Class<? extends PObject> servingClass; + ReferenceManufacturer<? extends PObject, ? extends CDOMSingleRef<?>> mfg; + if (equalLoc == -1) + { + if ("ABILITY".equals(key)) + { Logging.errorPrint("Invalid use of ABILITY in SERVESAS " + "(requires ABILITY=<category>): " + key); return false; } - c = StringPClassUtil.getClassFor(key); - } else { - if (!"ABILITY".equals(key.substring(0, equalLoc))) { + servingClass = StringPClassUtil.getClassFor(key); + if (servingClass == null) + { + Logging.errorPrint(getTokenName() + + " expecting a POBJECT Type, found: " + key); + return false; + } + mfg = context.ref.getManufacturer(servingClass); + } + else + { + if (!"ABILITY".equals(key.substring(0, equalLoc))) + { Logging.errorPrint("Invalid use of = in SERVESAS " + "(only valid for ABILITY): " + key); return false; } - c = Ability.class; - category = key.substring(equalLoc + 1); + String category = key.substring(equalLoc + 1); + key = key.substring(0, equalLoc); + AbilityCategory cat = SettingsHandler.getGame().getAbilityCategory( + category); + mfg = context.ref.getManufacturer(Ability.class, cat); } - if (c == null) { - Logging.errorPrint(getTokenName() + " expecting a POBJECT Type, found: " + key); + if (!st.hasMoreTokens()) + { + Logging.errorPrint(getTokenName() + + " must include at least one target object"); return false; - } else { - key = st.nextToken(); } - - while (true) + + ListKey<CDOMReference> listkey = ListKey.getKeyFor(CDOMReference.class, + "SERVES_AS_" + key); + while (st.hasMoreTokens()) { - obj.putServesAs( key, category); - - if (!st.hasMoreTokens()) - { - break; - } - - key = st.nextToken(); + CDOMSingleRef<?> ref = mfg.getReference(st.nextToken()); + context.obj.addToList(obj, listkey, ref); } - + return true; } - - public List<Class<? extends PObject>> getLegalTypes() { - return Arrays.asList( - - PCClass.class, Ability.class,Skill.class, Race.class - //Ability.class, Deity.class, Domain.class,Equipment.class, - //Race.class, Skill.class,Spell.class, PCTemplate.class, WeaponProf.class - ); + + public String[] unparse(LoadContext context, CDOMObject obj) + { + String key = StringPClassUtil.getStringFor(obj.getClass()); + ListKey<CDOMReference> listkey = ListKey.getKeyFor(CDOMReference.class, + "SERVES_AS_" + key); + Changes<CDOMReference> changes = context.obj.getListChanges(obj, + listkey); + Collection<CDOMReference> removedItems = changes.getRemoved(); + if (removedItems != null && !removedItems.isEmpty() + || changes.includesGlobalClear()) + { + context + .addWriteMessage(getTokenName() + + " does not support .CLEAR"); + return null; + } + Collection<CDOMReference> added = changes.getAdded(); + if (added == null || added.isEmpty()) + { + // Zero indicates no Token (and no global clear, so nothing to do) + return null; + } + TreeMapToList<String, String> map = new TreeMapToList<String, String>(); + for (CDOMReference ref : added) + { + String mapKey = key; + if (CategorizedCDOMObject.class.isAssignableFrom(obj.getClass())) + { + CategorizedCDOMReference<Ability> catref = (CategorizedCDOMReference<Ability>) ref; + mapKey = key + "=" + catref.getCDOMCategory().toString(); + } + map.addToListFor(mapKey, ref.getLSTformat()); + } + List<String> returnList = new ArrayList<String>(); + for (String mapKey : map.getKeySet()) + { + Set<String> set = new TreeSet<String>(map.getListFor(mapKey)); + returnList.add(mapKey + '|' + + StringUtil.joinToStringBuffer(set, "|")); + } + return returnList.toArray(new String[returnList.size()]); } + + public Class<CDOMObject> getTokenClass() + { + return CDOMObject.class; + } } Modified: Trunk/pcgen/code/src/java/plugin/pretokens/test/PreAbilityTester.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/pretokens/test/PreAbilityTester.java 2008-10-05 18:47:13 UTC (rev 7950) +++ Trunk/pcgen/code/src/java/plugin/pretokens/test/PreAbilityTester.java 2008-10-05 19:21:21 UTC (rev 7951) @@ -86,7 +86,8 @@ String key = prereq.getKey(); String subKey = prereq.getSubKey(); String categoryName = prereq.getCategoryName(); - AbilityCategory category = gameMode.getAbilityCategory(categoryName); + AbilityCategory category = categoryName == null ? null : gameMode + .getAbilityCategory(categoryName); int runningTotal = PrerequisiteUtilities.passesAbilityTest(prereq, character, countMults, number, key, subKey, categoryName, category); Modified: Trunk/pcgen/code/src/java/plugin/pretokens/test/PreCSkillTester.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/pretokens/test/PreCSkillTester.java 2008-10-05 18:47:13 UTC (rev 7950) +++ Trunk/pcgen/code/src/java/plugin/pretokens/test/PreCSkillTester.java 2008-10-05 19:21:21 UTC (rev 7951) @@ -25,6 +25,8 @@ import java.util.HashSet; import java.util.Set; +import pcgen.cdom.base.CDOMReference; +import pcgen.cdom.enumeration.ListKey; import pcgen.core.Globals; import pcgen.core.PlayerCharacter; import pcgen.core.Skill; @@ -144,12 +146,10 @@ { for(Skill aSkill: Globals.getContext().ref.getConstructedCDOMObjects(Skill.class)) { - Skill finalSkill = null ; Set<Skill> servesAs = new HashSet<Skill>(); - for(String fakeSkill: aSkill.getServesAs("")) + for(CDOMReference<Skill> ref: aSkill.getSafeListFor(ListKey.SERVES_AS_SKILL)) { - finalSkill = Globals.getContext().ref.silentlyGetConstructedCDOMObject(Skill.class, fakeSkill); - servesAs.add(finalSkill); + servesAs.addAll(ref.getContainedObjects()); } if(servesAs.size() > 0) Modified: Trunk/pcgen/code/src/java/plugin/pretokens/test/PreClassTester.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/pretokens/test/PreClassTester.java 2008-10-05 18:47:13 UTC (rev 7950) +++ Trunk/pcgen/code/src/java/plugin/pretokens/test/PreClassTester.java 2008-10-05 19:21:21 UTC (rev 7951) @@ -6,10 +6,9 @@ */ package plugin.pretokens.test; -import java.util.List; - +import pcgen.cdom.base.CDOMReference; +import pcgen.cdom.enumeration.ListKey; import pcgen.core.Equipment; -import pcgen.core.Globals; import pcgen.core.PCClass; import pcgen.core.PlayerCharacter; import pcgen.core.prereq.AbstractPrerequisiteTest; @@ -123,28 +122,25 @@ } else { - List<String> keys =cl.getServesAs(""); -SERVESAS: for(String aKey : keys) + for(CDOMReference<PCClass> ref: cl.getSafeListFor(ListKey.SERVES_AS_CLASS)) { - PCClass aClass = Globals.getContext().ref.silentlyGetConstructedCDOMObject(PCClass.class, aKey); - if (aClass == null) + for (PCClass fakeClass : ref.getContainedObjects()) { - continue SERVESAS; - } - if (aClass.isType(typeString)) - { - if (prereq.isCountMultiples()) + if (fakeClass.isType(typeString)) { - if (cl.getLevel() >= preClass) + if (prereq.isCountMultiples()) { - countedTotal++; + if (cl.getLevel() >= preClass) + { + countedTotal++; + } } + else + { + runningTotal += cl.getLevel(); + } + break; } - else - { - runningTotal += cl.getLevel(); - } - break; } } } @@ -171,23 +167,26 @@ { CLASSLIST: for(PCClass theClass: character.getClassList()) { - List<String> keys = theClass.getServesAs(""); - for(String aKey : keys) + for (CDOMReference<PCClass> ref : theClass + .getSafeListFor(ListKey.SERVES_AS_CLASS)) { - if (aKey.equalsIgnoreCase(aString)) + for (PCClass fakeClass : ref.getContainedObjects()) { - if (prereq.isCountMultiples()) + if (fakeClass.getKeyName().equalsIgnoreCase(aString)) { - if (theClass.getLevel() >= preClass) + if (prereq.isCountMultiples()) { - countedTotal++; + if (theClass.getLevel() >= preClass) + { + countedTotal++; + } } + else + { + runningTotal += theClass.getLevel(); + } + break CLASSLIST; } - else - { - runningTotal += theClass.getLevel(); - } - break CLASSLIST; } } } Modified: Trunk/pcgen/code/src/java/plugin/pretokens/test/PreRaceTester.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/pretokens/test/PreRaceTester.java 2008-10-05 18:47:13 UTC (rev 7950) +++ Trunk/pcgen/code/src/java/plugin/pretokens/test/PreRaceTester.java 2008-10-05 19:21:21 UTC (rev 7951) @@ -32,6 +32,7 @@ import java.util.Set; import java.util.StringTokenizer; +import pcgen.cdom.base.CDOMReference; import pcgen.cdom.base.Constants; import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; @@ -227,21 +228,11 @@ { for (Race theRace : Globals.getContext().ref.getConstructedCDOMObjects(Race.class)) { - Race finalRace = null; Set<Race> servesAs = new HashSet<Race>(); - if (theRace == null) + for(CDOMReference<Race> ref: theRace.getSafeListFor(ListKey.SERVES_AS_RACE)) { - return; + servesAs.addAll(ref.getContainedObjects()); } - for(String fakeRace: theRace.getServesAs("")) - { - finalRace = Globals.getContext().ref.silentlyGetConstructedCDOMObject(Race.class, fakeRace); - if (finalRace == null) - { - continue; - } - servesAs.add(finalRace); - } if(servesAs.size() > 0) { serveAsRaces.put(theRace, (HashSet<Race>) servesAs); Modified: Trunk/pcgen/code/src/java/plugin/pretokens/test/PreSkillTester.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/pretokens/test/PreSkillTester.java 2008-10-05 18:47:13 UTC (rev 7950) +++ Trunk/pcgen/code/src/java/plugin/pretokens/test/PreSkillTester.java 2008-10-05 19:21:21 UTC (rev 7951) @@ -30,7 +30,8 @@ import java.util.List; import java.util.Set; -import pcgen.core.Globals; +import pcgen.cdom.base.CDOMReference; +import pcgen.cdom.enumeration.ListKey; import pcgen.core.PlayerCharacter; import pcgen.core.Skill; import pcgen.core.analysis.SkillRankControl; @@ -214,12 +215,10 @@ { for(Skill aSkill: character.getSkillList()) { - Skill finalSkill = null ; Set<Skill> servesAs = new HashSet<Skill>(); - for(String fakeSkill: aSkill.getServesAs("")) + for(CDOMReference<Skill> ref: aSkill.getSafeListFor(ListKey.SERVES_AS_SKILL)) { - finalSkill = Globals.getContext().ref.silentlyGetConstructedCDOMObject(Skill.class, fakeSkill); - servesAs.add(finalSkill); + servesAs.addAll(ref.getContainedObjects()); } if(servesAs.size() > 0) Modified: Trunk/pcgen/code/src/test/pcgen/core/prereq/PreAbilityTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/prereq/PreAbilityTest.java 2008-10-05 18:47:13 UTC (rev 7950) +++ Trunk/pcgen/code/src/test/pcgen/core/prereq/PreAbilityTest.java 2008-10-05 19:21:21 UTC (rev 7951) @@ -26,10 +26,11 @@ import junit.framework.Test; import junit.framework.TestSuite; import pcgen.AbstractCharacterTestCase; +import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; +import pcgen.cdom.reference.CDOMDirectSingleRef; import pcgen.core.Ability; import pcgen.core.PlayerCharacter; -import pcgen.core.prereq.Prerequisite; import pcgen.persistence.PersistenceLayerException; import pcgen.util.TestHelper; import plugin.pretokens.parser.PreAbilityParser; @@ -218,12 +219,15 @@ assertFalse("Test feat match with no abilities.", PrereqHandler.passes( prereq3, character, null)); - TestHelper.makeAbility("Dancer", "FEAT", "General"); + Ability fd = TestHelper.makeAbility("Dancer", "FEAT", "General"); Ability ab2 = - TestHelper.makeAbility("Dancer", "BARDIC", - "General.Bardic"); - ab2.putServesAs("KEY_Alertness", "FEAT"); - ab2.putServesAs("KEY_Dancer", "FEAT"); + TestHelper.makeAbility("Dancer", "BARDIC", + "General.Bardic"); + Ability strangeness = + TestHelper.makeAbility("Strangeness", "BARDIC", + "General"); + ab2.addToListFor(ListKey.SERVES_AS_ABILITY, CDOMDirectSingleRef.getRef(fd)); + ab2.addToListFor(ListKey.SERVES_AS_ABILITY, CDOMDirectSingleRef.getRef(strangeness)); ab2.put(ObjectKey.MULTIPLE_ALLOWED, Boolean.FALSE); character.addAbility(TestHelper.getAbilityCategory(ab2), ab2, null); @@ -259,11 +263,11 @@ assertFalse("Test fighter type match with no abilities.", PrereqHandler .passes(prereq3, character, null)); - TestHelper.makeAbility("Power Attack", "FEAT", "Fighter"); + Ability pa = TestHelper.makeAbility("Power Attack", "FEAT", "Fighter"); Ability ab2 = TestHelper.makeAbility("Dancer", "BARDIC", "General.Bardic"); ab2.put(ObjectKey.MULTIPLE_ALLOWED, Boolean.FALSE); - ab2.putServesAs("KEY_Power Attack", "FEAT"); + ab2.addToListFor(ListKey.SERVES_AS_ABILITY, CDOMDirectSingleRef.getRef(pa)); character.addAbility(TestHelper.getAbilityCategory(ab2), ab2, null); assertTrue("Test general type match with an ability.", PrereqHandler @@ -298,11 +302,11 @@ assertFalse("Test feat match with no abilities.", PrereqHandler.passes( prereq3, character, null)); - TestHelper.makeAbility("Fascinate", "BARDIC", "Normal"); + Ability fas = TestHelper.makeAbility("Fascinate", "BARDIC", "Normal"); Ability ab2 = TestHelper.makeAbility("Dancer", "FEAT", "General.Bardic"); - ab2.putServesAs("KEY_Fascinate", "BARDIC"); + ab2.addToListFor(ListKey.SERVES_AS_ABILITY, CDOMDirectSingleRef.getRef(fas)); ab2.put(ObjectKey.MULTIPLE_ALLOWED, Boolean.FALSE); character.addAbility(TestHelper.getAbilityCategory(ab2), ab2, null); Modified: Trunk/pcgen/code/src/test/pcgen/core/prereq/PreCSkillTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/prereq/PreCSkillTest.java 2008-10-05 18:47:13 UTC (rev 7950) +++ Trunk/pcgen/code/src/test/pcgen/core/prereq/PreCSkillTest.java 2008-10-05 19:21:21 UTC (rev 7951) @@ -27,6 +27,8 @@ import pcgen.AbstractCharacterTestCase; import pcgen.cdom.base.FormulaFactory; import pcgen.cdom.enumeration.FormulaKey; +import pcgen.cdom.enumeration.ListKey; +import pcgen.cdom.reference.CDOMDirectSingleRef; import pcgen.core.Globals; import pcgen.core.PCClass; import pcgen.core.PlayerCharacter; @@ -130,17 +132,17 @@ Prerequisite prereq; final PreParserFactory factory = PreParserFactory.getInstance(); + Skill bar = new Skill(); + bar.setName("Bar"); + bar.setTypeInfo("Bar"); + Globals.getContext().ref.importObject(bar); + Skill foo = new Skill(); foo.setName("Foo"); - foo.putServesAs("Bar",""); + foo.addToListFor(ListKey.SERVES_AS_SKILL, CDOMDirectSingleRef.getRef(bar)); foo.setTypeInfo("Foo"); Globals.getContext().ref.importObject(foo); - Skill bar = new Skill(); - bar.setName("Bar"); - bar.setTypeInfo("Bar"); - Globals.getContext().ref.importObject(bar); - Skill baz = new Skill(); baz.setName("Baz"); baz.setTypeInfo("Baz"); Modified: Trunk/pcgen/code/src/test/pcgen/core/prereq/PreClassTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/prereq/PreClassTest.java 2008-10-05 18:47:13 UTC (rev 7950) +++ Trunk/pcgen/code/src/test/pcgen/core/prereq/PreClassTest.java 2008-10-05 19:21:21 UTC (rev 7951) @@ -32,7 +32,9 @@ import junit.framework.TestSuite; import junit.textui.TestRunner; import pcgen.AbstractCharacterTestCase; +import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.StringKey; +import pcgen.cdom.reference.CDOMDirectSingleRef; import pcgen.core.Globals; import pcgen.core.PCClass; import pcgen.core.PlayerCharacter; @@ -95,8 +97,12 @@ { final PCClass pcClass = new PCClass(); pcClass.setName("MyClass"); - pcClass.putServesAs("Warrior", ""); // the second parameter is for ability categories only - pcClass.putServesAs("Ranger", ""); // the second parameter is for ability categories only + final PCClass warrior = new PCClass(); + warrior.setName("Warrior"); + final PCClass ranger = new PCClass(); + ranger.setName("Ranger"); + pcClass.addToListFor(ListKey.SERVES_AS_CLASS, CDOMDirectSingleRef.getRef(warrior)); + pcClass.addToListFor(ListKey.SERVES_AS_CLASS, CDOMDirectSingleRef.getRef(ranger)); final PlayerCharacter character = getCharacter(); character.incrementClassLevel(3, pcClass); Modified: Trunk/pcgen/code/src/test/pcgen/core/prereq/PreRaceTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/prereq/PreRaceTest.java 2008-10-05 18:47:13 UTC (rev 7950) +++ Trunk/pcgen/code/src/test/pcgen/core/prereq/PreRaceTest.java 2008-10-05 19:21:21 UTC (rev 7951) @@ -36,6 +36,7 @@ import pcgen.cdom.enumeration.ObjectKey; import pcgen.cdom.enumeration.RaceSubType; import pcgen.cdom.enumeration.RaceType; +import pcgen.cdom.reference.CDOMDirectSingleRef; import pcgen.core.Globals; import pcgen.core.PlayerCharacter; import pcgen.core.Race; @@ -178,7 +179,7 @@ fake.setName("NotHuman"); Globals.getContext().ref.importObject(fake); - race.putServesAs(fake.getDisplayName(), ""); + race.addToListFor(ListKey.SERVES_AS_RACE, CDOMDirectSingleRef.getRef(fake)); character.setRace(fake); @@ -213,7 +214,7 @@ race.addToListFor(ListKey.RACESUBTYPE, RaceSubType.getConstant("none")); Globals.getContext().ref.importObject(fake); - fake.putServesAs(race.getDisplayName(), ""); + fake.addToListFor(ListKey.SERVES_AS_RACE, CDOMDirectSingleRef.getRef(race)); character.setRace(fake); final Prerequisite prereq = new Prerequisite(); @@ -255,7 +256,7 @@ fake.setTypeInfo("Humanoid"); Globals.getContext().ref.importObject(fake); - race.putServesAs(fake.getDisplayName(), ""); + race.addToListFor(ListKey.SERVES_AS_RACE, CDOMDirectSingleRef.getRef(fake)); character.setRace(fake); @@ -286,8 +287,8 @@ fake.setName("NotHuman"); fake.setTypeInfo("Humanoid"); Globals.getContext().ref.importObject(fake); - - race.putServesAs(fake.getDisplayName(), ""); + + race.addToListFor(ListKey.SERVES_AS_RACE, CDOMDirectSingleRef.getRef(fake)); character.setRace(fake); Modified: Trunk/pcgen/code/src/test/pcgen/core/prereq/PreSkillTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/prereq/PreSkillTest.java 2008-10-05 18:47:13 UTC (rev 7950) +++ Trunk/pcgen/code/src/test/pcgen/core/prereq/PreSkillTest.java 2008-10-05 19:21:21 UTC (rev 7951) @@ -121,8 +121,8 @@ fake.addToListFor(ListKey.CLASSES, CDOMDirectSingleRef.getRef(csl)); fake.setName("Fake"); fake.setTypeInfo("WIS"); - fake.putServesAs(target.getDisplayName(), ""); - fake.putServesAs(target2.getDisplayName(), ""); + fake.addToListFor(ListKey.SERVES_AS_SKILL, CDOMDirectSingleRef.getRef(target)); + fake.addToListFor(ListKey.SERVES_AS_SKILL, CDOMDirectSingleRef.getRef(target2)); Globals.getContext().ref.importObject(fake); Skill fs1 = character.addSkill(fake); SkillRankControl.modRanks(6.0, myClass, true, character, fs1); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jde...@us...> - 2008-10-06 09:41:31
|
Revision: 7972 http://pcgen.svn.sourceforge.net/pcgen/?rev=7972&view=rev Author: jdempsey Date: 2008-10-06 09:38:43 +0000 (Mon, 06 Oct 2008) Log Message: ----------- Fix bug: [5.15.4] Resources Tab - Duplicated Races Issue#: 2148763 Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java Trunk/pcgen/code/src/java/pcgen/gui/tabs/resources/AvailableFollowerModel.java Trunk/pcgen/code/src/test/pcgen/core/PlayerCharacterTest.java Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-10-06 02:55:46 UTC (rev 7971) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-10-06 09:38:43 UTC (rev 7972) @@ -2504,7 +2504,10 @@ { for (FollowerOption fo : followers) { - ret.addAll(fo.getExpandedOptions()); + if (fo.getListRef().getName().equalsIgnoreCase(aType)) + { + ret.addAll(fo.getExpandedOptions()); + } } } } Modified: Trunk/pcgen/code/src/java/pcgen/gui/tabs/resources/AvailableFollowerModel.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/tabs/resources/AvailableFollowerModel.java 2008-10-06 02:55:46 UTC (rev 7971) +++ Trunk/pcgen/code/src/java/pcgen/gui/tabs/resources/AvailableFollowerModel.java 2008-10-06 09:38:43 UTC (rev 7972) @@ -131,8 +131,7 @@ * @return true if cell editable **/ @Override - public boolean isCellEditable(@SuppressWarnings("unused") - Object node, int column) + public boolean isCellEditable(Object node, int column) { return (column == COL_NAME); } Modified: Trunk/pcgen/code/src/test/pcgen/core/PlayerCharacterTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/PlayerCharacterTest.java 2008-10-06 02:55:46 UTC (rev 7971) +++ Trunk/pcgen/code/src/test/pcgen/core/PlayerCharacterTest.java 2008-10-06 09:38:43 UTC (rev 7972) @@ -40,6 +40,7 @@ import junit.textui.TestRunner; import pcgen.AbstractCharacterTestCase; import pcgen.base.formula.Formula; +import pcgen.cdom.base.CDOMReference; import pcgen.cdom.base.Constants; import pcgen.cdom.base.FormulaFactory; import pcgen.cdom.content.LevelCommandFactory; @@ -51,7 +52,10 @@ import pcgen.cdom.helper.StatLock; import pcgen.cdom.inst.PCClassLevel; import pcgen.cdom.list.ClassSkillList; +import pcgen.cdom.list.CompanionList; import pcgen.cdom.reference.CDOMDirectSingleRef; +import pcgen.cdom.reference.CDOMSimpleSingleRef; +import pcgen.cdom.reference.CDOMSingleRef; import pcgen.core.Ability.Nature; import pcgen.core.analysis.SkillRankControl; import pcgen.core.bonus.Bonus; @@ -967,4 +971,47 @@ // assertEquals("After list bonus, temp no equip", 3, pc.getPartialStatBonusFor("STR", true, false)); } + + /** + * Validate the getAvailableFollowers function. + */ + public void testGetAvailableFollowers() + { + Ability ab = TestHelper.makeAbility("Tester", AbilityCategory.FEAT + .getAbilityCategory(), "Container"); + PlayerCharacter pc = getCharacter(); + + pc.addAbility(AbilityCategory.FEAT, ab, null); + + List<FollowerOption> fo = pc.getAvailableFollowers("Familiar"); + assertTrue("Initially familiar list should be empty", fo.isEmpty()); + fo = pc.getAvailableFollowers("MOUNT"); + assertTrue("Initially mount list should be empty", fo.isEmpty()); + + CDOMSingleRef<CompanionList> ref = new CDOMSimpleSingleRef<CompanionList>( + CompanionList.class, "Mount"); + CDOMReference<Race> race = new CDOMDirectSingleRef<Race>(giantRace); + FollowerOption option = new FollowerOption(race, ref); + ab.addToListFor(ListKey.COMPANIONLIST, option); + fo = pc.getAvailableFollowers("Familiar"); + assertTrue("Familiar list should still be empty", fo.isEmpty()); + fo = pc.getAvailableFollowers("MOUNT"); + assertFalse("Mount list should not be empty anymore", fo.isEmpty()); + assertEquals("Mount should be the giant race", giantRace.getKeyName(), fo.get(0).getRace().getKeyName()); + assertEquals("Mount list should only have one entry", 1, fo.size()); + + ref = new CDOMSimpleSingleRef<CompanionList>( + CompanionList.class, "Familiar"); + race = new CDOMDirectSingleRef<Race>(human); + option = new FollowerOption(race, ref); + ab.addToListFor(ListKey.COMPANIONLIST, option); + fo = pc.getAvailableFollowers("Familiar"); + assertFalse("Familiar list should not be empty anymore", fo.isEmpty()); + assertEquals("Familiar should be the human race", human.getKeyName(), fo.get(0).getRace().getKeyName()); + assertEquals("Familiar list should only have one entry", 1, fo.size()); + fo = pc.getAvailableFollowers("MOUNT"); + assertFalse("Mount list should not be empty anymore", fo.isEmpty()); + assertEquals("Mount should be the giant race", giantRace.getKeyName(), fo.get(0).getRace().getKeyName()); + assertEquals("Mount list should only have one entry", 1, fo.size()); + } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-10-08 00:19:20
|
Revision: 7992 http://pcgen.svn.sourceforge.net/pcgen/?rev=7992&view=rev Author: thpr Date: 2008-10-08 00:19:13 +0000 (Wed, 08 Oct 2008) Log Message: ----------- convert SPELLS token Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/cdom/base/CDOMObject.java Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/AssociationKey.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/SpellSupport.java Trunk/pcgen/code/src/java/pcgen/core/analysis/DomainApplication.java Trunk/pcgen/code/src/java/pcgen/core/spell/Spell.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/io/PCGVer2Parser.java Trunk/pcgen/code/src/java/plugin/lsttokens/SpellsLst.java Trunk/pcgen/code/src/java/plugin/pretokens/test/PreSpellTester.java Trunk/pcgen/code/src/test/pcgen/core/PCClassTest.java Added Paths: ----------- Trunk/pcgen/code/src/java/pcgen/cdom/list/SpellList.java Modified: Trunk/pcgen/code/src/java/pcgen/cdom/base/CDOMObject.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/base/CDOMObject.java 2008-10-07 23:29:02 UTC (rev 7991) +++ Trunk/pcgen/code/src/java/pcgen/cdom/base/CDOMObject.java 2008-10-08 00:19:13 UTC (rev 7992) @@ -22,6 +22,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.HashSet; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -78,7 +79,12 @@ 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>(); + /* + * CONSIDER This is currently order enforcing the reference fetching to + * match the integration tests that we perform, and their current behavior. + * Not sure if this is really tbe best solution? + */ + private DoubleKeyMapToList<CDOMReference<? extends CDOMList<? extends PrereqObject>>, CDOMReference<?>, AssociatedPrereqObject> cdomListMods = new DoubleKeyMapToList<CDOMReference<? extends CDOMList<? extends PrereqObject>>, CDOMReference<?>, AssociatedPrereqObject>(HashMap.class, LinkedHashMap.class); public final boolean containsKey(IntegerKey arg0) { Modified: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/AssociationKey.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/AssociationKey.java 2008-10-07 23:29:02 UTC (rev 7991) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/AssociationKey.java 2008-10-08 00:19:13 UTC (rev 7992) @@ -28,10 +28,12 @@ import java.util.List; import java.util.Map; +import pcgen.base.formula.Formula; import pcgen.base.util.CaseInsensitiveMap; import pcgen.cdom.base.CDOMObject; import pcgen.core.Ability; import pcgen.core.AbilityCategory; +import pcgen.core.TimeUnit; /** * @author Tom Parker <th...@us...> @@ -71,6 +73,16 @@ public static final AssociationKey<String> SPELL_KEY_CACHE = new AssociationKey<String>(); + public static final AssociationKey<String> CASTER_LEVEL = new AssociationKey<String>(); + + public static final AssociationKey<Formula> TIMES_PER_UNIT = new AssociationKey<Formula>(); + + public static final AssociationKey<TimeUnit> TIME_UNIT = new AssociationKey<TimeUnit>(); + + public static final AssociationKey<String> SPELLBOOK = new AssociationKey<String>(); + + public static final AssociationKey<String> DC_FORMULA = new AssociationKey<String>(); + private static CaseInsensitiveMap<AssociationKey<?>> map = null; private AssociationKey() Added: Trunk/pcgen/code/src/java/pcgen/cdom/list/SpellList.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/list/SpellList.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/cdom/list/SpellList.java 2008-10-08 00:19:13 UTC (rev 7992) @@ -0,0 +1,50 @@ +/* + * 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.list; + +import pcgen.cdom.base.CDOMListObject; +import pcgen.core.spell.Spell; + +/** + * SpellList is a CDOMListObject designed to reference a List of Spell objects. + */ +public class SpellList extends CDOMListObject<Spell> +{ + + /** + * Returns the Spell Class object (Spell.class) + * + * @return the Spell Class object (Spell.class) + */ + public Class<Spell> getListClass() + { + return Spell.class; + } + + /** + * Lists never have a Type, so this returns false + */ + @Override + public boolean isType(String str) + { + return false; + } + + // No additional Functionality :) + +} Modified: Trunk/pcgen/code/src/java/pcgen/core/PCClass.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-10-07 23:29:02 UTC (rev 7991) +++ Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-10-08 00:19:13 UTC (rev 7992) @@ -1907,28 +1907,6 @@ .unparse(me.getValue()), "\t")); } - // Output the list of spells associated with the class. - int cap = getSpellSupport().getMaxSpellListLevel(); - if (hasMaxLevel() && cap > getSafe(IntegerKey.LEVEL_LIMIT)) - { - cap = getSafe(IntegerKey.LEVEL_LIMIT); - } - for (int i = 0; i <= cap; i++) - { - final List<PCSpell> spellList = - getSpellSupport().getSpellListForLevel(i); - - if (spellList != null) - { - for (PCSpell spell : spellList) - { - pccTxt.append(lineSep).append(i).append("\tSPELLS:") - .append(spell.getPCCText()); - } - } - - } - for (int x = 0; x < getBonusList().size(); ++x) { final BonusObj aBonus = getBonusList().get(x); @@ -4519,33 +4497,6 @@ return spMod; } - /** - * Retrieve the list of spells for the class. Warning this overrides the - * PObject method getSpellList and obnly returns the spells up to the level - * held in the class. This may not be what you expect. - * - * @see pcgen.core.PObject#getSpellList() - */ - /* - * DELETEMETHOD This implies a whole host of work to be done in order to use - * PObject's version of this method. - * - * First of all, SpellSupport is level aware, and for many reasons, that is - * bad (and will be unnecessary, yea!). Once SpellSupport's knowledge of - * levels is eliminated, this can be removed, as it will not differ from - * PObject's version of this method. - * - * However, in order NOT to break PCClass and PCClassLevel, the level - * awareness that is in SpellSupport needs to be transferred out to the - * PCClass, which will likely have to create one SpellSupport object per - * level and have those stored and ready for passing to PCClassLevels. - */ - @Override - public List<PCSpell> getSpellList() - { - return getSpellSupport().getSpellList(getLevel()); - } - public int getMinLevelForSpellLevel(int spellLevel, boolean allowBonus) { if (!updateSpellCache(false)) Modified: Trunk/pcgen/code/src/java/pcgen/core/PObject.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-10-07 23:29:02 UTC (rev 7991) +++ Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-10-08 00:19:13 UTC (rev 7992) @@ -790,15 +790,6 @@ } /** - * This method gets access to the spell list. - * @return List - */ - public List<PCSpell> getSpellList() - { - return spellSupport.getSpellList(-1); - } - - /** * Get the type of PObject * * @return the type of PObject @@ -1510,14 +1501,6 @@ txt.append(writer); } - if (!(this instanceof PCClass)) - { - for (PCSpell s : getSpellList()) - { - txt.append("\tSPELLS:").append(s.getPCCText()); - } - } - if (getMyTypeCount() != 0) { txt.append('\t').append(Constants.s_TAG_TYPE).append(getType()); Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-10-07 23:29:02 UTC (rev 7991) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-10-08 00:19:13 UTC (rev 7992) @@ -12134,81 +12134,53 @@ private void addSpells(final PObject obj) { - if ((race == null) || (obj == null) || (obj.getSpellList() == null) - || obj.getSpellList().isEmpty()) + if (race == null || obj == null) { return; } - - PObject owner; - - List<PCSpell> spellList = obj.getSpellList(); - for (PCSpell pcSpell : spellList) + Collection<CDOMReference<Spell>> mods = obj.getListMods(Spell.SPELLS); + if (mods == null) { - final String spellKey = pcSpell.getKeyName(); - final Spell aSpell = Globals.getSpellKeyed(spellKey); - - if (aSpell == null) + return; + } + for (CDOMReference<Spell> ref : mods) + { + Collection<AssociatedPrereqObject> assocs = obj.getListAssociations(Spell.SPELLS, ref); + Collection<Spell> spells = ref.getContainedObjects(); + for (AssociatedPrereqObject apo : assocs) { - return; - } - - final String castCount = pcSpell.getTimesPerDay(); - int spellLevel = -1; - int times = 1; - int slotLevel = 0; - owner = race; - TimeUnit timeUnit = pcSpell.getTimeUnit(); - - if (castCount == null || castCount.equals("")) - { - times = 1; - } - else if (castCount.startsWith("LEVEL=") - || castCount.startsWith("LEVEL.")) - { - spellLevel = Integer.parseInt(castCount.substring(6)); - slotLevel = spellLevel; - - if (obj instanceof PCClass) + if (!PrereqHandler.passesAll(apo.getPrerequisiteList(), this, null)) { - owner = obj; + continue; } - } - else - { - times = getVariableValue(castCount, "").intValue(); - } + for (Spell sp : spells) + { + Formula times = apo + .getAssociation(AssociationKey.TIMES_PER_UNIT); + int resolvedTimes = times.resolve(this, + obj.getQualifiedKey()).intValue(); + TimeUnit timeunit = apo.getAssociation(AssociationKey.TIME_UNIT); + String book = apo.getAssociation(AssociationKey.SPELLBOOK); + + final Spell newSpell = sp.clone(); + sp.setFixedCasterLevel(apo.getAssociation(AssociationKey.CASTER_LEVEL)); + sp.setFixedDC(apo.getAssociation(AssociationKey.DC_FORMULA)); + final List<CharacterSpell> sList = + race.getSpellSupport().getCharacterSpell(newSpell, + book, -1); - final String book = pcSpell.getSpellbook(); + if (!sList.isEmpty()) + { + continue; + } - final String dcFormula = pcSpell.getDcFormula(); - if (dcFormula != null && !dcFormula.equals("")) - { - getVariableValue(dcFormula, "").intValue(); // TODO: value never - // used - } + final CharacterSpell cs = new CharacterSpell(race, sp); + SpellInfo si = cs.addInfo(0, resolvedTimes, book); + si.setTimeUnit(timeunit); - if (PrereqHandler.passesAll(pcSpell.getPrerequisiteList(), this, pcSpell)) - { - final Spell newSpell = aSpell.clone(); - aSpell.setFixedCasterLevel(pcSpell.getCasterLevelFormula()); - aSpell.setFixedDC(pcSpell.getDcFormula()); - final List<CharacterSpell> sList = - owner.getSpellSupport().getCharacterSpell(newSpell, - book, spellLevel); - - if (!sList.isEmpty()) - { - continue; + addSpellBook(new SpellBook(book, SpellBook.TYPE_INNATE_SPELLS)); + race.getSpellSupport().addCharacterSpell(cs); } - - final CharacterSpell cs = new CharacterSpell(owner, aSpell); - SpellInfo si = cs.addInfo(slotLevel, times, book); - si.setTimeUnit(timeUnit); - - addSpellBook(new SpellBook(book, SpellBook.TYPE_INNATE_SPELLS)); - owner.getSpellSupport().addCharacterSpell(cs); } } setDirty(true); Modified: Trunk/pcgen/code/src/java/pcgen/core/SpellSupport.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/SpellSupport.java 2008-10-07 23:29:02 UTC (rev 7991) +++ Trunk/pcgen/code/src/java/pcgen/core/SpellSupport.java 2008-10-08 00:19:13 UTC (rev 7992) @@ -37,7 +37,6 @@ import java.util.Map.Entry; import pcgen.base.util.DoubleKeyMap; -import pcgen.base.util.HashMapToList; import pcgen.core.character.CharacterSpell; import pcgen.core.character.SpellInfo; import pcgen.core.prereq.PrereqHandler; @@ -60,7 +59,6 @@ private HashMap<String, Integer> spellLevelMap = new HashMap<String, Integer>(); private DoubleKeyMap<String, String, Info> spellInfoMap = new DoubleKeyMap<String, String, Info>(); - private HashMapToList<Integer, PCSpell> spellMap = new HashMapToList<Integer, PCSpell>(); private HashMap<String, List<Prerequisite>> preReqSpellLevelMap = new HashMap<String, List<Prerequisite>>(); /* @@ -180,98 +178,6 @@ return spellInfoMap.get(tagType, spellName); } - /** - * Add a list of spells to the spell map - * @param level - * @param aSpellList - */ - public void addSpells(final int level, final List<PCSpell> aSpellList) - { - Integer aLevel = Integer.valueOf(level); - for (PCSpell spell : aSpellList ) - { - if (!spellMap.containsInList(aLevel, spell)) - { - spellMap.addToListFor(aLevel, spell); - } - } - } - - /** - * Get a list of spells from the spell map - * @param levelLimit - * @return List of PCSpells - */ - public List<PCSpell> getSpellList(int levelLimit) - { - boolean allSpells = levelLimit == -1; - final ArrayList<PCSpell> aList = new ArrayList<PCSpell>(); - - if (spellMap != null) - { - for ( Integer key : spellMap.getKeySet() ) - { - if (allSpells || key <= levelLimit) - { - aList.addAll(spellMap.getListFor(key)); - } - } - } - - return aList; - } - - /** - * Retrieve the list of spells registered for the specific level. - * - * @param level The level to be retrieved. - * @return A List of the level's spells - */ - public List<PCSpell> getSpellListForLevel(int level) - { - final ArrayList<PCSpell> aList = new ArrayList<PCSpell>(); - - if (spellMap != null) - { - for ( Integer key : spellMap.getKeySet() ) - { - if (key == level) - { - aList.addAll(spellMap.getListFor(key)); - } - } - } - - return aList; - } - - /** - * @return The maximum level for which a spell list is available - */ - public final int getMaxSpellListLevel() - { - int max = 0; - if (spellMap != null) - { - for ( Integer key : spellMap.getKeySet() ) - { - if (key > max) - { - max = key; - } - } - } - return max; - } - - /** - * Clear the spell list by initialising a new one - */ - public final void clearSpellList() - { - spellMap = new HashMapToList<Integer, PCSpell>(); - } - /** * Add a spell level to the spell map and spell info into the info map * @@ -574,8 +480,6 @@ public SpellSupport clone() throws CloneNotSupportedException { SpellSupport ss = (SpellSupport) super.clone(); ss.spellInfoMap = spellInfoMap.clone(); - ss.spellMap = new HashMapToList<Integer, PCSpell>(); - ss.spellMap.addAllLists(spellMap); if (characterSpellList != null) { ss.characterSpellList = new ArrayList<CharacterSpell>(characterSpellList); } Modified: Trunk/pcgen/code/src/java/pcgen/core/analysis/DomainApplication.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/analysis/DomainApplication.java 2008-10-07 23:29:02 UTC (rev 7991) +++ Trunk/pcgen/code/src/java/pcgen/core/analysis/DomainApplication.java 2008-10-08 00:19:13 UTC (rev 7992) @@ -20,14 +20,18 @@ package pcgen.core.analysis; import java.util.ArrayList; +import java.util.Collection; import java.util.List; +import pcgen.base.formula.Formula; +import pcgen.cdom.base.AssociatedPrereqObject; +import pcgen.cdom.base.CDOMReference; +import pcgen.cdom.enumeration.AssociationKey; import pcgen.cdom.enumeration.IntegerKey; import pcgen.core.CharacterDomain; import pcgen.core.Domain; import pcgen.core.Globals; import pcgen.core.PCClass; -import pcgen.core.PCSpell; import pcgen.core.PlayerCharacter; import pcgen.core.character.CharacterSpell; import pcgen.core.chooser.ChooserUtilities; @@ -97,34 +101,31 @@ } } - final List<PCSpell> spellList = d.getSpellList(); - - if ((aClass != null) && (spellList != null) && !spellList.isEmpty()) + Collection<CDOMReference<Spell>> mods = d.getSafeListMods(Spell.SPELLS); + for (CDOMReference<Spell> ref : mods) { - for (PCSpell pcSpell : spellList) + Collection<Spell> spells = ref.getContainedObjects(); + Collection<AssociatedPrereqObject> assoc = d.getListAssociations(Spell.SPELLS, ref); + for (AssociatedPrereqObject apo : assoc) { - final Spell aSpell = Globals - .getSpellKeyed(pcSpell.getKeyName()); - - if (aSpell == null) + if (!PrereqHandler.passesAll(apo.getPrerequisiteList(), pc, d)) { - return; + continue; } - - final int times = Integer.parseInt(pcSpell.getTimesPerDay()); - - final String book = pcSpell.getSpellbook(); - - if (PrereqHandler.passesAll(pcSpell.getPrerequisiteList(), pc, - d)) + for (Spell s : spells) { - final List<CharacterSpell> aList = aClass.getSpellSupport() - .getCharacterSpell(aSpell, book, -1); + String book = apo.getAssociation(AssociationKey.SPELLBOOK); + List<CharacterSpell> aList = aClass.getSpellSupport() + .getCharacterSpell(s, book, -1); if (aList.isEmpty()) { - final CharacterSpell cs = new CharacterSpell(d, aSpell); - cs.addInfo(1, times, book); + Formula times = apo + .getAssociation(AssociationKey.TIMES_PER_UNIT); + CharacterSpell cs = new CharacterSpell(d, s); + int resolvedTimes = times.resolve(pc, + d.getQualifiedKey()).intValue(); + cs.addInfo(1, resolvedTimes, book); aClass.getSpellSupport().addCharacterSpell(cs); } } Modified: Trunk/pcgen/code/src/java/pcgen/core/spell/Spell.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/spell/Spell.java 2008-10-07 23:29:02 UTC (rev 7991) +++ Trunk/pcgen/code/src/java/pcgen/core/spell/Spell.java 2008-10-08 00:19:13 UTC (rev 7992) @@ -44,6 +44,8 @@ import pcgen.cdom.helper.PointCost; import pcgen.cdom.list.ClassSpellList; import pcgen.cdom.list.DomainSpellList; +import pcgen.cdom.list.SpellList; +import pcgen.cdom.reference.CDOMDirectSingleRef; import pcgen.core.Ability; import pcgen.core.CharacterDomain; import pcgen.core.Domain; @@ -71,6 +73,15 @@ */ public final class Spell extends PObject { + public static final CDOMReference<SpellList> SPELLS; + + static + { + SpellList wpl = new SpellList(); + wpl.setName("*Spells"); + SPELLS = CDOMDirectSingleRef.getRef(wpl); + } + private String fixedCasterLevel = null; private String fixedDC = null; Modified: Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassLevelPanel.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassLevelPanel.java 2008-10-07 23:29:02 UTC (rev 7991) +++ Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassLevelPanel.java 2008-10-08 00:19:13 UTC (rev 7992) @@ -67,7 +67,6 @@ import pcgen.core.Globals; import pcgen.core.Kit; import pcgen.core.PCClass; -import pcgen.core.PCSpell; import pcgen.core.PObject; import pcgen.core.SpecialAbility; import pcgen.core.bonus.BonusObj; @@ -277,37 +276,6 @@ } } - // Output the list of spells associated with the class. - for (int i=0;i<=obj.getSpellSupport().getMaxSpellListLevel();i++) - { - final List<PCSpell> spellList = obj.getSpellSupport().getSpellListForLevel(i); - - if (spellList != null) - { - for (Iterator<PCSpell> li = spellList.iterator(); li.hasNext();) - { - String src = li.next().getPCCText(); - LevelTag lt = new LevelTag(String.valueOf(i), LevelTag.TAG_SPELLS, src); - levelTagList.add(lt); - } - } - - } - - /* - aCol = obj.vFeatList(); - if (aCol != null) - { - for (Iterator se = aCol.iterator(); se.hasNext();) - { - String c = (String) se.next(); - int y = c.indexOf(':'); - LevelTag lt = new LevelTag(c.substring(0, y), LevelTag.TAG_VFEAT, c.substring(y + 1)); - levelTagList.add(lt); - } - } - */ - for (Iterator<TransitionChoice<Kit>> it = obj.getSafeListFor( ListKey.KIT_CHOICE).iterator(); it.hasNext();) { @@ -320,6 +288,17 @@ for (PCClassLevel pcl : obj.getClassLevelCollection()) { Integer cl = pcl.get(IntegerKey.LEVEL); + + String[] unparse = Globals.getContext().unparse(pcl, "SPELLS"); + if (unparse != null) + { + for (String s : unparse) + { + LevelTag lt = new LevelTag(cl, LevelTag.TAG_SPELLS, s); + levelTagList.add(lt); + } + } + for (Iterator<TransitionChoice<Kit>> it = obj.getSafeListFor( ListKey.KIT_CHOICE).iterator(); it.hasNext();) { Modified: Trunk/pcgen/code/src/java/pcgen/gui/editor/EditorMainForm.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/editor/EditorMainForm.java 2008-10-07 23:29:02 UTC (rev 7991) +++ Trunk/pcgen/code/src/java/pcgen/gui/editor/EditorMainForm.java 2008-10-08 00:19:13 UTC (rev 7992) @@ -78,7 +78,6 @@ import pcgen.core.Movement; import pcgen.core.PCAlignment; import pcgen.core.PCClass; -import pcgen.core.PCSpell; import pcgen.core.PCTemplate; import pcgen.core.PObject; import pcgen.core.Race; @@ -623,7 +622,7 @@ thisPObject.clearPrerequisiteList(); thisPObject.removeListFor(ListKey.SAB); thisPObject.remove(ObjectKey.SR); - thisPObject.getSpellSupport().clearSpellList(); + thisPObject.removeAllFromList(Spell.SPELLS); thisPObject.clearAutoMap(); SpellSupport spellSupport = thisPObject.getSpellSupport(); @@ -3127,11 +3126,13 @@ if (anEditType != EditorConstants.EDIT_CLASS) { - List<PCSpell> spellList = thisPObject.getSpellList(); - if (spellList != null) { - for (Iterator<PCSpell> it = spellList.iterator(); it.hasNext();) + String[] unparse = Globals.getContext().unparse(thisPObject, + "SPELLS"); + if (unparse != null) + { + for (String s : unparse) { - selectedList.add("SPELLS:" + it.next().getPCCText()); + selectedList.add("SPELLS:" + s); } } } Modified: Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Parser.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Parser.java 2008-10-07 23:29:02 UTC (rev 7991) +++ Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Parser.java 2008-10-08 00:19:13 UTC (rev 7992) @@ -27,6 +27,7 @@ import java.math.BigDecimal; import java.util.ArrayList; +import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; @@ -35,7 +36,9 @@ import java.util.StringTokenizer; import pcgen.base.util.FixedStringList; +import pcgen.cdom.base.AssociatedPrereqObject; import pcgen.cdom.base.CDOMObject; +import pcgen.cdom.base.CDOMReference; import pcgen.cdom.base.ChoiceSet; import pcgen.cdom.base.Constants; import pcgen.cdom.base.TransitionChoice; @@ -62,7 +65,6 @@ import pcgen.core.Language; import pcgen.core.NoteItem; import pcgen.core.PCClass; -import pcgen.core.PCSpell; import pcgen.core.PCTemplate; import pcgen.core.PObject; import pcgen.core.PlayerCharacter; @@ -3860,30 +3862,34 @@ if (level < 0) { - final List<PCSpell> aList = source.getSpellList(); - - if (aList == null) + Collection<CDOMReference<Spell>> mods = source + .getListMods(Spell.SPELLS); + if (mods == null) { continue; } - - for (PCSpell pcSpell : aList) + for (CDOMReference<Spell> ref : mods) { - if (pcSpell == null) + Collection<Spell> refSpells = ref.getContainedObjects(); + Collection<AssociatedPrereqObject> assocs = source + .getListAssociations(Spell.SPELLS, ref); + for (Spell sp : refSpells) { - continue; + if (aSpell.getKeyName().equals(sp.getKeyName())) + { + for (AssociatedPrereqObject apo : assocs) + { + String sb = apo + .getAssociation(AssociationKey.SPELLBOOK); + if (spellBook.equals(sb)) + { + found = true; + break; + } + } + } } - - found = - (aSpell.getKeyName().equals(pcSpell.getKeyName()) && pcSpell - .getSpellbook().equals(spellBook)); - - if (found) - { - break; - } } - continue; } @@ -4013,17 +4019,6 @@ else { aClass.addClassSpellList(csl, thePC); - /* - * TODO This makes no sense to me - WHY do we have to add - * the spells by hand? - look at Rev 6416 and older for this - * behavior, but I don't understand it - thpr, 1 Jun 08 - */ - PCClass spellClass = refContext.silentlyGetConstructedCDOMObject(PCClass.class, csl.getLSTformat()); - if (spellClass != null) - { - aClass.getSpellSupport().addSpells(-1, - spellClass.getSpellList()); - } } } } Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/SpellsLst.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/SpellsLst.java 2008-10-07 23:29:02 UTC (rev 7991) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/SpellsLst.java 2008-10-08 00:19:13 UTC (rev 7992) @@ -4,196 +4,385 @@ */ package plugin.lsttokens; -import pcgen.core.Campaign; -import pcgen.core.PObject; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.StringTokenizer; +import java.util.TreeSet; + +import pcgen.base.formula.Formula; +import pcgen.base.lang.StringUtil; +import pcgen.base.util.DoubleKeyMap; +import pcgen.base.util.MapToList; +import pcgen.base.util.TripleKeyMap; +import pcgen.cdom.base.AssociatedPrereqObject; +import pcgen.cdom.base.CDOMObject; +import pcgen.cdom.base.CDOMReference; +import pcgen.cdom.base.Constants; +import pcgen.cdom.base.FormulaFactory; +import pcgen.cdom.enumeration.AssociationKey; import pcgen.core.SettingsHandler; import pcgen.core.TimeUnit; import pcgen.core.prereq.Prerequisite; -import pcgen.persistence.PersistenceLayerException; -import pcgen.persistence.lst.GlobalLstToken; -import pcgen.persistence.lst.prereq.PreParserFactory; +import pcgen.core.spell.Spell; +import pcgen.rules.context.AssociatedChanges; +import pcgen.rules.context.LoadContext; +import pcgen.rules.persistence.token.AbstractToken; +import pcgen.rules.persistence.token.CDOMPrimaryToken; import pcgen.util.Logging; -import java.util.ArrayList; -import java.util.List; -import java.util.StringTokenizer; -import pcgen.core.PCSpell; /** * @author djones4 - * + * */ -public class SpellsLst implements GlobalLstToken +public class SpellsLst extends AbstractToken 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 - */ - + @Override public String getTokenName() { return "SPELLS"; } - /* (non-Javadoc) - * @see pcgen.persistence.lst.GlobalLstToken#parse(pcgen.core.PObject, java.lang.String, int) - */ - public boolean parse(PObject obj, String value, int anInt) + public boolean parse(LoadContext context, CDOMObject obj, String value) { - if (!(obj instanceof Campaign)) - { - obj.getSpellSupport().addSpells(anInt, createSpellsList(value, obj)); - return true; - } - return false; + // if (!(obj instanceof Campaign)) { + return createSpellsList(context, obj, value); + // } + // return false; } /** - * SPELLS:<spellbook name>|[<optional parameters, pipe deliminated>] - * |<spell name>[,<formula for DC>] - * |<spell name2>[,<formula2 for DC>] + * SPELLS:<spellbook name>|[<optional parameters, pipe deliminated>] |<spell + * name>[,<formula for DC>] |<spell name2>[,<formula2 for DC>] |PRExxx * |PRExxx - * |PRExxx - * - * CASTERLEVEL=<formula> Casterlevel of spells - * TIMES=<formula> Cast Times per day, -1=At Will - * @param sourceLine Line from the LST file without the SPELLS: - * @param obj The object the line is being added to. Used for error reporting. + * + * CASTERLEVEL=<formula> Casterlevel of spells TIMES=<formula> Cast Times + * per day, -1=At Will + * + * @param sourceLine + * Line from the LST file without the SPELLS: * @return spells list */ - private List<PCSpell> createSpellsList(final String sourceLine, PObject obj) + private boolean createSpellsList(LoadContext context, CDOMObject obj, + String sourceLine) { - List<PCSpell> spellList = new ArrayList<PCSpell>(); - StringTokenizer tok = new StringTokenizer(sourceLine, "|"); - boolean isPre = false; - - if (tok.countTokens() > 1) + if (isEmpty(sourceLine) || hasIllegalSeparator('|', sourceLine)) { - String spellBook = tok.nextToken(); - String casterLevel = null; - String times = "1"; - TimeUnit timeUnit = SettingsHandler.getGame().getDefaultTimeUnit(); - List<String> preParseSpellList = new ArrayList<String>(); - List<Prerequisite> preList = new ArrayList<Prerequisite>(); - while (tok.hasMoreTokens()) + return false; + } + + StringTokenizer tok = new StringTokenizer(sourceLine, Constants.PIPE); + String spellBook = tok.nextToken(); + // Formula casterLevel = null; + String casterLevel = null; + String times = null; + String timeunit = null; + + if (!tok.hasMoreTokens()) + { + Logging.addParseMessage(Logging.LST_ERROR, getTokenName() + + ": minimally requires a Spell Name"); + return false; + } + String token = tok.nextToken(); + + while (true) + { + if (token.startsWith("TIMES=")) { - String token = tok.nextToken(); - if (token.startsWith("CASTERLEVEL=")) + if (times != null) { - if (isPre) - { - Logging.errorPrint("Invalid " + getTokenName() + ": " + sourceLine); - Logging.errorPrint(" PRExxx must be at the END of the Token"); - Logging.errorPrint("Please change: " + sourceLine - + " in " + obj.getSourceURI()); - isPre = false; - } - casterLevel = token.substring(12); + Logging.addParseMessage(Logging.LST_ERROR, + "Found two TIMES entries in " + getTokenName() + + ": invalid: " + sourceLine); + return false; } - else if (token.startsWith("TIMES=")) + times = token.substring(6); + if (times.length() == 0) { - if (isPre) - { - Logging.errorPrint("Invalid " + getTokenName() + ": " + sourceLine); - Logging.errorPrint(" PRExxx must be at the END of the Token"); - Logging.errorPrint("Please change: " + sourceLine - + " in " + obj.getSourceURI()); - isPre = false; - } - times = token.substring(6); - if ("ATWILL".equals(times)) - { - times = "-1"; - } - else if ("-1".equals(times)) - { - Logging.deprecationPrint("TIMES=-1 in " - + getTokenName() + " is deprecated. " - + "Assuming you meant TIMES=ATWILL. "); - Logging.deprecationPrint("Please change: " + sourceLine - + " in " + obj.getSourceURI()); - times = "-1"; - } + Logging.addParseMessage(Logging.LST_ERROR, + "Error in Times in " + getTokenName() + + ": argument was empty"); + return false; } - else if (token.startsWith("TIMEUNIT=")) + if (!tok.hasMoreTokens()) { - if (isPre) - { - Logging.errorPrint("Invalid " + getTokenName() + ": " + sourceLine); - Logging.errorPrint(" PRExxx must be at the END of the Token"); - Logging.errorPrint("Please change: " + sourceLine - + " in " + obj.getSourceURI()); - isPre = false; - } - String timeUnitKey = token.substring(9); - // Retrieve the time unit by key - timeUnit = SettingsHandler.getGame().getTimeUnit(timeUnitKey); - if (timeUnit == null) - { - // For now we create a new one if it isn't already present - timeUnit = new TimeUnit(timeUnitKey); - SettingsHandler.getGame().addTimeUnit(timeUnit); - } + Logging.addParseMessage(Logging.LST_ERROR, getTokenName() + + ": minimally requires " + + "a Spell Name (after TIMES=)"); + return false; } - else if (PreParserFactory.isPreReqString(token)) + token = tok.nextToken(); + } + else if (token.startsWith("TIMEUNIT=")) + { + if (timeunit != null) { - isPre = true; - try - { - PreParserFactory factory = - PreParserFactory.getInstance(); - preList.add(factory.parse(token)); - } - catch (PersistenceLayerException ple) - { - Logging.errorPrint(ple.getMessage(), ple); - } + Logging.addParseMessage(Logging.LST_ERROR, + "Found two TIMEUNIT entries in " + getTokenName() + + ": invalid: " + sourceLine); + return false; } - else + timeunit = token.substring(9); + if (timeunit.length() == 0) { - if (isPre) - { - Logging.errorPrint("Invalid " + getTokenName() + ": " + sourceLine); - Logging.errorPrint(" PRExxx must be at the END of the Token"); - Logging.errorPrint("Please change: " + sourceLine - + " in " + obj.getSourceURI()); - isPre = false; - } - preParseSpellList.add(token); + Logging.addParseMessage(Logging.LST_ERROR, + "Error in TimeUnit in " + getTokenName() + + ": argument was empty"); + return false; } + if (!tok.hasMoreTokens()) + { + Logging.addParseMessage(Logging.LST_ERROR, getTokenName() + + ": minimally requires " + + "a Spell Name (after TIMEUNIT=)"); + return false; + } + token = tok.nextToken(); } - for (int i = 0; i < preParseSpellList.size(); i++) + else if (token.startsWith("CASTERLEVEL=")) { - StringTokenizer spellTok = - new StringTokenizer(preParseSpellList.get(i), ","); - String name = spellTok.nextToken(); - String dcFormula = null; - if (spellTok.hasMoreTokens()) + if (casterLevel != null) { - dcFormula = spellTok.nextToken(); + Logging.addParseMessage(Logging.LST_ERROR, + "Found two CASTERLEVEL entries in " + + getTokenName() + ": invalid: " + + sourceLine); + return false; } - PCSpell spell = new PCSpell(); - spell.setName(name); - spell.setKeyName(spell.getKeyName()); - spell.setSpellbook(spellBook); - spell.setCasterLevelFormula(casterLevel); - spell.setTimesPerDay(times); - spell.setTimeUnit(timeUnit); - spell.setDcFormula(dcFormula); - for (Prerequisite prereq : preList) + casterLevel = token.substring(12); + if (casterLevel.length() == 0) { - spell.addPrerequisite(prereq); + Logging.addParseMessage(Logging.LST_ERROR, + "Error in Caster Level in " + getTokenName() + + ": argument was empty"); + return false; } - spellList.add(spell); + if (!tok.hasMoreTokens()) + { + Logging.addParseMessage(Logging.LST_ERROR, getTokenName() + + ": minimally requires a " + + "Spell Name (after CASTERLEVEL=)"); + return false; + } + token = tok.nextToken(); } + else + { + break; + } } - else + if (times == null) { - Logging - .errorPrint("SPELLS: line minimally requires SPELLS:<spellbook name>|<spell name>"); - Logging.errorPrint("Please change: " + sourceLine - + " in " + obj.getSourceURI()); + times = "1"; } - return spellList; + + if (token.charAt(0) == ',') + { + Logging.addParseMessage(Logging.LST_ERROR, getTokenName() + + " Spell arguments may not start with , : " + token); + return false; + } + if (token.charAt(token.length() - 1) == ',') + { + Logging.addParseMessage(Logging.LST_ERROR, getTokenName() + + " Spell arguments may not end with , : " + token); + return false; + } + if (token.indexOf(",,") != -1) + { + Logging.addParseMessage(Logging.LST_ERROR, getTokenName() + + " Spell arguments uses double separator ,, : " + token); + return false; + } + + /* + * CONSIDER This is currently order enforcing the reference fetching to + * match the integration tests that we perform, and their current + * behavior. Not sure if this is really tbe best solution? + * + * See CDOMObject. + */ + DoubleKeyMap<CDOMReference<Spell>, AssociationKey<?>, Object> dkm = new DoubleKeyMap<CDOMReference<Spell>, AssociationKey<?>, Object>(LinkedHashMap.class, HashMap.class); + while (true) + { + int commaLoc = token.indexOf(','); + String name = commaLoc == -1 ? token : token.substring(0, commaLoc); + CDOMReference<Spell> spell = context.ref.getCDOMReference( + Spell.class, name); + dkm.put(spell, AssociationKey.CASTER_LEVEL, casterLevel); + dkm.put(spell, AssociationKey.TIMES_PER_UNIT, FormulaFactory + .getFormulaFor(times)); + dkm.put(spell, AssociationKey.TIME_UNIT, SettingsHandler.getGame() + .getTimeUnit(timeunit)); + dkm.put(spell, AssociationKey.SPELLBOOK, spellBook); + if (commaLoc != -1) + { + dkm.put(spell, AssociationKey.DC_FORMULA, token + .substring(commaLoc + 1)); + } + if (!tok.hasMoreTokens()) + { + // No prereqs, so we're done + finish(context, obj, dkm, null); + return true; + } + token = tok.nextToken(); + if (token.startsWith("PRE") || token.startsWith("!PRE")) + { + break; + } + } + + List<Prerequisite> prereqs = new ArrayList<Prerequisite>(); + + while (true) + { + Prerequisite prereq = getPrerequisite(token); + if (prereq == null) + { + Logging.addParseMessage(Logging.LST_ERROR, + " (Did you put spells after the " + + "PRExxx tags in SPELLS:?)"); + return false; + } + prereqs.add(prereq); + if (!tok.hasMoreTokens()) + { + break; + } + token = tok.nextToken(); + } + + finish(context, obj, dkm, prereqs); + return true; } + + public void finish(LoadContext context, CDOMObject obj, + DoubleKeyMap<CDOMReference<Spell>, AssociationKey<?>, Object> dkm, + List<Prerequisite> prereqs) + { + for (CDOMReference<Spell> spell : dkm.getKeySet()) + { + AssociatedPrereqObject edge = context.getListContext().addToList( + getTokenName(), obj, Spell.SPELLS, spell); + for (AssociationKey ak : dkm.getSecondaryKeySet(spell)) + { + edge.setAssociation(ak, dkm.get(spell, ak)); + } + if (prereqs != null) + { + for (Prerequisite prereq : prereqs) + { + edge.addPrerequisite(prereq); + } + } + } + } + + public String[] unparse(LoadContext context, CDOMObject obj) + { + AssociatedChanges<CDOMReference<Spell>> changes = context + .getListContext().getChangesInList(getTokenName(), obj, + Spell.SPELLS); + MapToList<CDOMReference<Spell>, AssociatedPrereqObject> mtl = changes + .getAddedAssociations(); + if (mtl == null || mtl.isEmpty()) + { + // Zero indicates no Token + return null; + } + + TripleKeyMap<Set<Prerequisite>, Map<AssociationKey<?>, Object>, CDOMReference<Spell>, String> m = new TripleKeyMap<Set<Prerequisite>, Map<AssociationKey<?>, Object>, CDOMReference<Spell>, String>(); + for (CDOMReference<Spell> lw : mtl.getKeySet()) + { + for (AssociatedPrereqObject assoc : mtl.getListFor(lw)) + { + Map<AssociationKey<?>, Object> am = new HashMap<AssociationKey<?>, Object>(); + String dc = null; + for (AssociationKey<?> ak : assoc.getAssociationKeys()) + { + // if (AssociationKey.SOURCE_URI.equals(ak) + // || AssociationKey.FILE_LOCATION.equals(ak)) + // { + // // Do nothing + // } + // else + if (AssociationKey.DC_FORMULA.equals(ak)) + { + dc = assoc.getAssociation(AssociationKey.DC_FORMULA); + } + else + { + am.put(ak, assoc.getAssociation(ak)); + } + } + m.put(new HashSet<Prerequisite>(assoc.getPrerequisiteList()), + am, lw, dc); + } + } + + Set<String> set = new TreeSet<String>(); + for (Set<Prerequisite> prereqs : m.getKeySet()) + { + for (Map<AssociationKey<?>, Object> am : m + .getSecondaryKeySet(prereqs)) + { + StringBuilder sb = new StringBuilder(); + sb.append(am.get(AssociationKey.SPELLBOOK)); + Formula times = AssociationKey.TIMES_PER_UNIT.cast(am + .get(AssociationKey.TIMES_PER_UNIT)); + if (!Formula.ONE.equals(times)) + { + sb.append(Constants.PIPE).append("TIMES=").append(times); + } + TimeUnit timeunit = AssociationKey.TIME_UNIT.cast(am + .get(AssociationKey.TIME_UNIT)); + if (timeunit != null) + { + sb.append(Constants.PIPE).append("TIMEUNIT=").append( + timeunit.getKeyName()); + } + String casterLvl = AssociationKey.CASTER_LEVEL.cast(am + .get(AssociationKey.CASTER_LEVEL)); + if (casterLvl != null) + { + sb.append(Constants.PIPE).append("CASTERLEVEL=").append( + casterLvl); + } + Set<String> spellSet = new TreeSet<String>(); + for (CDOMReference<Spell> spell : m.getTertiaryKeySet(prereqs, + am)) + { + String spellString = spell.getLSTformat(); + String dc = m.get(prereqs, am, spell); + if (dc != null) + { + spellString += Constants.COMMA + dc; + } + spellSet.add(spellString); + } + sb.append(Constants.PIPE); + sb.append(StringUtil.join(spellSet, Constants.PIPE)); + if (prereqs != null && !prereqs.isEmpty()) + { + sb.append(Constants.PIPE); + sb.append(getPrerequisiteString(context, prereqs)); + } + set.add(sb.toString()); + } + } + return set.toArray(new String[set.size()]); + } + + public Class<CDOMObject> getTokenClass() + { + return CDOMObject.class; + } } Modified: Trunk/pcgen/code/src/java/plugin/pretokens/test/PreSpellTester.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/pretokens/test/PreSpellTester.java 2008-10-07 23:29:02 UTC (rev 7991) +++ Trunk/pcgen/code/src/java/plugin/pretokens/test/PreSpellTester.java 2008-10-08 00:19:13 UTC (rev 7992) @@ -26,9 +26,12 @@ */ package plugin.pretokens.test; +import java.util.Collection; +import java.util.List; + +import pcgen.cdom.base.CDOMReference; import pcgen.core.CharacterDomain; import pcgen.core.Globals; -import pcgen.core.PCSpell; import pcgen.core.PlayerCharacter; import pcgen.core.prereq.AbstractPrerequisiteTest; import pcgen.core.prereq.Prerequisite; @@ -37,8 +40,6 @@ import pcgen.util.Logging; import pcgen.util.PropertyFactory; -import java.util.List; - /** * @author wardc * @@ -82,9 +83,11 @@ //Are there Innate Spell-like abilities? if (character.getAutoSpells()) { - for (PCSpell spell : character.getRace().getSpellList()) + Collection<CDOMReference<Spell>> mods = character.getRace() + .getListMods(Spell.SPELLS); + for (CDOMReference<Spell> ref : mods) { - aArrayList.add(Globals.getSpellKeyed(spell.toString())); + aArrayList.addAll(ref.getContainedObjects()); } } Modified: Trunk/pcgen/code/src/test/pcgen/core/PCClassTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/PCClassTest.java 2008-10-07 23:29:02 UTC (rev 7991) +++ Trunk/pcgen/code/src/test/pcgen/core/PCClassTest.java 2008-10-08 00:19:13 UTC (rev 7992) @@ -59,6 +59,7 @@ import pcgen.core.bonus.BonusObj; import pcgen.core.pclevelinfo.PCLevelInfo; import pcgen.core.prereq.Prerequisite; +import pcgen.core.spell.Spell; import pcgen.persistence.PersistenceLayerException; import pcgen.persistence.lst.CampaignSourceEntry; import pcgen.persistence.lst.FeatLoader; @@ -460,14 +461,11 @@ assertEquals( "Class abbrev was not restored after saving and reloading.", humanoidClass.getAbbrev(), reconstClass.getAbbrev()); - final List<PCSpell> startSpells = - humanoidClass.getSpellSupport().getSpellList(-1); - final List<PCSpell> reconstSpells = - reconstClass.getSpellSupport().getSpellList(-1); + Collection<CDOMReference<Spell>> startSpells = humanoidClass.getClassLevel(1).getListMods(Spell.SPELLS); + Collection<CDOMReference<Spell>> reconstSpells = reconstClass.getClassLevel(1).getListMods(Spell.SPELLS); assertEquals("All spell should have been reconstituted.", startSpells .size(), reconstSpells.size()); - assertEquals("Spell names should been preserved.", startSpells.get(0) - .getKeyName(), reconstSpells.get(0).getKeyName()); + assertEquals("Spell names should been preserved.", startSpells, reconstSpells); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-10-08 21:27:53
|
Revision: 7996 http://pcgen.svn.sourceforge.net/pcgen/?rev=7996&view=rev Author: thpr Date: 2008-10-08 21:27:27 +0000 (Wed, 08 Oct 2008) Log Message: ----------- remove dead code Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/chooser/ChooserUtilities.java Trunk/pcgen/code/src/test/pcgen/core/AllJUnitTests.java Removed Paths: ------------- Trunk/pcgen/code/src/java/pcgen/core/chooser/SkillListCrossClassChoiceManager.java Trunk/pcgen/code/src/test/pcgen/core/chooser/SkillListCrossClassChoiceManagerTest.java Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/ChooserUtilities.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/ChooserUtilities.java 2008-10-08 21:16:18 UTC (rev 7995) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/ChooserUtilities.java 2008-10-08 21:27:27 UTC (rev 7996) @@ -399,8 +399,6 @@ // // -- Zaister, 2007/02/23 // - classLookup.put("SKILLIST", SkillListChoiceManager.class.getName()); - classLookup.put("CCSKILLIST", SkillListCrossClassChoiceManager.class.getName()); classLookup.put("NONCLASSSKILLLIST", SkillListNonClassChoiceManager.class.getName()); mapconstructed = true; Deleted: Trunk/pcgen/code/src/java/pcgen/core/chooser/SkillListCrossClassChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/SkillListCrossClassChoiceManager.java 2008-10-08 21:16:18 UTC (rev 7995) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/SkillListCrossClassChoiceManager.java 2008-10-08 21:27:27 UTC (rev 7996) @@ -1,55 +0,0 @@ -/** - * SkillListCrossClassChoiceManager.java - * - * 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 - * - * Current Version: $Revision: 285 $ - * Last Editor: $Author: nuance $ - * Last Edited: $Date: 2006-03-17 15:19:49 +0000 (Fri, 17 Mar 2006) $ - * - * Copyright 2006 Andrew Wilson <nu...@so...> - */ -package pcgen.core.chooser; - -import pcgen.core.Ability; -import pcgen.core.PObject; -import pcgen.core.PlayerCharacter; - -/** - * This is one of the choosers that deals with choosing a skill. - */ -public class SkillListCrossClassChoiceManager extends SkillListChoiceManager { - - /** - * Make a new Skill List chooser. - * - * @param aPObject - * @param choiceString - * @param aPC - */ - public SkillListCrossClassChoiceManager( - PObject aPObject, - String choiceString, - PlayerCharacter aPC) - { - super(aPObject, choiceString, aPC); - } - - @Override - protected void addSkillToAbility( final Ability anAbility, final String aSkillKey ) - { - anAbility.addCcSkill( aSkillKey ); - } -} Modified: Trunk/pcgen/code/src/test/pcgen/core/AllJUnitTests.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/AllJUnitTests.java 2008-10-08 21:16:18 UTC (rev 7995) +++ Trunk/pcgen/code/src/test/pcgen/core/AllJUnitTests.java 2008-10-08 21:27:27 UTC (rev 7996) @@ -111,8 +111,6 @@ suite.addTest(new TestSuite( pcgen.core.chooser.SkillListChoiceManagerTest.class)); suite.addTest(new TestSuite( - pcgen.core.chooser.SkillListCrossClassChoiceManagerTest.class)); - suite.addTest(new TestSuite( pcgen.core.chooser.SkillListNonClassChoiceManagerTest.class)); suite.addTest(new TestSuite( pcgen.core.chooser.SkillsChoiceManagerTest.class)); Deleted: Trunk/pcgen/code/src/test/pcgen/core/chooser/SkillListCrossClassChoiceManagerTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/chooser/SkillListCrossClassChoiceManagerTest.java 2008-10-08 21:16:18 UTC (rev 7995) +++ Trunk/pcgen/code/src/test/pcgen/core/chooser/SkillListCrossClassChoiceManagerTest.java 2008-10-08 21:27:27 UTC (rev 7996) @@ -1,92 +0,0 @@ -/* - * SkillListCrossClassChoiceManagerTest.java - * Copyright 2005 (C) Andrew Wilson <nu...@so...> - * - * 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 Oct 7, 2005 - * - * $Author: nuance $ - * $Date: 2006-03-26 08:00:03 +0100 (Sun, 26 Mar 2006) $ - * $Revision: 471 $ - * - */ -package pcgen.core.chooser; - -import java.lang.reflect.Field; -import java.util.List; - -import pcgen.AbstractCharacterTestCase; -import pcgen.core.PObject; -import pcgen.core.PlayerCharacter; -import pcgen.util.TestHelper; - -/** - * {@code SkillListCrossClassChoiceManagerTest} test that the SkillListCrossClassChoiceManager class is functioning correctly. - * - * @author Andrew Wilson <nu...@so...> - */ - -public class SkillListCrossClassChoiceManagerTest extends - AbstractCharacterTestCase -{ - - /** - * Constructs a new {@code SkillListCrossClassChoiceManagerTest}. - */ - public SkillListCrossClassChoiceManagerTest() - { - // Do Nothing - } - - /** - * Test the constructor - */ - public void test001() - { - PObject pObj = new PObject(); - pObj.setName("My PObject"); - pObj.setChoiceString("NUMCHOICES=3|CCSKILLIST|Foo,Bar,Baz,Qux"); - is(pObj.getChoiceString(), - strEq("NUMCHOICES=3|CCSKILLIST|Foo,Bar,Baz,Qux")); - - PlayerCharacter aPC = getCharacter(); - - ChoiceManagerList choiceManager = - ChooserUtilities.getChoiceManager(pObj, null, aPC); - is(choiceManager, not(eq(null)), "Found the chooser"); - - is(choiceManager.typeHandled(), strEq("CCSKILLIST"), - "got expected chooser"); - - try - { - Class cMClass = choiceManager.getClass(); - - Field aField = - (Field) TestHelper.findField(cMClass, "numberOfChoices"); - is(aField.get(choiceManager), eq(3)); - - aField = (Field) TestHelper.findField(cMClass, "choices"); - List choices = (List) aField.get(choiceManager); - is(choices.size(), eq(1)); - is(choices.get(0), strEq("Foo,Bar,Baz,Qux")); - } - catch (IllegalAccessException e) - { - System.out.println(e); - } - } -} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <nu...@us...> - 2008-10-09 11:22:06
|
Revision: 8000 http://pcgen.svn.sourceforge.net/pcgen/?rev=8000&view=rev Author: nuance Date: 2008-10-09 09:19:45 +0000 (Thu, 09 Oct 2008) Log Message: ----------- Fix TermEvaluator related test failures. Add a 3 parameter string evaluate to the TermEvaluator interface. Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/term/BasePCTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/core/term/EQACCheckTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/core/term/EQBaseCostTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/core/term/EQCritMultTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/core/term/EQDamageDiceTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/core/term/EQDamageDieTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/core/term/EQEquipSizeTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/core/term/EQHandsTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/core/term/EQRaceReachTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/core/term/EQRangeTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/core/term/EQReachMultTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/core/term/EQReachTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/core/term/EQSizeTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/core/term/EQSpellFailureTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/core/term/EQWeightTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/core/term/EvaluatorFactory.java Trunk/pcgen/code/src/java/pcgen/core/term/PCCasterLevelClassTermEvaluator.java Trunk/pcgen/code/src/java/pcgen/core/term/TermEvaluator.java Trunk/pcgen/code/src/java/pcgen/core/term/TermEvaluatorBuilderPCVar.java Trunk/pcgen/code/src/java/pcgen/util/TermUtilities.java Trunk/pcgen/code/src/test/pcgen/core/term/EvaluatorFactoryTest.java Trunk/pcgen/code/src/test/pcgen/util/TermUtilitiesTest.java Modified: Trunk/pcgen/code/src/java/pcgen/core/term/BasePCTermEvaluator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/term/BasePCTermEvaluator.java 2008-10-09 04:41:59 UTC (rev 7999) +++ Trunk/pcgen/code/src/java/pcgen/core/term/BasePCTermEvaluator.java 2008-10-09 09:19:45 UTC (rev 8000) @@ -42,6 +42,13 @@ return Integer.toString(resolve(pc, aSpell).intValue()); } + public String evaluate( + Equipment equipment, + boolean primary, + PlayerCharacter pc) { + return evaluate(pc); + } + public abstract Float resolve(PlayerCharacter pc); public Float resolve(PlayerCharacter pc, final Spell aSpell) { Modified: Trunk/pcgen/code/src/java/pcgen/core/term/EQACCheckTermEvaluator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/term/EQACCheckTermEvaluator.java 2008-10-09 04:41:59 UTC (rev 7999) +++ Trunk/pcgen/code/src/java/pcgen/core/term/EQACCheckTermEvaluator.java 2008-10-09 09:19:45 UTC (rev 8000) @@ -42,9 +42,16 @@ boolean primary, PlayerCharacter pc) { - return (float) eq.getSafe(IntegerKey.AC_CHECK); + return Float.valueOf(evaluate(eq, primary, pc)); } + public String evaluate( + Equipment equipment, + boolean primary, + PlayerCharacter pc) { + return Integer.toString(equipment.getSafe(IntegerKey.AC_CHECK)); + } + public boolean isSourceDependant() { return false; Modified: Trunk/pcgen/code/src/java/pcgen/core/term/EQBaseCostTermEvaluator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/term/EQBaseCostTermEvaluator.java 2008-10-09 04:41:59 UTC (rev 7999) +++ Trunk/pcgen/code/src/java/pcgen/core/term/EQBaseCostTermEvaluator.java 2008-10-09 09:19:45 UTC (rev 8000) @@ -27,6 +27,7 @@ package pcgen.core.term; import pcgen.cdom.enumeration.ObjectKey; +import pcgen.cdom.enumeration.IntegerKey; import pcgen.core.Equipment; import pcgen.core.PlayerCharacter; @@ -43,9 +44,16 @@ boolean primary, PlayerCharacter pc) { - return eq.getSafe(ObjectKey.COST).floatValue(); + return Float.valueOf(evaluate(eq, primary, pc)); } + public String evaluate( + Equipment equipment, + boolean primary, + PlayerCharacter pc) { + return Float.toString(equipment.getSafe(ObjectKey.COST).floatValue()); + } + public boolean isSourceDependant() { return false; Modified: Trunk/pcgen/code/src/java/pcgen/core/term/EQCritMultTermEvaluator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/term/EQCritMultTermEvaluator.java 2008-10-09 04:41:59 UTC (rev 7999) +++ Trunk/pcgen/code/src/java/pcgen/core/term/EQCritMultTermEvaluator.java 2008-10-09 09:19:45 UTC (rev 8000) @@ -41,14 +41,21 @@ boolean primary, PlayerCharacter pc) { + return Float.valueOf(evaluate(eq, primary, pc)); + } + + public String evaluate( + Equipment equipment, + boolean primary, + PlayerCharacter pc) { if (primary) { - return (float) eq.getCritMultiplier(); + return Float.toString(equipment.getCritMultiplier()); } - return (float) eq.getAltCritMultiplier(); + return Float.toString(equipment.getAltCritMultiplier()); } - + public boolean isSourceDependant() { return false; Modified: Trunk/pcgen/code/src/java/pcgen/core/term/EQDamageDiceTermEvaluator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/term/EQDamageDiceTermEvaluator.java 2008-10-09 04:41:59 UTC (rev 7999) +++ Trunk/pcgen/code/src/java/pcgen/core/term/EQDamageDiceTermEvaluator.java 2008-10-09 09:19:45 UTC (rev 8000) @@ -42,9 +42,16 @@ boolean primary, PlayerCharacter pc) { - return (float) new RollInfo(eq.getDamage(pc)).getTimes(); + return Float.valueOf(evaluate(eq, primary, pc)); } + public String evaluate( + Equipment equipment, + boolean primary, + PlayerCharacter pc) { + return Float.toString(new RollInfo(equipment.getDamage(pc)).getTimes()); + } + public boolean isSourceDependant() { return false; Modified: Trunk/pcgen/code/src/java/pcgen/core/term/EQDamageDieTermEvaluator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/term/EQDamageDieTermEvaluator.java 2008-10-09 04:41:59 UTC (rev 7999) +++ Trunk/pcgen/code/src/java/pcgen/core/term/EQDamageDieTermEvaluator.java 2008-10-09 09:19:45 UTC (rev 8000) @@ -42,9 +42,16 @@ boolean primary, PlayerCharacter pc) { - return (float) new RollInfo(eq.getDamage(pc)).getSides(); + return Float.valueOf(evaluate(eq, primary, pc)); } + public String evaluate( + Equipment equipment, + boolean primary, + PlayerCharacter pc) { + return Float.toString(new RollInfo(equipment.getDamage(pc)).getSides()); + } + public boolean isSourceDependant() { return false; Modified: Trunk/pcgen/code/src/java/pcgen/core/term/EQEquipSizeTermEvaluator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/term/EQEquipSizeTermEvaluator.java 2008-10-09 04:41:59 UTC (rev 7999) +++ Trunk/pcgen/code/src/java/pcgen/core/term/EQEquipSizeTermEvaluator.java 2008-10-09 09:19:45 UTC (rev 8000) @@ -41,9 +41,16 @@ boolean primary, PlayerCharacter pc) { - return Float.valueOf(eq.getSize()); + return Float.valueOf(evaluate(eq, primary, pc)); } + public String evaluate( + Equipment equipment, + boolean primary, + PlayerCharacter pc) { + return equipment.getSize(); + } + public boolean isSourceDependant() { return false; Modified: Trunk/pcgen/code/src/java/pcgen/core/term/EQHandsTermEvaluator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/term/EQHandsTermEvaluator.java 2008-10-09 04:41:59 UTC (rev 7999) +++ Trunk/pcgen/code/src/java/pcgen/core/term/EQHandsTermEvaluator.java 2008-10-09 09:19:45 UTC (rev 8000) @@ -42,9 +42,16 @@ boolean primary, PlayerCharacter pc) { - return (float) eq.getSafe(IntegerKey.SLOTS); + return Float.valueOf(evaluate(eq, primary, pc)); } + public String evaluate( + Equipment equipment, + boolean primary, + PlayerCharacter pc) { + return Integer.toString(equipment.getSafe(IntegerKey.SLOTS)); + } + public boolean isSourceDependant() { return false; Modified: Trunk/pcgen/code/src/java/pcgen/core/term/EQRaceReachTermEvaluator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/term/EQRaceReachTermEvaluator.java 2008-10-09 04:41:59 UTC (rev 7999) +++ Trunk/pcgen/code/src/java/pcgen/core/term/EQRaceReachTermEvaluator.java 2008-10-09 09:19:45 UTC (rev 8000) @@ -44,9 +44,16 @@ boolean primary, PlayerCharacter pc) { - return pc.getVariableValue("REACH.VAL", source); + return Float.valueOf(evaluate(eq, primary, pc)); } + public String evaluate( + Equipment equipment, + boolean primary, + PlayerCharacter pc) { + return String.valueOf(pc.getVariableValue("REACH.VAL", source)); + } + public boolean isSourceDependant() { return true; Modified: Trunk/pcgen/code/src/java/pcgen/core/term/EQRangeTermEvaluator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/term/EQRangeTermEvaluator.java 2008-10-09 04:41:59 UTC (rev 7999) +++ Trunk/pcgen/code/src/java/pcgen/core/term/EQRangeTermEvaluator.java 2008-10-09 09:19:45 UTC (rev 8000) @@ -42,9 +42,16 @@ boolean primary, PlayerCharacter pc) { - return (float) eq.getSafe(IntegerKey.RANGE); + return Float.valueOf(evaluate(eq, primary, pc)); } + public String evaluate( + Equipment equipment, + boolean primary, + PlayerCharacter pc) { + return String.valueOf(equipment.getSafe(IntegerKey.RANGE)); + } + public boolean isSourceDependant() { return true; Modified: Trunk/pcgen/code/src/java/pcgen/core/term/EQReachMultTermEvaluator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/term/EQReachMultTermEvaluator.java 2008-10-09 04:41:59 UTC (rev 7999) +++ Trunk/pcgen/code/src/java/pcgen/core/term/EQReachMultTermEvaluator.java 2008-10-09 09:19:45 UTC (rev 8000) @@ -36,15 +36,22 @@ { this.originalText = expressionString; } - + public Float resolve( Equipment eq, boolean primary, PlayerCharacter pc) { - return (float) eq.getSafe(IntegerKey.REACH_MULT); + return Float.valueOf(evaluate(eq, primary, pc)); } + public String evaluate( + Equipment equipment, + boolean primary, + PlayerCharacter pc) { + return String.valueOf(equipment.getSafe(IntegerKey.REACH_MULT)); + } + public boolean isSourceDependant() { return true; Modified: Trunk/pcgen/code/src/java/pcgen/core/term/EQReachTermEvaluator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/term/EQReachTermEvaluator.java 2008-10-09 04:41:59 UTC (rev 7999) +++ Trunk/pcgen/code/src/java/pcgen/core/term/EQReachTermEvaluator.java 2008-10-09 09:19:45 UTC (rev 8000) @@ -36,14 +36,22 @@ { this.originalText = expressionString; } + public Float resolve( Equipment eq, boolean primary, PlayerCharacter pc) { - return (float) eq.getSafe(IntegerKey.REACH); + return Float.valueOf(evaluate(eq, primary, pc)); } + public String evaluate( + Equipment equipment, + boolean primary, + PlayerCharacter pc) { + return String.valueOf(equipment.getSafe(IntegerKey.REACH)); + } + public boolean isSourceDependant() { return true; Modified: Trunk/pcgen/code/src/java/pcgen/core/term/EQSizeTermEvaluator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/term/EQSizeTermEvaluator.java 2008-10-09 04:41:59 UTC (rev 7999) +++ Trunk/pcgen/code/src/java/pcgen/core/term/EQSizeTermEvaluator.java 2008-10-09 09:19:45 UTC (rev 8000) @@ -28,6 +28,7 @@ import pcgen.core.Equipment; import pcgen.core.PlayerCharacter; +import pcgen.core.spell.Spell; import pcgen.cdom.enumeration.IntegerKey; public class EQSizeTermEvaluator extends BaseEQTermEvaluator implements TermEvaluator @@ -42,9 +43,23 @@ boolean primary, PlayerCharacter pc) { - return (float) eq.sizeInt(); + return Float.valueOf(evaluate(eq, primary, pc)); } + public String evaluate(PlayerCharacter pc) { + return String.valueOf("0"); + } + + public String evaluate(PlayerCharacter pc, final Spell aSpell) { + return String.valueOf("0"); + } + + public String evaluate( + Equipment equipment, boolean primary, PlayerCharacter pc) + { + return String.valueOf(equipment.sizeInt()); + } + public boolean isSourceDependant() { return true; Modified: Trunk/pcgen/code/src/java/pcgen/core/term/EQSpellFailureTermEvaluator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/term/EQSpellFailureTermEvaluator.java 2008-10-09 04:41:59 UTC (rev 7999) +++ Trunk/pcgen/code/src/java/pcgen/core/term/EQSpellFailureTermEvaluator.java 2008-10-09 09:19:45 UTC (rev 8000) @@ -42,9 +42,16 @@ boolean primary, PlayerCharacter pc) { - return (float) eq.getSafe(IntegerKey.SPELL_FAILURE); + return Float.valueOf(evaluate(eq, primary, pc)); } + public String evaluate( + Equipment equipment, + boolean primary, + PlayerCharacter pc) { + return String.valueOf(equipment.getSafe(IntegerKey.SPELL_FAILURE)); + } + public boolean isSourceDependant() { return false; Modified: Trunk/pcgen/code/src/java/pcgen/core/term/EQWeightTermEvaluator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/term/EQWeightTermEvaluator.java 2008-10-09 04:41:59 UTC (rev 7999) +++ Trunk/pcgen/code/src/java/pcgen/core/term/EQWeightTermEvaluator.java 2008-10-09 09:19:45 UTC (rev 8000) @@ -44,23 +44,31 @@ boolean primary, PlayerCharacter pc) { - if (eq.isCalculatingCost() && eq.isWeightAlreadyUsed()) + return Float.valueOf(evaluate(eq, primary, pc)); + } + + public String evaluate( + Equipment equipment, + boolean primary, + PlayerCharacter pc) { + + if (equipment.isCalculatingCost() && equipment.isWeightAlreadyUsed()) { - return 0f; + return "0"; } - BigDecimal weightInPounds = eq.getWeightInPounds(); + BigDecimal weightInPounds = equipment.getWeightInPounds(); - if (eq.isCalculatingCost() && eq.isAmmunition()) + if (equipment.isCalculatingCost() && equipment.isAmmunition()) { Float unitWeight = weightInPounds.floatValue(); - unitWeight /= eq.getSafe(IntegerKey.BASE_QUANTITY); - eq.setWeightAlreadyUsed(true); - return unitWeight; + unitWeight /= equipment.getSafe(IntegerKey.BASE_QUANTITY); + equipment.setWeightAlreadyUsed(true); + return String.valueOf(unitWeight); } - eq.setWeightAlreadyUsed(true); - return weightInPounds.floatValue(); + equipment.setWeightAlreadyUsed(true); + return String.valueOf(weightInPounds); } public boolean isSourceDependant() Modified: Trunk/pcgen/code/src/java/pcgen/core/term/EvaluatorFactory.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/term/EvaluatorFactory.java 2008-10-09 04:41:59 UTC (rev 7999) +++ Trunk/pcgen/code/src/java/pcgen/core/term/EvaluatorFactory.java 2008-10-09 09:19:45 UTC (rev 8000) @@ -34,6 +34,7 @@ import pcgen.core.GameMode; import pcgen.core.SettingsHandler; +import pcgen.util.Logging; public class EvaluatorFactory { @@ -146,7 +147,7 @@ } catch (TermEvaulatorException e) { - e.printStackTrace(); + Logging.log(Logging.ERROR, e.toString()); } } Modified: Trunk/pcgen/code/src/java/pcgen/core/term/PCCasterLevelClassTermEvaluator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/term/PCCasterLevelClassTermEvaluator.java 2008-10-09 04:41:59 UTC (rev 7999) +++ Trunk/pcgen/code/src/java/pcgen/core/term/PCCasterLevelClassTermEvaluator.java 2008-10-09 09:19:45 UTC (rev 8000) @@ -68,14 +68,17 @@ spellType = spClass.getSpellType(); } - final int pcBonus = (int) pc.getTotalBonusTo("PCLEVEL", varSource); + final Double d1 = pc.getTotalBonusTo("PCLEVEL", varSource); + final int pcBonus = (d1 == null) ? 0 : d1.intValue(); // does the class have a Casterlevel? - final int castBonus = (int) pc.getTotalBonusTo("CASTERLEVEL", varSource); + final Double d2 = pc.getTotalBonusTo("CASTERLEVEL", varSource); + final int castBonus = (d2 == null) ? 0 : d2.intValue(); // If no CASTERLEVEL has been defined for this class then // use total class level instead - final int iClass = (castBonus == 0) ? spClass.getLevel() : 0; + final int iClass = + (spClass != null && castBonus == 0) ? spClass.getLevel() : 0; return (float) pc.getTotalCasterLevelWithSpellBonus( aSpell, spellType, varSource, iClass + pcBonus); Modified: Trunk/pcgen/code/src/java/pcgen/core/term/TermEvaluator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/term/TermEvaluator.java 2008-10-09 04:41:59 UTC (rev 7999) +++ Trunk/pcgen/code/src/java/pcgen/core/term/TermEvaluator.java 2008-10-09 09:19:45 UTC (rev 8000) @@ -32,6 +32,8 @@ String evaluate(PlayerCharacter pc, final Spell aSpell); + String evaluate(Equipment equipment, boolean primary, PlayerCharacter pc); + Number resolve(PlayerCharacter pc); Number resolve(PlayerCharacter pc, final Spell aSpell); Modified: Trunk/pcgen/code/src/java/pcgen/core/term/TermEvaluatorBuilderPCVar.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/term/TermEvaluatorBuilderPCVar.java 2008-10-09 04:41:59 UTC (rev 7999) +++ Trunk/pcgen/code/src/java/pcgen/core/term/TermEvaluatorBuilderPCVar.java 2008-10-09 09:19:45 UTC (rev 8000) @@ -978,7 +978,7 @@ String[] types; if (fullTypes.length > first) { - TermUtilities.checkEqtypesTypesArray( + TermUtilities.checkEqTypeTypesArray( expressionString, fullTypes, first); Modified: Trunk/pcgen/code/src/java/pcgen/util/TermUtilities.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/util/TermUtilities.java 2008-10-09 04:41:59 UTC (rev 7999) +++ Trunk/pcgen/code/src/java/pcgen/util/TermUtilities.java 2008-10-09 09:19:45 UTC (rev 8000) @@ -36,22 +36,14 @@ public static Pattern dPat = Pattern.compile(dString); public static String sString = "(?:EQUIPPED|NOTEQUIPPED)"; public static Pattern sPat = Pattern.compile(sString); - public static String resString = "(?:CONTAINER|WEAPON|ACITEM)"; - public static Pattern restrictEquipmentPat = Pattern.compile(resString); - public static void checkEqtypesTypesArray( + public static void checkEqTypeTypesArray( String originalText, String[] types, int first) throws TermEvaulatorException { - int cur = first; + int cur = first + 1; - // "(?:CONTAINER|WEAPON|ACITEM)" - if (restrictEquipmentPat.matcher(types[cur]).matches()) - { - cur++; - } - while (cur < types.length) { // "(?:NOT|ADD|IS)" @@ -91,26 +83,8 @@ String[] types, int first) throws TermEvaulatorException { - int cur = first; + int cur = first + 1; - // "(?:CONTAINER|WEAPON|ACITEM)" - - // Count[EQUIPTYPE takes these but COUNT[EQUIPMENT doesn't for - // some reason better known to the original writer of the - // VariableProcessorPC class that this code is based on - Matcher rMat = restrictEquipmentPat.matcher(types[first]); - if (rMat.matches()) - { - StringBuilder sB = new StringBuilder(); - sB.append("Found \""); - sB.append(rMat.group()); - sB.append("\" in formula "); - sB.append(originalText); - sB.append("\nShould be COUNT[EQTYPE, not COUNT[EQUIPMENT"); - - throw new TermEvaulatorException(sB.toString()); - } - while (cur < types.length) { // "(?:NOT|ADD|IS)" Modified: Trunk/pcgen/code/src/test/pcgen/core/term/EvaluatorFactoryTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/term/EvaluatorFactoryTest.java 2008-10-09 04:41:59 UTC (rev 7999) +++ Trunk/pcgen/code/src/test/pcgen/core/term/EvaluatorFactoryTest.java 2008-10-09 09:19:45 UTC (rev 8000) @@ -4132,14 +4132,14 @@ Class<?> uClass = PCACcheckTermEvaluator.class; - Field pF = (Field) TestHelper.findField(uClass, "originalText"); + Field pF0 = (Field) TestHelper.findField(uClass, "originalText"); - String storedT = ""; + String field0 = ""; boolean ok; try { ok = true; - storedT = (String) pF.get(t); + field0 = (String) pF0.get(t); } catch (ClassCastException e) { @@ -4152,7 +4152,7 @@ is(ok, eq(true), "No illegal access in getTermEvaluator001"); - is(storedT, strEq(term), "GetTermEvaluator001 sored term correct " + term); + is(field0, strEq(term), "GetTermEvaluator001 stored term is correct " + term); } @@ -7485,7 +7485,7 @@ is(ok, eq(true), "No illegal access in getTermEvaluator082"); is(field0, strEq(term), "GetTermEvaluator082 stored term is correct " + term); - is(field1, strEq("Bard (Bardiliscious)"), "GetTermEvaluator082 field aClass is correct "); + is(field1, strEq("Bard (Bardiliscious)"), "GetTermEvaluator082 field classKey is correct "); } @@ -7528,7 +7528,7 @@ is(ok, eq(true), "No illegal access in getTermEvaluator083"); is(field0, strEq(term), "GetTermEvaluator083 stored term is correct " + term); - is(field1, strEq("Rogue (Sneaky)"), "GetTermEvaluator083 field aClass is correct "); + is(field1, strEq("Rogue (Sneaky)"), "GetTermEvaluator083 field classKey is correct "); } @@ -7657,7 +7657,7 @@ is(ok, eq(true), "No illegal access in getTermEvaluator086"); is(field0, strEq(term), "GetTermEvaluator086 stored term is correct " + term); - is(field1, strEq("Ranger"), "GetTermEvaluator086 field aClass is correct "); + is(field1, strEq("Ranger"), "GetTermEvaluator086 field classKey is correct "); } @@ -7714,7 +7714,7 @@ is(ok, eq(true), "No illegal access in getTermEvaluator088"); is(field0, strEq(term), "GetTermEvaluator088 stored term is correct " + term); - is(field1, strEq("Bard"), "GetTermEvaluator088 field aClass is correct "); + is(field1, strEq("Bard"), "GetTermEvaluator088 field classKey is correct "); } @@ -7757,7 +7757,7 @@ is(ok, eq(true), "No illegal access in getTermEvaluator089"); is(field0, strEq(term), "GetTermEvaluator089 stored term is correct " + term); - is(field1, strEq("Rogue"), "GetTermEvaluator089 field aClass is correct "); + is(field1, strEq("Rogue"), "GetTermEvaluator089 field classKey is correct "); } @@ -8143,7 +8143,7 @@ public void testGetTermEvaluator098() { TestHelper.loadAll(); - String term = "COUNT[EQTYPE.MERGENONE.IS.FOO]"; + String term = "COUNT[EQTYPE.MERGENONE.ARMOR.IS.FOO]"; TermEvaluator t = EvaluatorFactory.PC.getTermEvaluator(term, ""); @@ -8179,8 +8179,9 @@ is(ok, eq(true), "No illegal access in getTermEvaluator098"); is(field0, strEq(term), "GetTermEvaluator098 stored term is correct " + term); - is(field1[0], strEq("IS"), "GetTermEvaluator098 field types[0] is correct "); - is(field1[1], strEq("FOO"), "GetTermEvaluator098 field types[1] is correct "); + is(field1[0], strEq("ARMOR"), "GetTermEvaluator098 field types[0] is correct "); + is(field1[1], strEq("IS"), "GetTermEvaluator098 field types[1] is correct "); + is(field1[2], strEq("FOO"), "GetTermEvaluator098 field types[2] is correct "); is(field2, eq(Constants.MERGE_NONE), "GetTermEvaluator098 field merge is correct "); } @@ -8191,7 +8192,7 @@ public void testGetTermEvaluator099() { TestHelper.loadAll(); - String term = "COUNT[EQTYPE.MERGELOC.NOT.BAR]"; + String term = "COUNT[EQTYPE.MERGELOC.QUX.NOT.BAR]"; TermEvaluator t = EvaluatorFactory.PC.getTermEvaluator(term, ""); @@ -8227,8 +8228,9 @@ is(ok, eq(true), "No illegal access in getTermEvaluator099"); is(field0, strEq(term), "GetTermEvaluator099 stored term is correct " + term); - is(field1[0], strEq("NOT"), "GetTermEvaluator099 field types[0] is correct "); - is(field1[1], strEq("BAR"), "GetTermEvaluator099 field types[1] is correct "); + is(field1[0], strEq("QUX"), "GetTermEvaluator099 field types[0] is correct "); + is(field1[1], strEq("NOT"), "GetTermEvaluator099 field types[1] is correct "); + is(field1[2], strEq("BAR"), "GetTermEvaluator099 field types[2] is correct "); is(field2, eq(Constants.MERGE_LOCATION), "GetTermEvaluator099 field merge is correct "); } @@ -8239,7 +8241,7 @@ public void testGetTermEvaluator100() { TestHelper.loadAll(); - String term = "COUNT[EQTYPE.ADD.BAZ]"; + String term = "COUNT[EQTYPE.QUUX.ADD.BAZ]"; TermEvaluator t = EvaluatorFactory.PC.getTermEvaluator(term, ""); @@ -8275,8 +8277,9 @@ is(ok, eq(true), "No illegal access in getTermEvaluator100"); is(field0, strEq(term), "GetTermEvaluator100 stored term is correct " + term); - is(field1[0], strEq("ADD"), "GetTermEvaluator100 field types[0] is correct "); - is(field1[1], strEq("BAZ"), "GetTermEvaluator100 field types[1] is correct "); + is(field1[0], strEq("QUUX"), "GetTermEvaluator100 field types[0] is correct "); + is(field1[1], strEq("ADD"), "GetTermEvaluator100 field types[1] is correct "); + is(field1[2], strEq("BAZ"), "GetTermEvaluator100 field types[2] is correct "); is(field2, eq(Constants.MERGE_ALL), "GetTermEvaluator100 field merge is correct "); } @@ -8392,7 +8395,40 @@ TermEvaluator t = EvaluatorFactory.PC.getTermEvaluator(term, ""); - is(t, eqnull(), "GetTermEvaluator103 evaluator is null"); + is(t instanceof PCCountEqTypeTermEvaluator, eq(true), + "GetTermEvaluator103 evaluator correct for " + term); + + Class<?> uClass = PCCountEqTypeTermEvaluator.class; + + Field pF0 = (Field) TestHelper.findField(uClass, "originalText"); + Field pF1 = (Field) TestHelper.findField(uClass, "types"); + Field pF2 = (Field) TestHelper.findField(uClass, "merge"); + + String field0 = ""; + String[] field1 = new String[] {}; + Integer field2 = 0; + boolean ok; + try + { + ok = true; + field0 = (String) pF0.get(t); + field1 = (String[]) pF1.get(t); + field2 = (Integer) pF2.get(t); + } + catch (ClassCastException e) + { + ok = false; + } + catch (IllegalAccessException e) + { + ok = false; + } + + is(ok, eq(true), "No illegal access in getTermEvaluator103"); + + is(field0, strEq(term), "GetTermEvaluator103 stored term is correct " + term); + is(field1[0], strEq("FOO"), "GetTermEvaluator103 field types[0] is correct "); + is(field2, eq(Constants.MERGE_ALL), "GetTermEvaluator103 field merge is correct "); } @@ -8589,7 +8625,40 @@ TermEvaluator t = EvaluatorFactory.PC.getTermEvaluator(term, ""); - is(t, eqnull(), "GetTermEvaluator110 evaluator is null"); + is(t instanceof PCCountEquipmentTermEvaluator, eq(true), + "GetTermEvaluator110 evaluator correct for " + term); + + Class<?> uClass = PCCountEquipmentTermEvaluator.class; + + Field pF0 = (Field) TestHelper.findField(uClass, "originalText"); + Field pF1 = (Field) TestHelper.findField(uClass, "types"); + Field pF2 = (Field) TestHelper.findField(uClass, "merge"); + + String field0 = ""; + String[] field1 = new String[] {}; + Integer field2 = 0; + boolean ok; + try + { + ok = true; + field0 = (String) pF0.get(t); + field1 = (String[]) pF1.get(t); + field2 = (Integer) pF2.get(t); + } + catch (ClassCastException e) + { + ok = false; + } + catch (IllegalAccessException e) + { + ok = false; + } + + is(ok, eq(true), "No illegal access in getTermEvaluator110"); + + is(field0, strEq(term), "GetTermEvaluator110 stored term is correct " + term); + is(field1[0], strEq("EQUIPPED"), "GetTermEvaluator110 field types[0] is correct "); + is(field2, eq(Constants.MERGE_ALL), "GetTermEvaluator110 field merge is correct "); } @@ -8603,7 +8672,40 @@ TermEvaluator t = EvaluatorFactory.PC.getTermEvaluator(term, ""); - is(t, eqnull(), "GetTermEvaluator111 evaluator is null"); + is(t instanceof PCCountEquipmentTermEvaluator, eq(true), + "GetTermEvaluator111 evaluator correct for " + term); + + Class<?> uClass = PCCountEquipmentTermEvaluator.class; + + Field pF0 = (Field) TestHelper.findField(uClass, "originalText"); + Field pF1 = (Field) TestHelper.findField(uClass, "types"); + Field pF2 = (Field) TestHelper.findField(uClass, "merge"); + + String field0 = ""; + String[] field1 = new String[] {}; + Integer field2 = 0; + boolean ok; + try + { + ok = true; + field0 = (String) pF0.get(t); + field1 = (String[]) pF1.get(t); + field2 = (Integer) pF2.get(t); + } + catch (ClassCastException e) + { + ok = false; + } + catch (IllegalAccessException e) + { + ok = false; + } + + is(ok, eq(true), "No illegal access in getTermEvaluator111"); + + is(field0, strEq(term), "GetTermEvaluator111 stored term is correct " + term); + is(field1[0], strEq("NOTEQUIPPED"), "GetTermEvaluator111 field types[0] is correct "); + is(field2, eq(Constants.MERGE_ALL), "GetTermEvaluator111 field merge is correct "); } @@ -8617,7 +8719,40 @@ TermEvaluator t = EvaluatorFactory.PC.getTermEvaluator(term, ""); - is(t, eqnull(), "GetTermEvaluator112 evaluator is null"); + is(t instanceof PCCountEquipmentTermEvaluator, eq(true), + "GetTermEvaluator112 evaluator correct for " + term); + + Class<?> uClass = PCCountEquipmentTermEvaluator.class; + + Field pF0 = (Field) TestHelper.findField(uClass, "originalText"); + Field pF1 = (Field) TestHelper.findField(uClass, "types"); + Field pF2 = (Field) TestHelper.findField(uClass, "merge"); + + String field0 = ""; + String[] field1 = new String[] {}; + Integer field2 = 0; + boolean ok; + try + { + ok = true; + field0 = (String) pF0.get(t); + field1 = (String[]) pF1.get(t); + field2 = (Integer) pF2.get(t); + } + catch (ClassCastException e) + { + ok = false; + } + catch (IllegalAccessException e) + { + ok = false; + } + + is(ok, eq(true), "No illegal access in getTermEvaluator112"); + + is(field0, strEq(term), "GetTermEvaluator112 stored term is correct " + term); + is(field1[0], strEq("CONTAINER"), "GetTermEvaluator112 field types[0] is correct "); + is(field2, eq(Constants.MERGE_ALL), "GetTermEvaluator112 field merge is correct "); } @@ -8631,7 +8766,40 @@ TermEvaluator t = EvaluatorFactory.PC.getTermEvaluator(term, ""); - is(t, eqnull(), "GetTermEvaluator113 evaluator is null"); + is(t instanceof PCCountEquipmentTermEvaluator, eq(true), + "GetTermEvaluator113 evaluator correct for " + term); + + Class<?> uClass = PCCountEquipmentTermEvaluator.class; + + Field pF0 = (Field) TestHelper.findField(uClass, "originalText"); + Field pF1 = (Field) TestHelper.findField(uClass, "types"); + Field pF2 = (Field) TestHelper.findField(uClass, "merge"); + + String field0 = ""; + String[] field1 = new String[] {}; + Integer field2 = 0; + boolean ok; + try + { + ok = true; + field0 = (String) pF0.get(t); + field1 = (String[]) pF1.get(t); + field2 = (Integer) pF2.get(t); + } + catch (ClassCastException e) + { + ok = false; + } + catch (IllegalAccessException e) + { + ok = false; + } + + is(ok, eq(true), "No illegal access in getTermEvaluator113"); + + is(field0, strEq(term), "GetTermEvaluator113 stored term is correct " + term); + is(field1[0], strEq("WEAPON"), "GetTermEvaluator113 field types[0] is correct "); + is(field2, eq(Constants.MERGE_ALL), "GetTermEvaluator113 field merge is correct "); } @@ -8645,7 +8813,40 @@ TermEvaluator t = EvaluatorFactory.PC.getTermEvaluator(term, ""); - is(t, eqnull(), "GetTermEvaluator114 evaluator is null"); + is(t instanceof PCCountEquipmentTermEvaluator, eq(true), + "GetTermEvaluator114 evaluator correct for " + term); + + Class<?> uClass = PCCountEquipmentTermEvaluator.class; + + Field pF0 = (Field) TestHelper.findField(uClass, "originalText"); + Field pF1 = (Field) TestHelper.findField(uClass, "types"); + Field pF2 = (Field) TestHelper.findField(uClass, "merge"); + + String field0 = ""; + String[] field1 = new String[] {}; + Integer field2 = 0; + boolean ok; + try + { + ok = true; + field0 = (String) pF0.get(t); + field1 = (String[]) pF1.get(t); + field2 = (Integer) pF2.get(t); + } + catch (ClassCastException e) + { + ok = false; + } + catch (IllegalAccessException e) + { + ok = false; + } + + is(ok, eq(true), "No illegal access in getTermEvaluator114"); + + is(field0, strEq(term), "GetTermEvaluator114 stored term is correct " + term); + is(field1[0], strEq("ACITEM"), "GetTermEvaluator114 field types[0] is correct "); + is(field2, eq(Constants.MERGE_ALL), "GetTermEvaluator114 field merge is correct "); } @@ -8655,7 +8856,7 @@ public void testGetTermEvaluator115() { TestHelper.loadAll(); - String term = "COUNT[EQUIPMENT.MERGENONE.IS.FOO]"; + String term = "COUNT[EQUIPMENT.MERGENONE.BAR.IS.FOO]"; TermEvaluator t = EvaluatorFactory.PC.getTermEvaluator(term, ""); @@ -8691,8 +8892,9 @@ is(ok, eq(true), "No illegal access in getTermEvaluator115"); is(field0, strEq(term), "GetTermEvaluator115 stored term is correct " + term); - is(field1[0], strEq("IS"), "GetTermEvaluator115 field types[0] is correct "); - is(field1[1], strEq("FOO"), "GetTermEvaluator115 field types[1] is correct "); + is(field1[0], strEq("BAR"), "GetTermEvaluator115 field types[0] is correct "); + is(field1[1], strEq("IS"), "GetTermEvaluator115 field types[1] is correct "); + is(field1[2], strEq("FOO"), "GetTermEvaluator115 field types[2] is correct "); is(field2, eq(Constants.MERGE_NONE), "GetTermEvaluator115 field merge is correct "); } @@ -8703,7 +8905,7 @@ public void testGetTermEvaluator116() { TestHelper.loadAll(); - String term = "COUNT[EQUIPMENT.MERGELOC.NOT.BAR]"; + String term = "COUNT[EQUIPMENT.MERGELOC.FOO.NOT.BAR]"; TermEvaluator t = EvaluatorFactory.PC.getTermEvaluator(term, ""); @@ -8739,8 +8941,9 @@ is(ok, eq(true), "No illegal access in getTermEvaluator116"); is(field0, strEq(term), "GetTermEvaluator116 stored term is correct " + term); - is(field1[0], strEq("NOT"), "GetTermEvaluator116 field types[0] is correct "); - is(field1[1], strEq("BAR"), "GetTermEvaluator116 field types[1] is correct "); + is(field1[0], strEq("FOO"), "GetTermEvaluator116 field types[0] is correct "); + is(field1[1], strEq("NOT"), "GetTermEvaluator116 field types[1] is correct "); + is(field1[2], strEq("BAR"), "GetTermEvaluator116 field types[2] is correct "); is(field2, eq(Constants.MERGE_LOCATION), "GetTermEvaluator116 field merge is correct "); } @@ -8751,7 +8954,7 @@ public void testGetTermEvaluator117() { TestHelper.loadAll(); - String term = "COUNT[EQUIPMENT.ADD.BAZ]"; + String term = "COUNT[EQUIPMENT.FOO.ADD.BAZ]"; TermEvaluator t = EvaluatorFactory.PC.getTermEvaluator(term, ""); @@ -8787,8 +8990,9 @@ is(ok, eq(true), "No illegal access in getTermEvaluator117"); is(field0, strEq(term), "GetTermEvaluator117 stored term is correct " + term); - is(field1[0], strEq("ADD"), "GetTermEvaluator117 field types[0] is correct "); - is(field1[1], strEq("BAZ"), "GetTermEvaluator117 field types[1] is correct "); + is(field1[0], strEq("FOO"), "GetTermEvaluator117 field types[0] is correct "); + is(field1[1], strEq("ADD"), "GetTermEvaluator117 field types[1] is correct "); + is(field1[2], strEq("BAZ"), "GetTermEvaluator117 field types[2] is correct "); is(field2, eq(Constants.MERGE_ALL), "GetTermEvaluator117 field merge is correct "); } @@ -8817,7 +9021,40 @@ TermEvaluator t = EvaluatorFactory.PC.getTermEvaluator(term, ""); - is(t, eqnull(), "GetTermEvaluator119 evaluator is null"); + is(t instanceof PCCountEquipmentTermEvaluator, eq(true), + "GetTermEvaluator119 evaluator correct for " + term); + + Class<?> uClass = PCCountEquipmentTermEvaluator.class; + + Field pF0 = (Field) TestHelper.findField(uClass, "originalText"); + Field pF1 = (Field) TestHelper.findField(uClass, "types"); + Field pF2 = (Field) TestHelper.findField(uClass, "merge"); + + String field0 = ""; + String[] field1 = new String[] {}; + Integer field2 = 0; + boolean ok; + try + { + ok = true; + field0 = (String) pF0.get(t); + field1 = (String[]) pF1.get(t); + field2 = (Integer) pF2.get(t); + } + catch (ClassCastException e) + { + ok = false; + } + catch (IllegalAccessException e) + { + ok = false; + } + + is(ok, eq(true), "No illegal access in getTermEvaluator119"); + + is(field0, strEq(term), "GetTermEvaluator119 stored term is correct " + term); + is(field1[0], strEq("FOO"), "GetTermEvaluator119 field types[0] is correct "); + is(field2, eq(Constants.MERGE_ALL), "GetTermEvaluator119 field merge is correct "); } @@ -8827,7 +9064,7 @@ public void testGetTermEvaluator120() { TestHelper.loadAll(); - String term = "COUNT[EQUIPMENT.MERGENONE.IS.FOO.QUX]"; + String term = "COUNT[EQUIPMENT.MERGENONE.BAR.IS.FOO.QUX]"; TermEvaluator t = EvaluatorFactory.PC.getTermEvaluator(term, ""); @@ -8841,7 +9078,7 @@ public void testGetTermEvaluator121() { TestHelper.loadAll(); - String term = "COUNT[EQUIPMENT.MERGELOC.NOT.BAR.QUX]"; + String term = "COUNT[EQUIPMENT.MERGELOC.BAR.NOT.BAZ.QUX]"; TermEvaluator t = EvaluatorFactory.PC.getTermEvaluator(term, ""); @@ -8855,7 +9092,7 @@ public void testGetTermEvaluator122() { TestHelper.loadAll(); - String term = "COUNT[EQUIPMENT.ADD.BAZ.QUX]"; + String term = "COUNT[EQUIPMENT.BAR.ADD.BAZ.QUX]"; TermEvaluator t = EvaluatorFactory.PC.getTermEvaluator(term, ""); @@ -11664,7 +11901,7 @@ TermEvaluator t = EvaluatorFactory.PC.getTermEvaluator(term, ""); - is(t , eqnull(), "GetTermEvaluator195 evaluator correct for " + term); + is(t, eqnull(), "GetTermEvaluator195 evaluator is null"); } @@ -11678,7 +11915,7 @@ TermEvaluator t = EvaluatorFactory.PC.getTermEvaluator(term, ""); - is(t , eqnull(), "GetTermEvaluator196 evaluator correct for " + term); + is(t, eqnull(), "GetTermEvaluator196 evaluator is null"); } @@ -11692,7 +11929,7 @@ TermEvaluator t = EvaluatorFactory.PC.getTermEvaluator(term, ""); - is(t , eqnull(), "GetTermEvaluator197 evaluator correct for " + term); + is(t, eqnull(), "GetTermEvaluator197 evaluator is null"); } @@ -11706,7 +11943,7 @@ TermEvaluator t = EvaluatorFactory.PC.getTermEvaluator(term, ""); - is(t , eqnull(), "GetTermEvaluator198 evaluator correct for " + term); + is(t, eqnull(), "GetTermEvaluator198 evaluator is null"); } @@ -11720,9 +11957,10 @@ TermEvaluator t = EvaluatorFactory.PC.getTermEvaluator(term, ""); - is(t , eqnull(), "GetTermEvaluator199 evaluator correct for " + term); + is(t, eqnull(), "GetTermEvaluator199 evaluator is null"); } + /** * Method: getTermEvaluator(String term, String source) */ @@ -11733,12 +11971,50 @@ TermEvaluator t = EvaluatorFactory.PC.getTermEvaluator(term, ""); - is(t , eqnull(), "GetTermEvaluator200 evaluator correct for " + term); + is(t, eqnull(), "GetTermEvaluator200 evaluator is null"); } + + /** + * Method: getTermEvaluator(String term, String source) + */ + public void testGetTermEvaluator201() { + TestHelper.loadAll(); + String term = "BASECOST"; + TermEvaluator t = EvaluatorFactory.EQ.getTermEvaluator(term, ""); + is(t instanceof EQBaseCostTermEvaluator, eq(true), + "GetTermEvaluator201 evaluator correct for " + term); + + Class<?> uClass = EQBaseCostTermEvaluator.class; + + Field pF0 = (Field) TestHelper.findField(uClass, "originalText"); + + String field0 = ""; + boolean ok; + try + { + ok = true; + field0 = (String) pF0.get(t); + } + catch (ClassCastException e) + { + ok = false; + } + catch (IllegalAccessException e) + { + ok = false; + } + + is(ok, eq(true), "No illegal access in getTermEvaluator201"); + + is(field0, strEq(term), "GetTermEvaluator201 stored term is correct " + term); + } + + + /** * Method: getTermEvaluator(String term, String source) */ Modified: Trunk/pcgen/code/src/test/pcgen/util/TermUtilitiesTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/util/TermUtilitiesTest.java 2008-10-09 04:41:59 UTC (rev 7999) +++ Trunk/pcgen/code/src/test/pcgen/util/TermUtilitiesTest.java 2008-10-09 09:19:45 UTC (rev 8000) @@ -43,294 +43,294 @@ } /** - * Method: checkEquipmentTypesArray(String originalText, String[] types, int first) + * Method: checkEqTypeTypesArray(String originalText, String[] types, int first) */ - public void testcheckEquipmentTypesArray01() { + public void testcheckEqTypeTypesArray01() { boolean ok; try { ok = true; String[] types = new String[]{"EQUIPPED"}; - TermUtilities.checkEquipmentTypesArray("COUNT[EQTYPE.EQUIPPED]", types, 0); + TermUtilities.checkEqTypeTypesArray("COUNT[EQTYPE.EQUIPPED]", types, 0); } catch (TermEvaulatorException e) { ok = false; } - is(ok, eq(false), "EquipmentTypesArray01 Single Type EQUIPPED"); + is(ok, eq(true), "EqtypesTypesArray01 Single Type EQUIPPED"); } /** - * Method: checkEquipmentTypesArray(String originalText, String[] types, int first) + * Method: checkEqTypeTypesArray(String originalText, String[] types, int first) */ - public void testcheckEquipmentTypesArray02() { + public void testcheckEqTypeTypesArray02() { boolean ok; try { ok = true; String[] types = new String[]{"NOTEQUIPPED"}; - TermUtilities.checkEquipmentTypesArray("COUNT[EQTYPE.NOTEQUIPPED]", types, 0); + TermUtilities.checkEqTypeTypesArray("COUNT[EQTYPE.NOTEQUIPPED]", types, 0); } catch (TermEvaulatorException e) { ok = false; } - is(ok, eq(false), "EquipmentTypesArray02 Single Type NOTEQUIPPED"); + is(ok, eq(true), "EqtypesTypesArray02 Single Type NOTEQUIPPED"); } /** - * Method: checkEquipmentTypesArray(String originalText, String[] types, int first) + * Method: checkEqTypeTypesArray(String originalText, String[] types, int first) */ - public void testcheckEquipmentTypesArray03() { + public void testcheckEqTypeTypesArray03() { boolean ok; try { ok = true; String[] types = new String[]{"EQUIPPED", "FOO"}; - TermUtilities.checkEquipmentTypesArray("COUNT[EQTYPE.EQUIPPED.FOO]", types, 0); + TermUtilities.checkEqTypeTypesArray("COUNT[EQTYPE.EQUIPPED.FOO]", types, 0); } catch (TermEvaulatorException e) { ok = false; } - is(ok, eq(false), "EquipmentTypesArray03 EQUIPPED with spurious type"); + is(ok, eq(false), "EqtypesTypesArray03 EQUIPPED with spurious type"); } /** - * Method: checkEquipmentTypesArray(String originalText, String[] types, int first) + * Method: checkEqTypeTypesArray(String originalText, String[] types, int first) */ - public void testcheckEquipmentTypesArray04() { + public void testcheckEqTypeTypesArray04() { boolean ok; try { ok = true; - String[] types = new String[]{"NOT", "FOO"}; - TermUtilities.checkEquipmentTypesArray("COUNT[EQTYPE.NOT.FOO]", types, 0); + String[] types = new String[]{"BAR", "NOT", "FOO"}; + TermUtilities.checkEqTypeTypesArray("COUNT[EQTYPE.BAR.NOT.FOO]", types, 0); } catch (TermEvaulatorException e) { ok = false; } - is(ok, eq(true), "EquipmentTypesArray04 Exclude FOO"); + is(ok, eq(true), "EqtypesTypesArray04 Exclude FOO"); } /** - * Method: checkEquipmentTypesArray(String originalText, String[] types, int first) + * Method: checkEqTypeTypesArray(String originalText, String[] types, int first) */ - public void testcheckEquipmentTypesArray05() { + public void testcheckEqTypeTypesArray05() { boolean ok; try { ok = true; - String[] types = new String[]{"ADD", "FOO"}; - TermUtilities.checkEquipmentTypesArray("COUNT[EQTYPE.ADD.FOO]", types, 0); + String[] types = new String[]{"BAR", "ADD", "FOO"}; + TermUtilities.checkEqTypeTypesArray("COUNT[EQTYPE.BAR.ADD.FOO]", types, 0); } catch (TermEvaulatorException e) { ok = false; } - is(ok, eq(true), "EquipmentTypesArray05 Include FOO"); + is(ok, eq(true), "EqtypesTypesArray05 Include FOO"); } /** - * Method: checkEquipmentTypesArray(String originalText, String[] types, int first) + * Method: checkEqTypeTypesArray(String originalText, String[] types, int first) */ - public void testcheckEquipmentTypesArray06() { + public void testcheckEqTypeTypesArray06() { boolean ok; try { ok = true; - String[] types = new String[]{"IS", "FOO"}; - TermUtilities.checkEquipmentTypesArray("COUNT[EQTYPE.IS.FOO]", types, 0); + String[] types = new String[]{"BAR", "IS", "FOO"}; + TermUtilities.checkEqTypeTypesArray("COUNT[EQTYPE.BAR.IS.FOO]", types, 0); } catch (TermEvaulatorException e) { ok = false; } - is(ok, eq(true), "EquipmentTypesArray06 Only FOO"); + is(ok, eq(true), "EqtypesTypesArray06 Only FOO"); } /** - * Method: checkEquipmentTypesArray(String originalText, String[] types, int first) + * Method: checkEqTypeTypesArray(String originalText, String[] types, int first) */ - public void testcheckEquipmentTypesArray07() { + public void testcheckEqTypeTypesArray07() { boolean ok; try { ok = true; - String[] types = new String[]{"NOT", "FOO", "ADD", "BAR", "IS", "BAZ"}; - TermUtilities.checkEquipmentTypesArray("COUNT[EQTYPE.NOT.FOO.ADD.BAR.IS.BAZ]", types, 0); + String[] types = new String[]{"QUX", "NOT", "FOO", "ADD", "BAR", "IS", "BAZ"}; + TermUtilities.checkEqTypeTypesArray("COUNT[EQTYPE.QUX.NOT.FOO.ADD.BAR.IS.BAZ]", types, 0); } catch (TermEvaulatorException e) { ok = false; } - is(ok, eq(true), "EquipmentTypesArray07 All options"); + is(ok, eq(true), "EqtypesTypesArray07 All options"); } /** - * Method: checkEquipmentTypesArray(String originalText, String[] types, int first) + * Method: checkEqTypeTypesArray(String originalText, String[] types, int first) */ - public void testcheckEquipmentTypesArray08() { + public void testcheckEqTypeTypesArray08() { boolean ok; try { ok = true; - String[] types = new String[]{"NOT", "FOO", "ADD", "BAR", "IS", "BAZ", "QUX"}; - TermUtilities.checkEquipmentTypesArray("COUNT[EQTYPE.NOT.FOO.ADD.BAR.IS.BAZ.QUX]", types, 0); + String[] types = new String[]{"QUUX", "NOT", "FOO", "ADD", "BAR", "IS", "BAZ", "QUX"}; + TermUtilities.checkEqTypeTypesArray("COUNT[EQTYPE.QUUX.NOT.FOO.ADD.BAR.IS.BAZ.QUX]", types, 0); } catch (TermEvaulatorException e) { ok = false; } - is(ok, eq(false), "EquipmentTypesArray08 All options with spurious"); + is(ok, eq(false), "EqtypesTypesArray08 All options with spurious"); } - /** - * Method: checkEqtypesTypesArray(String originalText, String[] types, int first) + * Method: checkEquipmentTypesArray(String originalText, String[] types, int first) */ - public void testcheckEqtypesTypesArray01() { + public void testcheckEquipmentTypesArray01() { boolean ok; try { ok = true; String[] types = new String[]{"EQUIPPED"}; - TermUtilities.checkEqtypesTypesArray("COUNT[EQTYPE.EQUIPPED]", types, 0); + TermUtilities.checkEquipmentTypesArray("COUNT[EQUIPMENT.EQUIPPED]", types, 0); } catch (TermEvaulatorException e) { ok = false; } - is(ok, eq(true), "EqtypesTypesArray01 Single Type EQUIPPED"); + is(ok, eq(true), "EquipmentTypesArray01 Single Type EQUIPPED"); } /** - * Method: checkEqtypesTypesArray(String originalText, String[] types, int first) + * Method: checkEquipmentTypesArray(String originalText, String[] types, int first) */ - public void testcheckEqtypesTypesArray02() { + public void testcheckEquipmentTypesArray02() { boolean ok; try { ok = true; String[] types = new String[]{"NOTEQUIPPED"}; - TermUtilities.checkEqtypesTypesArray("COUNT[EQTYPE.NOTEQUIPPED]", types, 0); + TermUtilities.checkEquipmentTypesArray("COUNT[EQUIPMENT.NOTEQUIPPED]", types, 0); } catch (TermEvaulatorException e) { ok = false; } - is(ok, eq(true), "EqtypesTypesArray02 Single Type NOTEQUIPPED"); + is(ok, eq(true), "EquipmentTypesArray02 Single Type NOTEQUIPPED"); } /** - * Method: checkEqtypesTypesArray(String originalText, String[] types, int first) + * Method: checkEquipmentTypesArray(String originalText, String[] types, int first) */ - public void testcheckEqtypesTypesArray03() { + public void testcheckEquipmentTypesArray03() { boolean ok; try { ok = true; String[] types = new String[]{"EQUIPPED", "FOO"}; - TermUtilities.checkEqtypesTypesArray("COUNT[EQTYPE.EQUIPPED.FOO]", types, 0); + TermUtilities.checkEquipmentTypesArray("COUNT[EQUIPMENT.EQUIPPED.FOO]", types, 0); } catch (TermEvaulatorException e) { ok = false; } - is(ok, eq(false), "EqtypesTypesArray03 EQUIPPED with spurious type"); + is(ok, eq(false), "EquipmentTypesArray03 EQUIPPED with spurious type"); } /** - * Method: checkEqtypesTypesArray(String originalText, String[] types, int first) + * Method: checkEquipmentTypesArray(String originalText, String[] types, int first) */ - public void testcheckEqtypesTypesArray04() { + public void testcheckEquipmentTypesArray04() { boolean ok; try { ok = true; - String[] types = new String[]{"NOT", "FOO"}; - TermUtilities.checkEqtypesTypesArray("COUNT[EQTYPE.NOT.FOO]", types, 0); + String[] types = new String[]{"QUX", "NOT", "FOO"}; + TermUtilities.checkEquipmentTypesArray("COUNT[EQUIPMENT.QUX.NOT.FOO]", types, 0); } catch (TermEvaulatorException e) { ok = false; } - is(ok, eq(true), "EqtypesTypesArray04 Exclude FOO"); + is(ok, eq(true), "EquipmentTypesArray04 Exclude FOO"); } /** - * Method: checkEqtypesTypesArray(String originalText, String[] types, int first) + * Method: checkEquipmentTypesArray(String originalText, String[] types, int first) */ - public void testcheckEqtypesTypesArray05() { + public void testcheckEquipmentTypesArray05() { boolean ok; try { ok = true; - String[] types = new String[]{"ADD", "FOO"}; - TermUtilities.checkEqtypesTypesArray("COUNT[EQTYPE.ADD.FOO]", types, 0); + String[] types = new String[]{"QUUX", "ADD", "FOO"}; + TermUtilities.checkEquipmentTypesArray("COUNT[EQUIPMENT.QUUX.ADD.FOO]", types, 0); } catch (TermEvaulatorException e) { ok = false; } - is(ok, eq(true), "EqtypesTypesArray05 Include FOO"); + is(ok, eq(true), "EquipmentTypesArray05 Include FOO"); } /** - * Method: checkEqtypesTypesArray(String originalText, String[] types, int first) + * Method: checkEquipmentTypesArray(String originalText, String[] types, int first) */ - public void testcheckEqtypesTypesArray06() { + public void testcheckEquipmentTypesArray06() { boolean ok; try { ok = true; - String[] types = new String[]{"IS", "FOO"}; - TermUtilities.checkEqtypesTypesArray("COUNT[EQTYPE.IS.FOO]", types, 0); + String[] types = new String[]{"QUUX", "IS", "FOO"}; + TermUtilities.checkEquipmentTypesArray("COUNT[EQUIPMENT.QUUX.IS.FOO]", types, 0); } catch (TermEvaulatorException e) { ok = false; } - is(ok, eq(true), "EqtypesTypesArray06 Only FOO"); + is(ok, eq(true), "EquipmentTypesArray06 Only FOO"); } /** - * Method: checkEqtypesTypesArray(String originalText, String[] types, int first) + * Method: checkEquipmentTypesArray(String originalText, String[] types, int first) */ - public void testcheckEqtypesTypesArray07() { + public void testcheckEquipmentTypesArray07() { boolean ok; try { ok = true; - String[] types = new String[]{"NOT", "FOO", "ADD", "BAR", "IS", "BAZ"}; - TermUtilities.checkEqtypesTypesArray("COUNT[EQTYPE.NOT.FOO.ADD.BAR.IS.BAZ]", types, 0); + String[] types = new String[]{"QUUX", "NOT", "FOO", "ADD", "BAR", "IS", "BAZ"}; + TermUtilities.checkEquipmentTypesArray("COUNT[EQUIPMENT.QUUX.NOT.FOO.ADD.BAR.IS.BAZ]", types, 0); } catch (TermEvaulatorException e) { ok = false; } - is(ok, eq(true), "EqtypesTypesArray07 All options"); + is(ok, eq(true), "EquipmentTypesArray07 All options"); } /** - * Method: checkEqtypesTypesArray(String originalText, String[] types, int first) + * Method: checkEquipmentTypesArray(String originalText, String[] types, int first) */ - public void testcheckEqtypesTypesArray08() { + public void testcheckEquipmentTypesArray08() { boolean ok; try { ok = true; - String[] types = new String[]{"NOT", "FOO", "ADD", "BAR", "IS", "BAZ", "QUX"}; - TermUtilities.checkEqtypesTypesArray("COUNT[EQTYPE.NOT.FOO.ADD.BAR.IS.BAZ.QUX]", types, 0); + String[] types = new String[]{"QUUX", "NOT", "FOO", "ADD", "BAR", "IS", "BAZ", "QUX"}; + TermUtilities.checkEquipmentTypesArray("COUNT[EQUIPMENT.QUUX.NOT.FOO.ADD.BAR.IS.BAZ.QUX]", types, 0); } catch (TermEvaulatorException e) { ok = false; } - is(ok, eq(false), "EqtypesTypesArray08 All options with spurious"); + is(ok, eq(false), "EquipmentTypesArray08 All options with spurious"); } + /** * Method: splitAndConvertIntegers(final String source, int numOfFields) */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-10-10 02:15:19
|
Revision: 8007 http://pcgen.svn.sourceforge.net/pcgen/?rev=8007&view=rev Author: thpr Date: 2008-10-10 02:15:05 +0000 (Fri, 10 Oct 2008) Log Message: ----------- Split "static" and "dynamic" bonuses into two separate storage spaces This is in preparation for conversion of BONUS token, among other useful side effects. Note Combat AC of resized equipment is an exception & eventually needs a new long-term solution (perhaps even something that impacts the data) Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/AssociationListKey.java Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.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/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/Skill.java Trunk/pcgen/code/src/java/pcgen/core/StatList.java Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorPC.java Trunk/pcgen/code/src/java/pcgen/core/analysis/BonusAddition.java Trunk/pcgen/code/src/java/pcgen/core/chooser/SAListChoiceManager.java Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbility.java Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilitySpellCaster.java Trunk/pcgen/code/src/java/pcgen/core/term/PCCountEqTypeTermEvaluator.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/NaturalAttacksPanel.java Trunk/pcgen/code/src/java/pcgen/gui/editor/RaceBasePanel.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/io/ExportHandler.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/plugin/charactersheet/gui/ArmorPane.java Trunk/pcgen/code/src/java/plugin/exporttokens/ArmorToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/BonusLst.java Trunk/pcgen/code/src/java/plugin/lsttokens/NaturalattacksLst.java Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/BonusToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/pcclass/MonnonskillhdToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/pcclass/MonskillToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/pointbuy/method/BonusToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/race/StartfeatsToken.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/core/StatListTest.java Trunk/pcgen/code/src/test/pcgen/core/analysis/SkillModifierTest.java Trunk/pcgen/code/src/test/pcgen/core/bonus/BonusTest.java Trunk/pcgen/code/src/test/pcgen/core/prereq/PreAttTest.java Trunk/pcgen/code/src/test/pcgen/core/prereq/PreBaseSizeTest.java Trunk/pcgen/code/src/test/pcgen/core/prereq/PreCheckBaseTest.java Trunk/pcgen/code/src/test/pcgen/core/prereq/PreCheckTest.java Trunk/pcgen/code/src/test/pcgen/core/prereq/PreClassTest.java Trunk/pcgen/code/src/test/pcgen/core/prereq/PreHPTest.java Trunk/pcgen/code/src/test/pcgen/core/prereq/PreLevelMaxTest.java Trunk/pcgen/code/src/test/pcgen/core/prereq/PreLevelTest.java Trunk/pcgen/code/src/test/pcgen/core/prereq/PrePCLevelTest.java Trunk/pcgen/code/src/test/pcgen/io/ExportHandlerTest.java Trunk/pcgen/code/src/test/pcgen/io/exporttoken/SpellMemTokenTest.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/pcgen/util/TestHelper.java Trunk/pcgen/code/src/test/plugin/exporttokens/ACTokenTest.java Trunk/pcgen/code/src/test/plugin/exporttokens/AttackTokenTest.java Trunk/pcgen/code/src/test/plugin/exporttokens/SkillTokenTest.java Trunk/pcgen/code/src/test/plugin/exporttokens/SpellListTokenTest.java Removed Paths: ------------- Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityWeaponBonus.java Modified: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/AssociationListKey.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/AssociationListKey.java 2008-10-10 00:43:05 UTC (rev 8006) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/AssociationListKey.java 2008-10-10 02:15:05 UTC (rev 8007) @@ -32,6 +32,7 @@ import pcgen.base.util.NamedValue; import pcgen.cdom.base.CDOMListObject; import pcgen.cdom.list.ClassSkillList; +import pcgen.core.bonus.BonusObj; import pcgen.core.spell.Spell; /** @@ -64,6 +65,8 @@ public static final AssociationListKey<CDOMListObject<Spell>> CLASSSPELLLIST = new AssociationListKey<CDOMListObject<Spell>>(); + public static final AssociationListKey<BonusObj> BONUS = new AssociationListKey<BonusObj>(); + private static CaseInsensitiveMap<AssociationListKey<?>> map = null; private AssociationListKey() Modified: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java 2008-10-10 00:43:05 UTC (rev 8006) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java 2008-10-10 02:15:05 UTC (rev 8007) @@ -243,6 +243,7 @@ public static final ListKey<CDOMReference<PCClass>> SERVES_AS_CLASS = new ListKey<CDOMReference<PCClass>>(); public static final ListKey<CDOMReference<Ability>> SERVES_AS_ABILITY = new ListKey<CDOMReference<Ability>>(); public static final ListKey<ChooseResultActor> CHOOSE_ACTOR = new ListKey<ChooseResultActor>(); + public static final ListKey<BonusObj> BONUS = new ListKey<BonusObj>(); private static CaseInsensitiveMap<ListKey<?>> map = null; Modified: Trunk/pcgen/code/src/java/pcgen/core/Equipment.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Equipment.java 2008-10-10 00:43:05 UTC (rev 8006) +++ Trunk/pcgen/code/src/java/pcgen/core/Equipment.java 2008-10-10 02:15:05 UTC (rev 8007) @@ -61,6 +61,7 @@ import pcgen.core.analysis.EqModCost; import pcgen.core.analysis.EqModSpellInfo; import pcgen.core.analysis.EquipmentChoiceDriver; +import pcgen.core.bonus.Bonus; import pcgen.core.bonus.BonusObj; import pcgen.core.character.WieldCategory; import pcgen.core.prereq.PrereqHandler; @@ -577,7 +578,7 @@ public List<BonusObj> getActiveBonuses(final PlayerCharacter aPC) { final List<BonusObj> aList = new ArrayList<BonusObj>(); - for (BonusObj bonus : getBonusList(aPC)) { + for (BonusObj bonus : getRawBonusList(aPC)) { if (bonus.isApplied()) { aList.add(bonus); } @@ -614,7 +615,7 @@ final List<BonusObj> aList = new ArrayList<BonusObj>(); aList.addAll(getBonusListOfType(pc, aType, aName)); - for (BonusObj bonus : getBonusList()) { + for (BonusObj bonus : getRawBonusList(pc)) { if ((bonus.getTypeOfBonus().indexOf(aType) >= 0) && (bonus.getBonusInfo().indexOf(aName) >= 0)) { aList.add(bonus); @@ -1128,7 +1129,7 @@ if (equipped) { activateBonuses(aPC); } else { - deactivateBonuses(); + deactivateBonuses(aPC); } } @@ -2573,7 +2574,7 @@ // If using 3.5 weapon penalties, add them in also if (Globals.checkRule(RuleConstants.SYS_35WP)) { final List<BonusObj> aList = GameMode.getEqSizePenaltyObj() - .getBonusList(); + .getSafeListFor(ListKey.BONUS); super.bonusTo(aType, aName, this, aList, aPC); } @@ -4176,7 +4177,7 @@ final PlayerCharacter aPC, final Equipment baseEq, final SizeAdjustment newSA) { - if ((getBonusList() != null) && isArmor()) { + if ((getRawBonusList(aPC) != null) && isArmor()) { double mult = 1.0; final SizeAdjustment currSA = baseEq.getSafe(ObjectKey.SIZE); @@ -4186,8 +4187,8 @@ 1.0); } - final List<BonusObj> baseEqBonusList = baseEq.getBonusList(aPC); - final List<BonusObj> eqBonusList = getBonusList(aPC); + final List<BonusObj> baseEqBonusList = baseEq.getRawBonusList(aPC); + final List<BonusObj> eqBonusList = getRawBonusList(aPC); // // Go through the bonus list looking for COMBAT|AC|x and resize @@ -4203,7 +4204,15 @@ final int iOffs = aString.indexOf('|', 10); if (iOffs > 10) { - removeBonusList(aBonus); + /* + * TODO This is bad behavior to alter this list, + * which - theoretically - shouldn't be altered + * after data load. However, given .REPLACE + * potential in BONUS objects, I can't find + * another quick solution to this problem + * - thpr 10/9/08 + */ + removeFromListFor(ListKey.BONUS, aBonus); } } } @@ -4225,7 +4234,20 @@ aString = aString.substring(0, 10) + acCombatBonus.toString() + aString.substring(iOffs); - addBonusList(aString); + /* + * TODO This is bad behavior to alter this list, + * which - theoretically - shouldn't be altered + * after data load. However, given .REPLACE + * potential in BONUS objects, I can't find + * another quick solution to this problem + * - thpr 10/9/08 + */ + BonusObj b = Bonus.newBonus(aString); + if (b != null) + { + b.setCreatorObject(this); + addToListFor(ListKey.BONUS, b); + } } } } @@ -4803,7 +4825,7 @@ */ @Override public void activateBonuses(final PlayerCharacter aPC) { - for (final BonusObj bonus : getBonusList()) { + for (final BonusObj bonus : getRawBonusList(aPC)) { bonus.setApplied(false); if (PrereqHandler.passesAll(bonus.getPrerequisiteList(), this, aPC)) { Modified: Trunk/pcgen/code/src/java/pcgen/core/EquipmentModifier.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/EquipmentModifier.java 2008-10-10 00:43:05 UTC (rev 8006) +++ Trunk/pcgen/code/src/java/pcgen/core/EquipmentModifier.java 2008-10-10 02:15:05 UTC (rev 8007) @@ -141,31 +141,6 @@ } /** - * 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(AssociationStore as, final String aType, final String aName) - { - final List<BonusObj> aList = new ArrayList<BonusObj>(); - - for ( BonusObj bonus : getBonusList(as) ) - { - if ( - (bonus.getTypeOfBonus().indexOf(aType) >= 0) && - (bonus.getBonusInfo().indexOf(aName) >= 0)) - { - aList.add(bonus); - } - } - - return aList; - } - - /** * Does this Equipment Modifier add aType to the equipment it is applied * to? If aType begins with an " (Exclamation Mark) the " will * be removed before checking the type. Modified: Trunk/pcgen/code/src/java/pcgen/core/PCClass.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-10-10 00:43:05 UTC (rev 8006) +++ Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-10-10 02:15:05 UTC (rev 8007) @@ -335,7 +335,8 @@ { double i = 0; - if ((asLevel == 0) || getBonusList().isEmpty()) + List<BonusObj> rawBonusList = getRawBonusList(aPC); + if ((asLevel == 0) || rawBonusList.isEmpty()) { return 0; } @@ -343,7 +344,7 @@ final String type = argType.toUpperCase(); final String mname = argMname.toUpperCase(); - for (final BonusObj bonus : getBonusList()) + for (final BonusObj bonus : rawBonusList) { final StringTokenizer breakOnPipes = new StringTokenizer(bonus.toString().toUpperCase(), @@ -1559,7 +1560,7 @@ // + aBuf.toString()); BonusObj bon = Bonus.newBonus(aBuf.toString()); bon.setCreatorObject(this); - addBonusList(bon); + aPC.addAssoc(this, AssociationListKey.BONUS, bon); } } } @@ -1907,9 +1908,10 @@ .unparse(me.getValue()), "\t")); } - for (int x = 0; x < getBonusList().size(); ++x) + List<BonusObj> bonusList = getSafeListFor(ListKey.BONUS); + for (int x = 0; x < bonusList.size(); ++x) { - final BonusObj aBonus = getBonusList().get(x); + final BonusObj aBonus = bonusList.get(x); String bonusString = aBonus.toString(); final int levelEnd = bonusString.indexOf('|'); final String maybeLevel = bonusString.substring(0, levelEnd); @@ -1978,7 +1980,7 @@ @Override public void activateBonuses(final PlayerCharacter aPC) { - for (BonusObj bonus : getBonusList()) + for (BonusObj bonus : getRawBonusList(aPC)) { if ((bonus.getPCLevel() <= level)) { @@ -3398,9 +3400,10 @@ // Go through the bonus list (BONUS) and adjust the class to the new // name // - if (getBonusList() != null) + List<BonusObj> bonusList = getListFor(ListKey.BONUS); + if (bonusList != null) { - for (BonusObj bonusObj : getBonusList()) + for (BonusObj bonusObj : bonusList) { final String bonus = bonusObj.toString(); int offs = -1; @@ -3413,10 +3416,15 @@ { break; } - - addBonusList(bonus.substring(0, offs + 1) + newClass - + bonus.substring(offs + oldClass.length() + 1)); - removeBonusList(bonusObj); + final BonusObj aBonus = Bonus.newBonus(bonus.substring(0, offs + 1) + newClass + + bonus.substring(offs + oldClass.length() + 1)); + + if (aBonus != null) + { + aBonus.setCreatorObject(this); + addToListFor(ListKey.BONUS, aBonus); + } + removeFromListFor(ListKey.BONUS, bonusObj); } } } @@ -4270,9 +4278,10 @@ } } - if (!otherClass.getBonusList().isEmpty()) + List<BonusObj> bonusList = otherClass.getListFor(ListKey.BONUS); + if (bonusList != null) { - getBonusList().addAll(otherClass.getBonusList()); + addAllToListFor(ListKey.BONUS, bonusList); } for (VariableKey vk : otherClass.getVariableKeys()) Modified: Trunk/pcgen/code/src/java/pcgen/core/PCTemplate.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PCTemplate.java 2008-10-10 00:43:05 UTC (rev 8006) +++ Trunk/pcgen/code/src/java/pcgen/core/PCTemplate.java 2008-10-10 02:15:05 UTC (rev 8007) @@ -312,25 +312,25 @@ } @Override - public List<BonusObj> getBonusList() + public List<BonusObj> getRawBonusList(PlayerCharacter pc) { - List<BonusObj> list = new ArrayList<BonusObj>(super.getBonusList()); + List<BonusObj> list = new ArrayList<BonusObj>(super.getRawBonusList(pc)); for (PCTemplate rlt : getSafeListFor(ListKey.REPEATLEVEL_TEMPLATES)) { for (PCTemplate lt : rlt.getSafeListFor(ListKey.LEVEL_TEMPLATES)) { - list.addAll(lt.getBonusList()); + list.addAll(lt.getRawBonusList(pc)); } } for (PCTemplate lt : getSafeListFor(ListKey.LEVEL_TEMPLATES)) { - list.addAll(lt.getBonusList()); + list.addAll(lt.getRawBonusList(pc)); } for (PCTemplate lt : getSafeListFor(ListKey.HD_TEMPLATES)) { - list.addAll(lt.getBonusList()); + list.addAll(lt.getRawBonusList(pc)); } return list; Modified: Trunk/pcgen/code/src/java/pcgen/core/PObject.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-10-10 00:43:05 UTC (rev 8006) +++ Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-10-10 02:15:05 UTC (rev 8007) @@ -44,6 +44,7 @@ import pcgen.cdom.base.CDOMReference; import pcgen.cdom.base.Constants; import pcgen.cdom.base.TransitionChoice; +import pcgen.cdom.enumeration.AssociationListKey; import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; import pcgen.cdom.enumeration.StringKey; @@ -51,7 +52,6 @@ import pcgen.core.analysis.LanguageSupport; import pcgen.core.analysis.OutputNameFormatting; import pcgen.core.analysis.WeaponProfType; -import pcgen.core.bonus.Bonus; import pcgen.core.bonus.BonusObj; import pcgen.core.bonus.BonusUtilities; import pcgen.core.chooser.ChooserUtilities; @@ -104,9 +104,6 @@ /** The name to display to the user. This should be internationalized. */ protected String displayName = Constants.EMPTY_STRING; - /** List of Bonuses for the object */ - private List<BonusObj> bonusList = new ArrayList<BonusObj>(); - private SpellSupport spellSupport = new SpellSupport(); private boolean isNewItem = true; @@ -473,12 +470,13 @@ // } retVal.theSource = theSource.clone(); + List<BonusObj> bonusList = getListFor(ListKey.BONUS); if (bonusList != null) { - retVal.bonusList = new ArrayList<BonusObj>(); + retVal.removeListFor(ListKey.BONUS); for (BonusObj orig : bonusList) { - retVal.bonusList.add(orig.clone()); + retVal.addToListFor(ListKey.BONUS, orig.clone()); } retVal.ownBonuses(); @@ -605,6 +603,7 @@ * Set the name (sets keyname also) * @param aString */ + @Override public void setName(final String aString) { if (!aString.endsWith(".MOD")) @@ -1455,9 +1454,9 @@ } } - if (!(this instanceof PCClass) && (getBonusList().size() != 0)) + if (!(this instanceof PCClass) && (getSafeListFor(ListKey.BONUS).size() != 0)) { - for (BonusObj bonusobj : getBonusList()) + for (BonusObj bonusobj : getSafeListFor(ListKey.BONUS)) { txt.append("\tBONUS:").append(bonusobj.getPCCText()); //This formats the bonus items in the proper .lst manner } @@ -2378,27 +2377,21 @@ * @param as TODO * @return the list of bonuses for this object */ - public List<BonusObj> getBonusList(AssociationStore as) + public List<BonusObj> getRawBonusList(PlayerCharacter pc) { + List<BonusObj> bonusList = getSafeListFor(ListKey.BONUS); + if (pc != null) + { + List<BonusObj> listToo = pc.getAssocList(this, AssociationListKey.BONUS); + if (listToo != null) + { + bonusList.addAll(listToo); + } + } 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 @@ -2526,45 +2519,6 @@ } /** - * Add a new bonus to the list of bonuses - * @param aString The unparsed bonus to be added - * @return true if new bonus is not null - */ - public final boolean addBonusList(final String aString) - { - return addBonusList(aString, false); - } - - /** - * Add a new bonus to the list of bonuses. The bonus can optionally - * only be added once no matter how many associated choices this - * object has. This is normally used where a bonus is added for - * each associated choice. - * - * @param aString The unparsed bonus to be added - * @param addOnceOnly Should the bonus only be added once irrespective of number of choices - * @return true if new bonus is not null - */ - public final boolean addBonusList(final String aString, final boolean addOnceOnly) - { - if (bonusList == null) - { - bonusList = new ArrayList<BonusObj>(); - } - - final BonusObj aBonus = Bonus.newBonus(aString); - - if (aBonus != null) - { - aBonus.setCreatorObject(this); - aBonus.setAddOnceOnly(addOnceOnly); - addBonusList(aBonus); - } - - return (aBonus != null); - } - - /** * returns all BonusObj's that are "active" * @param aPC A PlayerCharacter object. * @return active bonuses @@ -2573,7 +2527,7 @@ { final List<BonusObj> aList = new ArrayList<BonusObj>(); - for ( BonusObj bonus : getBonusList() ) + for ( BonusObj bonus : getRawBonusList(aPC) ) { if (bonus.isApplied()) { @@ -2586,12 +2540,13 @@ /** * Get the list of bonuses as a String + * @param pc TODO * @param aString * @return the list of bonuses as a String */ - public boolean getBonusListString(final String aString) + public boolean hasBonusWithInfo(PlayerCharacter pc, final String aString) { - for ( BonusObj bonus : getBonusList() ) + for ( BonusObj bonus : getRawBonusList(pc) ) { if (bonus.getBonusInfo().equalsIgnoreCase(aString)) { @@ -2608,7 +2563,7 @@ */ public void activateBonuses(final PlayerCharacter aPC) { - for (Iterator<BonusObj> ab = getBonusList().iterator(); ab.hasNext();) + for (Iterator<BonusObj> ab = getRawBonusList(aPC).iterator(); ab.hasNext();) { final BonusObj aBonus = ab.next(); aBonus.setApplied(false); @@ -2622,22 +2577,11 @@ } /** - * This function will be required during the continued re-write - * of the BonusObj code -- JSC 8/18/03 - * - * @param aBonus - */ - public final void addBonusList(final BonusObj aBonus) - { - bonusList.add(aBonus); - } - - /** * Deactivate all of the bonuses */ - public void deactivateBonuses() + public void deactivateBonuses(PlayerCharacter aPC) { - for ( BonusObj bonus : getBonusList() ) + for (BonusObj bonus : getRawBonusList(aPC)) { bonus.setApplied(false); } @@ -2648,34 +2592,26 @@ */ public void ownBonuses() { - for ( BonusObj bonus : getBonusList() ) + for ( BonusObj bonus : getSafeListFor(ListKey.BONUS) ) { bonus.setCreatorObject(this); } } /** - * Remove the bonus object from the bonus list - * @param aBonus - */ - public void removeBonusList(final BonusObj aBonus) - { - getBonusList().remove(aBonus); - } - - /** * Remove all bonuses gained via a level * @param aLevel */ public void removeAllBonuses(final int aLevel) { + List<BonusObj> bonusList = getListFor(ListKey.BONUS); if (bonusList != null) { - for (int x = bonusList.size() - 1; x >= 0; --x) + for (BonusObj bo : bonusList) { - if (bonusList.get(x).getPCLevel() == aLevel) + if (bo.getPCLevel() == aLevel) { - bonusList.remove(x); + removeFromListFor(ListKey.BONUS, bo); } } } @@ -2843,4 +2779,16 @@ { return this; } + + public List<BonusObj> getBonusList(AssociationStore as) + { + if (as instanceof PlayerCharacter) + { + return getRawBonusList((PlayerCharacter) as); + } + else + { + return getRawBonusList(null); + } + } } Modified: Trunk/pcgen/code/src/java/pcgen/core/Skill.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Skill.java 2008-10-10 00:43:05 UTC (rev 8006) +++ Trunk/pcgen/code/src/java/pcgen/core/Skill.java 2008-10-10 02:15:05 UTC (rev 8007) @@ -279,7 +279,7 @@ { final List<BonusObj> aList = new ArrayList<BonusObj>(); - for (BonusObj bonus : aStat.getBonusList()) + for (BonusObj bonus : aStat.getSafeListFor(ListKey.BONUS)) { if (bonus.getTypeOfBonusAsInt() != iType) { Modified: Trunk/pcgen/code/src/java/pcgen/core/StatList.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/StatList.java 2008-10-10 00:43:05 UTC (rev 8006) +++ Trunk/pcgen/code/src/java/pcgen/core/StatList.java 2008-10-10 02:15:05 UTC (rev 8007) @@ -31,6 +31,7 @@ import java.util.List; import java.util.regex.Pattern; +import pcgen.cdom.enumeration.ListKey; import pcgen.core.bonus.BonusObj; import pcgen.core.bonus.BonusUtilities; @@ -87,7 +88,7 @@ for ( PCStat stat : stats ) { - aList.addAll(BonusUtilities.getBonusFromList(stat.getBonusList(), + aList.addAll(BonusUtilities.getBonusFromList(stat.getSafeListFor(ListKey.BONUS), aType, aName)); } Modified: Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorPC.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorPC.java 2008-10-10 00:43:05 UTC (rev 8006) +++ Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorPC.java 2008-10-10 02:15:05 UTC (rev 8007) @@ -1181,7 +1181,7 @@ final List<Equipment> equipList = getPc().getEquipmentListInOutputOrder(merge); for ( Equipment eq : equipList ) { - if (eq.getBonusListString("AC") && !eq.isArmor() && !eq.isShield()) + if (eq.hasBonusWithInfo(getPc(), "AC") && !eq.isArmor() && !eq.isShield()) { aList.add(eq); } Modified: Trunk/pcgen/code/src/java/pcgen/core/analysis/BonusAddition.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/analysis/BonusAddition.java 2008-10-10 00:43:05 UTC (rev 8006) +++ Trunk/pcgen/code/src/java/pcgen/core/analysis/BonusAddition.java 2008-10-10 02:15:05 UTC (rev 8007) @@ -19,6 +19,9 @@ */ package pcgen.core.analysis; +import java.util.List; + +import pcgen.cdom.enumeration.AssociationListKey; import pcgen.core.PObject; import pcgen.core.PlayerCharacter; import pcgen.core.bonus.Bonus; @@ -46,7 +49,16 @@ PlayerCharacter aPC, PObject target, boolean addOnceOnly) { bonusString = target.bonusStringPrefix() + makeBonusString(bonusString, chooseString, aPC); - target.addBonusList(bonusString, addOnceOnly); + + final BonusObj aBonus = Bonus.newBonus(bonusString); + + if (aBonus != null) + { + aBonus.setCreatorObject(target); + aBonus.setAddOnceOnly(addOnceOnly); + aPC.addAssoc(target, AssociationListKey.BONUS, aBonus); + } + target.addSave("BONUS|" + bonusString); } @@ -65,33 +77,35 @@ { String bonus = target.bonusStringPrefix() + makeBonusString(bonusString, chooseString, aPC); - int index = -1; + BonusObj toRemove = null; BonusObj aBonus = Bonus.newBonus(bonus); String bonusStrRep = String.valueOf(aBonus); - if (target.getBonusList() != null) + List<BonusObj> bonusList = aPC.getAssocList(target, AssociationListKey.BONUS); + + if (bonusList != null) { int count = 0; - for (BonusObj listBonus : target.getBonusList()) + for (BonusObj listBonus : bonusList) { if (listBonus.getCreatorObject().equals(target) && listBonus.toString().equals(bonusStrRep)) { - index = count; + toRemove = listBonus; } count++; } } - if (index >= 0) + if (toRemove != null) { - target.getBonusList().remove(index); + aPC.removeAssoc(target, AssociationListKey.BONUS, toRemove); } else { Logging.errorPrint("removeBonus: Could not find bonus: " + bonus - + " in bonusList " + target.getBonusList()); + + " in bonusList " + bonusList); } target.removeSave("BONUS|" + bonus); Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/SAListChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/SAListChoiceManager.java 2008-10-10 00:43:05 UTC (rev 8006) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/SAListChoiceManager.java 2008-10-10 02:15:05 UTC (rev 8007) @@ -26,6 +26,7 @@ import java.util.List; import pcgen.base.lang.StringUtil; +import pcgen.cdom.enumeration.AssociationListKey; import pcgen.core.PObject; import pcgen.core.PlayerCharacter; import pcgen.core.analysis.BonusAddition; @@ -139,7 +140,7 @@ { aBonus.setCreatorObject(pobject); aBonus.setAddOnceOnly(true); - pobject.addBonusList(aBonus); + aPc.addAssoc(pobject, AssociationListKey.BONUS, aBonus); } break; } Modified: Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbility.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbility.java 2008-10-10 00:43:05 UTC (rev 8006) +++ Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbility.java 2008-10-10 02:15:05 UTC (rev 8007) @@ -461,10 +461,6 @@ { return new LevelAbilityClassSkills(aowner, aLevel, aString); } - else if (aString.startsWith("WEAPONBONUS")) - { - return new LevelAbilityWeaponBonus(aowner, aLevel, aString); - } else if (aString.startsWith("EQUIP")) { return new LevelAbilityEquipment(aowner, aLevel, aString); Modified: Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilitySpellCaster.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilitySpellCaster.java 2008-10-10 00:43:05 UTC (rev 8006) +++ Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilitySpellCaster.java 2008-10-10 02:15:05 UTC (rev 8007) @@ -24,18 +24,24 @@ package pcgen.core.levelability; +import java.util.Iterator; +import java.util.List; +import java.util.StringTokenizer; + +import pcgen.cdom.enumeration.AssociationListKey; import pcgen.cdom.enumeration.StringKey; -import pcgen.core.*; +import pcgen.core.Globals; +import pcgen.core.PCClass; +import pcgen.core.PObject; +import pcgen.core.PlayerCharacter; +import pcgen.core.bonus.Bonus; +import pcgen.core.bonus.BonusObj; import pcgen.core.pclevelinfo.PCLevelInfo; import pcgen.util.Logging; import pcgen.util.chooser.ChooserInterface; -import java.util.Iterator; -import java.util.List; -import java.util.StringTokenizer; - /** * Class for adding a level of a spellcasting class to a character as part of * levelling up. @@ -122,9 +128,14 @@ aPC.incrementClassLevel(0, theClass); theClass = aPC.getClassKeyed(classKey); } + final BonusObj aBonus = Bonus.newBonus("0|PCLEVEL|" + theClass.getKeyName() + "|1"); + + if (aBonus != null) + { + aBonus.setCreatorObject(owner); + aPC.addAssoc(owner, AssociationListKey.BONUS, aBonus); + } - owner.addBonusList("0|PCLEVEL|" + theClass.getKeyName() + "|1"); - // owner.addSave("BONUS|0|PCLEVEL|" + bClass.getKeyName() + "|1"); // to force spellbook update // for divine spellcasters Deleted: Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityWeaponBonus.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityWeaponBonus.java 2008-10-10 00:43:05 UTC (rev 8006) +++ Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityWeaponBonus.java 2008-10-10 02:15:05 UTC (rev 8007) @@ -1,173 +0,0 @@ -/** - * LevelAbilityWeaponBonus.java - * Copyright 2001 (C) Dmitry Jemerov - * - * 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 Jul 26, 2001, 10:15:09 PM - * - * $Id$ - */ -package pcgen.core.levelability; - -import pcgen.core.*; -import pcgen.core.pclevelinfo.PCLevelInfo; -import pcgen.util.chooser.ChooserInterface; - -import java.util.*; - -/** - * Represents a weapon proficiency that a character gets when gaining a level - * (an ADD:WEAPONBONUS entry in the LST file). - * - * @author Dmitry Jemerov <yo...@sp...> - * @version $Revision$ - */ -final class LevelAbilityWeaponBonus extends LevelAbility -{ - private String bonusMod; - private String bonusTag; - - LevelAbilityWeaponBonus(final PObject aowner, final int aLevel, final String aList) - { - super(aowner, aLevel, aList); - } - - /** - * Parses the comma-separated list of the ADD: field and returns the - * list of tokens to be shown in the chooser. - * @param bString - * @param aPC - * @return choices list - */ - List<String> getChoicesList(final String bString, final PlayerCharacter aPC) - { - final List<String> aArrayList = new ArrayList<String>(); - final StringTokenizer bTok = new StringTokenizer(bString.substring(12), "|", false); - bonusTag = bTok.nextToken(); - bonusMod = bTok.nextToken(); - - while (bTok.hasMoreTokens()) - { - final String cString = bTok.nextToken(); - - if (cString.startsWith("PCFEAT=") || cString.startsWith("PCFEAT.")) - { - final Ability aFeat = aPC.getFeatKeyed(cString.substring(7)); - - if (aFeat != null) - { - for (String assoc : aPC.getAssociationList(aFeat)) - { - if (!aArrayList.contains(assoc)) - { - aArrayList.add(assoc); - } - } - } - } - else if (cString.startsWith("FEAT=") || cString.startsWith("FEAT.")) - { - final Ability anAbility = Globals.getAbilityKeyed("FEAT", cString.substring(5)); - - if (anAbility != null) - { - final StringTokenizer aTok = new StringTokenizer(anAbility.getKeyName(), " ", false); - final String aName = aTok.nextToken(); // first word of name should match type of weaponprof - - for (WeaponProf wp : Globals - .getPObjectsOfType( - Globals.getContext().ref - .getConstructedCDOMObjects(WeaponProf.class), - aName)) - { - if (!aArrayList.contains(wp.getKeyName())) - { - aArrayList.add(wp.getKeyName()); - } - } - } - } - else if (cString.startsWith("ALL")) - { - for (WeaponProf wp : Globals.getContext().ref.getConstructedCDOMObjects(WeaponProf.class)) - { - if (!aArrayList.contains(wp.getKeyName())) - { - aArrayList.add(wp.getKeyName()); - } - } - } - else if (cString.startsWith("PCPROFLIST")) - { - for ( WeaponProf wp : aPC.getWeaponProfs() ) - { - if (!aArrayList.contains(wp.getKeyName())) - { - aArrayList.add(wp.getKeyName()); - } - } - } - else - { - final WeaponProf wp = Globals.getContext().ref.silentlyGetConstructedCDOMObject(WeaponProf.class, cString); - - if ((wp != null) && !aArrayList.contains(cString)) - { - aArrayList.add(cString); - } - } - } - - return aArrayList; - } - - /** - * Performs the initial setup of a chooser. - * @param c - * @param aPC - * @return String - */ - String prepareChooser(final ChooserInterface c, PlayerCharacter aPC) - { - super.prepareChooser(c, aPC); - c.setTitle("Select Weapon Prof"); - bonusTag = ""; - bonusMod = ""; - - return rawTagData; - } - - /** - * Process the choice selected by the user. - * @param selectedList - * @param aPC - * @param pcLevelInfo - * @param aArrayList - */ - public boolean processChoice(final List<String> aArrayList, final List<String> selectedList, final PlayerCharacter aPC, final PCLevelInfo pcLevelInfo) - { - final String bonusString = '|' + bonusTag + '|' + bonusMod; - - for ( String cString : selectedList ) - { - final String weaponProfString = "WEAPONPROF=" + cString + bonusString; - - owner.addBonusList((new StringBuffer("0|").append(weaponProfString)).toString()); - owner.addSave((new StringBuffer("BONUS|0|").append(weaponProfString)).toString()); - } - return true; - } -} Modified: Trunk/pcgen/code/src/java/pcgen/core/term/PCCountEqTypeTermEvaluator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/term/PCCountEqTypeTermEvaluator.java 2008-10-10 00:43:05 UTC (rev 8006) +++ Trunk/pcgen/code/src/java/pcgen/core/term/PCCountEqTypeTermEvaluator.java 2008-10-10 02:15:05 UTC (rev 8007) @@ -84,7 +84,7 @@ pc.getEquipmentListInOutputOrder(merge); for ( Equipment eq : equipList ) { - if (eq.getBonusListString("AC") && !eq.isArmor() && !eq.isShield()) + if (eq.hasBonusWithInfo(pc, "AC") && !eq.isArmor() && !eq.isShield()) { aList.add(eq); } Modified: Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassLevelPanel.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassLevelPanel.java 2008-10-10 00:43:05 UTC (rev 8006) +++ Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassLevelPanel.java 2008-10-10 02:15:05 UTC (rev 8007) @@ -232,7 +232,7 @@ } } - final Iterator<BonusObj> bonusIter = obj.getBonusList().iterator(); + final Iterator<BonusObj> bonusIter = obj.getSafeListFor(ListKey.BONUS).iterator(); while (bonusIter.hasNext()) { @@ -326,6 +326,20 @@ } } + for (BonusObj bonus : pcl.getSafeListFor(ListKey.BONUS)) + { + String bonusValue = bonus.toString(); + String levelString = cl.toString(); + + if (bonusValue.startsWith(levelString)) + { + bonusValue = bonusValue.substring(levelString.length() + 1); + } + + LevelTag lt = new LevelTag(cl, LevelTag.TAG_BONUS, bonusValue); + levelTagList.add(lt); + } + } String s = obj.getRegionString(); Modified: Trunk/pcgen/code/src/java/pcgen/gui/editor/EditorMainForm.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/editor/EditorMainForm.java 2008-10-10 00:43:05 UTC (rev 8006) +++ Trunk/pcgen/code/src/java/pcgen/gui/editor/EditorMainForm.java 2008-10-10 02:15:05 UTC (rev 8007) @@ -90,6 +90,7 @@ import pcgen.core.SubstitutionClass; import pcgen.core.Vision; import pcgen.core.WeaponProf; +import pcgen.core.bonus.Bonus; import pcgen.core.bonus.BonusObj; import pcgen.core.prereq.Prerequisite; import pcgen.core.spell.Spell; @@ -616,7 +617,7 @@ pnlMainTab.updateData(thisPObject); - thisPObject.clearBonusList(); + thisPObject.removeListFor(ListKey.BONUS); thisPObject.removeAllVariables(); thisPObject.removeListFor(ListKey.DAMAGE_REDUCTION); thisPObject.clearPrerequisiteList(); @@ -806,7 +807,13 @@ sb.append('|').append(aTok.nextToken()); sb.append("|PRESKILL:1,").append(skillName).append('=').append(skillRank); sb.append("|TYPE=Synergy.STACK"); - thisPObject.addBonusList(sb.toString()); + final BonusObj aBonus = Bonus.newBonus(sb.toString()); + + if (aBonus != null) + { + aBonus.setCreatorObject(thisPObject); + thisPObject.addToListFor(ListKey.BONUS, aBonus); + } } else { @@ -2172,7 +2179,7 @@ // // BONUS:SKILL|Ride|2|PRESKILL:1,Handle Animal=5|TYPE=Synergy.STACK // - for (Iterator<BonusObj> e = thisPObject.getBonusList().iterator(); e.hasNext();) + for (Iterator<BonusObj> e = thisPObject.getSafeListFor(ListKey.BONUS).iterator(); e.hasNext();) { parseSynergyBonus(e.next(), availableSkillList, selectedSkillList); } @@ -3052,7 +3059,7 @@ if (anEditType != EditorConstants.EDIT_CLASS) { - for (Iterator<BonusObj> e = thisPObject.getBonusList().iterator(); e.hasNext();) + for (Iterator<BonusObj> e = thisPObject.getSafeListFor(ListKey.BONUS).iterator(); e.hasNext();) { // updated 18 Jul 2003 -- sage_sam and 9 apr 2005 -- hunterc final BonusObj bonus = e.next(); Modified: Trunk/pcgen/code/src/java/pcgen/gui/editor/NaturalAttacksPanel.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/editor/NaturalAttacksPanel.java 2008-10-10 00:43:05 UTC (rev 8006) +++ Trunk/pcgen/code/src/java/pcgen/gui/editor/NaturalAttacksPanel.java 2008-10-10 02:15:05 UTC (rev 8007) @@ -50,10 +50,13 @@ import pcgen.cdom.base.Constants; import pcgen.cdom.enumeration.IntegerKey; +import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; import pcgen.cdom.enumeration.StringKey; import pcgen.cdom.inst.EquipmentHead; import pcgen.core.Equipment; +import pcgen.core.bonus.Bonus; +import pcgen.core.bonus.BonusObj; import pcgen.core.utils.MessageType; import pcgen.core.utils.ShowMessageDelegate; import pcgen.gui.utils.IconUtilitities; @@ -144,7 +147,13 @@ if (anInt > 1) { String bonusString = "WEAPON|ATTACKS|" + (anInt - 1); - anEquip.addBonusList(bonusString); + final BonusObj aBonus = Bonus.newBonus(bonusString); + + if (aBonus != null) + { + aBonus.setCreatorObject(anEquip); + anEquip.addToListFor(ListKey.BONUS, aBonus); + } } // Set the damage dice Modified: Trunk/pcgen/code/src/java/pcgen/gui/editor/RaceBasePanel.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/editor/RaceBasePanel.java 2008-10-10 00:43:05 UTC (rev 8006) +++ Trunk/pcgen/code/src/java/pcgen/gui/editor/RaceBasePanel.java 2008-10-10 02:15:05 UTC (rev 8007) @@ -41,6 +41,7 @@ import pcgen.cdom.content.LevelCommandFactory; import pcgen.cdom.enumeration.FormulaKey; import pcgen.cdom.enumeration.IntegerKey; +import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; import pcgen.cdom.enumeration.RaceType; import pcgen.cdom.formula.FixedSizeFormula; @@ -345,7 +346,7 @@ StringBuffer sb = new StringBuffer(); sb.append("FEAT|POOL|").append(getBonusFeats()); final BonusObj bon = Bonus.newBonus(sb.toString()); - thisRace.addBonusList(bon); + thisRace.addToListFor(ListKey.BONUS, bon); thisRace.put(IntegerKey.SKILL_POINTS_PER_LEVEL, getBonusSkillPoints()); thisRace.put(ObjectKey.CHALLENGE_RATING, getCR()); Modified: Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoTempMod.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoTempMod.java 2008-10-10 00:43:05 UTC (rev 8006) +++ Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoTempMod.java 2008-10-10 02:15:05 UTC (rev 8007) @@ -2414,7 +2414,7 @@ // first do PC's feats and other abilities for (Ability aFeat : pc.getFullAbilitySet()) { - for (BonusObj aBonus : aFeat.getBonusList(pc)) + for (BonusObj aBonus : aFeat.getRawBonusList(pc)) { if (aBonus.isTempBonus()) { @@ -2433,7 +2433,7 @@ { Ability aFeat = (Ability) fI.next(); - for (BonusObj aBonus : aFeat.getBonusList(pc)) + for (BonusObj aBonus : aFeat.getRawBonusList(pc)) { if (aBonus.isTempBonus() && aBonus @@ -2456,7 +2456,7 @@ continue; } - for (BonusObj aBonus : aSpell.getBonusList(pc)) + for (BonusObj aBonus : aSpell.getRawBonusList(pc)) { if (aBonus.isTempBonus()) { @@ -2476,7 +2476,7 @@ { continue; } - for (BonusObj aBonus : aCharacterSpell.getSpell().getBonusList(pc)) + for (BonusObj aBonus : aCharacterSpell.getSpell().getRawBonusList(pc)) { if (aBonus.isTempBonus()) { @@ -2510,7 +2510,7 @@ continue; } - for (BonusObj aBonus : aSpell.getBonusList(pc)) + for (BonusObj aBonus : aSpell.getRawBonusList(pc)) { //aBonus.getPrereqString(); @@ -2535,7 +2535,7 @@ // iterate thru all PC's equipment objects for (Equipment aEq : pc.getEquipmentList()) { - for (BonusObj aBonus : aEq.getBonusList(pc)) + for (BonusObj aBonus : aEq.getRawBonusList(pc)) { if (aBonus.isTempBonus()) { @@ -2556,7 +2556,7 @@ // iterate thru all PC's Classes for (PCClass aClass : pc.getClassList()) { - for (BonusObj aBonus : aClass.getBonusList(pc)) + for (BonusObj aBonus : aClass.getRawBonusList(pc)) { final int myLevel = aClass.getLevel(); final int level = aBonus.getPCLevel(); @@ -2582,7 +2582,7 @@ // Iterate through all the PC's Templates for (PCTemplate aTemp : pc.getTemplateList()) { - for (BonusObj aBonus : aTemp.getBonusList(pc)) + for (BonusObj aBonus : aTemp.getRawBonusList(pc)) { if (aBonus.isTempBonus()) { @@ -2597,7 +2597,7 @@ // do all Templates to get PREAPPLY:ANYPC for (PCTemplate aTemp : Globals.getContext().ref.getConstructedCDOMObjects(PCTemplate.class)) { - for (BonusObj aBonus : aTemp.getBonusList(pc)) + for (BonusObj aBonus : aTemp.getRawBonusList(pc)) { if (aBonus.isTempBonus() && aBonus @@ -2621,7 +2621,7 @@ List<Skill> skillList = new ArrayList<Skill>(pc.getSkillList()); for (Skill aSkill : skillList) { - for (BonusObj aBonus : aSkill.getBonusList(pc)) + for (BonusObj aBonus : aSkill.getRawBonusList(pc)) { if (aBonus.isTempBonus()) { Modified: Trunk/pcgen/code/src/java/pcgen/gui/tabs/spells/InfoPreparedSpells.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/tabs/spells/InfoPreparedSpells.java 2008-10-10 00:43:05 UTC (rev 8006) +++ Trunk/pcgen/code/src/java/pcgen/gui/tabs/spells/InfoPreparedSpells.java 2008-10-10 02:15:05 UTC (rev 8007) @@ -1107,7 +1107,7 @@ boolean canAdd = false; List<BonusObj> bonusList = BonusUtilities.getBonusFromList(anAbility - .getBonusList(pc), Bonus + .getRawBonusList(pc), Bonus .getBonusTypeFromName("PPCOST")); //$NON-NLS-1$ if (bonusList.size() == 0) { Modified: Trunk/pcgen/code/src/java/pcgen/io/ExportHandler.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/ExportHandler.java 2008-10-10 00:43:05 UTC (rev 8006) +++ Trunk/pcgen/code/src/java/pcgen/io/ExportHandler.java 2008-10-10 02:15:05 UTC (rev 8007) @@ -2013,7 +2013,7 @@ for (Equipment eq : aPC.getEquipmentListInOutputOrder()) { - if (eq.getBonusListString("AC") + if (eq.hasBonusWithInfo(aPC, "AC") && (!eq.isArmor() && !eq.isShield())) { aArrayList.add(eq); Modified: Trunk/pcgen/code/src/java/pcgen/io/PCGIOHandler.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/PCGIOHandler.java 2008-10-10 00:43:05 UTC (rev 8006) +++ Trunk/pcgen/code/src/java/pcgen/io/PCGIOHandler.java 2008-10-10 02:15:05 UTC (rev 8007) @@ -25,9 +25,28 @@ */ package pcgen.io; +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.util.ArrayList; +import java.util.List; +import java.util.StringTokenizer; + import pcgen.cdom.base.Constants; +import pcgen.cdom.enumeration.AssociationListKey; import pcgen.cdom.enumeration.ObjectKey; -import pcgen.core.*; +import pcgen.core.Ability; +import pcgen.core.AbilityCategory; +import pcgen.core.PCClass; +import pcgen.core.PlayerCharacter; +import pcgen.core.SettingsHandler; +import pcgen.core.SpecialAbility; +import pcgen.core.bonus.Bonus; +import pcgen.core.bonus.BonusObj; import pcgen.core.utils.MessageType; import pcgen.core.utils.ShowMessageDelegate; import pcgen.persistence.PersistenceLayerException; @@ -36,11 +55,6 @@ import pcgen.util.InputInterface; import pcgen.util.Logging; -import java.io.*; -import java.util.ArrayList; -import java.util.List; -import java.util.StringTokenizer; - /** * <code>PCGIOHandler</code><br> * Reading and Writing PlayerCharacters in PCGen's own format (PCG). @@ -387,7 +401,13 @@ String tmp = bString .substring(bString.indexOf('|') + 1); - aFeat.addBonusList(tmp); + final BonusObj b = Bonus.newBonus(tmp); + + if (b != null) + { + b.setCreatorObject(aFeat); + aPC.addAssoc(aFeat, AssociationListKey.BONUS, b); + } break; } Modified: Trunk/pcgen/code/src/java/pcgen/io/PCGVer0Parser.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/PCGVer0Parser.java 2008-10-10 00:43:05 UTC (rev 8006) +++ Trunk/pcgen/code/src/java/pcgen/io/PCGVer0Parser.java 2008-10-10 02:15:05 UTC (rev 8007) @@ -34,6 +34,7 @@ import pcgen.cdom.base.Constants; import pcgen.cdom.enumeration.AssociationKey; +import pcgen.cdom.enumeration.AssociationListKey; import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; import pcgen.cdom.list.CompanionList; @@ -59,6 +60,8 @@ import pcgen.core.SpecialProperty; import pcgen.core.analysis.DomainApplication; import pcgen.core.analysis.SkillRankControl; +import pcgen.core.bonus.Bonus; +import pcgen.core.bonus.BonusObj; import pcgen.core.character.CharacterSpell; import pcgen.core.character.EquipSet; import pcgen.core.character.Follower; @@ -454,7 +457,13 @@ if (token.startsWith("BONUS")) { - aClass.addBonusList(token.substring(6)); + final BonusObj aBonus = Bonus.newBonus(token.substring(6)); + + if (aBonus != null) + { + aBonus.setCreatorObject(aClass); + aPC.addAssoc(aClass, AssociationListKey.BONUS, aBonus); + } if (token.lastIndexOf("|PCLEVEL|") > -1) { @@ -1220,7 +1229,13 @@ if (aString.startsWith("BONUS") && (aString.length() > 6)) { - anAbility.addBonusList(aString.substring(6)); + final BonusObj aBonus = Bonus.newBonus(aString.substring(6)); + + if (aBonus != null) + { + aBonus.setCreatorObject(anAbility); + aPC.addAssoc(anAbility, AssociationListKey.BONUS, aBonus); + } } anAbility.addSave(aString); Modified: Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Parser.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Parser.java 2008-10-10 00:43:05 UTC (rev 8006) +++ Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Parser.java 2008-10-10 02:15:05 UTC (rev 8007) @@ -1619,7 +1619,13 @@ // TODO This doesn't seem to be written in Creator. if (dString.startsWith(TAG_BONUS + TAG_SEPARATOR)) { - aPCClass.addBonusList(dString.substring(6)); + final BonusObj aBonus = Bonus.newBonus(dString.substring(6)); + + if (aBonus != null) + { + aBonus.setCreatorObject(aPCClass); + thePC.addAssoc(aPCClass, AssociationListKey.BONUS, aBonus); + } } aPCClass.addSave(dString); @@ -2400,7 +2406,13 @@ // TODO - This never gets written to the file if (saveKey.startsWith(TAG_BONUS) && (saveKey.length() > 6)) { - ability.addBonusList(saveKey.substring(6)); + final BonusObj aBonus = Bonus.newBonus(saveKey.substring(6)); + + if (aBonus != null) + { + aBonus.setCreatorObject(ability); + thePC.addAssoc(ability, AssociationListKey.BONUS, aBonus); + } } ability.addSave(saveKey); @@ -2664,7 +2676,13 @@ if (saveKey.startsWith(TAG_BONUS) && (saveKey.length() > 6)) { - aFeat.addBonusList(saveKey.substring(6)); + final BonusObj aBonus = Bonus.newBonus(saveKey.substring(6)); + + if (aBonus != null) + { + aBonus.setCreatorObject(aFeat); + thePC.addAssoc(aFeat, AssociationListKey.BONUS, aBonus); + } } aFeat.addSave(saveKey); Modified: Trunk/pcgen/code/src/java/plugin/charactersheet/gui/ArmorPane.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/charactersheet/gui/ArmorPane.java 2008-10-10 00:43:05 UTC (rev 8006) +++ Trunk/pcgen/code/src/java/plugin/charactersheet/gui/ArmorPane.java 2008-10-10 02:15:05 UTC (rev 8007) @@ -268,7 +268,7 @@ { for (Equipment eq : pc.getEquipmentListInOutputOrder()) { - if (eq.getBonusListString(AC) + if (eq.hasBonusWithInfo(pc, AC) && (!eq.isArmor() && !eq.isShield())) { armorList.add(eq); Modified: Trunk/pcgen/code/src/java/plugin/exporttokens/ArmorToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/exporttokens/ArmorToken.java 2008-10-10 00:43:05 UTC (rev 8006) +++ Trunk/pcgen/code/src/java/plugin/exporttokens/ArmorToken.java 2008-10-10 02:15:05 UTC (rev 8007) @@ -294,7 +294,7 @@ && ((equipped == 3) || ((equipped == 2) && !eq.isEquipped()) || ((equipped == 1) && eq .isEquipped()))) { - if (eq.getBonusListString("AC") && !eq.isArmor() + if (eq.hasBonusWithInfo(aPC, "AC") && !eq.isArmor() && !eq.isShield()) { aArrayList.add(eq); @@ -422,7 +422,7 @@ { aArrayList.add(eq); } - else if (eq.getBonusListString("AC")) + else if (eq.hasBonusWithInfo(aPC, "AC")) { aArrayList.add(eq); } Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/BonusLst.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/BonusLst.java 2008-10-10 00:43:05 UTC (rev 8006) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/BonusLst.java 2008-10-10 02:15:05 UTC (rev 8007) @@ -4,7 +4,10 @@ */ package plugin.lsttokens; +import pcgen.cdom.enumeration.ListKey; import pcgen.core.PObject; +import pcgen.core.bonus.Bonus; +import pcgen.core.bonus.BonusObj; import pcgen.persistence.lst.GlobalLstToken; import java.util.regex.Pattern; @@ -28,6 +31,7 @@ */ /** * Returns token name + * * @return token name */ public String getTokenName() @@ -38,18 +42,35 @@ /** * Parse BONUS token and use it to add a bonus to a PObject * - * @param obj the object to make the bonus a part of - * @param value the text of the bonus - * @param anInt the level to add the bonus at - * @return true if the bonus added to the PObject is non null or false otherwise + * @param obj + * the object to make the bonus a part of + * @param value + * the text of the bonus + * @param anInt + * the level to add the bonus at + * @return true if the bonus added to the PObject is non null or false + * otherwise */ - public boolean parse(final PObject obj, - final String value, - final int anInt) + public boolean parse(final PObject obj, final String value, final int anInt) { - final String v = value.replaceAll(Pattern.quote("<this>"), obj.getKeyName()); - return (anInt > -9) ? - obj.addBonusList(anInt + "|" + v) : - obj.addBonusList(v); + final String v = value.replaceAll(Pattern.quote("<this>"), obj + .getKeyName()); + final BonusObj aBonus; + if (anInt > -9) + { + aBonus = Bonus.newBonus(anInt + "|" + v); + } + else + { + aBonus = Bonus.newBonus(v); + } + + if (aBonus != null) + { + aBonus.setCreatorObject(obj); + obj.addToListFor(ListKey.BONUS, aBonus); + } + + return (aBonus != null); } } Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/NaturalattacksLst.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/NaturalattacksLst.java 2008-10-10 00:43:05 UTC (rev 8006) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/NaturalattacksLst.java 2008-10-10 02:15:05 UTC (rev 8007) @@ -22,6 +22,7 @@ import pcgen.core.SettingsHandler; import pcgen.core.SizeAdjustment; import pcgen.core.WeaponProf; +import pcgen.core.bonus.Bonus; import pcgen.core.bonus.BonusObj; import pcgen.rules.context.Changes; import pcgen.rules.context.LoadContext; @@ -193,7 +194,13 @@ try { int bonusAttacks = Integer.parseInt(numAttacks) - 1; - anEquip.addBonusList("WEAPON|ATTACKS|" + bonusAttacks); + final BonusObj aBonus = Bonus.newBonus("WEAPON|ATTACKS|" + bonusAttacks); + + if (aBonus != null) + { + aBonus.setCreatorObject(anEquip); + anEquip.addToListFor(ListKey.BONUS, aBonus); + } } catch (NumberFormatException exc) { @@ -283,7 +290,7 @@ { sb.append(Constants.CHAR_ASTERISK); } - List<BonusObj> bonuses = eq.getBonusList(); + List<BonusObj> bonuses = eq.getListFor(ListKey.BONUS); if (bonuses == null || bonuses.isEmpty()) { sb.append("1"); Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/BonusToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/BonusToken.java 2008-10-10 00:43:05 UTC (rev 8006) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/BonusToken.java 2008-10-10 02:15:05 UTC (rev 8007) @@ -1,6 +1,9 @@ package plugin.lsttokens.equipmentmodifier; +import pcgen.cdom.enumeration.ListKey; import pcgen.core.EquipmentModifier; +import pcgen.core.bonus.Bonus; +import pcgen.core.bonus.BonusObj; import pcgen.persistence.lst.EquipmentModifierLstToken; /** @@ -16,7 +19,13 @@ public boolean parse(EquipmentModifier mod, String value) { - mod.addBonusList(value); - return true; + final BonusObj aBonus = Bonus.newBonus(value); + + if (aBonus != null) + { + aBonus.setCreatorObject(mod); + mod.addToListFor(ListKey.BONUS, aBonus); + } + return (aBonus != null); } } Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/pcclass/MonnonskillhdToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/pcclass/MonnonskillhdToken.java 2008-10-10 00:43:05 UTC (rev 8006) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/pcclass/MonnonskillhdToken.java 2008-10-10 02:15:05 UTC (rev 8007) @@ -1,6 +1,9 @@ package plugin.lsttokens.pcclass; +import pcgen.cdom.enumeration.ListKey; import pcgen.core.PCClass; +import pcgen.core.bonus.Bonus; +import pcgen.core.bonus.BonusObj; import pcgen.persistence.lst.PCClassLstToken; /** @@ -16,7 +19,13 @@ public boolean parse(PCClass pcclass, String value, int level) { - pcclass.addBonusList("0|MONNONSKILLHD|NUMBER|" + value); - return true; + final BonusObj aBonus = Bonus.newBonus("0|MONNONSKILLHD|NUMBER|" + value); + + if (aBonus != null) + { + aBonus.setCreatorObject(pcclass); + pcclass.addToListFor(ListKey.BONUS, aBonus); + } + return (aBonus != null); } } Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/pcclass/MonskillToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/pcclass/MonskillToken.java 2008-10-10 00:43:05 UTC (rev 8006) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/pcclass/MonskillToken.java 2008-10-10 02:15:05 UTC (rev 8007) @@ -1,6 +1,9 @@ package plugin.lsttokens.pcclass; +import pcgen.cdom.enumeration.ListKey; import pcgen.core.PCClass; +import pcgen.core.bonus.Bonus; +import pcgen.core.bonus.BonusObj; import pcgen.persistence.lst.PCClassLstToken; /** @@ -16,8 +19,13 @@ public boolean parse(PCClass pcclass, String value, int level) { - pcclass - .addBonusList("0|MONSKILLPTS|NUMBER|" + value + "|PRELEVELMAX:1"); - return true; + final BonusObj aBonus = Bonus.newBonus("0|MONSKILLPTS|NUMBER|" + value + "|PRELEVELMAX:1"); + + if (aBonus != null) + { + aBonus.setCreatorObject(pcclass); + pcclass.addToListFor(ListKey.BONUS, aBonus); + } + return (aBonus != null); } } Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/pointbuy/method/BonusToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/pointbuy/method/BonusToken.java 2008-10-10 00:43:05 UTC (rev 8006) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/pointbuy/method/BonusToken.java 2008-10-10 02:15:05 UTC (rev 8007) @@ -25,6 +25,7 @@ */ package plugin.lsttokens.pointbuy.method; +import pcgen.cdom.enumeration.ListKey; import pcgen.core.PObject; import pcgen.core.PointBuyMethod; import pcgen.core.bonus.BonusObj; @@ -55,7 +56,7 @@ return false; } - for (BonusObj bonus : dummy.getBonusList()) + for (BonusObj bonus : dummy.getSafeListFor(ListKey.BONUS)) { pbm.addBonusList(bonus); } Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/race/StartfeatsToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/race/StartfeatsToken.java 2008-10-10 00:43:05 UTC (rev 8006) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/race/StartfeatsToken.java 2008-10-10 02:15:05 UTC (rev 8007) @@ -1,5 +1,6 @@ package plugin.lsttokens.race; +import pcgen.cdom.enumeration.ListKey; import pcgen.core.Race; import pcgen.core.bonus.Bonus; import pcgen.core.bonus.BonusObj; @@ -36,7 +37,7 @@ final Prerequisite prereq = factory.parse(buf.toString()); bon.addPrerequisite(prereq); - race.addBonusList(bon); + race.addToListFor(ListKey.BONUS, bon); return tr... [truncated message content] |
From: <jde...@us...> - 2008-10-10 11:22:30
|
Revision: 8009 http://pcgen.svn.sourceforge.net/pcgen/?rev=8009&view=rev Author: jdempsey Date: 2008-10-10 10:26:21 +0000 (Fri, 10 Oct 2008) Log Message: ----------- Fix bug: [5.15.3] Custom Masterwork Equip gets name of "Masterwork" Issue#: 2146898 Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/EqModNameOpt.java Trunk/pcgen/code/src/java/pcgen/core/Equipment.java Trunk/pcgen/code/src/test/pcgen/core/EquipmentTest.java Modified: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/EqModNameOpt.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/EqModNameOpt.java 2008-10-10 04:43:15 UTC (rev 8008) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/EqModNameOpt.java 2008-10-10 10:26:21 UTC (rev 8009) @@ -64,9 +64,12 @@ { StringBuilder sb = new StringBuilder(100); sb.append(mod.getDisplayName()); - sb.append(" ("); - sb.append(associatedList(parent.getAssociationList(mod))); - sb.append(')'); + if (!parent.getAssociationList(mod).isEmpty()) + { + sb.append(" ("); + sb.append(associatedList(parent.getAssociationList(mod))); + sb.append(')'); + } return sb.toString().trim().replace('|', ' '); } }, Modified: Trunk/pcgen/code/src/java/pcgen/core/Equipment.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Equipment.java 2008-10-10 04:43:15 UTC (rev 8008) +++ Trunk/pcgen/code/src/java/pcgen/core/Equipment.java 2008-10-10 10:26:21 UTC (rev 8009) @@ -690,7 +690,7 @@ if (baseItem == null) { return getKeyName(); } - return baseItem.resolvesTo().getKeyName(); + return baseItem.resolvesTo().displayName; } /** Modified: Trunk/pcgen/code/src/test/pcgen/core/EquipmentTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/EquipmentTest.java 2008-10-10 04:43:15 UTC (rev 8008) +++ Trunk/pcgen/code/src/test/pcgen/core/EquipmentTest.java 2008-10-10 10:26:21 UTC (rev 8009) @@ -128,6 +128,15 @@ source); EquipmentModifier eqMod = Globals.getContext().ref.silentlyGetConstructedCDOMObject( EquipmentModifier.class, "PLUS1W"); + loader + .parseLine( + Globals.getContext(), + null, + "Masterwork KEY:MWORKW FORMATCAT:FRONT NAMEOPT:NORMAL TYPE:MasterworkQuality.Ammunition.Weapon COST:0 VISIBLE:QUALIFY ITYPE:Masterwork SOURCEPAGE:SRDEquipmentI.rtf BONUS:ITEMCOST|TYPE=Ammunition|6 BONUS:ITEMCOST|TYPE=Weapon|300 BONUS:WEAPON|TOHIT|1|TYPE=Enhancement ASSIGNTOALL:YES", + source); + eqMod = + Globals.getContext().ref.silentlyGetConstructedCDOMObject( + EquipmentModifier.class, "MWORKW"); } /***************************************************************************** @@ -393,4 +402,40 @@ assertEquals("Equip eqmod", "PLUS1W", aEquip.getEqModifierList(true).get(0).getKeyName()); assertEquals("Output", "Dummy$"+customProperties, aEquip.formatSaveLine('$', '=').trim()); } + + /** + * Validate naming items using the +1 modifier + */ + public void testGetItemNameFromModifiersPlus1() + { + EquipmentModifier eqMod = Globals.getContext().ref.silentlyGetConstructedCDOMObject( + EquipmentModifier.class, "PLUS1W"); + assertNotNull("Eqmod should be present", eqMod); + + Equipment aEquip = eq.clone(); + assertEquals("Name before modifier added", "Dummy", aEquip + .getItemNameFromModifiers()); + aEquip.addEqModifier(eqMod, true, getCharacter()); + assertEquals("Name after modifier added", "Dummy +1", aEquip + .getItemNameFromModifiers()); + + } + + /** + * Validate naming items using the masterwork equip modifier + */ + public void testGetItemNameFromModifiersMasterwork() + { + EquipmentModifier eqMod = Globals.getContext().ref.silentlyGetConstructedCDOMObject( + EquipmentModifier.class, "MWORKW"); + assertNotNull("Eqmod should be present", eqMod); + + Equipment aEquip = eq.clone(); + assertEquals("Name before modifier added", "Dummy", aEquip + .getItemNameFromModifiers()); + aEquip.addEqModifier(eqMod, true, getCharacter()); + assertEquals("Name after modifier added", "Masterwork Dummy", aEquip + .getItemNameFromModifiers()); + + } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-10-15 02:22:06
|
Revision: 8078 http://pcgen.svn.sourceforge.net/pcgen/?rev=8078&view=rev Author: thpr Date: 2008-10-15 01:52:08 +0000 (Wed, 15 Oct 2008) Log Message: ----------- CSKILL token update Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/AssociationListKey.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/PObject.java Trunk/pcgen/code/src/java/pcgen/core/chooser/SkillListChoiceManager.java Trunk/pcgen/code/src/java/pcgen/core/chooser/SkillsNamedToCSkillChoiceManager.java Trunk/pcgen/code/src/java/pcgen/gui/editor/EditorMainForm.java Trunk/pcgen/code/src/java/pcgen/io/PCGIOHandler.java Trunk/pcgen/code/src/java/plugin/lsttokens/CskillLst.java Trunk/pcgen/code/src/test/pcgen/core/chooser/ClassSkillsChoiceManagerTest.java Trunk/pcgen/code/src/test/pcgen/core/prereq/PreCSkillTest.java Added Paths: ----------- Trunk/pcgen/code/src/utest/plugin/lsttokens/CSkillLstTest.java Modified: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/AssociationListKey.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/AssociationListKey.java 2008-10-15 00:56:00 UTC (rev 8077) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/AssociationListKey.java 2008-10-15 01:52:08 UTC (rev 8078) @@ -66,6 +66,8 @@ public static final AssociationListKey<CDOMListObject<Spell>> CLASSSPELLLIST = new AssociationListKey<CDOMListObject<Spell>>(); + public static final AssociationListKey<Skill> CSKILL = new AssociationListKey<Skill>(); + public static final AssociationListKey<Skill> MONCSKILL = new AssociationListKey<Skill>(); public static final AssociationListKey<BonusObj> BONUS = new AssociationListKey<BonusObj>(); Modified: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java 2008-10-15 00:56:00 UTC (rev 8077) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java 2008-10-15 01:52:08 UTC (rev 8078) @@ -93,8 +93,6 @@ public final class ListKey<T> { public static final ListKey<Aspect> ASPECT = new ListKey<Aspect>(); - /** CLASS_SKILLS - a ListKey */ - public static final ListKey<String> CLASS_SKILLS = new ListKey<String>(); /** CROSS_CLASS_SKILLS - a ListKey */ public static final ListKey<String> CROSS_CLASS_SKILLS = new ListKey<String>(); /** FILE_ABILITY_CATEGORY - a ListKey */ @@ -242,6 +240,7 @@ public static final ListKey<CDOMReference<PCClass>> SERVES_AS_CLASS = new ListKey<CDOMReference<PCClass>>(); public static final ListKey<CDOMReference<Ability>> SERVES_AS_ABILITY = new ListKey<CDOMReference<Ability>>(); public static final ListKey<ChooseResultActor> CHOOSE_ACTOR = new ListKey<ChooseResultActor>(); + public static final ListKey<CDOMReference<Skill>> CSKILL = new ListKey<CDOMReference<Skill>>(); public static final ListKey<BonusObj> BONUS = new ListKey<BonusObj>(); public static final ListKey<String> UNARMED_DAMAGE = new ListKey<String>(); public static final ListKey<Capacity> CAPACITY = new ListKey<Capacity>(); Modified: Trunk/pcgen/code/src/java/pcgen/core/PCClass.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-10-15 00:56:00 UTC (rev 8077) +++ Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-10-15 01:52:08 UTC (rev 8078) @@ -4257,10 +4257,11 @@ put(vk, otherClass.get(vk)); } - if (otherClass.getCSkillList() != null) + if (otherClass.containsListFor(ListKey.CSKILL)) { - clearCSkills(); - addAllCSkills(otherClass.getCSkillList()); + removeListFor(ListKey.CSKILL); + addAllToListFor(ListKey.CSKILL, otherClass + .getListFor(ListKey.CSKILL)); } if (otherClass.getCcSkillList() != null) Modified: Trunk/pcgen/code/src/java/pcgen/core/PObject.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-10-15 00:56:00 UTC (rev 8077) +++ Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-10-15 01:52:08 UTC (rev 8078) @@ -241,103 +241,6 @@ } /** - * Adds entry to the CSkill list - * @param entry skill to add - */ - public final void addCSkill(String entry) - { - if (entry.startsWith(".CLEAR")) - { - if (".CLEAR".equals(entry)) - { - clearCSkills(); - } - else - { - if (entry.startsWith(".CLEAR")) - { - entry = entry.substring(7); - } - - if (entry.startsWith("TYPE.") || entry.startsWith("TYPE=")) - { - final String typeString = entry.substring(5); - - for (Skill skill : Globals.getContext().ref.getConstructedCDOMObjects(Skill.class)) - { - boolean toClear = true; - final StringTokenizer cTok = new StringTokenizer(typeString, "."); - - while (cTok.hasMoreTokens() && toClear) - { - if (!skill.isType(cTok.nextToken())) - { - toClear = false; - } - } - - if (toClear) - { - removeFromListFor(ListKey.CLASS_SKILLS, skill.getKeyName()); - } - } - } - else - { - removeFromListFor(ListKey.CLASS_SKILLS, entry); - } - } - } - else if (entry.startsWith("TYPE.") || entry.startsWith("TYPE=")) - { - for (Skill skill : Globals.getContext().ref.getConstructedCDOMObjects(Skill.class)) - { - if (skill.isType(entry.substring(5))) - { - addToListFor(ListKey.CLASS_SKILLS, skill.getKeyName()); - } - } - } - else if ("ALL".equals(entry)) - { - for (Skill skill : Globals.getContext().ref.getConstructedCDOMObjects(Skill.class)) - { - addToListFor(ListKey.CLASS_SKILLS, skill.getKeyName()); - } - } - else - { - addToListFor(ListKey.CLASS_SKILLS, entry); - } - } - - /** - * Adds all of the entries to the CSkills list - * @param entries list of entries - */ - public final void addAllCSkills(final List<String> entries) - { - addAllToListFor(ListKey.CLASS_SKILLS, entries); - } - - /** - * Clears the class skill list - */ - public void clearCSkills() - { - removeListFor(ListKey.CLASS_SKILLS); - } - - /** - * Get the list of class skills for this object - * @return the list of class skills for this object - */ - public final List<String> getCSkillList() - { - return getListFor(ListKey.CLASS_SKILLS); - } - - /** * Get the list of temporary bonuses for this list * @return the list of temporary bonuses for this list */ @@ -1450,12 +1353,6 @@ txt.append("\tCCSKILL:").append(StringUtil.join(ccSkillList, "|")); } - List<String> cSkillList = getCSkillList(); - if ((cSkillList != null) && (cSkillList.size() != 0)) - { - txt.append("\tCSKILL:").append(StringUtil.join(cSkillList, "|")); - } - aString = getChoiceString(); if ((aString != null) && (aString.length() != 0)) @@ -1989,44 +1886,33 @@ public final boolean hasCSkill(PlayerCharacter pc, final String aName) { - List<String> cSkillList = getCSkillList(); - if ((cSkillList == null) || cSkillList.isEmpty()) + List<CDOMReference<Skill>> cSkillList = getListFor(ListKey.CSKILL); + List<Skill> assocCSkill = pc.getAssocList(this, AssociationListKey.CSKILL); + if (cSkillList != null && !cSkillList.isEmpty()) { - return false; - } - - if (cSkillList.contains(aName)) - { - return true; - } - - if (cSkillList.contains("LIST")) - { - for (String aString : pc.getAssociationList(this)) + for (CDOMReference<Skill> ref : cSkillList) { - if (aName.startsWith(aString) || aString.startsWith(aName)) + //Have to do slow due to cloning :P + for (Skill sk : ref.getContainedObjects()) { - return true; + if (sk.getKeyName().equals(aName)) + { + return true; + } } } } - for (String aString : cSkillList) + if (assocCSkill != null && !assocCSkill.isEmpty()) { - if (aString.lastIndexOf('%') >= 0) + for (Skill sk : assocCSkill) { - aString = aString.substring(0, aString.length() - 1); - - if (aName.startsWith(aString)) + //Have to do slow due to cloning :P + if (sk.getKeyName().equals(aName)) { return true; } } - - if (aName.equalsIgnoreCase(aString)) - { - return true; - } } return false; Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/SkillListChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/SkillListChoiceManager.java 2008-10-15 00:56:00 UTC (rev 8077) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/SkillListChoiceManager.java 2008-10-15 01:52:08 UTC (rev 8078) @@ -26,7 +26,7 @@ import java.util.List; import java.util.StringTokenizer; -import pcgen.core.Ability; +import pcgen.cdom.enumeration.AssociationListKey; import pcgen.core.Globals; import pcgen.core.PObject; import pcgen.core.PlayerCharacter; @@ -109,16 +109,21 @@ PlayerCharacter pc, final String item) { super.associateChoice(pc, item); - - if (pobject != null && pobject instanceof Ability) - { - Ability ability = (Ability) pobject; - addSkillToAbility( ability, item ); - } + Skill sk = Globals.getContext().ref.silentlyGetConstructedCDOMObject( + Skill.class, item); + pc.addAssoc(pobject, AssociationListKey.CSKILL, sk); } - protected void addSkillToAbility( final Ability anAbility, final String aSkillKey ) + /** + * If pobject is an Ability object, clean up the list of Class skill associated + * with it. + * + * @param aPc + */ + @Override + protected void cleanUpAssociated(PlayerCharacter aPC) { - anAbility.addCSkill( aSkillKey ); + aPC.removeAllAssocs(pobject, AssociationListKey.CSKILL); + super.cleanUpAssociated(aPC); } } Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/SkillsNamedToCSkillChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/SkillsNamedToCSkillChoiceManager.java 2008-10-15 00:56:00 UTC (rev 8077) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/SkillsNamedToCSkillChoiceManager.java 2008-10-15 01:52:08 UTC (rev 8078) @@ -23,12 +23,12 @@ */ package pcgen.core.chooser; -import java.util.List; - +import pcgen.cdom.enumeration.AssociationListKey; import pcgen.core.Ability; import pcgen.core.Globals; import pcgen.core.PObject; import pcgen.core.PlayerCharacter; +import pcgen.core.Skill; /** * This is the chooser that deals with choosing a skill. @@ -56,7 +56,9 @@ super.associateChoice(pc, st); if (pobject != null && pobject instanceof Ability) { - pobject.addCSkill(st); + Skill sk = Globals.getContext().ref + .silentlyGetConstructedCDOMObject(Skill.class, st); + pc.addAssoc(pobject, AssociationListKey.CSKILL, sk); } } @@ -69,27 +71,7 @@ @Override protected void cleanUpAssociated(PlayerCharacter aPC) { - if (pobject != null && pobject instanceof Ability) - { - Ability anAbility = (Ability) pobject; - - List<String> skillList = anAbility.getCSkillList(); - if (skillList != null) - { - Ability globalAbility = Globals.getAbilityKeyed(anAbility - .getCategory(), pobject.getKeyName()); - List<String> globalList = globalAbility.getCSkillList(); - anAbility.clearCSkills(); - if (globalList != null) - { - skillList.retainAll(globalList); - for (String keepMe : skillList) - { - anAbility.addCSkill(keepMe); - } - } - } - } + aPC.removeAllAssocs(pobject, AssociationListKey.CSKILL); super.cleanUpAssociated(aPC); } } Modified: Trunk/pcgen/code/src/java/pcgen/gui/editor/EditorMainForm.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/editor/EditorMainForm.java 2008-10-15 00:56:00 UTC (rev 8077) +++ Trunk/pcgen/code/src/java/pcgen/gui/editor/EditorMainForm.java 2008-10-15 01:52:08 UTC (rev 8078) @@ -1042,10 +1042,17 @@ // // Save granted class skills // - thisPObject.clearCSkills(); + thisPObject.removeListFor(ListKey.CSKILL); sel = pnlSkills.getSelectedList(); - for(int i = 0; i < sel.length; i++) { - thisPObject.addCSkill(sel[i].toString()); + for (int i = 0; i < sel.length; i++) + { + Skill sk = context.ref.silentlyGetConstructedCDOMObject( + Skill.class, sel[i].toString()); + if (sk != null) + { + thisPObject.addToListFor(ListKey.CSKILL, + CDOMDirectSingleRef.getRef(sk)); + } } // @@ -2264,18 +2271,21 @@ } } - List<String> skills = thisPObject.getCSkillList(); + List<CDOMReference<Skill>> csk = thisPObject.getListFor(ListKey.CSKILL); - if (skills != null) + if (csk != null) { - for (Iterator<String> e = skills.iterator(); e.hasNext();) + for (CDOMReference<Skill> ref : csk) { - aString = e.next(); - selectedClassCrossClassList.add(aString); + for (Skill sk : ref.getContainedObjects()) + { + String key = sk.getKeyName(); + selectedClassCrossClassList.add(key); - if (availableClassCrossClassList.contains(aString)) - { - availableClassCrossClassList.remove(aString); + if (availableClassCrossClassList.contains(key)) + { + availableClassCrossClassList.remove(key); + } } } } @@ -2283,7 +2293,7 @@ pnlSkills.setSelectedList(selectedClassCrossClassList, true); List<String> selectedCCSkillList = new ArrayList<String>(); - skills = thisPObject.getCcSkillList(); + List<String> skills = thisPObject.getCcSkillList(); if (skills != null) { Modified: Trunk/pcgen/code/src/java/pcgen/io/PCGIOHandler.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/PCGIOHandler.java 2008-10-15 00:56:00 UTC (rev 8077) +++ Trunk/pcgen/code/src/java/pcgen/io/PCGIOHandler.java 2008-10-15 01:52:08 UTC (rev 8078) @@ -41,16 +41,16 @@ import pcgen.cdom.enumeration.ObjectKey; import pcgen.core.Ability; import pcgen.core.AbilityCategory; +import pcgen.core.Globals; import pcgen.core.PCClass; import pcgen.core.PlayerCharacter; import pcgen.core.SettingsHandler; +import pcgen.core.Skill; import pcgen.core.SpecialAbility; import pcgen.core.bonus.Bonus; import pcgen.core.bonus.BonusObj; import pcgen.core.utils.MessageType; import pcgen.core.utils.ShowMessageDelegate; -import pcgen.persistence.PersistenceLayerException; -import pcgen.persistence.lst.PObjectLoader; import pcgen.util.InputFactory; import pcgen.util.InputInterface; import pcgen.util.Logging; @@ -475,19 +475,16 @@ } else if (aFeat.getChoiceString().startsWith("NONCLASSSKILLLIST|")) { - // - // Byngl July 12, 2002 - // for (String skillString : currentPC.getAssociationList(aFeat)) { - try + Skill skill = Globals.getContext().ref + .silentlyGetConstructedCDOMObject(Skill.class, + skillString); + if (skill != null) { - PObjectLoader.parseTag(aFeat, "CSKILL:" + skillString); + currentPC.addAssoc(aFeat, AssociationListKey.CSKILL, + skill); } - catch (PersistenceLayerException e) - { - e.printStackTrace(); - } } } Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/CskillLst.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/CskillLst.java 2008-10-15 00:56:00 UTC (rev 8077) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/CskillLst.java 2008-10-15 01:52:08 UTC (rev 8078) @@ -4,34 +4,229 @@ */ package plugin.lsttokens; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; import java.util.StringTokenizer; -import pcgen.core.PObject; -import pcgen.persistence.lst.GlobalLstToken; +import pcgen.cdom.base.CDOMObject; +import pcgen.cdom.base.CDOMReference; +import pcgen.cdom.base.ChooseResultActor; +import pcgen.cdom.base.Constants; +import pcgen.cdom.enumeration.AssociationListKey; +import pcgen.cdom.enumeration.ListKey; +import pcgen.cdom.reference.PatternMatchingReference; +import pcgen.cdom.reference.ReferenceUtilities; +import pcgen.core.Globals; +import pcgen.core.PlayerCharacter; +import pcgen.core.Skill; +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; /** * @author djones4 - * + * */ -public class CskillLst implements GlobalLstToken +public class CskillLst extends AbstractToken implements + CDOMPrimaryToken<CDOMObject>, ChooseResultActor { - /* - * FIXME When this token is converted to the new syntax, a change needs to - * take place in PCGIOHandler, which is currently calling PObjectLoader - */ + private static final Class<Skill> SKILL_CLASS = Skill.class; + @Override public String getTokenName() { return "CSKILL"; } - public boolean parse(PObject obj, String value, int anInt) + public boolean parse(LoadContext context, CDOMObject obj, String value) { - final StringTokenizer tok = new StringTokenizer(value, "|"); + if (isEmpty(value) || hasIllegalSeparator('|', value)) + { + return false; + } + boolean first = true; + boolean foundAny = false; + boolean foundOther = false; + + StringTokenizer tok = new StringTokenizer(value, Constants.PIPE); while (tok.hasMoreTokens()) { - obj.addCSkill(tok.nextToken()); + String tokText = tok.nextToken(); + if (Constants.LST_DOT_CLEAR.equals(tokText)) + { + if (!first) + { + Logging.errorPrint(" Non-sensical " + getTokenName() + + ": .CLEAR was not the first list item"); + return false; + } + context.getObjectContext().removeList(obj, ListKey.CSKILL); + } + else if (tokText.startsWith(Constants.LST_DOT_CLEAR_DOT)) + { + CDOMReference<Skill> ref; + String clearText = tokText.substring(7); + if (Constants.LST_ALL.equals(clearText)) + { + ref = context.ref.getCDOMAllReference(SKILL_CLASS); + } + else + { + ref = TokenUtilities.getTypeOrPrimitive(context, + SKILL_CLASS, clearText); + } + if (ref == null) + { + Logging.errorPrint(" Error was encountered while parsing " + + getTokenName()); + return false; + } + context.getObjectContext().removeFromList(obj, ListKey.CSKILL, + ref); + } + else + { + /* + * Note this HAS to be done one-by-one, because the + * .clearChildNodeOfClass method above does NOT recognize the + * C/CC Skill object and therefore doesn't know how to search + * the sublists + */ + if (Constants.LST_ALL.equals(tokText)) + { + foundAny = true; + context.getObjectContext().addToList(obj, ListKey.CSKILL, + context.ref.getCDOMAllReference(SKILL_CLASS)); + } + else + { + foundOther = true; + if (Constants.LST_LIST.equals(tokText)) + { + context.getObjectContext().addToList(obj, + ListKey.CHOOSE_ACTOR, this); + } + else + { + CDOMReference<Skill> ref = getSkillReference(context, + tokText); + if (ref == null) + { + Logging + .errorPrint(" Error was encountered while parsing " + + getTokenName()); + return false; + } + context.getObjectContext().addToList(obj, + ListKey.CSKILL, ref); + } + } + } + first = false; } + if (foundAny && foundOther) + { + Logging.errorPrint("Non-sensical " + getTokenName() + + ": Contains ANY and a specific reference: " + value); + return false; + } return true; } + + private CDOMReference<Skill> getSkillReference(LoadContext context, + String tokText) + { + if (tokText.endsWith(Constants.LST_PATTERN)) + { + return new PatternMatchingReference<Skill>(Skill.class, context.ref + .getCDOMAllReference(SKILL_CLASS), tokText); + } + else + { + return TokenUtilities.getTypeOrPrimitive(context, SKILL_CLASS, + tokText); + } + } + + public String[] unparse(LoadContext context, CDOMObject obj) + { + Changes<CDOMReference<Skill>> changes = context.getObjectContext() + .getListChanges(obj, ListKey.CSKILL); + Changes<ChooseResultActor> listChanges = context.getObjectContext() + .getListChanges(obj, ListKey.CHOOSE_ACTOR); + List<String> list = new ArrayList<String>(); + Collection<CDOMReference<Skill>> removedItems = changes.getRemoved(); + if (removedItems != null && !removedItems.isEmpty()) + { + if (changes.includesGlobalClear()) + { + context.addWriteMessage("Non-sensical relationship in " + + getTokenName() + + ": global .CLEAR and local .CLEAR. performed"); + return null; + } + list.add(Constants.LST_DOT_CLEAR_DOT + + ReferenceUtilities.joinLstFormat(removedItems, + ",|.CLEAR.")); + } + Collection<ChooseResultActor> listRemoved = listChanges.getRemoved(); + if (listRemoved != null && !listRemoved.isEmpty()) + { + if (listRemoved.contains(this)) + { + list.add(".CLEAR.LIST"); + } + } + if (changes.includesGlobalClear()) + { + list.add(Constants.LST_DOT_CLEAR); + } + Collection<CDOMReference<Skill>> added = changes.getAdded(); + if (added != null && !added.isEmpty()) + { + list.add(ReferenceUtilities.joinLstFormat(added, Constants.PIPE)); + } + Collection<ChooseResultActor> listAdded = listChanges.getAdded(); + if (listAdded != null && !listAdded.isEmpty()) + { + if (listAdded.contains(this)) + { + list.add("LIST"); + } + } + if (list.isEmpty()) + { + return null; + } + return list.toArray(new String[list.size()]); + } + + public Class<CDOMObject> getTokenClass() + { + return CDOMObject.class; + } + + public void apply(PlayerCharacter pc, CDOMObject obj, String o) + { + Skill skill = Globals.getContext().ref + .silentlyGetConstructedCDOMObject(SKILL_CLASS, o); + if (skill != null) + { + pc.addAssoc(obj, AssociationListKey.CSKILL, skill); + } + } + + public void remove(PlayerCharacter pc, CDOMObject obj, String o) + { + Skill skill = Globals.getContext().ref + .silentlyGetConstructedCDOMObject(SKILL_CLASS, o); + if (skill != null) + { + pc.removeAssoc(obj, AssociationListKey.CSKILL, skill); + } + } } Modified: Trunk/pcgen/code/src/test/pcgen/core/chooser/ClassSkillsChoiceManagerTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/chooser/ClassSkillsChoiceManagerTest.java 2008-10-15 00:56:00 UTC (rev 8077) +++ Trunk/pcgen/code/src/test/pcgen/core/chooser/ClassSkillsChoiceManagerTest.java 2008-10-15 01:52:08 UTC (rev 8078) @@ -30,11 +30,15 @@ import java.util.List; import pcgen.AbstractCharacterTestCase; +import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.SkillArmorCheck; +import pcgen.core.Globals; import pcgen.core.PCClass; import pcgen.core.PObject; import pcgen.core.PlayerCharacter; import pcgen.core.Race; +import pcgen.core.Skill; +import pcgen.rules.context.LoadContext; import pcgen.util.TestHelper; /** @@ -77,11 +81,12 @@ "Intelligence.Knowledge", "INT", false, SkillArmorCheck.NONE); pcClass = new PCClass(); - pcClass.addCSkill("KEY_Bluff"); - pcClass.addCSkill("KEY_Listen"); - pcClass.addCSkill("TYPE.Knowledge"); + LoadContext context = Globals.getContext(); + pcClass.addToListFor(ListKey.CSKILL, context.ref.getCDOMReference(Skill.class, "KEY_Bluff")); + pcClass.addToListFor(ListKey.CSKILL, context.ref.getCDOMReference(Skill.class, "KEY_Listen")); + pcClass.addToListFor(ListKey.CSKILL, context.ref.getCDOMTypeReference(Skill.class, "Knowledge")); pcClass.addCcSkill("KEY_Move Silently"); - + context.resolveReferences(); } myChar = getCharacter(); Modified: Trunk/pcgen/code/src/test/pcgen/core/prereq/PreCSkillTest.java =================================================================== --- Trunk/pcgen/code/src/test/pcgen/core/prereq/PreCSkillTest.java 2008-10-15 00:56:00 UTC (rev 8077) +++ Trunk/pcgen/code/src/test/pcgen/core/prereq/PreCSkillTest.java 2008-10-15 01:52:08 UTC (rev 8078) @@ -48,6 +48,9 @@ public class PreCSkillTest extends AbstractCharacterTestCase { PCClass myClass = new PCClass(); + private Skill spy1; + private Skill spy2; + private Skill spy3; public static void main(final String[] args) { @@ -87,7 +90,7 @@ assertTrue("Character has spot class skills", PrereqHandler.passes( prereq, character, null)); - myClass.addCSkill("Spy 1"); + myClass.addToListFor(ListKey.CSKILL, CDOMDirectSingleRef.getRef(spy1)); character.setDirty(true); //Need to throw out the cache assertTrue("Character has spot class skills", PrereqHandler.passes( @@ -98,7 +101,7 @@ assertFalse("Character has only one Spy Skill", PrereqHandler.passes( prereq, character, null)); - myClass.addCSkill("Spy 2"); + myClass.addToListFor(ListKey.CSKILL, CDOMDirectSingleRef.getRef(spy2)); character.setDirty(true); //Need to throw out the cache assertTrue("Character has 2 Spy class skills", PrereqHandler.passes( @@ -114,7 +117,7 @@ assertFalse("Character has only 2 Spy Skills", PrereqHandler.passes( prereq, character, null)); - myClass.addCSkill("Spy 3"); + myClass.addToListFor(ListKey.CSKILL, CDOMDirectSingleRef.getRef(spy3)); character.setDirty(true); //Need to throw out the cache prereq = factory.parse("PRECSKILL:3,Listen,TYPE.Spy"); @@ -154,8 +157,8 @@ Globals.getContext().ref.importObject(fee); - myClass.addCSkill("Foo"); - myClass.addCSkill("Fee"); + myClass.addToListFor(ListKey.CSKILL, CDOMDirectSingleRef.getRef(foo)); + myClass.addToListFor(ListKey.CSKILL, CDOMDirectSingleRef.getRef(fee)); prereq = factory.parse("PRECSKILL:1,Bar"); assertTrue("Character has 1 Listen Skill", PrereqHandler.passes(prereq, character, null)); @@ -198,17 +201,17 @@ listen.setName("Listen"); Globals.getContext().ref.importObject(listen); - Skill spy1 = new Skill(); + spy1 = new Skill(); spy1.setName("Spy 1"); spy1.setTypeInfo("Spy"); Globals.getContext().ref.importObject(spy1); - Skill spy2 = new Skill(); + spy2 = new Skill(); spy2.setName("Spy 2"); spy2.setTypeInfo("Spy"); Globals.getContext().ref.importObject(spy2); - Skill spy3 = new Skill(); + spy3 = new Skill(); spy3.setName("Spy 3"); spy3.setTypeInfo("Spy"); Globals.getContext().ref.importObject(spy3); Added: Trunk/pcgen/code/src/utest/plugin/lsttokens/CSkillLstTest.java =================================================================== --- Trunk/pcgen/code/src/utest/plugin/lsttokens/CSkillLstTest.java (rev 0) +++ Trunk/pcgen/code/src/utest/plugin/lsttokens/CSkillLstTest.java 2008-10-15 01:52:08 UTC (rev 8078) @@ -0,0 +1,105 @@ +/* + * 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 org.junit.Test; + +import pcgen.cdom.base.CDOMObject; +import pcgen.core.PCTemplate; +import pcgen.core.Skill; +import pcgen.persistence.PersistenceLayerException; +import pcgen.rules.persistence.CDOMLoader; +import pcgen.rules.persistence.token.CDOMPrimaryToken; +import plugin.lsttokens.testsupport.AbstractGlobalListTokenTestCase; +import plugin.lsttokens.testsupport.CDOMTokenLoader; + +public class CSkillLstTest extends AbstractGlobalListTokenTestCase<Skill> +{ + + @Override + public char getJoinCharacter() + { + return '|'; + } + + @Override + public Class<Skill> getTargetClass() + { + return Skill.class; + } + + @Override + public boolean isTypeLegal() + { + return true; + } + + @Override + public boolean isAllLegal() + { + return true; + } + + @Override + public boolean isClearDotLegal() + { + return true; + } + + @Override + public boolean isClearLegal() + { + return true; + } + + static CDOMPrimaryToken<CDOMObject> token = new CskillLst(); + static CDOMTokenLoader<PCTemplate> loader = new CDOMTokenLoader<PCTemplate>( + PCTemplate.class); + + @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 testRoundRobinList() throws PersistenceLayerException + { + runRoundRobin("LIST"); + } + + @Test + public void testRoundRobinListPlus() throws PersistenceLayerException + { + construct(primaryContext, "Foo"); + construct(secondaryContext, "Foo"); + runRoundRobin("Foo", "LIST"); + } +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |