From: <th...@us...> - 2008-10-14 23:25:53
|
Revision: 8076 http://pcgen.svn.sourceforge.net/pcgen/?rev=8076&view=rev Author: thpr Date: 2008-10-14 23:25:43 +0000 (Tue, 14 Oct 2008) Log Message: ----------- [ 2166912 ] Eliminate UDAM=CLASS. syntax update UDAM to new token syntax Issue#: 2166912 Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java Trunk/pcgen/code/src/java/pcgen/core/PCClass.java Trunk/pcgen/code/src/java/pcgen/core/PObject.java Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java Trunk/pcgen/code/src/java/pcgen/core/Race.java Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassLevelPanel.java Trunk/pcgen/code/src/java/pcgen/gui/editor/EditorMainForm.java Trunk/pcgen/code/src/java/plugin/lsttokens/UdamLst.java Modified: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java 2008-10-14 22:41:43 UTC (rev 8075) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java 2008-10-14 23:25:43 UTC (rev 8076) @@ -171,8 +171,6 @@ public static final ListKey<SpecialAbility> SPECIAL_ABILITY = new ListKey<SpecialAbility>(); /** TEMP_BONUS - a ListKey */ public static final ListKey<BonusObj> TEMP_BONUS = new ListKey<BonusObj>(); - /** UDAM - a ListKey */ - public static final ListKey<String> UDAM = new ListKey<String>(); /** Key for a list of virtual feats (feats granted regardless of the prereqs) */ public static final ListKey<Ability> VIRTUAL_FEATS = new ListKey<Ability>(); // /** Key for a list of weapon proficiencies */ @@ -245,6 +243,7 @@ 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>(); + public static final ListKey<String> UNARMED_DAMAGE = new ListKey<String>(); public static final ListKey<Capacity> CAPACITY = new ListKey<Capacity>(); private static CaseInsensitiveMap<ListKey<?>> map = null; Modified: Trunk/pcgen/code/src/java/pcgen/core/PCClass.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-10-14 22:41:43 UTC (rev 8075) +++ Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-10-14 23:25:43 UTC (rev 8076) @@ -1952,20 +1952,6 @@ // TODO - Add ABILITY tokens. - List<String> udamList = getListFor(ListKey.UDAM); - if ((udamList != null) && (udamList.size() != 0)) - { - for (int x = 0; x < udamList.size(); ++x) - { - String udamItem = udamList.get(x); - if (udamItem != null) - { - pccTxt.append(lineSep).append(String.valueOf(x)).append( - "\tUDAM:").append(udamList.get(x)); - } - } - } - return pccTxt.toString(); } @@ -2821,14 +2807,15 @@ return false; } - /* - * REFACTOR There is redundant information being sent in here (level - * and PlayerCharacter). + /** + * Get the unarmed Damage for this class at the given level. + * + * @param aLevel + * @param aPC + * @param adjustForPCSize + * @param includeCrit + * @return the unarmed damage string */ - /* - * PCCLASSLEVELONLY Since this is a level dependent calculation, this should - * be performed by the PCClassLevel. - */ String getUdamForLevel(int aLevel, final PlayerCharacter aPC, boolean adjustForPCSize) { @@ -2881,50 +2868,22 @@ // // Check the UDAM list for monk-like damage // - List<String> udamList = - ref.silentlyGetConstructedCDOMObject(PCClass.class, keyName).getListFor(ListKey.UDAM); - - if ((udamList != null) && !udamList.isEmpty()) + List<CDOMObject> classObjects = new ArrayList<CDOMObject>(); + //Negative increment to start at highest level until an UDAM is found + for (int i = aLevel; i >= 1; i--) { - if (udamList.size() == 1) + classObjects.add(getClassLevel(i)); + } + classObjects.add(this); + for (CDOMObject cdo : classObjects) + { + List<String> udam = cdo.getListFor(ListKey.UNARMED_DAMAGE); + if (udam != null) { - final String aString = udamList.get(0); - - if (aString.startsWith("CLASS=") - || aString.startsWith("CLASS.")) - { - final PCClass aClass = - ref.silentlyGetConstructedCDOMObject(PCClass.class, aString.substring(6)); - - if (aClass != null) - { - return aClass.getUdamForLevel(aLevel, aPC, - adjustForPCSize); - } - - Logging.errorPrint(keyName + " refers to " - + aString.substring(6) + " which isn't loaded."); - - return aDamage; - } + aDamage = udam.get(iSize); + break; } - - final StringTokenizer aTok = new StringTokenizer(udamList.get(Math - .min(Math.max(aLevel, 0), udamList.size() - 1)), ",", false); - - while ((iSize > -1) && aTok.hasMoreTokens()) - { - aDamage = aTok.nextToken(); - - if (iSize == 0) - { - break; - } - - iSize -= 1; - } } - return aDamage; } @@ -2948,7 +2907,7 @@ * @param aPC * The character we are adding the level to. * @param ignorePrereqs - * True if prereqs for the level should be ignored. Used in + * True if prereqs for the level should be ignored. Used in * situations such as when the character is being loaded. * @return true or false */ Modified: Trunk/pcgen/code/src/java/pcgen/core/PObject.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-10-14 22:41:43 UTC (rev 8075) +++ Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-10-14 23:25:43 UTC (rev 8076) @@ -393,24 +393,6 @@ } /** - * Add to the unarmed damage list (or clear the whole list) - * @param addString - */ - public final void clearUdamList() - { - removeListFor(ListKey.UDAM); - } - - /** - * Add to the unarmed damage list (or clear the whole list) - * @param addString - */ - public final void setUdamItem(String addString, int loc) - { - listChar.addToListAt(ListKey.UDAM, addString, loc); - } - - /** * Add a virtual feat to the character list * @param aFeat */ @@ -1709,34 +1691,6 @@ } } - /** - * <p>Retrieves the unarmed damage information for this PObject. This - * comes from the <code>UDAM</code> tag, and can be a simple die string - * as in <code>1d20</code>, or a list of size-modified data like is - * utilised for monk unarmed damage.</p> - * @param aPC - * @return A string representing the unarmed damage dice of the object. - */ - String getUdamForSize(int iSize) - { - final StringBuffer aString = new StringBuffer(getElementInList(ListKey.UDAM, 0)); - - final StringTokenizer aTok = new StringTokenizer(aString.toString(), ",", false); - - while ((iSize > -1) && aTok.hasMoreTokens()) - { - aString.replace(0, aString.length(), aTok.nextToken()); - - if (iSize == 0) - { - break; - } - - iSize -= 1; - } - return aString.toString(); - } - /** * Add automatic tags to a list * For example, tag = "ARMORPROF", aList is list of armor proficiencies Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-10-14 22:41:43 UTC (rev 8075) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-10-14 23:25:43 UTC (rev 8076) @@ -7106,17 +7106,18 @@ { continue; } - // the assumption is that there is only one UDAM: tag for things other than class - if (pObj.containsListFor(ListKey.UDAM)) + List<String> unarmedDamage = pObj.getListFor(ListKey.UNARMED_DAMAGE); + if (unarmedDamage == null) { - pObjDamage = - PlayerCharacterUtilities.getBestUDamString(pObjDamage, pObj.getUdamForSize(sizeInt)); + continue; } + retString = PlayerCharacterUtilities.getBestUDamString(retString, + unarmedDamage.get(sizeInt)); } if (pObjDamage == null) { // If no UDAM exists, just grab default damage for the race, Michael Osterlie - pObjDamage = getRace().getUdam(); + pObjDamage = getRace().getUdam(this); } else { @@ -7125,18 +7126,19 @@ retString = PlayerCharacterUtilities.getBestUDamString(retString, pObjDamage); + // string is in form sides|damage, just return damage portion + StringBuilder ret = new StringBuilder(retString.substring(retString + .indexOf('|') + 1)); if (includeStrBonus) { - int b = (int) getStatBonusTo("DAMAGE", "TYPE.MELEE"); - b += (int) getStatBonusTo("DAMAGE", "TYPE=MELEE"); - if (b != 0) + int sb = (int) getStatBonusTo("DAMAGE", "TYPE.MELEE"); + sb += (int) getStatBonusTo("DAMAGE", "TYPE=MELEE"); + if (sb != 0) { - retString = retString + Delta.toString(b); + ret.append(Delta.toString(sb)); } } - - // string is in form sides|damage, just return damage portion - return retString.substring(retString.indexOf('|') + 1); + return ret.toString(); } public boolean getUseMasterSkill() Modified: Trunk/pcgen/code/src/java/pcgen/core/Race.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Race.java 2008-10-14 22:41:43 UTC (rev 8075) +++ Trunk/pcgen/code/src/java/pcgen/core/Race.java 2008-10-14 23:25:43 UTC (rev 8076) @@ -70,14 +70,12 @@ /** * Retrieve Unarmed Damage according to the Race + * @param pc TODO * @return UDAM damage die (ie 1d3) */ - public String getUdam() + public String getUdam(PlayerCharacter pc) { - /* - * TODO This has pc == null, which could be a problem - */ - final int iSize = getSafe(FormulaKey.SIZE).resolve(null, "").intValue(); + final int iSize = getSafe(FormulaKey.SIZE).resolve(pc, "").intValue(); final SizeAdjustment defAdj = SettingsHandler.getGame().getDefaultSizeAdjustment(); final SizeAdjustment sizAdj = Modified: Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassLevelPanel.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassLevelPanel.java 2008-10-14 22:41:43 UTC (rev 8075) +++ Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassLevelPanel.java 2008-10-14 23:25:43 UTC (rev 8076) @@ -384,19 +384,14 @@ } } - List<String> sList = obj.getListFor(ListKey.UDAM); - - if (sList != null) + for (PCClassLevel pcl : obj.getClassLevelCollection()) { - for (int x = 0; x < sList.size(); ++x) + List<String> udam = pcl.getListFor(ListKey.UNARMED_DAMAGE); + if (udam != null) { - String c = sList.get(x); - - if (!c.equals("")) - { - LevelTag lt = new LevelTag(x + 1, LevelTag.TAG_UDAM, c); - levelTagList.add(lt); - } + LevelTag lt = new LevelTag(obj.getPCClassLevel(pcl), + LevelTag.TAG_UDAM, StringUtil.join(udam, ",")); + levelTagList.add(lt); } } Modified: Trunk/pcgen/code/src/java/pcgen/gui/editor/EditorMainForm.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/editor/EditorMainForm.java 2008-10-14 22:41:43 UTC (rev 8075) +++ Trunk/pcgen/code/src/java/pcgen/gui/editor/EditorMainForm.java 2008-10-14 23:25:43 UTC (rev 8076) @@ -971,11 +971,12 @@ thisPCClass.removeListFor(ListKey.TEMPLATE_CHOOSE); thisPCClass.removeListFor(ListKey.TEMPLATE_ADDCHOICE); thisPCClass.remove(IntegerKey.UMULT); + thisPCClass.removeListFor(ListKey.UNARMED_DAMAGE); for (PCClassLevel pcl : thisPCClass.getClassLevelCollection()) { pcl.remove(IntegerKey.UMULT); + pcl.removeListFor(ListKey.UNARMED_DAMAGE); } - thisPCClass.clearUdamList(); break; default: Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/UdamLst.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/UdamLst.java 2008-10-14 22:41:43 UTC (rev 8075) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/UdamLst.java 2008-10-14 23:25:43 UTC (rev 8076) @@ -4,44 +4,99 @@ */ package plugin.lsttokens; -import pcgen.core.PObject; -import pcgen.persistence.lst.GlobalLstToken; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.StringTokenizer; +import pcgen.base.lang.StringUtil; +import pcgen.cdom.base.CDOMObject; +import pcgen.cdom.base.Constants; +import pcgen.cdom.enumeration.ListKey; +import pcgen.rules.context.Changes; +import pcgen.rules.context.LoadContext; +import pcgen.rules.persistence.token.CDOMPrimaryToken; +import pcgen.util.Logging; + /** * @author djones4 * */ -public class UdamLst implements GlobalLstToken +public class UdamLst implements CDOMPrimaryToken<CDOMObject> { - /* - * FIXME Classes must be resolved/in context before this is converted due to - * undocumented "features" - */ - /* - * Note: Don't need to wait for Template's LevelToken before this can be converted - * as there is no level support in templates for this token - */ - public String getTokenName() { return "UDAM"; } - public boolean parse(PObject obj, String value, int anInt) + public boolean parse(LoadContext context, CDOMObject obj, String value) { - if (".CLEAR".equals(value)) + if (Constants.LST_DOT_CLEAR.equals(value)) { - obj.clearUdamList(); + /* + * TODO Need a hack for PCClass to clear all levels :( + */ + context.getObjectContext().removeList(obj, ListKey.UNARMED_DAMAGE); } - else if (anInt <= 0) - { - obj.setUdamItem(value, 0); - } else { - obj.setUdamItem(value, anInt); + final StringTokenizer tok = new StringTokenizer(value, + Constants.COMMA); + if (tok.countTokens() != 9) + { + Logging.errorPrint(getTokenName() + + " requires 9 comma separated values"); + return false; + } + if (context.getObjectContext().containsListFor(obj, + ListKey.UNARMED_DAMAGE)) + { + Logging.errorPrint(obj.getDisplayName() + " already has " + + getTokenName() + " set."); + Logging.errorPrint(" It will be redefined, " + + "but you should be using " + getTokenName() + + ":.CLEAR"); + context.getObjectContext().removeList(obj, + ListKey.UNARMED_DAMAGE); + } + while (tok.hasMoreTokens()) + { + context.getObjectContext().addToList(obj, + ListKey.UNARMED_DAMAGE, tok.nextToken()); + } } return true; } + + public String[] unparse(LoadContext context, CDOMObject obj) + { + Changes<String> changes = context.getObjectContext().getListChanges( + obj, ListKey.UNARMED_DAMAGE); + if (changes == null || changes.isEmpty()) + { + return null; + } + List<String> returnList = new ArrayList<String>(2); + if (changes.includesGlobalClear()) + { + returnList.add(Constants.LST_DOT_CLEAR); + } + Collection<String> list = changes.getAdded(); + if (list.size() == 9) + { + returnList.add(StringUtil.join(list, Constants.COMMA)); + } + if (returnList.isEmpty()) + { + // TODO Error + return null; + } + return returnList.toArray(new String[returnList.size()]); + } + + public Class<CDOMObject> getTokenClass() + { + return CDOMObject.class; + } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |