From: <za...@us...> - 2008-07-24 11:33:20
|
Revision: 7231 http://pcgen.svn.sourceforge.net/pcgen/?rev=7231&view=rev Author: zaister Date: 2008-07-24 11:33:29 +0000 (Thu, 24 Jul 2008) Log Message: ----------- [ 1999270 ] [PATHFINDER] FAVCLASS:CHOOSE improvements Implement CHOOSE:CLASS, however race object cannot call choosers directly - need workaround (First version, to be improved upon) Issue#: 1999270 Added Paths: ----------- Trunk/pcgen/code/src/java/pcgen/core/chooser/ClassChoiceManager.java Trunk/pcgen/code/src/java/plugin/lsttokens/choose/ClassToken.java Added: Trunk/pcgen/code/src/java/pcgen/core/chooser/ClassChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/ClassChoiceManager.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/ClassChoiceManager.java 2008-07-24 11:33:29 UTC (rev 7231) @@ -0,0 +1,171 @@ +/** + * ClassChoiceManager.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 2008 Stefan Radermacher <za...@us...> + */ + +package pcgen.core.chooser; + +import java.util.ArrayList; +import java.util.List; +import java.util.StringTokenizer; +import pcgen.core.Globals; +import pcgen.core.PCClass; +import pcgen.core.PObject; +import pcgen.core.PlayerCharacter; +import pcgen.rules.context.AbstractReferenceContext; + +// Referenced classes of package pcgen.core.chooser: +// AbstractBasicPObjectChoiceManager + +public class ClassChoiceManager extends AbstractBasicPObjectChoiceManager<PCClass> +{ + + /** + * Make a new PCClass chooser. + * + * @param aPObject + * @param choiceString + * @param aPC + */ + public ClassChoiceManager( + PObject aPObject, + String choiceString, + PlayerCharacter aPC) + { + super(aPObject, choiceString, aPC); + setTitle("Class Choice"); + } + + + /** + * Parse the Choice string and build a list of available choices. + * @param aPc + * @param availableList + * @param selectedList + */ + @Override + public void getChoices( + final PlayerCharacter aPc, + final List<PCClass> availableList, + final List<PCClass> selectedList) + { + AbstractReferenceContext refContext = Globals.getContext().ref; + for(String option : getChoiceList()) + { + StringTokenizer tok1 = new StringTokenizer(option, ","); + while(tok1.hasMoreTokens()) + { + String choice = tok1.nextToken(); + if("ANY".equals(choice)) + { + for (PCClass aClass : refContext.getConstructedCDOMObjects(PCClass.class)) + { + if(aClass.hasSubClass()) + { + for (PCClass aSubClass : aClass.getSubClassList()) + { + availableList.add(aSubClass); + } + } else + { + availableList.add(aClass); + } + } + } else + if(choice.startsWith("TYPE=")) + { + StringTokenizer tok2 = new StringTokenizer(choice.substring(5), "."); + List<String> typeList = new ArrayList<String>(); + while (tok2.hasMoreTokens()) + { + typeList.add(tok2.nextToken().toUpperCase()); + } + + for (PCClass aClass : refContext.getConstructedCDOMObjects(PCClass.class)) + { + boolean bMatch = true; + for (String type : typeList) + { + bMatch &= aClass.getTypeList(true).contains(type); + } + + if(bMatch) + { + if(aClass.hasSubClass()) + { + for (PCClass aSubClass : aClass.getSubClassList()) + { + availableList.add(aSubClass); + } + } else + { + availableList.add(aClass); + } + } + } + } else + { + int dotLoc = choice.indexOf("."); + if(dotLoc == -1) + { + PCClass aClass = refContext.silentlyGetConstructedCDOMObject(PCClass.class, choice); + if(aClass != null) + { + availableList.add(aClass); + if(aClass.hasSubClass()) + { + for (PCClass aSubClass : aClass.getSubClassList()) + { + availableList.add(aSubClass); + } + } + } + } else + { + String substring = choice.substring(0, dotLoc); + PCClass aClass = refContext.silentlyGetConstructedCDOMObject(PCClass.class, substring); + if(aClass != null) + { + PCClass aSubClass = aClass.getSubClassKeyed(choice.substring(dotLoc + 1)); + if(aSubClass != null) + { + availableList.add(aSubClass); + } + } + } + } + } + } + + List<String> classKeys = new ArrayList<String>(); + pobject.addAssociatedTo(classKeys); + for (String key : classKeys) + { + PCClass aClass = refContext.silentlyGetConstructedCDOMObject(PCClass.class, key); + if(aClass != null) + { + selectedList.add(aClass); + } + } + setPreChooserChoices(selectedList.size()); + } +} Added: Trunk/pcgen/code/src/java/plugin/lsttokens/choose/ClassToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/choose/ClassToken.java (rev 0) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/choose/ClassToken.java 2008-07-24 11:33:29 UTC (rev 7231) @@ -0,0 +1,95 @@ +/* + * Copyright 2007 (C) Thomas 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 plugin.lsttokens.choose; + +import java.util.StringTokenizer; + +import pcgen.cdom.base.Constants; +import pcgen.core.PObject; +import pcgen.persistence.lst.ChooseLstToken; +import pcgen.util.Logging; + +public class ClassToken implements ChooseLstToken +{ + + public boolean parse(PObject po, String prefix, String value) + { + if (value == null) + { + Logging.errorPrint("CHOOSE:" + getTokenName() + + " requires additional arguments"); + return false; + } + if (value.indexOf('|') != -1) + { + Logging.errorPrint("CHOOSE:" + getTokenName() + + " arguments may not contain | : " + value); + return false; + } + if (value.indexOf('[') != -1) + { + Logging.errorPrint("CHOOSE:" + getTokenName() + + " arguments may not contain [] : " + value); + return false; + } + if (value.charAt(0) == ',') + { + Logging.errorPrint("CHOOSE:" + getTokenName() + + " arguments may not start with , : " + value); + return false; + } + if (value.charAt(value.length() - 1) == ',') + { + Logging.errorPrint("CHOOSE:" + getTokenName() + + " arguments may not end with , : " + value); + return false; + } + if (value.indexOf(",,") != -1) + { + Logging.errorPrint("CHOOSE:" + getTokenName() + + " arguments uses double separator ,, : " + value); + return false; + } + StringTokenizer st = new StringTokenizer(value, Constants.PIPE); + while (st.hasMoreTokens()) + { + String tokString = st.nextToken(); + int equalsLoc = tokString.indexOf("="); + if (equalsLoc == tokString.length() - 1) + { + Logging.errorPrint("CHOOSE:" + getTokenName() + + " arguments must have value after = : " + tokString); + Logging.errorPrint(" entire token was: " + value); + return false; + } + } + StringBuilder sb = new StringBuilder(); + if (prefix.length() > 0) + { + sb.append(prefix).append('|'); + } + sb.append(getTokenName()).append('|').append(value); + po.setChoiceString(sb.toString()); + return true; + } + + public String getTokenName() + { + return "CLASS"; + } +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-08-04 22:48:00
|
Revision: 7337 http://pcgen.svn.sourceforge.net/pcgen/?rev=7337&view=rev Author: thpr Date: 2008-08-04 22:47:48 +0000 (Mon, 04 Aug 2008) Log Message: ----------- Global Kit Token Update Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/cdom/content/TransitionChoice.java Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java Trunk/pcgen/code/src/java/pcgen/core/AbilityUtilities.java Trunk/pcgen/code/src/java/pcgen/core/BioSet.java Trunk/pcgen/code/src/java/pcgen/core/PCClass.java Trunk/pcgen/code/src/java/pcgen/core/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/gui/editor/ClassLevelPanel.java Trunk/pcgen/code/src/java/plugin/lsttokens/KitLst.java Added Paths: ----------- Trunk/pcgen/code/src/java/pcgen/cdom/choiceset/QualifiedDecorator.java Removed Paths: ------------- Trunk/pcgen/code/src/java/pcgen/core/KitUtilities.java Added: Trunk/pcgen/code/src/java/pcgen/cdom/choiceset/QualifiedDecorator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/choiceset/QualifiedDecorator.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/cdom/choiceset/QualifiedDecorator.java 2008-08-04 22:47:48 UTC (rev 7337) @@ -0,0 +1,45 @@ +package pcgen.cdom.choiceset; + +import java.util.HashSet; +import java.util.Set; + +import pcgen.cdom.base.PrimitiveChoiceSet; +import pcgen.core.PObject; +import pcgen.core.PlayerCharacter; +import pcgen.core.prereq.PrereqHandler; + +public class QualifiedDecorator<T extends PObject> implements + PrimitiveChoiceSet<T> +{ + + private final PrimitiveChoiceSet<T> set; + + public <U> QualifiedDecorator(PrimitiveChoiceSet<T> underlyingSet) + { + set = underlyingSet; + } + + public Class<? super T> getChoiceClass() + { + return set.getChoiceClass(); + } + + public String getLSTformat() + { + return set.getLSTformat(); + } + + public Set<T> getSet(PlayerCharacter pc) + { + Set<T> returnSet = new HashSet<T>(); + for (T item : set.getSet(pc)) + { + if (PrereqHandler.passesAll(item.getPrerequisiteList(), pc, item)) + { + returnSet.add(item); + } + } + return returnSet; + } + +} Modified: Trunk/pcgen/code/src/java/pcgen/cdom/content/TransitionChoice.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/content/TransitionChoice.java 2008-08-04 22:38:39 UTC (rev 7336) +++ Trunk/pcgen/code/src/java/pcgen/cdom/content/TransitionChoice.java 2008-08-04 22:47:48 UTC (rev 7337) @@ -100,8 +100,7 @@ } c.setTitle(title); Set<? extends T> set = choices.getSet(pc); - - if (c.pickAll()) + if (c.pickAll() || intValue == set.size()) { return set; } Modified: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java 2008-08-04 22:38:39 UTC (rev 7336) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java 2008-08-04 22:47:48 UTC (rev 7337) @@ -42,6 +42,7 @@ import pcgen.core.Domain; import pcgen.core.Equipment; import pcgen.core.EquipmentModifier; +import pcgen.core.Kit; import pcgen.core.Language; import pcgen.core.PCTemplate; import pcgen.core.QualifiedObject; @@ -121,8 +122,6 @@ public static final ListKey<CampaignSourceEntry> FILE_WEAPON_PROF = new ListKey<CampaignSourceEntry>(); /** GAME_MODE - a ListKey */ public static final ListKey<String> GAME_MODE = new ListKey<String>(); - /** KITS - a ListKey */ - public static final ListKey<String> KITS = new ListKey<String>(); /** LICENSE - a ListKey */ public static final ListKey<String> LICENSE = new ListKey<String>(); /** LICENSE_FILE - a ListKey */ @@ -203,6 +202,7 @@ public static final ListKey<CDOMReference<PCTemplate>> REMOVE_TEMPLATES = new ListKey<CDOMReference<PCTemplate>>(); public static final ListKey<Vision> VISION_CACHE = new ListKey<Vision>(); public static final ListKey<TransitionChoice<?>> ADD = new ListKey<TransitionChoice<?>>(); + public static final ListKey<TransitionChoice<Kit>> KIT_CHOICE = new ListKey<TransitionChoice<Kit>>(); /** Private constructor to prevent instantiation of this class */ private ListKey() { Modified: Trunk/pcgen/code/src/java/pcgen/core/AbilityUtilities.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/AbilityUtilities.java 2008-08-04 22:38:39 UTC (rev 7336) +++ Trunk/pcgen/code/src/java/pcgen/core/AbilityUtilities.java 2008-08-04 22:47:48 UTC (rev 7337) @@ -24,6 +24,7 @@ package pcgen.core; import pcgen.cdom.base.CDOMReference; +import pcgen.cdom.content.TransitionChoice; import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; import pcgen.core.pclevelinfo.PCLevelInfo; @@ -418,10 +419,9 @@ if (addIt) { - final List<String> kitList = ability.getSafeListFor(ListKey.KITS); - for (int i = 0; i < kitList.size(); i++) + for (TransitionChoice<Kit> kit : ability.getSafeListFor(ListKey.KIT_CHOICE)) { - KitUtilities.makeKitSelections(0, kitList.get(i), 1, aPC); + kit.act(kit.driveChoice(aPC), aPC); } } Modified: Trunk/pcgen/code/src/java/pcgen/core/BioSet.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/BioSet.java 2008-08-04 22:38:39 UTC (rev 7336) +++ Trunk/pcgen/code/src/java/pcgen/core/BioSet.java 2008-08-04 22:47:48 UTC (rev 7337) @@ -26,6 +26,7 @@ package pcgen.core; import pcgen.cdom.base.Constants; +import pcgen.cdom.content.TransitionChoice; import pcgen.cdom.enumeration.ListKey; import pcgen.core.bonus.Bonus; import pcgen.core.bonus.BonusObj; @@ -353,15 +354,15 @@ if (aString.startsWith("KIT:")) { - temporaryPObject.setKitString("0|" + aString.substring(4)); + Globals.getContext().unconditionallyProcess(temporaryPObject, + "KIT", aString.substring(4)); } } pc.setArmorProfListStable(false); - List<String> l = temporaryPObject.getSafeListFor(ListKey.KITS); - for (int i = 0; i > l.size(); i++) + for (TransitionChoice<Kit> kit : temporaryPObject.getSafeListFor(ListKey.KIT_CHOICE)) { - KitUtilities.makeKitSelections(0, l.get(i), i, pc); + kit.act(kit.driveChoice(pc), pc); } pc.setHasMadeKitSelectionForAgeSet(ageSet, true); } Deleted: Trunk/pcgen/code/src/java/pcgen/core/KitUtilities.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/KitUtilities.java 2008-08-04 22:38:39 UTC (rev 7336) +++ Trunk/pcgen/code/src/java/pcgen/core/KitUtilities.java 2008-08-04 22:47:48 UTC (rev 7337) @@ -1,128 +0,0 @@ -/* - * Copyright 2001 (C) Bryan McRoberts <mer...@ya...> - * Copyright 2005 (C) Tom Parker <th...@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 - * - * Refactored out of PObject July 22, 2005 - * - * Current Ver: $Revision$ - * Last Editor: $Author$ - * Last Edited: $Date$ - */ -package pcgen.core; - -import java.util.ArrayList; -import java.util.List; -import java.util.StringTokenizer; -import pcgen.core.prereq.PrereqHandler; -import pcgen.util.Logging; -import pcgen.util.chooser.ChooserFactory; -import pcgen.util.chooser.ChooserInterface; - -/** - * @author Tom Parker <th...@so...> - * - * This is a utility class related to Kit objects. - */ -public final class KitUtilities -{ - private KitUtilities() - { - //Don't allow instantiation of utility class - } - - /** - * Make the Kit seclections - * @param arg - * @param kitString - * @param iKit - * @param aPC - */ - public static final void makeKitSelections(final int arg, final String kitString, final int iKit, final PlayerCharacter aPC) - { - final StringTokenizer aTok = new StringTokenizer(kitString, "|", false); - - // first element is prelevel - should be 0 for everything but PCClass entries - String tok = aTok.nextToken(); - int aLevel; - - try - { - aLevel = Integer.parseInt(tok); - } - catch (NumberFormatException e) - { - Logging.errorPrint("Badly formed kitString: " + tok); - aLevel = 0; - } - - if (aLevel > arg) - { - return; - } - - tok = aTok.nextToken(); - - int num; - - try - { - num = Integer.parseInt(tok); // number of kit selections - } - catch (NumberFormatException e) - { - Logging.errorPrint("Badly formed number of kit selections attribute: " + tok); - num = 0; - } - - List<Kit> aList = new ArrayList<Kit>(); - - while (aTok.hasMoreTokens()) - { - final String kitKey = aTok.nextToken(); - final Kit aKit = Globals.getContext().ref.silentlyGetConstructedCDOMObject(Kit.class, kitKey); - if (aKit == null) - { - Logging.errorPrint("Nonexistant kit: " + kitKey); - return; - } - if (PrereqHandler.passesAll(aKit.getPrerequisiteList(), aPC, aKit)) - { - aList.add(aKit); - } - } - - if (num != aList.size()) - { - final ChooserInterface c = ChooserFactory.getChooserInstance(); - c.setTitle("Kit Selection"); - c.setTotalChoicesAvail(num); - c.setPoolFlag(false); - c.setAvailableList(aList); - c.setVisible(true); - aList = c.getSelectedList(); - } - - if (aList.size() > 0) - { - for ( Kit kit : aList ) - { - Kit.applyKit( kit, aPC ); - } - } - } - -} Modified: Trunk/pcgen/code/src/java/pcgen/core/PCClass.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-08-04 22:38:39 UTC (rev 7336) +++ Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-08-04 22:47:48 UTC (rev 7337) @@ -2337,25 +2337,6 @@ "\tREGION:").append(regionString.substring(x + 1)); } - // if (kitString != null && !kitString.startsWith("0|")) - // { - // int x = kitString.indexOf('|'); - // pccTxt.append(lineSep + kitString.substring(0, - // x)).append("\tKIT:").append(kitString.substring(x + 1)); - // } - List<String> kits = getSafeListFor(ListKey.KITS); - for (int iKit = 0; iKit < kits.size(); ++iKit) - { - final String kitString = kits.get(iKit); - final int x = kitString.indexOf('|'); - - if (x >= 0) - { - pccTxt.append(lineSep + kitString.substring(0, x)).append( - "\tKIT:").append(kitString.substring(x + 1)); - } - } - pccTxt.append('\t'); pccTxt.append(StringUtil.joinToStringBuffer(Globals.getContext().unparse( this), "\t")); @@ -3897,19 +3878,18 @@ if (newLevel == 1) { - List<String> l = getSafeListFor(ListKey.KITS); - for (int i = 0; i > l.size(); i++) + for (TransitionChoice<Kit> kit : getSafeListFor(ListKey.KIT_CHOICE)) { - KitUtilities.makeKitSelections(0, l.get(i), i, aPC); + kit.act(kit.driveChoice(aPC), aPC); } makeRegionSelection(0, aPC); addAdds(aPC); } - List<String> l = getSafeListFor(ListKey.KITS); - for (int i = 0; i > l.size(); i++) + for (TransitionChoice<Kit> kit : getClassLevel(newLevel) + .getSafeListFor(ListKey.KIT_CHOICE)) { - KitUtilities.makeKitSelections(newLevel, l.get(i), i, aPC); + kit.act(kit.driveChoice(aPC), aPC); } makeRegionSelection(newLevel, aPC); @@ -5214,7 +5194,9 @@ addAllCcSkills(otherClass.getCcSkillList()); } - otherClass.setKitList(getSafeListFor(ListKey.KITS)); + removeListFor(ListKey.KIT_CHOICE); + addAllToListFor(ListKey.KIT_CHOICE, otherClass + .getSafeListFor(ListKey.KIT_CHOICE)); if (otherClass.getRegionString() != null) { Modified: Trunk/pcgen/code/src/java/pcgen/core/PObject.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-08-04 22:38:39 UTC (rev 7336) +++ Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-08-04 22:47:48 UTC (rev 7337) @@ -465,25 +465,6 @@ } /** - * Set the KIT string, should be in the form of #|KIT1|KIT2|KIT3|etc - * @param arg - */ - public final void setKitString(final String arg) - { - if (arg.equals(".CLEAR")) - { - removeListFor(ListKey.KITS); - } - else - { - if (!containsInList(ListKey.KITS, arg)) - { - addToListFor(ListKey.KITS, arg); - } - } - } - - /** * Get the level ability list for this object * @return the level ability list for this object */ @@ -2664,14 +2645,6 @@ txt.append("\tREGION:").append(regionString.substring(2)); } - for (String s : getSafeListFor(ListKey.KITS)) - { - if (s.startsWith("0|")) - { - txt.append("\tKIT:").append(s.substring(2)); - } - } - // SPELLLEVEL txt.append('\t').append(getSpellSupport().getPCCText()); @@ -2827,10 +2800,9 @@ protected void globalChecks(final boolean flag, final PlayerCharacter aPC) { aPC.setArmorProfListStable(false); - List<String> l = getSafeListFor(ListKey.KITS); - for (int i = 0; i > l.size(); i++) + for (TransitionChoice<Kit> kit : getSafeListFor(ListKey.KIT_CHOICE)) { - KitUtilities.makeKitSelections(0, l.get(i), i, aPC); + kit.act(kit.driveChoice(aPC), aPC); } makeRegionSelection(aPC); @@ -3524,16 +3496,6 @@ } /** - * Set the list of Kits - * @param l - */ - public void setKitList(List<String> l) - { - removeListFor(ListKey.KITS); - addAllToListFor(ListKey.KITS, l); - } - - /** * Get the Spell Support for this object * @return SpellSupport */ Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-08-04 22:38:39 UTC (rev 7336) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-08-04 22:47:48 UTC (rev 7337) @@ -66,6 +66,7 @@ import pcgen.cdom.content.HitDie; import pcgen.cdom.content.LevelCommandFactory; import pcgen.cdom.content.Modifier; +import pcgen.cdom.content.TransitionChoice; import pcgen.cdom.enumeration.AssociationKey; import pcgen.cdom.enumeration.FormulaKey; import pcgen.cdom.enumeration.Gender; @@ -2378,10 +2379,9 @@ } } - final List<String> kits = cMod.getSafeListFor(ListKey.KITS); - for (int i1 = 0; i1 < kits.size(); i1++) + for (TransitionChoice<Kit> kit : cMod.getSafeListFor(ListKey.KIT_CHOICE)) { - KitUtilities.makeKitSelections(0, kits.get(i1), i1, this); + kit.act(kit.driveChoice(this), this); } } setDirty(true); @@ -8183,11 +8183,6 @@ } } this.setArmorProfListStable(false); - List<String> l = inTmpl.getSafeListFor(ListKey.KITS); - for (int i1 = 0; i1 < l.size(); i1++) - { - KitUtilities.makeKitSelections(0, l.get(i1), i1, this); - } calcActiveBonuses(); Modified: Trunk/pcgen/code/src/java/pcgen/core/Skill.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Skill.java 2008-08-04 22:38:39 UTC (rev 7336) +++ Trunk/pcgen/code/src/java/pcgen/core/Skill.java 2008-08-04 22:47:48 UTC (rev 7337) @@ -28,6 +28,7 @@ import java.util.StringTokenizer; import pcgen.cdom.base.Constants; +import pcgen.cdom.content.TransitionChoice; import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; import pcgen.cdom.enumeration.SkillCost; @@ -613,10 +614,9 @@ protected void globalChecks(final boolean flag, final PlayerCharacter aPC) { aPC.setArmorProfListStable(false); - List<String> l = getSafeListFor(ListKey.KITS); - for (int i = 0; i > l.size(); i++) + for (TransitionChoice<Kit> kit : getSafeListFor(ListKey.KIT_CHOICE)) { - KitUtilities.makeKitSelections(0, l.get(i), i, aPC); + kit.act(kit.driveChoice(aPC), aPC); } makeRegionSelection(aPC); Modified: Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassLevelPanel.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassLevelPanel.java 2008-08-04 22:38:39 UTC (rev 7336) +++ Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassLevelPanel.java 2008-08-04 22:47:48 UTC (rev 7337) @@ -52,6 +52,7 @@ import pcgen.base.lang.StringUtil; import pcgen.cdom.base.CDOMReference; import pcgen.cdom.base.Constants; +import pcgen.cdom.content.TransitionChoice; import pcgen.cdom.enumeration.IntegerKey; import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.inst.PCClassLevel; @@ -61,6 +62,7 @@ import pcgen.core.Description; import pcgen.core.Domain; import pcgen.core.Globals; +import pcgen.core.Kit; import pcgen.core.LevelProperty; import pcgen.core.PCClass; import pcgen.core.PCSpell; @@ -332,22 +334,29 @@ } */ - for (Iterator<String> it = obj.getSafeListFor(ListKey.KITS).iterator(); it.hasNext();) + for (Iterator<TransitionChoice<Kit>> it = obj.getSafeListFor( + ListKey.KIT_CHOICE).iterator(); it.hasNext();) { - String s = it.next(); - int y = s.indexOf('|'); - String l = "1"; + TransitionChoice<Kit> s = it.next(); + LevelTag lt = new LevelTag(1, LevelTag.TAG_KIT, s.getCount() + "|" + + s.getChoices().getLSTformat()); + levelTagList.add(lt); + } - if (y > 0) + for (PCClassLevel pcl : obj.getClassLevelCollection()) + { + for (Iterator<TransitionChoice<Kit>> it = obj.getSafeListFor( + ListKey.KIT_CHOICE).iterator(); it.hasNext();) { - l = s.substring(0, y); - s = s.substring(y + 1); + TransitionChoice<Kit> s = it.next(); + LevelTag lt = new LevelTag(pcl.get(IntegerKey.LEVEL), + LevelTag.TAG_KIT, s.getCount() + "|" + + s.getChoices().getLSTformat()); + levelTagList.add(lt); } - - LevelTag lt = new LevelTag(l, LevelTag.TAG_KIT, s); - levelTagList.add(lt); } + String s = obj.getRegionString(); if ((s != null) && !s.equals("")) Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/KitLst.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/KitLst.java 2008-08-04 22:38:39 UTC (rev 7336) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/KitLst.java 2008-08-04 22:47:48 UTC (rev 7337) @@ -4,35 +4,146 @@ */ 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.Set; +import java.util.StringTokenizer; +import java.util.TreeSet; +import pcgen.base.formula.Formula; +import pcgen.cdom.base.CDOMObject; +import pcgen.cdom.base.CDOMReference; +import pcgen.cdom.base.ChoiceSet; +import pcgen.cdom.base.Constants; +import pcgen.cdom.base.FormulaFactory; +import pcgen.cdom.choiceset.QualifiedDecorator; +import pcgen.cdom.choiceset.ReferenceChoiceSet; +import pcgen.cdom.content.ChoiceActor; +import pcgen.cdom.content.TransitionChoice; +import pcgen.cdom.enumeration.ListKey; +import pcgen.core.Kit; +import pcgen.core.PlayerCharacter; +import pcgen.rules.context.Changes; +import pcgen.rules.context.LoadContext; +import pcgen.rules.persistence.token.AbstractToken; +import pcgen.rules.persistence.token.CDOMPrimaryToken; +import pcgen.util.Logging; + /** * @author djones4 - * + * */ -public class KitLst implements GlobalLstToken +public class KitLst extends AbstractToken implements + CDOMPrimaryToken<CDOMObject>, ChoiceActor<Kit> { - /* - * 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 - */ + private static final Class<Kit> KIT_CLASS = Kit.class; + + @Override public String getTokenName() { return "KIT"; } - public boolean parse(PObject obj, String value, int anInt) + public boolean parse(LoadContext context, CDOMObject pcc, String value) { - if (anInt > -9) + if (isEmpty(value) || hasIllegalSeparator('|', value)) { - obj.setKitString(anInt + "|" + value); + return false; } - else + StringTokenizer tok = new StringTokenizer(value, Constants.PIPE); + Formula count = FormulaFactory.getFormulaFor(tok.nextToken()); + if (!count.isStatic()) { - obj.setKitString("0|" + value); + Logging.addParseMessage(Logging.LST_ERROR, "Count in " + + getTokenName() + " must be a number"); + return false; } + if (count.resolve(null, "").intValue() <= 0) + { + Logging.addParseMessage(Logging.LST_ERROR, "Count in " + + getTokenName() + " must be > 0"); + return false; + } + if (!tok.hasMoreTokens()) + { + Logging.addParseMessage(Logging.LST_ERROR, getTokenName() + + " must have a | separating " + + "count from the list of possible values: " + value); + return false; + } + List<CDOMReference<Kit>> refs = new ArrayList<CDOMReference<Kit>>(); + boolean foundAny = false; + boolean foundOther = false; + + while (tok.hasMoreTokens()) + { + String token = tok.nextToken(); + CDOMReference<Kit> ref; + if (Constants.LST_ALL.equals(token)) + { + foundAny = true; + ref = context.ref.getCDOMAllReference(KIT_CLASS); + } + else + { + foundOther = true; + ref = context.ref.getCDOMReference(KIT_CLASS, token); + } + refs.add(ref); + } + + if (foundAny && foundOther) + { + Logging.addParseMessage(Logging.LST_ERROR, "Non-sensical " + + getTokenName() + + ": Contains ANY and a specific reference: " + value); + return false; + } + + ReferenceChoiceSet<Kit> rcs = new ReferenceChoiceSet<Kit>(refs); + ChoiceSet<Kit> cs = new ChoiceSet<Kit>(getTokenName(), + new QualifiedDecorator<Kit>(rcs)); + TransitionChoice<Kit> tc = new TransitionChoice<Kit>(cs, count); + context.obj.addToList(pcc, ListKey.KIT_CHOICE, tc); + tc.setTitle("Kit Selection"); + tc.setRequired(false); + tc.setChoiceActor(this); return true; } + + public String[] unparse(LoadContext context, CDOMObject pcc) + { + Changes<TransitionChoice<Kit>> changes = context.getObjectContext() + .getListChanges(pcc, ListKey.KIT_CHOICE); + if (changes == null || changes.isEmpty()) + { + // Zero indicates no Token + return null; + } + Collection<TransitionChoice<Kit>> added = changes.getAdded(); + Set<String> set = new TreeSet<String>(); + for (TransitionChoice<Kit> tc : added) + { + StringBuilder sb = new StringBuilder(); + sb.append(tc.getCount()); + sb.append(Constants.PIPE); + sb.append(tc.getChoices().getLSTformat().replaceAll( + Constants.COMMA, Constants.PIPE)); + set.add(sb.toString()); + } + return set.toArray(new String[set.size()]); + } + + public Class<CDOMObject> getTokenClass() + { + return CDOMObject.class; + } + + public void applyChoice(Kit choice, PlayerCharacter pc) + { + Kit.applyKit(choice, pc); + } + } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-08-04 22:53:20
|
Revision: 7338 http://pcgen.svn.sourceforge.net/pcgen/?rev=7338&view=rev Author: thpr Date: 2008-08-04 22:53:11 +0000 (Mon, 04 Aug 2008) Log Message: ----------- Global Move Token Update Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java Trunk/pcgen/code/src/java/pcgen/core/Movement.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/VariableProcessorPC.java Trunk/pcgen/code/src/java/pcgen/gui/editor/EditorMainForm.java Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoRaces.java Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoResources.java Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoSummary.java Trunk/pcgen/code/src/java/pcgen/gui/tabs/resources/AvailableFollowerModel.java Trunk/pcgen/code/src/java/plugin/lsttokens/MoveLst.java Trunk/pcgen/code/src/java/plugin/lsttokens/MovecloneLst.java Trunk/pcgen/code/src/java/plugin/pretokens/test/PreMoveTester.java Modified: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java 2008-08-04 22:47:48 UTC (rev 7337) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java 2008-08-04 22:53:11 UTC (rev 7338) @@ -44,6 +44,7 @@ import pcgen.core.EquipmentModifier; import pcgen.core.Kit; import pcgen.core.Language; +import pcgen.core.Movement; import pcgen.core.PCTemplate; import pcgen.core.QualifiedObject; import pcgen.core.SpecialAbility; @@ -203,6 +204,7 @@ public static final ListKey<Vision> VISION_CACHE = new ListKey<Vision>(); public static final ListKey<TransitionChoice<?>> ADD = new ListKey<TransitionChoice<?>>(); public static final ListKey<TransitionChoice<Kit>> KIT_CHOICE = new ListKey<TransitionChoice<Kit>>(); + public static final ListKey<Movement> MOVEMENT = new ListKey<Movement>(); /** Private constructor to prevent instantiation of this class */ private ListKey() { Modified: Trunk/pcgen/code/src/java/pcgen/core/Movement.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Movement.java 2008-08-04 22:47:48 UTC (rev 7337) +++ Trunk/pcgen/code/src/java/pcgen/core/Movement.java 2008-08-04 22:53:11 UTC (rev 7338) @@ -348,7 +348,7 @@ */ public String toLSTString() { - StringBuffer txt = new StringBuffer(); + StringBuilder txt = new StringBuilder(); txt.append("\tMOVE"); switch (moveRatesFlag) { @@ -360,6 +360,12 @@ break; } txt.append(':'); + addTokenContents(txt); + return txt.toString(); + } + + public void addTokenContents(StringBuilder txt) + { for (int index = 0; index < movementTypes.length; ++index) { if (index > 0) @@ -382,7 +388,6 @@ txt.append(new DecimalFormat("###0.#").format(movements[index])); } } - return txt.toString(); } /** Modified: Trunk/pcgen/code/src/java/pcgen/core/PCClass.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-08-04 22:47:48 UTC (rev 7337) +++ Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-08-04 22:53:11 UTC (rev 7338) @@ -109,11 +109,6 @@ } /* - * FINALALLCLASSLEVELS Since this applies to a ClassLevel line - */ - private List<LevelProperty<Movement>> movementList = null; - - /* * FUTURETYPESAFETY This is an interesting case of Type Safety, that may not be * possible, as this is a big magical in what it could be - School, * Subschool, and other things. Need lots of investigation as to what the @@ -5481,35 +5476,6 @@ return spellCache.getMaxSpellLevelForClassLevel(classLevel); } - @Override - public void setMovement(Movement m, int level) - { - if (movementList == null) - { - movementList = new ArrayList<LevelProperty<Movement>>(); - } - movementList.add(LevelProperty.getLevelProperty(level, m)); - - } - - @Override - public List<Movement> getMovements() - { - if (movementList == null) - { - return Collections.emptyList(); - } - List<Movement> returnList = new ArrayList<Movement>(); - for (LevelProperty<Movement> prop : movementList) - { - if (prop.getLevel() <= level) - { - returnList.add(prop.getObject()); - } - } - return returnList; - } - public void removeAllAutoAbilites(final int alevel) { for (AbilityCategory category : getAbilityCategories()) Modified: Trunk/pcgen/code/src/java/pcgen/core/PObject.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-08-04 22:47:48 UTC (rev 7337) +++ Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-08-04 22:53:11 UTC (rev 7338) @@ -120,7 +120,6 @@ private HashMap<String, String> changeProfMap = new HashMap<String, String>(); - private Movement movement; private SpellSupport spellSupport = new SpellSupport(); private VariableList variableList = null; @@ -571,19 +570,6 @@ } /** - * Get the movement for this object - * @return the movement for this object - */ - public List<Movement> getMovements() - { - if (movement == null) - { - return Collections.emptyList(); - } - return Collections.singletonList(movement); - } - - /** * Sets the natural weapon equipment items list for this object * @param aList */ @@ -2545,11 +2531,6 @@ } } - if (movement != null && movement.getNumberOfMovements() > 0) - { - txt.append(movement.toLSTString()); - } - if (hasPrerequisites()) { final StringWriter writer = new StringWriter(); @@ -3487,15 +3468,6 @@ } /** - * Set the movement - * @param cm - */ - public void setMovement(Movement cm, int level) - { - movement = cm; - } - - /** * Get the Spell Support for this object * @return SpellSupport */ Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-08-04 22:47:48 UTC (rev 7337) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-08-04 22:53:11 UTC (rev 7338) @@ -8343,7 +8343,7 @@ return; } - List<Movement> mms = getRace().getMovements(); + List<Movement> mms = getRace().getListFor(ListKey.MOVEMENT); if (mms == null || mms.isEmpty() || (!mms.get(0).isInitialized())) { return; @@ -8355,7 +8355,7 @@ movementMult = movement.getMovementMult(); movementMultOp = movement.getMovementMultOp(); - setMoveFromList(getPObjectList()); + setMoveFromList(getCDOMObjectList()); // temp mods // TODO This would never do anything since setMoveFromList only @@ -11767,11 +11767,11 @@ return lvlMap; } - private void setMoveFromList(final List<? extends PObject> aList) + private void setMoveFromList(final List<? extends CDOMObject> aList) { - for (PObject pObj : aList) + for (CDOMObject pObj : aList) { - List<Movement> ml = pObj.getMovements(); + List<Movement> ml = pObj.getListFor(ListKey.MOVEMENT); if (ml == null || ml.isEmpty()) { continue; Modified: Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorPC.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorPC.java 2008-08-04 22:47:48 UTC (rev 7337) +++ Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorPC.java 2008-08-04 22:53:11 UTC (rev 7338) @@ -27,6 +27,7 @@ import pcgen.cdom.base.Constants; import pcgen.cdom.enumeration.FormulaKey; +import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; import pcgen.cdom.reference.CDOMSingleRef; import pcgen.core.analysis.SkillModifier; @@ -672,7 +673,7 @@ } else if ("MOVEBASE".equals(valString)) { - valString = getPc().getRace().getMovements().get(0).getDoubleMovement().toString(); + valString = getPc().getRace().getSafeListFor(ListKey.MOVEMENT).get(0).getDoubleMovement().toString(); } else if ("FAVCLASSLEVEL".equals(valString)) { Modified: Trunk/pcgen/code/src/java/pcgen/gui/editor/EditorMainForm.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/editor/EditorMainForm.java 2008-08-04 22:47:48 UTC (rev 7337) +++ Trunk/pcgen/code/src/java/pcgen/gui/editor/EditorMainForm.java 2008-08-04 22:53:11 UTC (rev 7338) @@ -721,10 +721,10 @@ Race thisRace = (Race) thisPObject; - //thisRace.setMovements(pnlMovement.getMoveRates()); + thisRace.removeListFor(ListKey.MOVEMENT); Movement cm = Movement.getMovementFrom(pnlMovement.getMoveValues()); cm.setMovementTypes(pnlMovement.getMoveTypes()); - thisRace.setMovement(cm, -9); + thisRace.addToListFor(ListKey.MOVEMENT, cm); thisRace.removeAllFromList(Vision.VISIONLIST); List<Vision> visionList = pnlVision.getVision(); @@ -877,9 +877,10 @@ case EditorConstants.EDIT_TEMPLATE: PCTemplate thisPCTemplate = (PCTemplate) thisPObject; + thisPCTemplate.removeListFor(ListKey.MOVEMENT); Movement cmv = Movement.getMovementFrom(pnlMovement.getMoveValues()); cmv.setMoveRatesFlag(pnlMovement.getMoveRateType()); - thisPCTemplate.setMovement(cmv, -9); + thisPCTemplate.addToListFor(ListKey.MOVEMENT, cmv); thisPCTemplate.removeAllFromList(Vision.VISIONLIST); List<Vision> tplVisionList = pnlVision.getVision(); @@ -1595,7 +1596,7 @@ // movementValues = new ArrayList<String>(); - List<Movement> mms = thisPObject.getMovements(); + List<Movement> mms = thisPObject.getListFor(ListKey.MOVEMENT); if (mms != null && !mms.isEmpty()) { Movement cm = mms.get(0); @@ -1962,7 +1963,7 @@ // movementValues = new ArrayList<String>(); - List<Movement> mmsl = thisPObject.getMovements(); + List<Movement> mmsl = thisPObject.getListFor(ListKey.MOVEMENT); if (mmsl != null && !mmsl.isEmpty()) { Movement cmv = mmsl.get(0); Modified: Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoRaces.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoRaces.java 2008-08-04 22:47:48 UTC (rev 7337) +++ Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoRaces.java 2008-08-04 22:53:11 UTC (rev 7338) @@ -1176,7 +1176,7 @@ if (fn.getItem() instanceof Race) { Race race = (Race) fn.getItem(); - List<Movement> movements = race.getMovements(); + List<Movement> movements = race.getListFor(ListKey.MOVEMENT); if (movements != null && !movements.isEmpty()) { return movements.get(0).toString(); Modified: Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoResources.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoResources.java 2008-08-04 22:47:48 UTC (rev 7337) +++ Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoResources.java 2008-08-04 22:53:11 UTC (rev 7338) @@ -76,6 +76,7 @@ import pcgen.base.formula.Formula; import pcgen.cdom.base.Constants; import pcgen.cdom.enumeration.FormulaKey; +import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; import pcgen.cdom.enumeration.RaceType; import pcgen.core.Equipment; @@ -1198,7 +1199,7 @@ b.appendLineBreak(); String bString = ""; - List<Movement> movements = aRace.getMovements(); + List<Movement> movements = aRace.getListFor(ListKey.MOVEMENT); if (movements != null && !movements.isEmpty()) { bString = movements.get(0).toString(); Modified: Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoSummary.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoSummary.java 2008-08-04 22:47:48 UTC (rev 7337) +++ Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoSummary.java 2008-08-04 22:53:11 UTC (rev 7338) @@ -915,7 +915,7 @@ Formula sz = aRace.get(FormulaKey.SIZE); b.appendI18nElement("in_sumSize", sz == null ? "" : sz.toString()); //$NON-NLS-1 - List<Movement> movements = aRace.getMovements(); + List<Movement> movements = aRace.getListFor(ListKey.MOVEMENT); if (movements != null && !movements.isEmpty()) { final String movelabel = movements.get(0).toString(); Modified: Trunk/pcgen/code/src/java/pcgen/gui/tabs/resources/AvailableFollowerModel.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/tabs/resources/AvailableFollowerModel.java 2008-08-04 22:47:48 UTC (rev 7337) +++ Trunk/pcgen/code/src/java/pcgen/gui/tabs/resources/AvailableFollowerModel.java 2008-08-04 22:53:11 UTC (rev 7338) @@ -12,6 +12,7 @@ import pcgen.base.formula.Formula; import pcgen.cdom.base.Constants; import pcgen.cdom.enumeration.FormulaKey; +import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; import pcgen.cdom.enumeration.RaceType; import pcgen.core.FollowerOption; @@ -255,7 +256,7 @@ * race null, return null That's inconsistent and should * probably be cleaned up... */ - List<Movement> movements = race.getMovements(); + List<Movement> movements = race.getListFor(ListKey.MOVEMENT); if (movements != null && !movements.isEmpty()) { sRet = movements.get(0).toString(); Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/MoveLst.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/MoveLst.java 2008-08-04 22:47:48 UTC (rev 7337) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/MoveLst.java 2008-08-04 22:53:11 UTC (rev 7338) @@ -4,37 +4,65 @@ */ package plugin.lsttokens; +import java.util.Collection; +import java.util.Set; import java.util.StringTokenizer; +import java.util.TreeSet; +import pcgen.cdom.base.CDOMObject; import pcgen.cdom.base.Constants; +import pcgen.cdom.enumeration.ListKey; import pcgen.core.Equipment; import pcgen.core.Movement; -import pcgen.core.PObject; -import pcgen.persistence.lst.GlobalLstToken; +import pcgen.rules.context.Changes; +import pcgen.rules.context.LoadContext; +import pcgen.rules.persistence.token.AbstractToken; +import pcgen.rules.persistence.token.CDOMPrimaryToken; import pcgen.util.Logging; /** * @author djones4 * */ -public class MoveLst implements GlobalLstToken +public class MoveLst 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 "MOVE"; } - public boolean parse(PObject obj, String value, int anInt) + private void validateMove(String value, String mod) { + try + { + if (Integer.parseInt(mod) < 0) + { + Logging.addParseMessage(Logging.LST_ERROR, + "Invalid movement (cannot be negative): " + mod + + " in MOVE: " + value); + } + } + catch (NumberFormatException nfe) + { + Logging.addParseMessage(Logging.LST_ERROR, + "Invalid movement (must be an integer >= 0): " + mod + + " in MOVE: " + value); + } + } + + public boolean parse(LoadContext context, CDOMObject obj, String value) + { if (obj instanceof Equipment) { return false; } + if (isEmpty(value) || hasIllegalSeparator(',', value)) + { + return false; + } StringTokenizer moves = new StringTokenizer(value, Constants.COMMA); Movement cm; @@ -59,29 +87,38 @@ } if (moves.countTokens() != 0) { - Logging.errorPrint("Badly formed MOVE token " - + "(extra value at end of list): " + value); + Logging.addParseMessage(Logging.LST_ERROR, + "Badly formed MOVE token " + + "(extra value at end of list): " + value); } } cm.setMoveRatesFlag(0); - obj.setMovement(cm, anInt); + context.obj.addToList(obj, ListKey.MOVEMENT, cm); return true; } - private void validateMove(String value, String mod) + public String[] unparse(LoadContext context, CDOMObject obj) { - try + Changes<Movement> changes = context.getObjectContext().getListChanges( + obj, ListKey.MOVEMENT); + Collection<Movement> added = changes.getAdded(); + if (added == null || added.isEmpty()) { - if (Integer.parseInt(mod) < 0) - { - Logging.errorPrint("Invalid movement (cannot be negative): " - + mod + " in MOVE: " + value); - } + // Zero indicates no Token + return null; } - catch (NumberFormatException nfe) + Set<String> set = new TreeSet<String>(); + for (Movement m : added) { - Logging.errorPrint("Invalid movement (must be an integer >= 0): " - + mod + " in MOVE: " + value); + StringBuilder sb = new StringBuilder(); + m.addTokenContents(sb); + 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/lsttokens/MovecloneLst.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/MovecloneLst.java 2008-08-04 22:47:48 UTC (rev 7337) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/MovecloneLst.java 2008-08-04 22:53:11 UTC (rev 7338) @@ -4,50 +4,122 @@ */ package plugin.lsttokens; +import java.util.Collection; +import java.util.Set; import java.util.StringTokenizer; +import java.util.TreeSet; +import pcgen.cdom.base.CDOMObject; import pcgen.cdom.base.Constants; +import pcgen.cdom.enumeration.ListKey; import pcgen.core.Movement; -import pcgen.core.PObject; -import pcgen.persistence.lst.GlobalLstToken; +import pcgen.rules.context.Changes; +import pcgen.rules.context.LoadContext; +import pcgen.rules.persistence.token.AbstractToken; +import pcgen.rules.persistence.token.CDOMPrimaryToken; import pcgen.util.Logging; /** * @author djones4 * */ -public class MovecloneLst implements GlobalLstToken +public class MovecloneLst 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 "MOVECLONE"; } - public boolean parse(PObject obj, String value, int anInt) + public boolean parse(LoadContext context, CDOMObject obj, String value) { + if (isEmpty(value) || hasIllegalSeparator(',', value)) + { + return false; + } StringTokenizer moves = new StringTokenizer(value, Constants.COMMA); - Movement cm; - if (moves.countTokens() == 3) + if (moves.countTokens() != 3) { - cm = new Movement(2); - cm.assignMovement(0, moves.nextToken(), "0"); - cm.assignMovement(1, moves.nextToken(), moves.nextToken()); + Logging.addParseMessage(Logging.LST_ERROR, + "Invalid Version of MOVECLONE detected: " + value + + "\n MOVECLONE has 3 arguments: " + + "SourceMove,DestinationMove,Modifier"); + return false; } - else + + String oldType = moves.nextToken(); + String newType = moves.nextToken(); + String formulaString = moves.nextToken(); + + if (formulaString.startsWith("/")) { - Logging.errorPrint("Deprecated Version of MOVECLONE detected: " - + value + "\n MOVECLONE now has 3 arguments: " - + "SourceMove,DestinationMove,Modifier"); - cm = Movement.getMovementFrom(value); + int denom = Integer.parseInt(formulaString.substring(1)); + if (denom <= 0) + { + Logging.addParseMessage(Logging.LST_ERROR, getTokenName() + + " was expecting a Positive Integer " + + "for dividing Movement, was : " + + formulaString.substring(1)); + return false; + } } + else if (formulaString.startsWith("*")) + { + int mult = Integer.parseInt(formulaString.substring(1)); + if (mult < 0) + { + Logging.addParseMessage(Logging.LST_ERROR, getTokenName() + + " was expecting an " + + "Integer >= 0 for multiplying Movement, was : " + + formulaString.substring(1)); + return false; + } + } + else if (formulaString.startsWith("+")) + { + int add = Integer.parseInt(formulaString.substring(1)); + if (add < 0) + { + Logging.addParseMessage(Logging.LST_ERROR, getTokenName() + + " was expecting a Non-Negative " + + "Integer for adding Movement, was : " + + formulaString.substring(1)); + return false; + } + } + Movement cm = new Movement(2); + cm.assignMovement(0, oldType, "0"); + cm.assignMovement(1, newType, formulaString); cm.setMoveRatesFlag(2); - obj.setMovement(cm, anInt); + context.obj.addToList(obj, ListKey.MOVEMENT, cm); return true; } + + public String[] unparse(LoadContext context, CDOMObject obj) + { + Changes<Movement> changes = context.getObjectContext().getListChanges( + obj, ListKey.MOVEMENT); + Collection<Movement> added = changes.getAdded(); + if (added == null || added.isEmpty()) + { + // Zero indicates no Token + return null; + } + Set<String> set = new TreeSet<String>(); + for (Movement m : added) + { + StringBuilder sb = new StringBuilder(); + m.addTokenContents(sb); + 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/PreMoveTester.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/pretokens/test/PreMoveTester.java 2008-08-04 22:47:48 UTC (rev 7337) +++ Trunk/pcgen/code/src/java/plugin/pretokens/test/PreMoveTester.java 2008-08-04 22:53:11 UTC (rev 7338) @@ -28,6 +28,7 @@ import java.util.List; +import pcgen.cdom.enumeration.ListKey; import pcgen.core.Movement; import pcgen.core.PlayerCharacter; import pcgen.core.Race; @@ -116,7 +117,7 @@ { return false; } - List<Movement> movements = r.getMovements(); + List<Movement> movements = r.getListFor(ListKey.MOVEMENT); if (movements == null || movements.isEmpty()) { return false; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-08-04 22:58:22
|
Revision: 7339 http://pcgen.svn.sourceforge.net/pcgen/?rev=7339&view=rev Author: thpr Date: 2008-08-04 22:58:20 +0000 (Mon, 04 Aug 2008) Log Message: ----------- EqMod Cost/CostPre New Tokens Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/base/formula/Formula.java Trunk/pcgen/code/src/java/pcgen/cdom/base/FormulaFactory.java Trunk/pcgen/code/src/java/pcgen/cdom/base/JEPFormula.java Trunk/pcgen/code/src/java/pcgen/cdom/formula/FixedSizeFormula.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/gui/EqBuilder.java Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/CostToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/CostpreToken.java Modified: Trunk/pcgen/code/src/java/pcgen/base/formula/Formula.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/base/formula/Formula.java 2008-08-04 22:53:11 UTC (rev 7338) +++ Trunk/pcgen/code/src/java/pcgen/base/formula/Formula.java 2008-08-04 22:58:20 UTC (rev 7339) @@ -17,6 +17,7 @@ */ package pcgen.base.formula; +import pcgen.core.Equipment; import pcgen.core.PlayerCharacter; /** @@ -27,6 +28,10 @@ public interface Formula { + public static final Integer INT_ONE = Integer.valueOf(1); + + public static final Integer INT_ZERO = Integer.valueOf(0); + /** * A Formula for the integer constant ZERO. This is done in order to * minimize memory usage in the many cases where a default Formula of ZERO @@ -36,31 +41,45 @@ { public Integer resolve(PlayerCharacter pc, String source) { - return Integer.valueOf(0); + return INT_ZERO; } + public Integer resolve(Equipment equipment, boolean primary, + PlayerCharacter apc, String string) + { + return INT_ZERO; + } + public boolean isStatic() { return true; } + }; /** - * A Formula for the integer constant ONE. This is done in order to - * minimize memory usage in the many cases where a default Formula of ONE - * is required. + * A Formula for the integer constant ONE. This is done in order to minimize + * memory usage in the many cases where a default Formula of ONE is + * required. */ public final Formula ONE = new Formula() { public Integer resolve(PlayerCharacter pc, String source) { - return Integer.valueOf(1); + return INT_ONE; } + public Integer resolve(Equipment equipment, boolean primary, + PlayerCharacter apc, String string) + { + return INT_ONE; + } + public boolean isStatic() { return true; } + }; /* @@ -72,4 +91,6 @@ public Number resolve(PlayerCharacter pc, String source); public boolean isStatic(); + + public Number resolve(Equipment equipment, boolean primary, PlayerCharacter apc, String string); } Modified: Trunk/pcgen/code/src/java/pcgen/cdom/base/FormulaFactory.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/base/FormulaFactory.java 2008-08-04 22:53:11 UTC (rev 7338) +++ Trunk/pcgen/code/src/java/pcgen/cdom/base/FormulaFactory.java 2008-08-04 22:58:20 UTC (rev 7339) @@ -18,6 +18,7 @@ package pcgen.cdom.base; import pcgen.base.formula.Formula; +import pcgen.core.Equipment; import pcgen.core.PlayerCharacter; /** @@ -134,6 +135,12 @@ return i; } + public Integer resolve(Equipment equipment, boolean primary, + PlayerCharacter apc, String string) + { + return i; + } + /** * Returns a String representation of this IntegerFormula. */ @@ -214,6 +221,12 @@ return i; } + public Double resolve(Equipment equipment, boolean primary, + PlayerCharacter apc, String string) + { + return i; + } + /** * Returns a String representation of this DoubleFormula. */ Modified: Trunk/pcgen/code/src/java/pcgen/cdom/base/JEPFormula.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/base/JEPFormula.java 2008-08-04 22:53:11 UTC (rev 7338) +++ Trunk/pcgen/code/src/java/pcgen/cdom/base/JEPFormula.java 2008-08-04 22:58:20 UTC (rev 7339) @@ -18,6 +18,7 @@ package pcgen.cdom.base; import pcgen.base.formula.Formula; +import pcgen.core.Equipment; import pcgen.core.PlayerCharacter; /** @@ -94,4 +95,10 @@ { return false; } + + public Number resolve(Equipment equipment, boolean primary, + PlayerCharacter apc, String string) + { + return equipment.getVariableValue(formula, "", primary, apc); + } } Modified: Trunk/pcgen/code/src/java/pcgen/cdom/formula/FixedSizeFormula.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/formula/FixedSizeFormula.java 2008-08-04 22:53:11 UTC (rev 7338) +++ Trunk/pcgen/code/src/java/pcgen/cdom/formula/FixedSizeFormula.java 2008-08-04 22:58:20 UTC (rev 7339) @@ -19,6 +19,7 @@ import pcgen.base.formula.Formula; import pcgen.cdom.enumeration.StringKey; +import pcgen.core.Equipment; import pcgen.core.Globals; import pcgen.core.PlayerCharacter; import pcgen.core.SizeAdjustment; @@ -105,6 +106,12 @@ return Globals.sizeInt(size.getAbbreviation()); } + public Number resolve(Equipment equipment, boolean primary, + PlayerCharacter apc, String string) + { + return Globals.sizeInt(size.getAbbreviation()); + } + public boolean isStatic() { return true; Modified: Trunk/pcgen/code/src/java/pcgen/core/Equipment.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Equipment.java 2008-08-04 22:53:11 UTC (rev 7338) +++ Trunk/pcgen/code/src/java/pcgen/core/Equipment.java 2008-08-04 22:58:20 UTC (rev 7339) @@ -41,9 +41,11 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; +import pcgen.base.formula.Formula; import pcgen.base.lang.StringUtil; import pcgen.cdom.base.Constants; import pcgen.cdom.enumeration.EqModFormatCat; +import pcgen.cdom.enumeration.FormulaKey; import pcgen.cdom.enumeration.IntegerKey; import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; @@ -706,8 +708,9 @@ iCount = 1; } - final BigDecimal eqModCost = new BigDecimal(getVariableValue( - eqMod.getPreCost(), "", true, aPC).toString()); + Formula baseCost = eqMod.getSafe(FormulaKey.BASECOST); + Number bc = baseCost.resolve(this, true, aPC, ""); + final BigDecimal eqModCost = new BigDecimal(bc.toString()); c = c.add(eqModCost.multiply(new BigDecimal(Integer .toString(getSafe(IntegerKey.BASE_QUANTITY) * iCount)))); c = c.add(eqMod.addItemCosts(aPC, "ITEMCOST", @@ -721,8 +724,9 @@ iCount = 1; } - final BigDecimal eqModCost = new BigDecimal(getVariableValue( - eqMod.getPreCost(), "", false, aPC).toString()); + Formula baseCost = eqMod.getSafe(FormulaKey.BASECOST); + Number bc = baseCost.resolve(this, false, aPC, ""); + final BigDecimal eqModCost = new BigDecimal(bc.toString()); c = c.add(eqModCost.multiply(new BigDecimal(Integer .toString(getSafe(IntegerKey.BASE_QUANTITY) * iCount)))); c = c.add(eqMod.addItemCosts(aPC, "ITEMCOST", iCount, this)); @@ -770,7 +774,8 @@ } BigDecimal eqModCost; - String costFormula = eqMod.getCost(); + Formula cost = eqMod.getSafe(FormulaKey.COST); + String costFormula = cost.toString(); Pattern pat = Pattern.compile("BASECOST"); Matcher mat; @@ -798,7 +803,7 @@ iCount = 1; } else { - mat = pat.matcher(eqMod.getCost()); + mat = pat.matcher(cost.toString()); costFormula = mat.replaceAll("(BASECOST/" + getSafe(IntegerKey.BASE_QUANTITY) + ")"); eqModCost = new BigDecimal(getVariableValue(costFormula, "", @@ -833,9 +838,9 @@ iCount = 1; } - final String costFormula = eqMod.getCost(); - final BigDecimal eqModCost = new BigDecimal(getVariableValue( - costFormula, "", false, aPC).toString()); + Formula cost = eqMod.getSafe(FormulaKey.BASECOST); + Number bc = cost.resolve(this, false, aPC, ""); + final BigDecimal eqModCost = new BigDecimal(bc.toString()); c = c.add(eqModCost.multiply(new BigDecimal(Integer .toString(getSafe(IntegerKey.BASE_QUANTITY) * iCount)))); altPlus += (eqMod.getSafe(IntegerKey.PLUS) * iCount); Modified: Trunk/pcgen/code/src/java/pcgen/core/EquipmentModifier.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/EquipmentModifier.java 2008-08-04 22:53:11 UTC (rev 7338) +++ Trunk/pcgen/code/src/java/pcgen/core/EquipmentModifier.java 2008-08-04 22:58:20 UTC (rev 7339) @@ -33,6 +33,7 @@ import java.util.StringTokenizer; import pcgen.cdom.base.Constants; +import pcgen.cdom.enumeration.FormulaKey; import pcgen.cdom.enumeration.IntegerKey; import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; @@ -56,8 +57,6 @@ public final class EquipmentModifier extends PObject implements Comparable<Object> { private static final String s_CHARGES = "CHARGES"; - private String cost = "0"; - private String preCost = "0"; /** * returns all BonusObj's that are "active", for example, ones that pass all @@ -181,26 +180,6 @@ } /** - * set the cost of this object - * - * @param aString representing the cost - */ - public void setCost(final String aString) - { - cost = aString; - } - - /** - * get the cost of this object - * - * @return the cost. - */ - public String getCost() - { - return cost; - } - - /** * 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. @@ -221,25 +200,6 @@ } /** - * Set pre cost - * - * @param aString - */ - public void setPreCost(final String aString) - { - preCost = aString; - } - - /** - * Get pre cost - * @return pre cost - */ - public String getPreCost() - { - return preCost; - } - - /** * A list of Special properties tailored to the PC and the piece of * equipment passed as arguments. * @@ -800,13 +760,12 @@ protected String getCost(final int eqIdx) { final String listEntry = getAssociated(eqIdx); - String costFormula = cost; - String costFormula1 = costFormula; + String costFormula = getSafe(FormulaKey.COST).toString(); String modChoice = ""; - while (costFormula1.indexOf("%SPELLLEVEL") >= 0) + while (costFormula.indexOf("%SPELLLEVEL") >= 0) { - final int idx = costFormula1.indexOf("%SPELLLEVEL"); + final int idx = costFormula.indexOf("%SPELLLEVEL"); if (modChoice.length() == 0) { @@ -822,11 +781,10 @@ } } - costFormula1 = costFormula1.substring(0, idx) + modChoice + - costFormula1.substring(idx + 11); + costFormula = costFormula.substring(0, idx) + modChoice + + costFormula.substring(idx + 11); } - costFormula = costFormula1; costFormula = replaceCostSpellCost(costFormula, listEntry); costFormula = replaceCostSpellXPCost(costFormula, listEntry); costFormula = replaceCostCasterLevel(costFormula, listEntry); Modified: Trunk/pcgen/code/src/java/pcgen/gui/EqBuilder.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/EqBuilder.java 2008-08-04 22:53:11 UTC (rev 7338) +++ Trunk/pcgen/code/src/java/pcgen/gui/EqBuilder.java 2008-08-04 22:58:20 UTC (rev 7339) @@ -65,7 +65,9 @@ import javax.swing.table.AbstractTableModel; import javax.swing.table.TableColumn; +import pcgen.base.formula.Formula; import pcgen.cdom.base.Constants; +import pcgen.cdom.enumeration.FormulaKey; import pcgen.cdom.enumeration.IntegerKey; import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; @@ -2137,28 +2139,28 @@ eCost.append("Plus:").append(iPlus); } - String sCost = e.getPreCost(); + Formula baseCost = e.getSafe(FormulaKey.BASECOST); - if (!"0".equals(sCost)) + if (!"0".equals(baseCost.toString())) { if (eCost.length() != 0) { eCost.append(", "); } - eCost.append("Precost:").append(sCost); + eCost.append("Precost:").append(baseCost); } - sCost = e.getCost(); + Formula cost = e.getSafe(FormulaKey.BASECOST); - if (!"0".equals(sCost)) + if (!"0".equals(cost.toString())) { if (eCost.length() != 0) { eCost.append(", "); } - eCost.append("Cost:").append(sCost); + eCost.append("Cost:").append(cost); } sRet = eCost.toString(); Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/CostToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/CostToken.java 2008-08-04 22:53:11 UTC (rev 7338) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/CostToken.java 2008-08-04 22:58:20 UTC (rev 7339) @@ -1,12 +1,16 @@ package plugin.lsttokens.equipmentmodifier; +import pcgen.base.formula.Formula; +import pcgen.cdom.base.FormulaFactory; +import pcgen.cdom.enumeration.FormulaKey; import pcgen.core.EquipmentModifier; -import pcgen.persistence.lst.EquipmentModifierLstToken; +import pcgen.rules.context.LoadContext; +import pcgen.rules.persistence.token.CDOMPrimaryToken; /** - * Deals with COST token + * Deals with COST token */ -public class CostToken implements EquipmentModifierLstToken +public class CostToken implements CDOMPrimaryToken<EquipmentModifier> { public String getTokenName() @@ -14,9 +18,26 @@ return "COST"; } - public boolean parse(EquipmentModifier mod, String value) + public boolean parse(LoadContext context, EquipmentModifier mod, + String value) { - mod.setCost(value); + context.getObjectContext().put(mod, FormulaKey.COST, + FormulaFactory.getFormulaFor(value)); return true; } + + public String[] unparse(LoadContext context, EquipmentModifier mod) + { + Formula f = context.getObjectContext().getFormula(mod, FormulaKey.COST); + if (f == null) + { + return null; + } + return new String[] { f.toString() }; + } + + public Class<EquipmentModifier> getTokenClass() + { + return EquipmentModifier.class; + } } Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/CostpreToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/CostpreToken.java 2008-08-04 22:53:11 UTC (rev 7338) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/equipmentmodifier/CostpreToken.java 2008-08-04 22:58:20 UTC (rev 7339) @@ -1,12 +1,16 @@ package plugin.lsttokens.equipmentmodifier; +import pcgen.base.formula.Formula; +import pcgen.cdom.base.FormulaFactory; +import pcgen.cdom.enumeration.FormulaKey; import pcgen.core.EquipmentModifier; -import pcgen.persistence.lst.EquipmentModifierLstToken; +import pcgen.rules.context.LoadContext; +import pcgen.rules.persistence.token.CDOMPrimaryToken; /** - * Deals with COSTPRE token + * Deals with COSTPRE token */ -public class CostpreToken implements EquipmentModifierLstToken +public class CostpreToken implements CDOMPrimaryToken<EquipmentModifier> { public String getTokenName() @@ -14,9 +18,27 @@ return "COSTPRE"; } - public boolean parse(EquipmentModifier mod, String value) + public boolean parse(LoadContext context, EquipmentModifier mod, + String value) { - mod.setPreCost(value); + context.getObjectContext().put(mod, FormulaKey.BASECOST, + FormulaFactory.getFormulaFor(value)); return true; } + + public String[] unparse(LoadContext context, EquipmentModifier mod) + { + Formula f = context.getObjectContext().getFormula(mod, + FormulaKey.BASECOST); + if (f == null) + { + return null; + } + return new String[] { f.toString() }; + } + + public Class<EquipmentModifier> getTokenClass() + { + return EquipmentModifier.class; + } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-08-05 02:36:59
|
Revision: 7351 http://pcgen.svn.sourceforge.net/pcgen/?rev=7351&view=rev Author: thpr Date: 2008-08-05 02:37:05 +0000 (Tue, 05 Aug 2008) Log Message: ----------- Equipment SPROP token update Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/Equipment.java Trunk/pcgen/code/src/java/pcgen/gui/EqBuilder.java Trunk/pcgen/code/src/java/pcgen/io/PCGVer0Parser.java Trunk/pcgen/code/src/java/plugin/lsttokens/equipment/SpropToken.java Modified: Trunk/pcgen/code/src/java/pcgen/core/Equipment.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Equipment.java 2008-08-05 02:32:54 UTC (rev 7350) +++ Trunk/pcgen/code/src/java/pcgen/core/Equipment.java 2008-08-05 02:37:05 UTC (rev 7351) @@ -175,8 +175,6 @@ private List<EquipmentModifier> eqModifierList = new ArrayList<EquipmentModifier>(); - private List<SpecialProperty> specialPropertyList = new ArrayList<SpecialProperty>(); - private EquipmentCollection d_parent = null; private List<Equipment> d_containedEquipment = null; @@ -1798,10 +1796,11 @@ * @return raw special propertie */ public String getRawSpecialProperties() { + //CONSIDER standardize this with other joins? final StringBuffer retString = new StringBuffer(); boolean first = true; - for (int i = 0; i < specialPropertyList.size(); i++) { - final SpecialProperty sprop = specialPropertyList.get(i); + for (SpecialProperty sprop : getSafeListFor(ListKey.SPECIAL_PROPERTIES)) + { if (!first) { retString.append(", "); } @@ -1898,23 +1897,6 @@ } /** - * Clears all special properties of an Equipment. - */ - public void clearSpecialProperties() { - specialPropertyList.clear(); - } - - /** - * Sets special properties of an Equipment. - * - * @param sprop - * The properties to set - */ - public void addSpecialProperty(final SpecialProperty sprop) { - specialPropertyList.add(sprop); - } - - /** * Returns special properties of an Equipment. * * @param aPC @@ -1944,8 +1926,8 @@ final StringBuffer sp = new StringBuffer(); boolean first = true; - for (int i = 0; i < specialPropertyList.size(); i++) { - final SpecialProperty sprop = specialPropertyList.get(i); + for (SpecialProperty sprop : getSafeListFor(ListKey.SPECIAL_PROPERTIES)) + { final String text = sprop.getParsedText(aPC, this); if (!text.equals("")) { if (!first) { @@ -2748,10 +2730,6 @@ eq.eqModifierList = cloneEqModList(true); eq.altEqModifierList = cloneEqModList(false); - - // Make sure any lists aren't shared - eq.specialPropertyList = new ArrayList<SpecialProperty>(); - eq.specialPropertyList.addAll(specialPropertyList); } catch (CloneNotSupportedException e) { ShowMessageDelegate.showMessageDialog(e.getMessage(), Constants.s_APPNAME, MessageType.ERROR); @@ -3029,8 +3007,8 @@ } else if (aString.startsWith("ALTEQMOD" + endPart)) { addEqModifiers(aString.substring(8 + endPartLen), false); } else if (aString.startsWith("SPROP" + endPart)) { - addSpecialProperty(SpecialProperty.createFromLst(aString - .substring(5 + endPartLen))); + addToListFor(ListKey.SPECIAL_PROPERTIES, SpecialProperty + .createFromLst(aString.substring(5 + endPartLen))); } else if (aString.startsWith("COSTMOD" + endPart)) { setCostMod(aString.substring(7 + endPartLen)); } else if (aString.startsWith("WEIGHTMOD" + endPart)) { Modified: Trunk/pcgen/code/src/java/pcgen/gui/EqBuilder.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/EqBuilder.java 2008-08-05 02:32:54 UTC (rev 7350) +++ Trunk/pcgen/code/src/java/pcgen/gui/EqBuilder.java 2008-08-05 02:37:05 UTC (rev 7351) @@ -1136,7 +1136,7 @@ if (!oldName.toString().toUpperCase().startsWith(Constants.s_GENERIC_ITEM.toUpperCase())) { - aNewEq.addSpecialProperty(SpecialProperty.createFromLst(oldName.toString())); + aNewEq.addToListFor(ListKey.SPECIAL_PROPERTIES, SpecialProperty.createFromLst(oldName.toString())); } final SizeAdjustment aSize = SettingsHandler.getGame().getSizeAdjustmentAtIndex(getItemSize()); @@ -1241,10 +1241,10 @@ } else { - aNewEq.clearSpecialProperties(); + aNewEq.removeListFor(ListKey.SPECIAL_PROPERTIES); if (!aString.equals("")) { - aNewEq.addSpecialProperty(SpecialProperty.createFromLst(aString)); + aNewEq.addToListFor(ListKey.SPECIAL_PROPERTIES, SpecialProperty.createFromLst(aString)); } final SizeAdjustment aSize = SettingsHandler.getGame().getSizeAdjustmentAtIndex(getItemSize()); Modified: Trunk/pcgen/code/src/java/pcgen/io/PCGVer0Parser.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/PCGVer0Parser.java 2008-08-05 02:32:54 UTC (rev 7350) +++ Trunk/pcgen/code/src/java/pcgen/io/PCGVer0Parser.java 2008-08-05 02:37:05 UTC (rev 7351) @@ -939,8 +939,8 @@ if (customProp.length() != 0) { - eq.addSpecialProperty(SpecialProperty - .createFromLst(customProp)); + eq.addToListFor(ListKey.SPECIAL_PROPERTIES, SpecialProperty + .createFromLst(customProp)); } eq.addEqModifiers(head1, true); Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/equipment/SpropToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/equipment/SpropToken.java 2008-08-05 02:32:54 UTC (rev 7350) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/equipment/SpropToken.java 2008-08-05 02:37:05 UTC (rev 7351) @@ -1,30 +1,82 @@ package plugin.lsttokens.equipment; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import pcgen.cdom.base.Constants; +import pcgen.cdom.enumeration.ListKey; import pcgen.core.Equipment; import pcgen.core.SpecialProperty; -import pcgen.persistence.lst.EquipmentLstToken; +import pcgen.rules.context.Changes; +import pcgen.rules.context.LoadContext; +import pcgen.rules.persistence.token.AbstractToken; +import pcgen.rules.persistence.token.CDOMPrimaryToken; /** - * Deals with SPROP token + * Deals with SPROP token */ -public class SpropToken implements EquipmentLstToken +public class SpropToken extends AbstractToken implements + CDOMPrimaryToken<Equipment> { + @Override public String getTokenName() { return "SPROP"; } - public boolean parse(Equipment eq, String value) + public boolean parse(LoadContext context, Equipment eq, String value) { - if (".CLEAR".equals(value)) + if (isEmpty(value) || hasIllegalSeparator('|', value)) { - eq.clearSpecialProperties(); + return false; } - else + if (Constants.LST_DOT_CLEAR.equals(value)) { - eq.addSpecialProperty(SpecialProperty.createFromLst(value)); + context.getObjectContext().removeList(eq, + ListKey.SPECIAL_PROPERTIES); + return true; } + + SpecialProperty sa = SpecialProperty.createFromLst(value); + if (sa == null) + { + return false; + } + context.getObjectContext() + .addToList(eq, ListKey.SPECIAL_PROPERTIES, sa); return true; } + + public String[] unparse(LoadContext context, Equipment eq) + { + Changes<SpecialProperty> changes = context.getObjectContext() + .getListChanges(eq, ListKey.SPECIAL_PROPERTIES); + Collection<SpecialProperty> added = changes.getAdded(); + if (added == null || added.isEmpty()) + { + // Zero indicates no Token + return null; + } + List<String> list = new ArrayList<String>(); + for (SpecialProperty sp : added) + { + StringBuilder sb = new StringBuilder(); + sb.append(sp.getDisplayName()); + if (sp.hasPrerequisites()) + { + sb.append(Constants.PIPE); + sb.append(getPrerequisiteString(context, sp + .getPrerequisiteList())); + } + list.add(sb.toString()); + } + return list.toArray(new String[list.size()]); + } + + public Class<Equipment> getTokenClass() + { + return Equipment.class; + } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-08-06 21:06:56
|
Revision: 7392 http://pcgen.svn.sourceforge.net/pcgen/?rev=7392&view=rev Author: thpr Date: 2008-08-06 21:07:02 +0000 (Wed, 06 Aug 2008) Log Message: ----------- CLASS ExchangeLevel and ExClass Token update Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ObjectKey.java Trunk/pcgen/code/src/java/pcgen/core/PCClass.java Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassBasePanel.java Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoSummary.java Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Creator.java Trunk/pcgen/code/src/java/plugin/exporttokens/LevelToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/pcclass/ExchangelevelToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/pcclass/ExclassToken.java Added Paths: ----------- Trunk/pcgen/code/src/java/pcgen/cdom/content/LevelExchange.java Added: Trunk/pcgen/code/src/java/pcgen/cdom/content/LevelExchange.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/content/LevelExchange.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/cdom/content/LevelExchange.java 2008-08-06 21:07:02 UTC (rev 7392) @@ -0,0 +1,121 @@ +/* + * Copyright 2007 (C) Tom Parker <th...@us...> + * + * This library is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation; either version 2.1 of the License, or (at your option) + * any later version. + * + * This library is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + * details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +package pcgen.cdom.content; + +import pcgen.cdom.base.ConcretePrereqObject; +import pcgen.cdom.reference.CDOMSingleRef; +import pcgen.core.PCClass; + +public class LevelExchange extends ConcretePrereqObject +{ + + private final CDOMSingleRef<PCClass> exchangeClass; + private final int minDonatingLevel; + + private final int maxDonatedLevels; + + private final int donatingLowerLevelBound; + + public LevelExchange(CDOMSingleRef<PCClass> pcc, int minDonatingLvl, + int maxDonated, int donatingLowerBound) + { + if (minDonatingLvl <= 0) + { + throw new IllegalArgumentException( + "Error: Min Donatign Level <= 0: " + + "Cannot Allow Donations to produce negative levels"); + } + if (maxDonated <= 0) + { + throw new IllegalArgumentException( + "Error: Max Donated Levels <= 0: " + + "Cannot Allow Donations to produce negative levels"); + } + if (donatingLowerBound < 0) + { + throw new IllegalArgumentException( + "Error: Max Remaining Levels < 0: " + + "Cannot Allow Donations to produce negative levels"); + } + if (donatingLowerBound < 0) + { + throw new IllegalArgumentException( + "Error: Min Remaining Levels < 0: " + + "Cannot Allow Donations to produce negative levels"); + } + if (minDonatingLvl - maxDonated > donatingLowerBound) + { + throw new IllegalArgumentException( + "Error: Donating Lower Bound cannot be reached"); + } + exchangeClass = pcc; + minDonatingLevel = minDonatingLvl; + maxDonatedLevels = maxDonated; + donatingLowerLevelBound = donatingLowerBound; + } + + public int getDonatingLowerLevelBound() + { + return donatingLowerLevelBound; + } + + public CDOMSingleRef<PCClass> getExchangeClass() + { + return exchangeClass; + } + + public int getMaxDonatedLevels() + { + return maxDonatedLevels; + } + + public int getMinDonatingLevel() + { + return minDonatingLevel; + } + + @Override + public int hashCode() + { + return minDonatingLevel * 23 + maxDonatedLevels * 31 + + donatingLowerLevelBound; + } + + @Override + public boolean equals(Object o) + { + if (o == this) + { + return true; + } + if (!(o instanceof LevelExchange)) + { + return false; + } + LevelExchange other = (LevelExchange) o; + return minDonatingLevel == other.minDonatingLevel + && maxDonatedLevels == other.maxDonatedLevels + && donatingLowerLevelBound == other.donatingLowerLevelBound + && exchangeClass.equals(other.exchangeClass); + } + + public String getLSTformat() + { + return getExchangeClass().getLSTformat(); + } +} Modified: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ObjectKey.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ObjectKey.java 2008-08-06 20:32:33 UTC (rev 7391) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ObjectKey.java 2008-08-06 21:07:02 UTC (rev 7392) @@ -37,6 +37,7 @@ import pcgen.cdom.content.ChallengeRating; import pcgen.cdom.content.HitDie; import pcgen.cdom.content.LevelCommandFactory; +import pcgen.cdom.content.LevelExchange; import pcgen.cdom.content.Modifier; import pcgen.cdom.list.ClassSkillList; import pcgen.cdom.list.ClassSpellList; @@ -212,6 +213,10 @@ public static final ObjectKey<CDOMSingleRef<Equipment>> BASE_ITEM = new ObjectKey<CDOMSingleRef<Equipment>>(null); + public static final ObjectKey<LevelExchange> EXCHANGE_LEVEL = new ObjectKey<LevelExchange>(null); + + public static final ObjectKey<CDOMSingleRef<PCClass>> EX_CLASS = new ObjectKey<CDOMSingleRef<PCClass>>(null); + public static final ObjectKey<SizeAdjustment> BASESIZE; public static final ObjectKey<SizeAdjustment> SIZE; Modified: Trunk/pcgen/code/src/java/pcgen/core/PCClass.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-08-06 20:32:33 UTC (rev 7391) +++ Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-08-06 21:07:02 UTC (rev 7392) @@ -49,6 +49,7 @@ import pcgen.cdom.content.HitDie; import pcgen.cdom.content.KnownSpellIdentifier; import pcgen.cdom.content.LevelCommandFactory; +import pcgen.cdom.content.LevelExchange; import pcgen.cdom.content.Modifier; import pcgen.cdom.enumeration.FormulaKey; import pcgen.cdom.enumeration.IntegerKey; @@ -233,26 +234,6 @@ // really working properly /* - * FUTURETYPESAFETY This should not be a String, but a member of a Typesafe - * Enumeration of Classes... unfortunately, that really requires a two-pass - * design for the LST files... because the EX Class may not exist at the - * time this tag is hit. - */ - /* - * FINALALLCLASSLEVELS Because this indicates what a Class becomes when the - * prerequisites are no longer met, this must be passed into each and every - * PCClassLevel (though it can be given in its pure form). - */ - /* - * REFACTOR Consideration of HOW to actually perform this given the - * characteristics of PCClass vs. PCClassLevel are rather interesting... - * exactly how do you impose an ExClass on something in a way that is - * reasonably safe - given object structure - as well as being reasonably - * efficient? - */ - private String exClass = Constants.EMPTY_STRING; - - /* * STRINGREFACTOR This is currently taking in a complex formula-ish string * and needs to be put back into the Tag! */ @@ -271,23 +252,6 @@ private String itemCreationMultiplier = Constants.EMPTY_STRING; /* - * STRINGREFACTOR This is currently processed outside of this set (format is - * of the form EXCHANGELEVEL:Ex Paladin|11|10|1). Should be processed in the - * tag and passed in here as an object. - */ - /* - * TYPESAFETY This is actually passing around a Class, and thus can be made - * type safe to the list of classes. - */ - /* - * UNKNOWNDESTINATION Don't know where to put this yet... this is a - * COMPLICATED function that allows the exchange of levels (presumably on a - * one-time basis). Thus, this needs to be tagged as performed, and thus - * unrepeatable. - */ - private String levelExchange = Constants.EMPTY_STRING; - - /* * UNKNOWNDESTINATION This is (yet again) a bit complicated due to the fact * that this is a prerequisite test. First, this is LEVELONEONLY in the * sense that this prerequisite might only be justifiably tested for the @@ -829,24 +793,6 @@ } /* - * FINALPCCLASSANDLEVEL This is required in PCClassLevel and PCClass since it - * is a Tag - */ - public final void setExClass(final String aString) - { - exClass = aString; - } - - /* - * FINALPCCLASSANDLEVEL This is required in PCClassLevel and should be present in - * PCClass for PCClassLevel creation (in the factory) - */ - public final String getExClass() - { - return exClass; - } - - /* * PCCLASSONLY Since this is a reference variable, it will likely * only appear in PCCLASS */ @@ -873,30 +819,6 @@ return level; } - /* - * UNKNOWNDESTINATION Because this is a VERY strange variable and function, - * I have yet to architect exactly how this will work in the PCGen system. - * There will end up having to do some form of verification across multiple - * PCClassLevels, so this is really a similar solution to how the Challenge - * Rating (CRFormula) works. - */ - public final void setLevelExchange(final String aString) - { - levelExchange = aString; - } - - /* - * UNKNOWNDESTINATION Because this is a VERY strange variable and function, - * I have yet to architect exactly how this will work in the PCGen system. - * There will end up having to do some form of verification across multiple - * PCClassLevels, so this is really a similar solution to how the Challenge - * Rating (CRFormula) works. - */ - public final String getLevelExchange() - { - return levelExchange; - } - /** * set the level to arg without impacting spells, hp, or anything else - use * this with great caution only TODO Then why is it even here, What is it @@ -2276,10 +2198,7 @@ final StringBuffer pccTxt = new StringBuffer(200); pccTxt.append("CLASS:").append(getDisplayName()); pccTxt.append(super.getPCCText(false)); - checkAdd(pccTxt, "", "EXCLASS:", exClass); - checkAdd(pccTxt, "", "EXCHANGELEVEL:", levelExchange); - if (hasSubClass) { pccTxt.append("\tHASSUBCLASS:Y"); @@ -2856,8 +2775,6 @@ aClass.classSpellList = null; aClass.stableSpellKey = null; - aClass.setLevelExchange(levelExchange); - List<KnownSpellIdentifier> ksl = getListFor(ListKey.KNOWN_SPELLS); if (ksl != null) { @@ -3889,8 +3806,8 @@ // // Allow exchange of classes only when assign 1st level // - if ((levelExchange.length() != 0) && (getLevel() == 1) - && !aPC.isImporting()) + if (containsKey(ObjectKey.EXCHANGE_LEVEL) && (getLevel() == 1) + && !aPC.isImporting()) { exchangeLevels(aPC); } @@ -3904,43 +3821,16 @@ */ private void exchangeLevels(final PlayerCharacter aPC) { - final StringTokenizer aTok = - new StringTokenizer(levelExchange, "|", false); - - if (aTok.countTokens() != 4) - { - Logging.errorPrint("levelExhange: invalid token count: " - + aTok.countTokens()); - } - else - { + LevelExchange le = get(ObjectKey.EXCHANGE_LEVEL); + try - { - final String classKey = aTok.nextToken(); // Class to get - // levels from - final int iMinLevel = Integer.parseInt(aTok.nextToken()); // Minimum - // level - // required - // in - // donating - // class - int iMaxDonation = Integer.parseInt(aTok.nextToken()); // Maximum - // levels - // donated - // from - // class - final int iLowest = Integer.parseInt(aTok.nextToken()); // Lowest - // that - // donation - // can - // lower - // donating - // class - // level - // to + { + PCClass cl = le.getExchangeClass().resolvesTo(); + int iMinLevel = le.getMinDonatingLevel(); + int iMaxDonation = le.getMaxDonatedLevels(); + int iLowest = le.getDonatingLowerLevelBound(); + final PCClass aClass = aPC.getClassKeyed(cl.getKeyName()); - final PCClass aClass = aPC.getClassKeyed(classKey); - if (aClass != null) { final int iLevel = aClass.getLevel(); @@ -4005,7 +3895,6 @@ + Constants.s_LINE_SEP + exc.getMessage(), Constants.s_APPNAME, MessageType.ERROR); } - } } /* @@ -4725,20 +4614,6 @@ } /* - * DELETEMETHOD through refactoring this to another location. While this is - * yet another potentially useful utility function, PCClass really isn't the - * appropriate place for this method. - */ - private static void checkAdd(final StringBuffer txt, final String comp, - final String label, final String value) - { - if ((value != null) && !comp.equals(value)) - { - txt.append('\t').append(label).append(value); - } - } - - /* * PCCLASSONLY This is really part of the PCClassLevel Factory, and * therefore only needs to be placed in PCClass */ Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-08-06 20:32:33 UTC (rev 7391) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-08-06 21:07:02 UTC (rev 7392) @@ -9897,28 +9897,17 @@ public void makeIntoExClass(final PCClass aClass) { - final String exClass = aClass.getExClass(); + CDOMSingleRef<PCClass> exc = aClass.get(ObjectKey.EX_CLASS); - if (exClass.length() == 0) - { - return; - } - try { - PCClass bClass = getClassKeyed(exClass); + PCClass cl = exc.resolvesTo(); + PCClass bClass = getClassKeyed(cl.getKeyName()); if (bClass == null) { - bClass = Globals.getContext().ref.silentlyGetConstructedCDOMObject(PCClass.class, exClass); + bClass = cl.clone(); - if (bClass == null) - { - return; - } - - bClass = bClass.clone(); - rebuildLists(bClass, aClass, aClass.getLevel(), this); bClass.setLevel(aClass.getLevel(), this); @@ -9963,14 +9952,14 @@ // for (Skill skill : getSkillList()) { - skill.replaceClassRank(aClass.getKeyName(), exClass); + skill.replaceClassRank(aClass.getKeyName(), cl.getKeyName()); } bClass.setSkillPool(aClass.getSkillPool(this)); } - catch (NumberFormatException exc) + catch (NumberFormatException nfe) { - ShowMessageDelegate.showMessageDialog(exc.getMessage(), + ShowMessageDelegate.showMessageDialog(nfe.getMessage(), Constants.s_APPNAME, MessageType.INFORMATION); } } Modified: Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassBasePanel.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassBasePanel.java 2008-08-06 20:32:33 UTC (rev 7391) +++ Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassBasePanel.java 2008-08-06 21:07:02 UTC (rev 7392) @@ -51,6 +51,7 @@ import pcgen.persistence.PersistenceLayerException; import pcgen.persistence.lst.GlobalLstToken; import pcgen.persistence.lst.TokenStore; +import pcgen.rules.context.LoadContext; import pcgen.util.Logging; import pcgen.util.PropertyFactory; import pcgen.util.StringPClassUtil; @@ -118,8 +119,9 @@ PCClass obj = (PCClass) thisPObject; obj.put(StringKey.OUTPUT_NAME, txtDisplayName.getText().trim()); - Globals.getContext().ref.registerAbbreviation(obj, abbreviation.getText().trim()); - obj.setLevelExchange(exchangeLevel.getText().trim()); + LoadContext context = Globals.getContext(); + context.ref.registerAbbreviation(obj, abbreviation.getText().trim()); + context.unconditionallyProcess(obj, "EXCHANGELEVEL", exchangeLevel.getText().trim()); String form = startSkillPoints.getText().trim(); if (form.length() > 0) { @@ -141,7 +143,7 @@ Logging.errorPrint("Invalid QUALIFY: " + qualify.getText(), e); } } - obj.setExClass(exClass.getText().trim()); + context.unconditionallyProcess(obj, "EXCLASS", exClass.getText().trim()); obj.setHasSubClass(hasSubClass.getSelectedObjects() != null); obj.put(ObjectKey.MOD_TO_SKILLS, modToSkills.getSelectedObjects() != null); obj.put(ObjectKey.VISIBILITY, chkVisible.getSelectedObjects() == null ? Visibility.HIDDEN : Visibility.DEFAULT); @@ -197,7 +199,9 @@ setTypesSelectedList(selectedList, true); txtDisplayName.setText(obj.getOutputName()); abbreviation.setText(obj.getAbbrev()); - exchangeLevel.setText(obj.getLevelExchange()); + LoadContext context = Globals.getContext(); + String[] le = context.unparse(obj, "EXCHANGELEVEL"); + exchangeLevel.setText(le == null ? "" : le[0]); Formula spf = obj.get(FormulaKey.START_SKILL_POINTS); startSkillPoints.setText(spf == null ? "" : spf.toString()); List<Qualifier> qualList = obj.getListFor(ListKey.QUALIFY); @@ -218,7 +222,8 @@ } qualify.setText(StringUtil.join(ol, "|")); } - exClass.setText(obj.getExClass()); + String[] exc = context.unparse(obj, "EXCLASS"); + exClass.setText(exc == null ? "" : exc[0]); hasSubClass.setSelected(obj.hasSubClass()); Boolean mts = obj.get(ObjectKey.MOD_TO_SKILLS); modToSkills.setSelected(mts == null ? true : mts); Modified: Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoSummary.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoSummary.java 2008-08-06 20:32:33 UTC (rev 7391) +++ Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoSummary.java 2008-08-06 21:07:02 UTC (rev 7392) @@ -1426,23 +1426,20 @@ for (PCClass aClass : classList) { - pc.setAlignment(oldAlignment, false, true); - - if (aClass.isQualified(pc)) { - pc.setAlignment(newAlignment, false, true); - - if (!aClass.isQualified(pc) - && (aClass.getExClass().length() != 0)) + if (!aClass.isQualified(pc)) { - if (unqualified.length() > 0) + if (aClass.containsKey(ObjectKey.EX_CLASS)) { - unqualified.append(", "); //$NON-NLS-1$ - } + if (unqualified.length() > 0) + { + unqualified.append(", "); //$NON-NLS-1$ + } - unqualified.append(aClass.getKeyName()); - exclassList.add(aClass); + unqualified.append(aClass.getKeyName()); + exclassList.add(aClass); + } } } } Modified: Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Creator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Creator.java 2008-08-06 20:32:33 UTC (rev 7391) +++ Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Creator.java 2008-08-06 21:07:02 UTC (rev 7392) @@ -930,7 +930,7 @@ if (pcClass != null) { - pcClass = thePC.getClassKeyed(pcClass.getExClass()); + pcClass = thePC.getClassKeyed(pcClass.get(ObjectKey.EX_CLASS).resolvesTo().getKeyName()); } } Modified: Trunk/pcgen/code/src/java/plugin/exporttokens/LevelToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/exporttokens/LevelToken.java 2008-08-06 20:32:33 UTC (rev 7391) +++ Trunk/pcgen/code/src/java/plugin/exporttokens/LevelToken.java 2008-08-06 21:07:02 UTC (rev 7392) @@ -25,6 +25,11 @@ */ package plugin.exporttokens; +import java.util.Iterator; +import java.util.StringTokenizer; + +import pcgen.cdom.enumeration.ObjectKey; +import pcgen.cdom.reference.CDOMSingleRef; import pcgen.core.Globals; import pcgen.core.PCClass; import pcgen.core.PlayerCharacter; @@ -32,9 +37,6 @@ import pcgen.io.ExportHandler; import pcgen.io.exporttoken.Token; -import java.util.Iterator; -import java.util.StringTokenizer; - /** * LEVEL token */ @@ -46,6 +48,7 @@ /** * @see pcgen.io.exporttoken.Token#getTokenName() */ + @Override public String getTokenName() { return TOKENNAME; @@ -54,6 +57,7 @@ /** * @see pcgen.io.exporttoken.Token#getToken(java.lang.String, pcgen.core.PlayerCharacter, pcgen.io.ExportHandler) */ + @Override public String getToken(String tokenSource, PlayerCharacter pc, ExportHandler eh) { @@ -156,7 +160,8 @@ aClass = Globals.getContext().ref.silentlyGetConstructedCDOMObject(PCClass.class, classKeyName); if (aClass != null) { - aClass = pc.getClassKeyed(aClass.getExClass()); + CDOMSingleRef<PCClass> exc = aClass.get(ObjectKey.EX_CLASS); + aClass = pc.getClassKeyed(exc.resolvesTo().getKeyName()); } } if (aClass != null) Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/pcclass/ExchangelevelToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/pcclass/ExchangelevelToken.java 2008-08-06 20:32:33 UTC (rev 7391) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/pcclass/ExchangelevelToken.java 2008-08-06 21:07:02 UTC (rev 7392) @@ -1,22 +1,117 @@ package plugin.lsttokens.pcclass; +import java.util.StringTokenizer; + +import pcgen.cdom.base.Constants; +import pcgen.cdom.content.LevelExchange; +import pcgen.cdom.enumeration.ObjectKey; +import pcgen.cdom.reference.CDOMSingleRef; import pcgen.core.PCClass; -import pcgen.persistence.lst.PCClassLstToken; +import pcgen.rules.context.LoadContext; +import pcgen.rules.persistence.token.AbstractToken; +import pcgen.rules.persistence.token.CDOMPrimaryToken; +import pcgen.util.Logging; /** * Class deals with EXCHANGELEVEL Token */ -public class ExchangelevelToken implements PCClassLstToken +public class ExchangelevelToken extends AbstractToken implements + CDOMPrimaryToken<PCClass> { + @Override public String getTokenName() { return "EXCHANGELEVEL"; } - public boolean parse(PCClass pcclass, String value, int level) + public boolean parse(LoadContext context, PCClass pcc, String value) { - pcclass.setLevelExchange(value); - return true; + if (isEmpty(value) || hasIllegalSeparator('|', value)) + { + return false; + } + + final StringTokenizer tok = new StringTokenizer(value, Constants.PIPE); + if (tok.countTokens() != 4) + { + Logging.errorPrint(getTokenName() + + " must have 4 | delimited arguments : " + value); + return false; + } + + String classString = tok.nextToken(); + CDOMSingleRef<PCClass> cl = context.ref.getCDOMReference(PCClass.class, + classString); + String mindlString = tok.nextToken(); + int mindl; + try + { + mindl = Integer.parseInt(mindlString); + } + catch (NumberFormatException nfe) + { + Logging.errorPrint(getTokenName() + " expected an integer: " + + mindlString); + return false; + } + String maxdlString = tok.nextToken(); + int maxdl; + try + { + maxdl = Integer.parseInt(maxdlString); + } + catch (NumberFormatException nfe) + { + Logging.errorPrint(getTokenName() + " expected an integer: " + + maxdlString); + return false; + } + String minremString = tok.nextToken(); + int minrem; + try + { + minrem = Integer.parseInt(minremString); + } + catch (NumberFormatException nfe) + { + Logging.errorPrint(getTokenName() + " expected an integer: " + + minremString); + return false; + } + try + { + LevelExchange le = new LevelExchange(cl, mindl, maxdl, minrem); + context.getObjectContext().put(pcc, ObjectKey.EXCHANGE_LEVEL, le); + return true; + } + catch (IllegalArgumentException e) + { + Logging.errorPrint("Error in " + getTokenName() + " " + + e.getMessage()); + Logging.errorPrint(" Token contents: " + value); + return false; + } } + + public String[] unparse(LoadContext context, PCClass pcc) + { + LevelExchange le = context.getObjectContext().getObject(pcc, + ObjectKey.EXCHANGE_LEVEL); + if (le == null) + { + return null; + } + StringBuilder sb = new StringBuilder(); + sb.append(le.getLSTformat()).append(Constants.PIPE); + sb.append(le.getMinDonatingLevel()).append(Constants.PIPE); + sb.append(le.getMaxDonatedLevels()).append(Constants.PIPE); + sb.append(le.getDonatingLowerLevelBound()); + return new String[] { sb.toString() }; + } + + public Class<PCClass> getTokenClass() + { + return PCClass.class; + } } Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/pcclass/ExclassToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/pcclass/ExclassToken.java 2008-08-06 20:32:33 UTC (rev 7391) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/pcclass/ExclassToken.java 2008-08-06 21:07:02 UTC (rev 7392) @@ -1,12 +1,16 @@ package plugin.lsttokens.pcclass; +import pcgen.cdom.enumeration.ObjectKey; +import pcgen.cdom.reference.CDOMSingleRef; import pcgen.core.PCClass; -import pcgen.persistence.lst.PCClassLstToken; +import pcgen.rules.context.LoadContext; +import pcgen.rules.persistence.token.CDOMPrimaryToken; +import pcgen.util.Logging; /** * Class deals with EXCLASS Token */ -public class ExclassToken implements PCClassLstToken +public class ExclassToken implements CDOMPrimaryToken<PCClass> { public String getTokenName() @@ -14,9 +18,32 @@ return "EXCLASS"; } - public boolean parse(PCClass pcclass, String value, int level) + public boolean parse(LoadContext context, PCClass pcc, String value) { - pcclass.setExClass(value); + if (value.length() == 0) + { + Logging.errorPrint(getTokenName() + " may not have empty argument"); + return false; + } + CDOMSingleRef<PCClass> cl = context.ref.getCDOMReference(PCClass.class, + value); + context.getObjectContext().put(pcc, ObjectKey.EX_CLASS, cl); return true; } + + public String[] unparse(LoadContext context, PCClass pcc) + { + CDOMSingleRef<PCClass> cl = context.getObjectContext().getObject(pcc, + ObjectKey.EX_CLASS); + if (cl == null) + { + return null; + } + return new String[] { cl.getLSTformat() }; + } + + public Class<PCClass> getTokenClass() + { + return PCClass.class; + } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-08-06 22:34:00
|
Revision: 7414 http://pcgen.svn.sourceforge.net/pcgen/?rev=7414&view=rev Author: thpr Date: 2008-08-06 22:34:06 +0000 (Wed, 06 Aug 2008) Log Message: ----------- updates for tests Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/Movement.java Trunk/pcgen/code/src/java/plugin/lsttokens/AbilityLst.java Trunk/pcgen/code/src/java/plugin/lsttokens/MoveLst.java Trunk/pcgen/code/src/java/plugin/lsttokens/MovecloneLst.java Trunk/pcgen/code/src/java/plugin/lsttokens/VFeatLst.java Trunk/pcgen/code/src/java/plugin/lsttokens/domain/FeatToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/race/FeatToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/template/FeatToken.java Modified: Trunk/pcgen/code/src/java/pcgen/core/Movement.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Movement.java 2008-08-06 22:33:26 UTC (rev 7413) +++ Trunk/pcgen/code/src/java/pcgen/core/Movement.java 2008-08-06 22:34:06 UTC (rev 7414) @@ -366,6 +366,22 @@ public void addTokenContents(StringBuilder txt) { + if (moveRatesFlag == 2) + { + txt.append(movementTypes[0]); + txt.append(','); + txt.append(movementTypes[1]); + txt.append(','); + if (movementMultOp[1].length() > 0) + { + txt.append(movementMultOp[1]).append(movementMult[1].intValue()); + } + else + { + txt.append(new DecimalFormat("###0").format(movements[1])); + } + return; + } for (int index = 0; index < movementTypes.length; ++index) { if (index > 0) @@ -385,7 +401,7 @@ } else { - txt.append(new DecimalFormat("###0.#").format(movements[index])); + txt.append(new DecimalFormat("###0").format(movements[index])); } } } Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/AbilityLst.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/AbilityLst.java 2008-08-06 22:33:26 UTC (rev 7413) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/AbilityLst.java 2008-08-06 22:34:06 UTC (rev 7414) @@ -229,8 +229,6 @@ return null; } - - TripleKeyMapToList<Ability.Nature, Category<Ability>, List<Prerequisite>, CDOMReference<Ability>> m = new TripleKeyMapToList<Ability.Nature, Category<Ability>, List<Prerequisite>, CDOMReference<Ability>>(); for (CDOMReference<Ability> ab : mtl.getKeySet()) { Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/MoveLst.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/MoveLst.java 2008-08-06 22:33:26 UTC (rev 7413) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/MoveLst.java 2008-08-06 22:34:06 UTC (rev 7414) @@ -34,7 +34,7 @@ return "MOVE"; } - private void validateMove(String value, String mod) + private boolean validateMove(String value, String mod) { try { @@ -43,6 +43,7 @@ Logging.addParseMessage(Logging.LST_ERROR, "Invalid movement (cannot be negative): " + mod + " in MOVE: " + value); + return false; } } catch (NumberFormatException nfe) @@ -50,7 +51,9 @@ Logging.addParseMessage(Logging.LST_ERROR, "Invalid movement (must be an integer >= 0): " + mod + " in MOVE: " + value); + return false; } + return true; } public boolean parse(LoadContext context, CDOMObject obj, String value) @@ -70,7 +73,10 @@ { cm = new Movement(1); String mod = moves.nextToken(); - validateMove(value, mod); + if (!validateMove(value, mod)) + { + return false; + } cm.assignMovement(0, "Walk", mod); } else @@ -82,7 +88,10 @@ { String type = moves.nextToken(); String mod = moves.nextToken(); - validateMove(value, mod); + if (!validateMove(value, mod)) + { + return false; + } cm.assignMovement(x++, type, mod); } if (moves.countTokens() != 0) @@ -90,6 +99,7 @@ Logging.addParseMessage(Logging.LST_ERROR, "Badly formed MOVE token " + "(extra value at end of list): " + value); + return false; } } cm.setMoveRatesFlag(0); Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/MovecloneLst.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/MovecloneLst.java 2008-08-06 22:33:26 UTC (rev 7413) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/MovecloneLst.java 2008-08-06 22:34:06 UTC (rev 7414) @@ -90,6 +90,20 @@ return false; } } + else + { + try + { + Integer.parseInt(formulaString); + } + catch (NumberFormatException e) + { + Logging.addParseMessage(Logging.LST_ERROR, getTokenName() + + " was expecting a Formula as the final value, was : " + + formulaString); + return false; + } + } Movement cm = new Movement(2); cm.assignMovement(0, oldType, "0"); cm.assignMovement(1, newType, formulaString); Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/VFeatLst.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/VFeatLst.java 2008-08-06 22:33:26 UTC (rev 7413) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/VFeatLst.java 2008-08-06 22:34:06 UTC (rev 7414) @@ -3,8 +3,11 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.Set; import java.util.StringTokenizer; +import java.util.TreeSet; +import pcgen.base.util.HashMapToList; import pcgen.base.util.MapToList; import pcgen.cdom.base.AssociatedPrereqObject; import pcgen.cdom.base.CDOMObject; @@ -60,7 +63,7 @@ AbilityCategory category = AbilityCategory.FEAT; Nature nature = Ability.Nature.VIRTUAL; - CDOMReference<AbilityList> list = Ability.ABILITYLIST; + CDOMReference<AbilityList> list = Ability.FEATLIST; while (true) { if (token.equals(Constants.LST_DOT_CLEAR)) @@ -72,7 +75,7 @@ return false; } context.getListContext().removeAllFromList(getTokenName(), obj, - Ability.FEATLIST); + list); } else { @@ -144,9 +147,10 @@ // Zero indicates no Token return null; } - Collection<CDOMReference<Ability>> added = changes.getAdded(); + MapToList<CDOMReference<Ability>, AssociatedPrereqObject> added = changes + .getAddedAssociations(); Collection<CDOMReference<Ability>> removedItems = changes.getRemoved(); - StringBuilder sb = new StringBuilder(); + List<String> returnList = new ArrayList<String>(); if (changes.includesGlobalClear()) { if (removedItems != null && !removedItems.isEmpty()) @@ -156,7 +160,7 @@ + ": global .CLEAR and local .CLEAR. performed"); return null; } - sb.append(Constants.LST_DOT_CLEAR); + returnList.add(Constants.LST_DOT_CLEAR); } else if (removedItems != null && !removedItems.isEmpty()) { @@ -166,17 +170,34 @@ } if (added != null && !added.isEmpty()) { - if (sb.length() != 0) + HashMapToList<List<Prerequisite>, CDOMReference<Ability>> m = new HashMapToList<List<Prerequisite>, CDOMReference<Ability>>(); + for (CDOMReference<Ability> ab : mtl.getKeySet()) { - sb.append(Constants.PIPE); + for (AssociatedPrereqObject assoc : mtl.getListFor(ab)) + { + m.addToListFor(assoc.getPrerequisiteList(), ab); + } } - sb.append(ReferenceUtilities.joinLstFormat(added, Constants.PIPE)); + + Set<String> returnSet = new TreeSet<String>(); + for (List<Prerequisite> prereqs : m.getKeySet()) + { + StringBuilder sb = new StringBuilder(); + sb.append(ReferenceUtilities.joinLstFormat(m.getListFor(prereqs), Constants.PIPE)); + if (prereqs != null && !prereqs.isEmpty()) + { + sb.append(Constants.PIPE); + sb.append(getPrerequisiteString(context, prereqs)); + } + returnSet.add(sb.toString()); + } + returnList.addAll(returnSet); } - if (sb.length() == 0) + if (returnList.isEmpty()) { return null; } - return new String[] { sb.toString() }; + return returnList.toArray(new String[returnList.size()]); } public Class<CDOMObject> getTokenClass() Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/domain/FeatToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/domain/FeatToken.java 2008-08-06 22:33:26 UTC (rev 7413) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/domain/FeatToken.java 2008-08-06 22:34:06 UTC (rev 7414) @@ -11,7 +11,6 @@ import pcgen.cdom.base.CDOMReference; import pcgen.cdom.base.Constants; import pcgen.cdom.enumeration.AssociationKey; -import pcgen.cdom.reference.ReferenceUtilities; import pcgen.core.Ability; import pcgen.core.AbilityCategory; import pcgen.core.AbilityUtilities; @@ -79,7 +78,8 @@ AssociatedPrereqObject assoc = context.getListContext() .addToList(getTokenName(), obj, Ability.FEATLIST, ability); - assoc.setAssociation(AssociationKey.NATURE, Ability.Nature.AUTOMATIC); + assoc.setAssociation(AssociationKey.NATURE, + Ability.Nature.AUTOMATIC); if (token.indexOf('(') != -1) { List<String> choices = new ArrayList<String>(); @@ -104,7 +104,8 @@ // Zero indicates no Token return null; } - Collection<CDOMReference<Ability>> added = changes.getAdded(); + MapToList<CDOMReference<Ability>, AssociatedPrereqObject> added = changes + .getAddedAssociations(); Collection<CDOMReference<Ability>> removedItems = changes.getRemoved(); StringBuilder sb = new StringBuilder(); if (changes.includesGlobalClear()) @@ -126,11 +127,20 @@ } if (added != null && !added.isEmpty()) { - if (sb.length() != 0) + boolean needsPipe = sb.length() != 0; + for (CDOMReference<Ability> ref : added.getKeySet()) { - sb.append(Constants.PIPE); + String lstFormat = ref.getLSTformat(); + for (int i = 0; i < added.sizeOfListFor(ref); i++) + { + if (needsPipe) + { + sb.append(Constants.PIPE); + } + needsPipe = true; + sb.append(lstFormat); + } } - sb.append(ReferenceUtilities.joinLstFormat(added, Constants.PIPE)); } if (sb.length() == 0) { Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/race/FeatToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/race/FeatToken.java 2008-08-06 22:33:26 UTC (rev 7413) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/race/FeatToken.java 2008-08-06 22:34:06 UTC (rev 7414) @@ -11,7 +11,6 @@ import pcgen.cdom.base.CDOMReference; import pcgen.cdom.base.Constants; import pcgen.cdom.enumeration.AssociationKey; -import pcgen.cdom.reference.ReferenceUtilities; import pcgen.core.Ability; import pcgen.core.AbilityCategory; import pcgen.core.AbilityUtilities; @@ -26,20 +25,25 @@ /** * Class deals with FEAT Token */ -public class FeatToken extends AbstractToken implements CDOMPrimaryToken<Race> { +public class FeatToken extends AbstractToken implements CDOMPrimaryToken<Race> +{ public static final Class<Ability> ABILITY_CLASS = Ability.class; @Override - public String getTokenName() { + public String getTokenName() + { return "FEAT"; } - public boolean parse(LoadContext context, Race pct, String value) { + public boolean parse(LoadContext context, Race pct, String value) + { return parseFeat(context, pct, value); } - public boolean parseFeat(LoadContext context, CDOMObject obj, String value) { - if (isEmpty(value) || hasIllegalSeparator('|', value)) { + public boolean parseFeat(LoadContext context, CDOMObject obj, String value) + { + if (isEmpty(value) || hasIllegalSeparator('|', value)) + { return false; } @@ -47,28 +51,36 @@ boolean first = true; - while (tok.hasMoreTokens()) { + while (tok.hasMoreTokens()) + { String token = tok.nextToken(); - if (Constants.LST_DOT_CLEAR.equals(token)) { - if (!first) { + if (Constants.LST_DOT_CLEAR.equals(token)) + { + if (!first) + { Logging.errorPrint(" Non-sensical " + getTokenName() + ": .CLEAR was not the first list item: " + value); return false; } context.getListContext().removeAllFromList(getTokenName(), obj, Ability.FEATLIST); - } else { + } + else + { CDOMReference<Ability> ability = TokenUtilities .getTypeOrPrimitive(context, ABILITY_CLASS, AbilityCategory.FEAT, token); - if (ability == null) { + if (ability == null) + { return false; } AssociatedPrereqObject assoc = context.getListContext() .addToList(getTokenName(), obj, Ability.FEATLIST, ability); - assoc.setAssociation(AssociationKey.NATURE, Ability.Nature.AUTOMATIC); - if (token.indexOf('(') != -1) { + assoc.setAssociation(AssociationKey.NATURE, + Ability.Nature.AUTOMATIC); + if (token.indexOf('(') != -1) + { List<String> choices = new ArrayList<String>(); AbilityUtilities.getUndecoratedName(token, choices); assoc.setAssociation(AssociationKey.ASSOC_CHOICES, choices); @@ -79,45 +91,65 @@ return true; } - public String[] unparse(LoadContext context, Race pct) { + public String[] unparse(LoadContext context, Race pct) + { AssociatedChanges<CDOMReference<Ability>> changes = context .getListContext().getChangesInList(getTokenName(), pct, Ability.FEATLIST); MapToList<CDOMReference<Ability>, AssociatedPrereqObject> mtl = changes .getAddedAssociations(); - if (mtl == null || mtl.isEmpty()) { + if (mtl == null || mtl.isEmpty()) + { // Zero indicates no Token return null; } - Collection<CDOMReference<Ability>> added = changes.getAdded(); + MapToList<CDOMReference<Ability>, AssociatedPrereqObject> added = changes + .getAddedAssociations(); Collection<CDOMReference<Ability>> removedItems = changes.getRemoved(); StringBuilder sb = new StringBuilder(); - if (changes.includesGlobalClear()) { - if (removedItems != null && !removedItems.isEmpty()) { + if (changes.includesGlobalClear()) + { + if (removedItems != null && !removedItems.isEmpty()) + { context.addWriteMessage("Non-sensical relationship in " + getTokenName() + ": global .CLEAR and local .CLEAR. performed"); return null; } sb.append(Constants.LST_DOT_CLEAR); - } else if (removedItems != null && !removedItems.isEmpty()) { + } + else if (removedItems != null && !removedItems.isEmpty()) + { context.addWriteMessage(getTokenName() + " does not support " + Constants.LST_DOT_CLEAR_DOT); return null; } - if (added != null && !added.isEmpty()) { - if (sb.length() != 0) { - sb.append(Constants.PIPE); + if (added != null && !added.isEmpty()) + { + boolean needsPipe = sb.length() != 0; + for (CDOMReference<Ability> ref : added.getKeySet()) + { + String lstFormat = ref.getLSTformat(); + for (int i = 0; i < added.sizeOfListFor(ref); i++) + { + if (needsPipe) + { + sb.append(Constants.PIPE); + } + needsPipe = true; + sb.append(lstFormat); + } } - sb.append(ReferenceUtilities.joinLstFormat(added, Constants.PIPE)); } - if (sb.length() == 0) { + if (sb.length() == 0) + { return null; } return new String[] { sb.toString() }; } - public Class<Race> getTokenClass() { + public Class<Race> getTokenClass() + { return Race.class; } Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/template/FeatToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/template/FeatToken.java 2008-08-06 22:33:26 UTC (rev 7413) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/template/FeatToken.java 2008-08-06 22:34:06 UTC (rev 7414) @@ -11,7 +11,6 @@ import pcgen.cdom.base.CDOMReference; import pcgen.cdom.base.Constants; import pcgen.cdom.enumeration.AssociationKey; -import pcgen.cdom.reference.ReferenceUtilities; import pcgen.core.Ability; import pcgen.core.AbilityCategory; import pcgen.core.AbilityUtilities; @@ -79,7 +78,8 @@ AssociatedPrereqObject assoc = context.getListContext() .addToList(getTokenName(), obj, Ability.FEATLIST, ability); - assoc.setAssociation(AssociationKey.NATURE, Ability.Nature.AUTOMATIC); + assoc.setAssociation(AssociationKey.NATURE, + Ability.Nature.AUTOMATIC); if (token.indexOf('(') != -1) { List<String> choices = new ArrayList<String>(); @@ -104,7 +104,8 @@ // Zero indicates no Token return null; } - Collection<CDOMReference<Ability>> added = changes.getAdded(); + MapToList<CDOMReference<Ability>, AssociatedPrereqObject> added = changes + .getAddedAssociations(); Collection<CDOMReference<Ability>> removedItems = changes.getRemoved(); StringBuilder sb = new StringBuilder(); if (changes.includesGlobalClear()) @@ -126,11 +127,20 @@ } if (added != null && !added.isEmpty()) { - if (sb.length() != 0) + boolean needsPipe = sb.length() != 0; + for (CDOMReference<Ability> ref : added.getKeySet()) { - sb.append(Constants.PIPE); + String lstFormat = ref.getLSTformat(); + for (int i = 0; i < added.sizeOfListFor(ref); i++) + { + if (needsPipe) + { + sb.append(Constants.PIPE); + } + needsPipe = true; + sb.append(lstFormat); + } } - sb.append(ReferenceUtilities.joinLstFormat(added, Constants.PIPE)); } if (sb.length() == 0) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <nu...@us...> - 2008-08-10 01:17:10
|
Revision: 7459 http://pcgen.svn.sourceforge.net/pcgen/?rev=7459&view=rev Author: nuance Date: 2008-08-10 01:17:14 +0000 (Sun, 10 Aug 2008) Log Message: ----------- General tidying up ================== Tidied up PlayerCharacter getVariable, most of the code was using the same size constant values, replaced these with a more specific routine. decrement in VariableProcessor was passed through four or five levels of calls, but nnever used in any way. eliminted the variable and the useless parameters. Changed the visibility of some operations in PlayerCharacter. Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java Trunk/pcgen/code/src/java/pcgen/core/VariableProcessor.java Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorEq.java Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorPC.java Trunk/pcgen/code/src/java/pcgen/gui/MainDebug.java Trunk/pcgen/code/src/java/pcgen/io/ExportHandler.java Trunk/pcgen/code/src/java/pcgen/io/exporttoken/VarToken.java Trunk/pcgen/code/src/java/plugin/exporttokens/ClassToken.java Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-08-09 23:23:07 UTC (rev 7458) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-08-10 01:17:14 UTC (rev 7459) @@ -3596,14 +3596,39 @@ return getSafeStringFor(StringKey.TRAIT2); } - public Float getVariable(final String variableString, final boolean isMax, - final boolean includeBonus, final String matchSrc, - final String matchSubSrc, int decrement) + /** + * Most of the time when you're looking up a PC variable you want the + * standard behaviour (i.e. you don't care about the source and you want + * the search to recurse and you want the result to include any bonuses + * that have been defined for this variable). If that's what you want, + * this is the routine to call. + * + * note: most of the code was calling the method this delegates to and + * passing the exact same five constant values. + * + * @param variableString The variable to lookup and return the value of. + * @return Float + */ + + public Float getVariable(final String variableString) { - return getVariable(variableString, isMax, includeBonus, matchSrc, - matchSubSrc, true, decrement); + return getVariable(variableString, true, true, "", "", true); } + public Float getVariable( + final String variableString, + final boolean isMax, + final String matchSrc, + final String matchSubSrc) + { + return getVariable(variableString, + isMax, + true, + matchSrc, + matchSubSrc, + true); + } + private double getMinMaxFirstValue(final boolean isNewValue, final boolean isMax, final double oldValue, final double newValue) { @@ -3626,12 +3651,15 @@ * @param matchSrc * @param matchSubSrc * @param recurse - * @param decrement * @return Float */ - public Float getVariable(final String variableString, final boolean isMax, - boolean includeBonus, final String matchSrc, final String matchSubSrc, - final boolean recurse, int decrement) + public Float getVariable( + final String variableString, + final boolean isMax, + boolean includeBonus, + final String matchSrc, + final String matchSubSrc, + final boolean recurse) { double value = 0.0; boolean found = false; @@ -3690,7 +3718,7 @@ { final String varInList = checkForVariableInList(obj, variableString, isMax, - found, value, decrement); + found, value); if (varInList.length() > 0) { @@ -3706,7 +3734,7 @@ { final String varInList = checkForVariableInList(obj, variableString, isMax, - found, value, 0); + found, value); if (varInList.length() > 0) { @@ -3721,7 +3749,7 @@ { final String eS = checkForVariableInList(obj, variableString, isMax, - found, value, 0); + found, value); if (eS.length() > 0) { @@ -3735,8 +3763,7 @@ { final String varInList = checkForVariableInList(em, variableString, isMax, - found, value, - decrement); + found, value); if (varInList.length() > 0) { @@ -3751,8 +3778,7 @@ { final String varInList = checkForVariableInList(em, variableString, isMax, - found, value, - decrement); + found, value); if (varInList.length() > 0) { @@ -3768,7 +3794,7 @@ { final String aString = checkForVariableInList(obj, variableString, isMax, - found, value, decrement); + found, value); if (aString.length() > 0) { @@ -3783,7 +3809,7 @@ { final String aString = checkForVariableInList(obj, variableString, isMax, - found, value, decrement); + found, value); if (aString.length() > 0) { @@ -3798,7 +3824,7 @@ { final String aString = checkForVariableInList(race, variableString, isMax, - found, value, decrement); + found, value); if (aString.length() > 0) { @@ -3813,7 +3839,7 @@ { final String aString = checkForVariableInList(deity, variableString, isMax, - found, value, decrement); + found, value); if (aString.length() > 0) { @@ -3833,8 +3859,7 @@ final String aString = checkForVariableInList(obj.getDomain(), variableString, - isMax, found, value, - decrement); + isMax, found, value); if (aString.length() > 0) { @@ -3869,7 +3894,7 @@ { final String aString = checkForVariableInList(obj, variableString, isMax, - found, value, decrement); + found, value); if (aString.length() > 0) { @@ -3885,7 +3910,7 @@ { final String aString = checkForVariableInList(obj, variableString, isMax, - found, value, decrement); + found, value); if (aString.length() > 0) { @@ -11822,7 +11847,7 @@ setDirty(true); } - int getNumAttacks() + public int getNumAttacks() { return Math.min(Math.max(baseAttackBonus() / 5, 4), 1); } @@ -13464,7 +13489,7 @@ return sa; } - int getSpellClassCount() + public int getSpellClassCount() { return getSpellClassList().size(); } @@ -13495,9 +13520,9 @@ return aList; } - private String checkForVariableInList(final PObject obj, - final String variableString, final boolean isMax, - boolean found, double value, int decrement) + private String checkForVariableInList( + final PObject obj, final String variableString, final boolean isMax, + boolean found, double value) { boolean flag = false; @@ -13545,7 +13570,7 @@ * @return <code>true</code> if the character has the Deity, * <code>false</code> otherwise. */ - boolean hasDeity(final String deityName) + public boolean hasDeity(final String deityName) { final Prerequisite prereq = new Prerequisite(); prereq.setKind("DEITY"); Modified: Trunk/pcgen/code/src/java/pcgen/core/VariableProcessor.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/VariableProcessor.java 2008-08-09 23:23:07 UTC (rev 7458) +++ Trunk/pcgen/code/src/java/pcgen/core/VariableProcessor.java 2008-08-10 01:17:14 UTC (rev 7459) @@ -53,8 +53,6 @@ { /** The current indenting to be used for debug output of jep evaluations. */ protected String jepIndent = ""; - //TODO: This never gets set - perhaps it can be removed? - protected int decrement; private PlayerCharacter pc; /** Modified: Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorEq.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorEq.java 2008-08-09 23:23:07 UTC (rev 7458) +++ Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorEq.java 2008-08-10 01:17:14 UTC (rev 7459) @@ -69,8 +69,7 @@ Float retVal = null; if (getPc().hasVariable(element)) { - final Float value = getPc().getVariable(element, true, true, src, - "", decrement); + final Float value = getPc().getVariable(element, true, src, ""); Logging.debugPrint(jepIndent + "variable for: '" + element + "' = " + value); retVal = new Float(value.doubleValue()); Modified: Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorPC.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorPC.java 2008-08-09 23:23:07 UTC (rev 7458) +++ Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorPC.java 2008-08-10 01:17:14 UTC (rev 7459) @@ -72,7 +72,7 @@ Float retVal = null; if (getPc().hasVariable(element)) { - final Float value = getPc().getVariable(element, true, true, src, "", decrement); + final Float value = getPc().getVariable(element, true, src, ""); Logging.debugPrint(jepIndent + "variable for: '" + element + "' = " + value); retVal = new Float(value.doubleValue()); } Modified: Trunk/pcgen/code/src/java/pcgen/gui/MainDebug.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/MainDebug.java 2008-08-09 23:23:07 UTC (rev 7458) +++ Trunk/pcgen/code/src/java/pcgen/gui/MainDebug.java 2008-08-10 01:17:14 UTC (rev 7459) @@ -153,7 +153,7 @@ pcgen.core.VariableProcessor vp = aPC.getVariableProcessor(); vp.pauseCache(); txtAreaDebug.append(aPC.getDisplayName() + ":" + keyWord + " = " - + aPC.getVariable(keyWord, true, true, "", "", 0)); + + aPC.getVariable(keyWord)); vp.restartCache(); } else Modified: Trunk/pcgen/code/src/java/pcgen/io/ExportHandler.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/ExportHandler.java 2008-08-09 23:23:07 UTC (rev 7458) +++ Trunk/pcgen/code/src/java/pcgen/io/ExportHandler.java 2008-08-10 01:17:14 UTC (rev 7459) @@ -2962,7 +2962,7 @@ value = aTok.nextToken(); } - final Float varval = aPC.getVariable(varName, true, true, "", "", 0); + final Float varval = aPC.getVariable(varName); final Float valval = aPC.getVariableValue(value, ""); if ("GTEQ".equals(bString)) Modified: Trunk/pcgen/code/src/java/pcgen/io/exporttoken/VarToken.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/exporttoken/VarToken.java 2008-08-09 23:23:07 UTC (rev 7458) +++ Trunk/pcgen/code/src/java/pcgen/io/exporttoken/VarToken.java 2008-08-10 01:17:14 UTC (rev 7459) @@ -130,7 +130,7 @@ public static float getVarToken(PlayerCharacter pc, String varName, boolean isMin) { - return pc.getVariable(varName, !isMin, true, "", "", 0).floatValue(); + return pc.getVariable(varName, !isMin, "", ""); } /** @@ -146,6 +146,6 @@ public static int getIntVarToken(PlayerCharacter pc, String varName, boolean isMin) { - return pc.getVariable(varName, !isMin, true, "", "", 0).intValue(); + return pc.getVariable(varName, !isMin, "", "").intValue(); } } Modified: Trunk/pcgen/code/src/java/plugin/exporttokens/ClassToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/exporttokens/ClassToken.java 2008-08-09 23:23:07 UTC (rev 7458) +++ Trunk/pcgen/code/src/java/plugin/exporttokens/ClassToken.java 2008-08-10 01:17:14 UTC (rev 7459) @@ -193,8 +193,7 @@ for (int j = 0; j < varCount; ++j) { // Get the value for each variable final String vString = varTok.nextToken(); - varValue[j] = aPC.getVariable(vString, true, true, "", "", - 0).intValue(); + varValue[j] = aPC.getVariable(vString).intValue(); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-09-14 23:41:26
|
Revision: 7731 http://pcgen.svn.sourceforge.net/pcgen/?rev=7731&view=rev Author: thpr Date: 2008-09-14 23:41:33 +0000 (Sun, 14 Sep 2008) Log Message: ----------- [ 2024451 ] SPELLTYPE ANY is not typed to an item correctly Issue#: 2024451 Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorPC.java Trunk/pcgen/code/src/java/pcgen/core/chooser/SpellsChoiceManager.java Trunk/pcgen/code/src/java/plugin/lsttokens/choose/SpellsToken.java Modified: Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorPC.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorPC.java 2008-09-14 23:20:33 UTC (rev 7730) +++ Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorPC.java 2008-09-14 23:41:33 UTC (rev 7731) @@ -517,6 +517,35 @@ } valString = Integer.toString(max); } + else if ("MAXCASTABLE".equals(valString) && src.equals("ANY")) + { + int max = 0; + for (PCClass spClass : getPc().getClassList()) + { + int cutoff = spClass.getHighestLevelSpell(); + if (spClass.hasCastList()) + { + for (int i = 0; i < cutoff; i++) + { + if (spClass.getCastForLevel(i, getPc()) != 0) + { + max = Math.max(max, i); + } + } + } + else + { + for (int i = 0; i < cutoff; i++) + { + if (spClass.getKnownForLevel(i, getPc()) != 0) + { + max = Math.max(max, i); + } + } + } + } + valString = Integer.toString(max); + } else if ("MAXCASTABLE".equals(valString) && src.startsWith("CLASS:")) { String classKey = src.substring(6); Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/SpellsChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/SpellsChoiceManager.java 2008-09-14 23:20:33 UTC (rev 7730) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/SpellsChoiceManager.java 2008-09-14 23:41:33 UTC (rev 7731) @@ -93,6 +93,23 @@ appendSpells(new TypeKeyFilter("CLASS", token.substring(6), null), aPc, localList); } + else if (token.startsWith("ANY")) + { + int bracketLoc = token.indexOf('['); + Restriction r = null; + if (bracketLoc != -1) + { + if (!token.endsWith("]")) + { + Logging.errorPrint("Invalid entry in " + + "CHOOSE:SPELLS: " + token + + " did not have matching brackets"); + } + r = getRestriction("ANY", token.substring( + bracketLoc + 1, token.length() - 1), aPc); + } + appendSpells(new AnyFilter(r), aPc, localList); + } else if (token.startsWith("SPELLTYPE=")) { int bracketLoc = token.indexOf('['); @@ -469,6 +486,67 @@ } } + private class AnyFilter implements SpellFilter + { + private final Restriction res; + private final String defaultbook; + + public AnyFilter(Restriction r) + { + defaultbook = Globals.getDefaultSpellBook(); + res = r; + } + + public void conditionallyAdd(Spell spell, PlayerCharacter pc, + List<Spell> availableList) + { + Map<String, Integer> levelInfo = spell.getLevelInfo(pc); + for (Map.Entry<String, Integer> me : levelInfo.entrySet()) + { + if (passesRestriction(spell, pc, me.getValue())) + { + availableList.add(spell); + return; + } + } + } + + private boolean passesRestriction(Spell spell, PlayerCharacter pc, + int level) + { + if (res != null) + { + if (level > res.maxLevel || level < res.minLevel) + { + return false; + } + if (res.knownRequired) + { + boolean found = false; + for (PCClass cl : pc.getClassList()) + { + SpellSupport ss = cl.getSpellSupport(); + List<CharacterSpell> csl = ss.getCharacterSpell(spell, + defaultbook, -1); + if (csl != null && !csl.isEmpty()) + { + /* + * Going to assume here that the level doesn't need + * to be rechecked... ?? - thpr Feb 26, 08 + */ + found = true; + } + } + if (!found) + { + return false; + } + } + } + return true; + } + } + private class TypeFilter implements SpellFilter { private final String type; Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/choose/SpellsToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/choose/SpellsToken.java 2008-09-14 23:20:33 UTC (rev 7730) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/choose/SpellsToken.java 2008-09-14 23:41:33 UTC (rev 7731) @@ -168,6 +168,28 @@ token.length() - 1)); } } + else if (token.startsWith("ANY")) + { + int bracketLoc = token.indexOf('['); + if (bracketLoc > -1 && bracketLoc != 3) + { + Logging.errorPrint("Invalid ANY entry for " + + "CHOOSE:SPELLS, bracket must immediately follow 'ANY'"); + return false; + } + else + { + if (!token.endsWith("]")) + { + Logging.errorPrint("Invalid entry in " + + "CHOOSE:SPELLS: " + token + + " did not have matching brackets"); + return false; + } + validateRestriction(token.substring(bracketLoc + 1, + token.length() - 1)); + } + } else if (token.startsWith("SCHOOL=")) { if (token.length() < 8) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jde...@us...> - 2008-09-20 02:01:51
|
Revision: 7758 http://pcgen.svn.sourceforge.net/pcgen/?rev=7758&view=rev Author: jdempsey Date: 2008-09-20 02:01:37 +0000 (Sat, 20 Sep 2008) Log Message: ----------- FReq: Make TYPE:* valid in ABILITYCATEGORY file Issue#: 2074858 Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/AbilityCategory.java Trunk/pcgen/code/src/java/pcgen/core/Globals.java Trunk/pcgen/code/src/java/pcgen/persistence/lst/LstSystemLoader.java Trunk/pcgen/code/src/java/plugin/lsttokens/gamemode/abilitycategory/TypeToken.java Modified: Trunk/pcgen/code/src/java/pcgen/core/AbilityCategory.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/AbilityCategory.java 2008-09-18 23:52:23 UTC (rev 7757) +++ Trunk/pcgen/code/src/java/pcgen/core/AbilityCategory.java 2008-09-20 02:01:37 UTC (rev 7758) @@ -52,6 +52,7 @@ private String theAbilityCategory; private Set<String> theAbilityTypes = null; + private boolean allAbilityTypes = false; private String thePoolFormula = "0"; //$NON-NLS-1$ private String theDisplayLocation; @@ -173,6 +174,26 @@ } /** + * Should all ability types be included in this category? + * @return true if all types should be included, + * false if only those listed should be. + */ + public boolean isAllAbilityTypes() + { + return allAbilityTypes; + } + + /** + * Configure whether all ability types be included in this category? + * @param allAbilityTypes true if all types should be included, + * false if only those listed should be. + */ + public void setAllAbilityTypes(boolean allAbilityTypes) + { + this.allAbilityTypes = allAbilityTypes; + } + + /** * Gets the formula to use for calculating the base pool size for this * category of ability. * Modified: Trunk/pcgen/code/src/java/pcgen/core/Globals.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Globals.java 2008-09-18 23:52:23 UTC (rev 7757) +++ Trunk/pcgen/code/src/java/pcgen/core/Globals.java 2008-09-20 02:01:37 UTC (rev 7758) @@ -870,13 +870,21 @@ { final List<? extends Categorisable> abilities = abilityStore.getUnmodifiableList( aCategory.getAbilityCategory() ); final List<Ability> ret = new ArrayList<Ability>(abilities.size()); + final boolean includeAllAbiltiies = + aCategory.getAbilityCategory().equalsIgnoreCase( + aCategory.getKeyName()) + || aCategory.isAllAbilityTypes(); for ( final Categorisable ab : abilities ) { if ( ab instanceof Ability ) { final Ability ability = (Ability)ab; - if ( aCategory.getAbilityTypes().size() > 0 ) + if (includeAllAbiltiies) { + ret.add( ability ); + } + else if ( aCategory.getAbilityTypes().size() > 0 ) + { for ( final String type : aCategory.getAbilityTypes() ) { if ( ability.isType(type) ) @@ -886,10 +894,6 @@ } } } - else - { - ret.add( ability ); - } } } return Collections.unmodifiableList(ret); Modified: Trunk/pcgen/code/src/java/pcgen/persistence/lst/LstSystemLoader.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/persistence/lst/LstSystemLoader.java 2008-09-18 23:52:23 UTC (rev 7757) +++ Trunk/pcgen/code/src/java/pcgen/persistence/lst/LstSystemLoader.java 2008-09-20 02:01:37 UTC (rev 7758) @@ -579,11 +579,12 @@ for (AbilityCategory ac : gamemode.getAllAbilityCategories()) { //Must be a universal set if no types - if (ac.getAbilityTypes().isEmpty()) + if (ac.getAbilityTypes().isEmpty() && !ac.isAllAbilityTypes()) { if (!ac.getAbilityCategory().equalsIgnoreCase(ac.getKeyName())) { - Logging.errorPrint("Ability Category " + ac.getKeyName() + Logging.log(Logging.LST_ERROR, "Ability Category " + + ac.getKeyName() + " had no TYPE, but has a different CATEGORY"); } } Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/gamemode/abilitycategory/TypeToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/gamemode/abilitycategory/TypeToken.java 2008-09-18 23:52:23 UTC (rev 7757) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/gamemode/abilitycategory/TypeToken.java 2008-09-20 02:01:37 UTC (rev 7758) @@ -26,6 +26,7 @@ import pcgen.core.AbilityCategory; import pcgen.persistence.lst.AbilityCategoryLstToken; +import pcgen.util.Logging; /** * Handles the TYPE token on an ABILITYCATEGORY line. @@ -43,9 +44,34 @@ public boolean parse(final AbilityCategory aCat, final String aValue) { final StringTokenizer tok = new StringTokenizer(aValue, "."); //$NON-NLS-1$ + boolean errorFlagged = false; while (tok.hasMoreTokens()) { - aCat.addAbilityType(tok.nextToken()); + String typeVal = tok.nextToken(); + if ("*".equals(typeVal)) + { + if (!aCat.getAbilityTypes().isEmpty() && !errorFlagged) + { + Logging.log(Logging.LST_WARNING, + "Use of named types along with TYPE:* in category " + + aCat.getDisplayName() + + " is redundant. Named types " + aCat.getAbilityTypes() + " will be ignored"); + errorFlagged = true; + } + aCat.setAllAbilityTypes(true); + } + else + { + aCat.addAbilityType(typeVal); + if (aCat.isAllAbilityTypes() && !errorFlagged) + { + Logging.log(Logging.LST_WARNING, + "Use of named types along with TYPE:* in category " + + aCat.getDisplayName() + + " is redundant. Named types " + aCat.getAbilityTypes() + "will be ignored"); + errorFlagged = true; + } + } } return true; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-09-26 01:52:44
|
Revision: 7795 http://pcgen.svn.sourceforge.net/pcgen/?rev=7795&view=rev Author: thpr Date: 2008-09-26 01:52:33 +0000 (Fri, 26 Sep 2008) Log Message: ----------- ITEMCREATE token update Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/StringKey.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/gui/editor/ClassAbilityPanel.java Trunk/pcgen/code/src/java/plugin/lsttokens/pcclass/ItemcreateToken.java Modified: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/StringKey.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/StringKey.java 2008-09-26 01:40:08 UTC (rev 7794) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/StringKey.java 2008-09-26 01:52:33 UTC (rev 7795) @@ -33,5 +33,5 @@ */ public enum StringKey { - NAME, KEY_NAME, WORSHIPPERS, TITLE, HOLY_ITEM, MASTER_HP_FORMULA, MASTER_CHECK_FORMULA, MASTER_BAB_FORMULA, BIRTHPLACE, BIRTHDAY, CATEGORY, BOOK_TYPE, CHOICE_STRING, DESTINATION, PAGE_USAGE, MINDEVVER, MINVER, ADD, BIO, DESCRIPTION, GENRE, HELP, APPEARANCE, CATCH_PHRASE, OUTPUT_NAME, INFO_TEXT, CHOICE_TO_MODIFY, PUB_NAME_LONG, COST, PUB_NAME_SHORT, CURRENT_EQUIP_SET_NAME, REGION, PUB_NAME_WEB, SETTING, SR_FORMULA, TEMP_DESCRIPTION, TRAIT2, TRAIT1, SKIN_COLOR, HAIR_COLOR, SUB_REGION, SPEECH_TENDENCY, PHOBIAS, INTERESTS, RESIDENCE, SPELLBOOK_AUTO_ADD_KNOWN, PLAYERS_NAME, HANDED, HAIR_STYLE, PORTRAIT_PATH, EYE_COLOR, LOCATION, FILE_NAME, ABB, TARGET_AREA, NAME_TEXT, DAMAGE, DAMAGE_OVERRIDE, RATE_OF_FIRE, FUMBLE_RANGE, LISTTYPE, SPELLTYPE + NAME, KEY_NAME, WORSHIPPERS, TITLE, HOLY_ITEM, MASTER_HP_FORMULA, MASTER_CHECK_FORMULA, MASTER_BAB_FORMULA, BIRTHPLACE, BIRTHDAY, CATEGORY, BOOK_TYPE, CHOICE_STRING, DESTINATION, PAGE_USAGE, MINDEVVER, MINVER, ADD, BIO, DESCRIPTION, GENRE, HELP, APPEARANCE, CATCH_PHRASE, OUTPUT_NAME, INFO_TEXT, CHOICE_TO_MODIFY, PUB_NAME_LONG, COST, PUB_NAME_SHORT, CURRENT_EQUIP_SET_NAME, REGION, PUB_NAME_WEB, SETTING, SR_FORMULA, TEMP_DESCRIPTION, TRAIT2, TRAIT1, SKIN_COLOR, HAIR_COLOR, SUB_REGION, SPEECH_TENDENCY, PHOBIAS, INTERESTS, RESIDENCE, SPELLBOOK_AUTO_ADD_KNOWN, PLAYERS_NAME, HANDED, HAIR_STYLE, PORTRAIT_PATH, EYE_COLOR, LOCATION, FILE_NAME, ABB, TARGET_AREA, NAME_TEXT, DAMAGE, DAMAGE_OVERRIDE, RATE_OF_FIRE, FUMBLE_RANGE, LISTTYPE, SPELLTYPE, ITEMCREATE } Modified: Trunk/pcgen/code/src/java/pcgen/core/EquipmentModifier.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/EquipmentModifier.java 2008-09-26 01:40:08 UTC (rev 7794) +++ Trunk/pcgen/code/src/java/pcgen/core/EquipmentModifier.java 2008-09-26 01:52:33 UTC (rev 7795) @@ -37,6 +37,7 @@ import pcgen.cdom.enumeration.IntegerKey; import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; +import pcgen.cdom.enumeration.StringKey; import pcgen.core.bonus.Bonus; import pcgen.core.bonus.BonusObj; import pcgen.core.prereq.PrereqHandler; @@ -562,8 +563,7 @@ if (castClass != null) { final StringBuffer multiple = new StringBuffer(200); - String aString = castClass - .getItemCreationMultiplier(); + String aString = castClass.get(StringKey.ITEMCREATE); if (aString.length() != 0) { Modified: Trunk/pcgen/code/src/java/pcgen/core/PCClass.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-09-26 01:40:08 UTC (rev 7794) +++ Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-09-26 01:52:33 UTC (rev 7795) @@ -234,24 +234,6 @@ // really working properly /* - * STRINGREFACTOR This is currently taking in a complex formula-ish string - * and needs to be put back into the Tag! - */ - /* - * UNKNOWNDESTINATION Not sure where to put this today. In fact, this is - * NEVER called from an instance of PCClass that is part of a - * PlayerCharacter, it is actually a REFERENCE item based on calculating the - * cost (GP cost?) of a piece of equipment. Therefore, there seems to be no - * reason at ALL to put this into PCClassLevel, but rather keep it as - * something entirely in PCClass. (Perhaps this really becomes a "static" - * method in PCClass: The Factory? This can't literally be static, since it - * is directly part of the PCClass instance, but it's also one of the few - * things that should be exposed for use in PCClass other than the - * PCClassLevel factory method. - */ - private String itemCreationMultiplier = Constants.EMPTY_STRING; - - /* * UNKNOWNDESTINATION This is (yet again) a bit complicated due to the fact * that this is a prerequisite test. First, this is LEVELONEONLY in the * sense that this prerequisite might only be justifiably tested for the @@ -793,25 +775,6 @@ } /* - * PCCLASSONLY Since this is a reference variable, it will likely - * only appear in PCCLASS - */ - public final void setItemCreationMultiplier( - final String argItemCreationMultiplier) - { - itemCreationMultiplier = argItemCreationMultiplier; - } - - /* - * PCCLASSONLY Since this is a reference variable, it will likely - * only appear in PCCLASS - */ - public final String getItemCreationMultiplier() - { - return itemCreationMultiplier; - } - - /* * PCCLASSLEVELONLY This is only relevant for the PCClassLevel (obviously?) */ public final int getLevel() @@ -2214,11 +2177,6 @@ pccTxt.append(StringUtil.join(prohibitedSchools, ",")); } - if (itemCreationMultiplier.length() != 0) - { - pccTxt.append("\tITEMCREATE:").append(itemCreationMultiplier); - } - // now all the level-based stuff final String lineSep = System.getProperty("line.separator"); Modified: Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassAbilityPanel.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassAbilityPanel.java 2008-09-26 01:40:08 UTC (rev 7794) +++ Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassAbilityPanel.java 2008-09-26 01:52:33 UTC (rev 7795) @@ -121,7 +121,10 @@ } a = itemCreate.getText().trim(); - obj.setItemCreationMultiplier(a); + if (a.length() > 0) + { + obj.put(StringKey.ITEMCREATE, a); + } a = extraFeats.getText().trim(); @@ -213,7 +216,7 @@ .getSafeListFor(ListKey.ATTACK_CYCLE), Constants.PIPE)); hitDice.setText(String.valueOf(obj.getSafe(ObjectKey.LEVEL_HITDIE).getDie())); deity.setText(StringUtil.join(obj.getSafeListFor(ListKey.DEITY), Constants.PIPE)); - itemCreate.setText(obj.getItemCreationMultiplier()); + itemCreate.setText(obj.get(StringKey.ITEMCREATE)); Integer sf = obj.get(IntegerKey.START_FEATS); extraFeats.setText(sf == null ? "" : sf.toString()); Integer lpf = obj.get(IntegerKey.LEVELS_PER_FEAT); Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/pcclass/ItemcreateToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/pcclass/ItemcreateToken.java 2008-09-26 01:40:08 UTC (rev 7794) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/pcclass/ItemcreateToken.java 2008-09-26 01:52:33 UTC (rev 7795) @@ -1,12 +1,15 @@ package plugin.lsttokens.pcclass; +import pcgen.cdom.enumeration.StringKey; import pcgen.core.PCClass; -import pcgen.persistence.lst.PCClassLstToken; +import pcgen.rules.context.LoadContext; +import pcgen.rules.persistence.token.CDOMPrimaryToken; +import pcgen.util.Logging; /** * Class deals with ITEMCREATE Token */ -public class ItemcreateToken implements PCClassLstToken +public class ItemcreateToken implements CDOMPrimaryToken<PCClass> { public String getTokenName() @@ -14,9 +17,30 @@ return "ITEMCREATE"; } - public boolean parse(PCClass pcclass, String value, int level) + public boolean parse(LoadContext context, PCClass pcc, String value) { - pcclass.setItemCreationMultiplier(value); + if (value.length() == 0) + { + Logging.errorPrint(getTokenName() + " arguments may not be empty"); + return false; + } + context.getObjectContext().put(pcc, StringKey.ITEMCREATE, value); return true; } + + public String[] unparse(LoadContext context, PCClass pcc) + { + String title = + context.getObjectContext().getString(pcc, StringKey.ITEMCREATE); + if (title == null) + { + return null; + } + return new String[]{title}; + } + + public Class<PCClass> getTokenClass() + { + return PCClass.class; + } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-09-27 20:25:57
|
Revision: 7811 http://pcgen.svn.sourceforge.net/pcgen/?rev=7811&view=rev Author: thpr Date: 2008-09-27 20:25:49 +0000 (Sat, 27 Sep 2008) Log Message: ----------- SELECT token update Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/FormulaKey.java Trunk/pcgen/code/src/java/pcgen/core/Equipment.java Trunk/pcgen/code/src/java/pcgen/core/EquipmentChoice.java Trunk/pcgen/code/src/java/pcgen/core/PObject.java Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java Trunk/pcgen/code/src/java/pcgen/core/chooser/AbstractBasicChoiceManager.java Trunk/pcgen/code/src/java/plugin/lsttokens/SelectLst.java Trunk/pcgen/code/src/java/plugin/lsttokens/choose/SpellLevelToken.java Modified: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/FormulaKey.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/FormulaKey.java 2008-09-27 19:08:59 UTC (rev 7810) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/FormulaKey.java 2008-09-27 20:25:49 UTC (rev 7811) @@ -70,7 +70,7 @@ public static final FormulaKey MONSTER_NON_SKILL_HD = getConstant("MONSTER_NON_SKILL_HD"); - public static final FormulaKey SELECT = getConstant("SELECT"); + public static final FormulaKey SELECT = getConstant("SELECT", Formula.ONE); public static final FormulaKey STAT_MOD = getConstant("STAT_MOD"); Modified: Trunk/pcgen/code/src/java/pcgen/core/Equipment.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Equipment.java 2008-09-27 19:08:59 UTC (rev 7810) +++ Trunk/pcgen/code/src/java/pcgen/core/Equipment.java 2008-09-27 20:25:49 UTC (rev 7811) @@ -6061,8 +6061,9 @@ public int getSelectCorrectedAssociationCount(PObject obj) { //TODO Null here is probably a problem for the PC :/ - return obj.tempGetAssociatedCount() - / getVariableValue(obj.getSelectCount(), "", null).intValue(); + int select = obj.getSafe(FormulaKey.SELECT).resolve(this, true, null, + "").intValue(); + return obj.tempGetAssociatedCount() / select; } public List<String> getAssociationList(PObject obj) Modified: Trunk/pcgen/code/src/java/pcgen/core/EquipmentChoice.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/EquipmentChoice.java 2008-09-27 19:08:59 UTC (rev 7810) +++ Trunk/pcgen/code/src/java/pcgen/core/EquipmentChoice.java 2008-09-27 20:25:49 UTC (rev 7811) @@ -23,6 +23,7 @@ */ package pcgen.core; +import pcgen.cdom.enumeration.FormulaKey; import pcgen.cdom.enumeration.ObjectKey; import pcgen.util.Delta; import pcgen.util.Logging; @@ -526,8 +527,9 @@ } } - setMaxSelect(parent.getVariableValue(parent.getSelectCount(), "", pc) - .intValue()); + int select = parent.getSafe(FormulaKey.SELECT).resolve(parent, true, + pc, "").intValue(); + setMaxSelect(select); String originalkind = null; final StringTokenizer aTok = new StringTokenizer(choiceString, "|", false); Modified: Trunk/pcgen/code/src/java/pcgen/core/PObject.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-09-27 19:08:59 UTC (rev 7810) +++ Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-09-27 20:25:49 UTC (rev 7811) @@ -128,8 +128,6 @@ private Set<String> types = new LinkedHashSet<String>(); - private String chooseSelectCount = "1"; - private final Class<?> myClass = getClass(); /* ************ @@ -3718,16 +3716,6 @@ levelAbilityList.clear(); } - public void setSelect(String value) - { - chooseSelectCount = value; - } - - public String getSelectCount() - { - return chooseSelectCount; - } - public void putServesAs( final String key, final String category) { if (servesAsList == null) Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-09-27 19:08:59 UTC (rev 7810) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-09-27 20:25:49 UTC (rev 7811) @@ -16414,7 +16414,7 @@ } else { - int select = getVariableValue(aFeat.getSelectCount(), "") + int select = aFeat.getSafe(FormulaKey.SELECT).resolve(this, "") .intValue(); double relativeCost = cost / select; if (!AbilityCategory.FEAT.allowFractionalPool()) @@ -16454,8 +16454,8 @@ } else { - int select = getVariableValue(ability.getSelectCount(), "") - .intValue(); + int select = ability.getSafe(FormulaKey.SELECT).resolve( + this, "").intValue(); double relativeCost = cost / select; if (!aCategory.allowFractionalPool()) { @@ -17904,7 +17904,7 @@ public int getSelectCorrectedAssociationCount(PObject obj) { return obj.tempGetAssociatedCount() - / getVariableValue(obj.getSelectCount(), "", this).intValue(); + / obj.getSafe(FormulaKey.SELECT).resolve(this, "").intValue(); } public List<String> getAssociationList(PObject obj) Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/AbstractBasicChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/AbstractBasicChoiceManager.java 2008-09-27 19:08:59 UTC (rev 7810) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/AbstractBasicChoiceManager.java 2008-09-27 20:25:49 UTC (rev 7811) @@ -26,7 +26,9 @@ import java.util.List; import java.util.StringTokenizer; +import pcgen.base.formula.Formula; import pcgen.cdom.base.Constants; +import pcgen.cdom.enumeration.FormulaKey; import pcgen.cdom.enumeration.ObjectKey; import pcgen.core.Ability; import pcgen.core.AbilityCategory; @@ -68,7 +70,7 @@ pobject = aPObject; StringTokenizer st = new StringTokenizer(theChoices, Constants.PIPE); String chooserName = st.nextToken(); - String selectionsPerUnitCost = pobject.getSelectCount(); + Formula selectionsPerUnitCost = pobject.getSafe(FormulaKey.SELECT); int totalChoices = -1; /* @@ -114,8 +116,7 @@ choices.trimToSize(); chooserHandled = chooserName; numberOfChoices = totalChoices; - choicesPerUnitCost = aPC.getVariableValue(selectionsPerUnitCost, "") - .intValue(); + choicesPerUnitCost = selectionsPerUnitCost.resolve(aPC, "").intValue(); } /** Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/SelectLst.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/SelectLst.java 2008-09-27 19:08:59 UTC (rev 7810) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/SelectLst.java 2008-09-27 20:25:49 UTC (rev 7811) @@ -1,26 +1,43 @@ package plugin.lsttokens; -import pcgen.core.PObject; -import pcgen.persistence.lst.GlobalLstToken; +import pcgen.base.formula.Formula; +import pcgen.cdom.base.CDOMObject; +import pcgen.cdom.base.FormulaFactory; +import pcgen.cdom.enumeration.FormulaKey; +import pcgen.rules.context.LoadContext; +import pcgen.rules.persistence.token.CDOMPrimaryToken; /** * Class deals with SELECT Token */ -public class SelectLst implements GlobalLstToken +public class SelectLst implements CDOMPrimaryToken<CDOMObject> { - - /* - * FIXME Can't do this until Formula objects can be used in Equipment - */ public String getTokenName() { return "SELECT"; } - public boolean parse(PObject obj, String value, int anInt) + public boolean parse(LoadContext context, CDOMObject cdo, String value) { - obj.setSelect(value); + context.getObjectContext().put(cdo, FormulaKey.SELECT, + FormulaFactory.getFormulaFor(value)); return true; } + + public String[] unparse(LoadContext context, CDOMObject cdo) + { + Formula f = context.getObjectContext().getFormula(cdo, + FormulaKey.SELECT); + if (f == null) + { + return null; + } + return new String[] { f.toString() }; + } + + public Class<CDOMObject> getTokenClass() + { + return CDOMObject.class; + } } Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/choose/SpellLevelToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/choose/SpellLevelToken.java 2008-09-27 19:08:59 UTC (rev 7810) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/choose/SpellLevelToken.java 2008-09-27 20:25:49 UTC (rev 7811) @@ -20,6 +20,8 @@ import java.util.StringTokenizer; import pcgen.cdom.base.Constants; +import pcgen.cdom.base.FormulaFactory; +import pcgen.cdom.enumeration.FormulaKey; import pcgen.core.PObject; import pcgen.persistence.lst.ChooseLstToken; import pcgen.util.Logging; @@ -93,10 +95,11 @@ + " must have two or more | delimited arguments : " + value); return false; } - String start = value.substring(0, pipeLoc); + String startString = value.substring(0, pipeLoc); + int start; try { - Integer.parseInt(start); + start = Integer.parseInt(startString); } catch (NumberFormatException nfe) { @@ -161,7 +164,7 @@ } sb.append(getTokenName()).append('|').append(value).append(suffix); po.setChoiceString(sb.toString()); - po.setSelect(start); + po.put(FormulaKey.SELECT, FormulaFactory.getFormulaFor(start)); return true; } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-09-27 21:06:14
|
Revision: 7812 http://pcgen.svn.sourceforge.net/pcgen/?rev=7812&view=rev Author: thpr Date: 2008-09-27 21:06:08 +0000 (Sat, 27 Sep 2008) Log Message: ----------- CHANGEPROF token update Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.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/chooser/ProficiencyChoiceManager.java Trunk/pcgen/code/src/java/plugin/lsttokens/ChangeprofLst.java Added Paths: ----------- Trunk/pcgen/code/src/java/pcgen/cdom/content/ChangeProf.java Trunk/pcgen/code/src/java/pcgen/core/analysis/WeaponProfType.java Added: Trunk/pcgen/code/src/java/pcgen/cdom/content/ChangeProf.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/content/ChangeProf.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/cdom/content/ChangeProf.java 2008-09-27 21:06:08 UTC (rev 7812) @@ -0,0 +1,85 @@ +/* + * Copyright 2007 (C) Tom Parker <th...@us...> + * + * This library is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation; either version 2.1 of the License, or (at your option) + * any later version. + * + * This library is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + * details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +package pcgen.cdom.content; + +import pcgen.cdom.base.CDOMReference; +import pcgen.cdom.base.ConcretePrereqObject; +import pcgen.cdom.reference.CDOMGroupRef; +import pcgen.core.WeaponProf; + +public class ChangeProf extends ConcretePrereqObject +{ + + private final CDOMReference<WeaponProf> source; + + private final CDOMGroupRef<WeaponProf> result; + + public ChangeProf(CDOMReference<WeaponProf> sourceProf, + CDOMGroupRef<WeaponProf> resultType) + { + if (sourceProf == null) + { + throw new IllegalArgumentException( + "Source Prof for ChangeProf cannot be null"); + } + if (resultType == null) + { + throw new IllegalArgumentException( + "Resulting Prof Type for ChangeProf cannot be null"); + } + source = sourceProf; + result = resultType; + } + + public CDOMReference<WeaponProf> getSource() + { + return source; + } + + public CDOMGroupRef<WeaponProf> getResult() + { + return result; + } + + @Override + public int hashCode() + { + return 31 * source.hashCode() + result.hashCode(); + } + + @Override + public boolean equals(Object o) + { + if (o == this) + { + return true; + } + if (!(o instanceof ChangeProf)) + { + return false; + } + ChangeProf other = (ChangeProf) o; + return source.equals(other.source) && result.equals(other.result); + } + + public String getLSTformat() + { + // FIXME Hack for back Generics in GraphChangs + return source.getLSTformat() + " " + result.getLSTformat(); + } +} Modified: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java 2008-09-27 20:25:49 UTC (rev 7811) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java 2008-09-27 21:06:08 UTC (rev 7812) @@ -28,6 +28,7 @@ import pcgen.base.formula.Formula; import pcgen.cdom.base.CDOMReference; import pcgen.cdom.base.TransitionChoice; +import pcgen.cdom.content.ChangeProf; import pcgen.cdom.content.KnownSpellIdentifier; import pcgen.cdom.content.LevelCommandFactory; import pcgen.cdom.helper.Aspect; @@ -222,6 +223,7 @@ 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>(); + public static final ListKey<ChangeProf> CHANGEPROF = new ListKey<ChangeProf>(); /** Private constructor to prevent instantiation of this class */ private ListKey() { Modified: Trunk/pcgen/code/src/java/pcgen/core/Globals.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Globals.java 2008-09-27 20:25:49 UTC (rev 7811) +++ Trunk/pcgen/code/src/java/pcgen/core/Globals.java 2008-09-27 21:06:08 UTC (rev 7812) @@ -2545,42 +2545,6 @@ } /** - * Get the Weapon Profs - * @param type - * @param aPC - * @return List of Weapon Profs - */ - public static List<WeaponProf> getWeaponProfs(final String type, final PlayerCharacter aPC) - { - MapToList<String, WeaponProf> mtl = aPC.getChangeProfList(); - List<WeaponProf> aList = mtl.getListFor(type); - if (aList == null) - { - aList = new ArrayList<WeaponProf>(); - } - - Collection<WeaponProf> weaponProfsOfType = getPObjectsOfType( - getContext().ref.getConstructedCDOMObjects(WeaponProf.class), - type); - - if (weaponProfsOfType == null) - { - return aList; - } - - ArrayList<WeaponProf> appendList = new ArrayList<WeaponProf>(weaponProfsOfType); - for (String cpType : mtl.getKeySet()) - { - if (!type.equals(cpType)) - { - appendList.removeAll(mtl.getListFor(cpType)); - } - } - aList.addAll(appendList); - return aList; - } - - /** * Reduce/increase damage for modified size as per DMG p.162 * @param aDamage * @param sBaseSize Modified: Trunk/pcgen/code/src/java/pcgen/core/PObject.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-09-27 20:25:49 UTC (rev 7811) +++ Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-09-27 21:06:08 UTC (rev 7812) @@ -52,6 +52,7 @@ import pcgen.cdom.enumeration.ObjectKey; import pcgen.cdom.enumeration.StringKey; import pcgen.cdom.reference.CDOMSingleRef; +import pcgen.core.analysis.WeaponProfType; import pcgen.core.bonus.Bonus; import pcgen.core.bonus.BonusObj; import pcgen.core.bonus.BonusUtilities; @@ -114,8 +115,6 @@ /** List of Bonuses for the object */ private List<BonusObj> bonusList = new ArrayList<BonusObj>(); - private HashMap<String, String> changeProfMap = new HashMap<String, String>(); - private SpellSupport spellSupport = new SpellSupport(); private boolean isNewItem = true; @@ -525,68 +524,6 @@ } /** - * Get a list of WeaponProf|ProfType strings from changeProfMap - * @param character - * @return List - */ - public Map<WeaponProf, String> getChangeProfList(final PlayerCharacter character) - { - final Map<WeaponProf, String> results = new HashMap<WeaponProf, String>(); - - for (Iterator<String> e = changeProfMap.keySet().iterator(); e.hasNext();) - { - // aKey will either be: - // TYPE.blah - // or - // Weapon Name - final String aKey = e.next(); - - // New proficiency type, such as Martial or Simple - final String newProfType = changeProfMap.get(aKey); - - if (aKey.startsWith("TYPE.")) - { - // need to get all items of this TYPE - for (Iterator<Equipment> eq = EquipmentList.getEquipmentOfType(aKey.substring(5), "").iterator(); eq.hasNext();) - { - CDOMSingleRef<WeaponProf> ref = eq.next().get(ObjectKey.WEAPON_PROF); - if (ref != null) - { - results.put(ref.resolvesTo(), newProfType); - } - } - } - else - { - final Equipment aEq = Globals.getContext().ref - .silentlyGetConstructedCDOMObject(Equipment.class, aKey); - - if (aEq == null) - { - continue; - } - CDOMSingleRef<WeaponProf> ref = aEq.get(ObjectKey.WEAPON_PROF); - if (ref != null) - { - results.put(ref.resolvesTo(), newProfType); - } - } - } - - return results; - } - - /** - * Adds Weapons/Armor/Shield names/types to new Proficiency mapping - * - * @param aString is a list of equipment and new Profs - */ - public void addChangeProf(String eqString, String newProf) - { - changeProfMap.put(eqString, newProf); - } - - /** * Returns true if the assocaited item is in the associated list for this object * @param associated * @return true if the assocaited item is in the associated list for this object @@ -667,8 +604,6 @@ // } retVal.theSource = theSource.clone(); - retVal.changeProfMap = new HashMap<String, String>(changeProfMap); - if (assocList != null) { retVal.assocList = new ArrayList<String[]>(assocList); @@ -2389,7 +2324,7 @@ while (bTok.hasMoreTokens()) { final String bString = bTok.nextToken(); - final List<WeaponProf> pcWeapProfList = Globals.getWeaponProfs(bString, aPC); + final List<WeaponProf> pcWeapProfList = WeaponProfType.getWeaponProfs(bString, aPC); final List<Equipment> pcWeaponList = new ArrayList<Equipment>(); if (pcWeapProfList.size() == 0) { Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-09-27 20:25:49 UTC (rev 7811) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-09-27 21:06:08 UTC (rev 7812) @@ -56,8 +56,6 @@ import pcgen.base.lang.StringUtil; import pcgen.base.util.DoubleKeyMap; import pcgen.base.util.HashMapToList; -import pcgen.base.util.MapToList; -import pcgen.base.util.TreeMapToList; import pcgen.cdom.base.AssociatedPrereqObject; import pcgen.cdom.base.CDOMObject; import pcgen.cdom.base.CDOMObjectUtilities; @@ -5316,28 +5314,6 @@ return sumActiveBonusMap(typeString); } - /** - * Get the list of WeaponName and Proficiency types from the changeProfMap - * of each granting object - * - * @return List - */ - public MapToList<String, WeaponProf> getChangeProfList() - { - MapToList<String, WeaponProf> mtl = new TreeMapToList<String, WeaponProf>( - String.CASE_INSENSITIVE_ORDER); - - for (PObject pObj : getPObjectList()) - { - Map<WeaponProf, String> cp = pObj.getChangeProfList(this); - for (Map.Entry<WeaponProf, String> me : cp.entrySet()) - { - mtl.addToListFor(me.getValue(), me.getKey()); - } - } - return mtl; - } - public CharacterDomain getCharacterDomainForDomain(final String domainKey) { for (CharacterDomain cd : characterDomainList) Added: Trunk/pcgen/code/src/java/pcgen/core/analysis/WeaponProfType.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/analysis/WeaponProfType.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/core/analysis/WeaponProfType.java 2008-09-27 21:06:08 UTC (rev 7812) @@ -0,0 +1,58 @@ +package pcgen.core.analysis; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import pcgen.cdom.base.CDOMObject; +import pcgen.cdom.content.ChangeProf; +import pcgen.cdom.enumeration.ListKey; +import pcgen.cdom.reference.CDOMGroupRef; +import pcgen.core.Globals; +import pcgen.core.PlayerCharacter; +import pcgen.core.WeaponProf; +import pcgen.rules.context.AbstractReferenceContext; + +public class WeaponProfType +{ + /** + * Get the Weapon Profs + * @param type + * @param aPC + * @return List of Weapon Profs + */ + public static List<WeaponProf> getWeaponProfs(final String type, + final PlayerCharacter aPC) + { + AbstractReferenceContext ref = Globals.getContext().ref; + CDOMGroupRef<WeaponProf> master = + ref.getCDOMTypeReference(WeaponProf.class, type.split("\\.")); + List<WeaponProf> aList = new ArrayList<WeaponProf>(); + //Can't use master because late called references may not have been initialized, see 2001287 + Collection<WeaponProf> weaponProfsOfType = + Globals.getPObjectsOfType(ref + .getConstructedCDOMObjects(WeaponProf.class), type); + for (CDOMObject cdo : aPC.getCDOMObjectList()) + { + List<ChangeProf> changes = cdo.getListFor(ListKey.CHANGEPROF); + if (changes != null) + { + for (ChangeProf cp : changes) + { + if (cp.getResult().equals(master)) + { + aList.addAll(cp.getSource().getContainedObjects()); + } + else if (weaponProfsOfType != null) + { + weaponProfsOfType.removeAll(cp.getSource() + .getContainedObjects()); + } + } + } + } + aList.addAll(weaponProfsOfType); + return aList; + } + +} Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/ProficiencyChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/ProficiencyChoiceManager.java 2008-09-27 20:25:49 UTC (rev 7811) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/ProficiencyChoiceManager.java 2008-09-27 21:06:08 UTC (rev 7812) @@ -32,6 +32,7 @@ import pcgen.core.PObject; import pcgen.core.PlayerCharacter; import pcgen.core.WeaponProf; +import pcgen.core.analysis.WeaponProfType; import pcgen.util.Logging; /** @@ -128,7 +129,7 @@ if (prof.startsWith("TYPE.") || prof.startsWith("TYPE=")) { String typeString = prof.substring(5); - for (Iterator<WeaponProf> i = Globals.getWeaponProfs(typeString, aPc).iterator();i.hasNext();) + for (Iterator<WeaponProf> i = WeaponProfType.getWeaponProfs(typeString, aPc).iterator();i.hasNext();) { profs.add(i.next()); } Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/ChangeprofLst.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/ChangeprofLst.java 2008-09-27 20:25:49 UTC (rev 7811) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/ChangeprofLst.java 2008-09-27 21:06:08 UTC (rev 7812) @@ -4,54 +4,193 @@ */ package plugin.lsttokens; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Set; +import java.util.SortedSet; import java.util.StringTokenizer; +import java.util.TreeSet; -import pcgen.core.PObject; -import pcgen.persistence.lst.GlobalLstToken; +import pcgen.base.lang.StringUtil; +import pcgen.base.util.HashMapToList; +import pcgen.cdom.base.CDOMObject; +import pcgen.cdom.base.CDOMReference; +import pcgen.cdom.base.Constants; +import pcgen.cdom.content.ChangeProf; +import pcgen.cdom.enumeration.ListKey; +import pcgen.cdom.reference.CDOMGroupRef; +import pcgen.cdom.reference.ReferenceUtilities; +import pcgen.core.WeaponProf; +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 ChangeprofLst implements GlobalLstToken +public class ChangeprofLst extends AbstractToken implements + CDOMPrimaryToken<CDOMObject> { + private static final Class<WeaponProf> WEAPONPROF_CLASS = WeaponProf.class; + public String getTokenName() { return "CHANGEPROF"; } - public boolean parse(PObject obj, String value, int anInt) + public boolean parse(LoadContext context, CDOMObject obj, String value) { - //value should be of the format: - //Name1,TYPE.type1,Name3=Prof1|Name4,Name5=Prof2 + if (isEmpty(value) || hasIllegalSeparator('|', value)) + { + return false; + } + + // value should be of the format: + // Name1,TYPE.type1,Name3=Prof1|Name4,Name5=Prof2 // - //e.g.: TYPE.Hammer,Hand Axe=Simple|Urgosh,Waraxe=Martial - // - final StringTokenizer tok = new StringTokenizer(value, "|"); + // e.g.: TYPE.Hammer,Hand Axe=Simple|Urgosh,Waraxe=Martial + StringTokenizer tok = new StringTokenizer(value, Constants.PIPE); + List<ChangeProf> list = new ArrayList<ChangeProf>(); + while (tok.hasMoreTokens()) { - String entry = tok.nextToken(); - String newProf; - final int indx = entry.indexOf('='); - if (indx > 1) + String tokText = tok.nextToken(); + int equalLoc = tokText.indexOf('='); + if (equalLoc < 0) { - newProf = entry.substring(indx + 1); - entry = entry.substring(0, indx); + Logging.errorPrint("Improper " + getTokenName() + + ": No = found. " + + "Expect format to be <Prof>,<Prof>=<Prof Type>"); + Logging.errorPrint(" Token was: " + tokText); + Logging.errorPrint(" Tag was: " + value); + return false; + } + else if (equalLoc != tokText.lastIndexOf('=')) + { + Logging.errorPrint("Improper " + getTokenName() + + ": Two = found. " + + "Expect format to be <Prof>,<Prof>=<Prof Type>"); + Logging.errorPrint(" Token was: " + tokText); + Logging.errorPrint(" Tag was: " + value); + return false; + } - final StringTokenizer bTok = new StringTokenizer(entry, ","); - while (bTok.hasMoreTokens()) - { - final String eqString = bTok.nextToken(); - obj.addChangeProf(eqString, newProf); - } + String newType = tokText.substring(equalLoc + 1); + if (newType.length() == 0) + { + Logging.errorPrint("Improper " + getTokenName() + + ": Empty Result Type. " + + "Expect format to be <Prof>,<Prof>=<Prof Type>"); + Logging.errorPrint(" Token was: " + tokText); + Logging.errorPrint(" Tag was: " + value); + return false; } - else + if (newType.indexOf(".") != -1) { + Logging + .errorPrint("Improper " + + getTokenName() + + ": Invalid (Compound) Result Type: cannot contain a period (.) " + + "Expect format to be <Prof>,<Prof>=<Prof Type>"); + Logging.errorPrint(" Token was: " + tokText); + Logging.errorPrint(" Tag was: " + value); return false; } + String[] val = {newType}; + + CDOMGroupRef<WeaponProf> newTypeProf = + context.ref.getCDOMTypeReference(WEAPONPROF_CLASS, val); + + String profs = tokText.substring(0, equalLoc); + if (profs.length() == 0) + { + Logging.errorPrint("Improper " + getTokenName() + + ": Empty Source Prof. " + + "Expect format to be <Prof>,<Prof>=<Prof Type>"); + Logging.errorPrint(" Token was: " + tokText); + Logging.errorPrint(" Tag was: " + value); + return false; + } + + StringTokenizer pTok = new StringTokenizer(profs, Constants.COMMA); + while (pTok.hasMoreTokens()) + { + CDOMReference<WeaponProf> wp = + TokenUtilities.getTypeOrPrimitive(context, + WEAPONPROF_CLASS, pTok.nextToken()); + list.add(new ChangeProf(wp, newTypeProf)); + } } + for (ChangeProf cp : list) + { + context.obj.addToList(obj, ListKey.CHANGEPROF, cp); + } return true; } + + public String[] unparse(LoadContext context, CDOMObject obj) + { + Changes<ChangeProf> changes = + context.obj.getListChanges(obj, ListKey.CHANGEPROF); + Collection<ChangeProf> added = changes.getAdded(); + if (added == null || added.isEmpty()) + { + // Zero indicates no Token + return null; + } + HashMapToList<CDOMGroupRef<WeaponProf>, CDOMReference<WeaponProf>> m = + new HashMapToList<CDOMGroupRef<WeaponProf>, CDOMReference<WeaponProf>>(); + for (ChangeProf lw : added) + { + ChangeProf cp = (ChangeProf) lw; + CDOMReference<WeaponProf> source = cp.getSource(); + CDOMGroupRef<WeaponProf> result = cp.getResult(); + m.addToListFor(result, source); + } + + SortedSet<CDOMReference<WeaponProf>> set = + new TreeSet<CDOMReference<WeaponProf>>( + ReferenceUtilities.REFERENCE_SORTER); + Set<String> returnSet = new TreeSet<String>(); + for (CDOMGroupRef<WeaponProf> result : m.getKeySet()) + { + StringBuilder sb = new StringBuilder(); + boolean needComma = false; + set.clear(); + set.addAll(m.getListFor(result)); + for (CDOMReference<WeaponProf> source : set) + { + if (needComma) + { + sb.append(Constants.COMMA); + } + needComma = true; + String sourceLst = source.getLSTformat(); + if (sourceLst.startsWith("TYPE=")) + { + sb.append("TYPE."); + sb.append(sourceLst.substring(5)); + } + else + { + sb.append(sourceLst); + } + } + sb.append(Constants.EQUALS).append(result.getLSTformat().substring(5)); + returnSet.add(sb.toString()); + } + return new String[]{StringUtil.join(returnSet, Constants.PIPE)}; + } + + 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. |
From: <th...@us...> - 2008-09-28 17:38:49
|
Revision: 7820 http://pcgen.svn.sourceforge.net/pcgen/?rev=7820&view=rev Author: thpr Date: 2008-09-28 17:38:36 +0000 (Sun, 28 Sep 2008) Log Message: ----------- eliminate unused code 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/PlayerCharacter.java Trunk/pcgen/code/src/java/pcgen/io/exporttoken/WeaponToken.java Trunk/pcgen/code/src/java/plugin/exporttokens/DamageToken.java Modified: Trunk/pcgen/code/src/java/pcgen/core/PCClass.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-09-28 17:32:52 UTC (rev 7819) +++ Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-09-28 17:38:36 UTC (rev 7820) @@ -3333,7 +3333,6 @@ * Get the unarmed Damage for this class at the given level. * * @param aLevel - * @param includeCrit * @param includeStrBonus * @param aPC * @param adjustForPCSize @@ -3347,9 +3346,8 @@ * PCCLASSLEVELONLY Since this is a level dependent calculation, this should * be performed by the PCClassLevel. */ - String getUdamForLevel(int aLevel, final boolean includeCrit, - final boolean includeStrBonus, final PlayerCharacter aPC, - boolean adjustForPCSize) + String getUdamForLevel(int aLevel, final boolean includeStrBonus, + final PlayerCharacter aPC, boolean adjustForPCSize) { // // Check "Unarmed Strike", then default to "1d3" @@ -3404,8 +3402,8 @@ if (aClass != null) { - return aClass.getUdamForLevel(aLevel, includeCrit, - includeStrBonus, aPC, adjustForPCSize); + return aClass.getUdamForLevel(aLevel, includeStrBonus, + aPC, adjustForPCSize); } Logging.errorPrint(keyName + " refers to " @@ -3445,32 +3443,6 @@ aString.append(String.valueOf(b)); } - if (includeCrit) - { - Integer active = null; - for (int i = aLevel; i >= 0; i--) - { - PCClassLevel pcl = levelMap.get(i); - if (pcl != null) - { - active = pcl.get(IntegerKey.UMULT); - if (active != null) - { - break; - } - } - } - if (active == null) - { - //Could be in the class - active = get(IntegerKey.UMULT); - } - if (active != null) - { - aString.append("(x").append(active).append(')'); - } - } - return aString.toString(); } Modified: Trunk/pcgen/code/src/java/pcgen/core/PObject.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-09-28 17:32:52 UTC (rev 7819) +++ Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-09-28 17:38:36 UTC (rev 7820) @@ -1982,14 +1982,12 @@ * 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 includeCrit Whether or not to include critical multiplier * @param includeStrBonus Whether or not to include strength damage bonus * @param aPC * * @return A string representing the unarmed damage dice of the object. */ - final String getUdamFor(final boolean includeCrit, final boolean includeStrBonus, final PlayerCharacter aPC) + final String getUdamFor(final boolean includeStrBonus, final PlayerCharacter aPC) { // the assumption is that there is only one UDAM: tag for things other than class if (!containsListFor(ListKey.UDAM)) @@ -2029,15 +2027,6 @@ aString.append(String.valueOf(b)); } - if (includeCrit) - { - Integer umult = get(IntegerKey.UMULT); - if (umult != null) - { - aString.append("(x").append(umult).append(')'); - } - } - return aString.toString(); } Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-09-28 17:32:52 UTC (rev 7819) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-09-28 17:38:36 UTC (rev 7820) @@ -7073,14 +7073,13 @@ /** * Get the unarmed damage string for this PC as adjusted by the booleans * passed in. - * - * @param includeCrit * @param includeStrBonus * @param adjustForPCSize + * * @return the unarmed damage string */ - public String getUnarmedDamageString(final boolean includeCrit, - final boolean includeStrBonus, final boolean adjustForPCSize) + public String getUnarmedDamageString(final boolean includeStrBonus, + final boolean adjustForPCSize) { String retString = "2|1d2"; @@ -7089,8 +7088,8 @@ retString = PlayerCharacterUtilities.getBestUDamString(retString, pcClass - .getUdamForLevel(pcClass.getLevel(), includeCrit, - includeStrBonus, this, adjustForPCSize)); + .getUdamForLevel(pcClass.getLevel(), includeStrBonus, + this, adjustForPCSize)); } for (PObject pObj : getPObjectList()) @@ -7101,7 +7100,7 @@ } retString = PlayerCharacterUtilities.getBestUDamString(retString, pObj - .getUdamFor(includeCrit, includeStrBonus, this)); + .getUdamFor(includeStrBonus, this)); } // string is in form sides|damage, just return damage portion Modified: Trunk/pcgen/code/src/java/pcgen/io/exporttoken/WeaponToken.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/io/exporttoken/WeaponToken.java 2008-09-28 17:32:52 UTC (rev 7819) +++ Trunk/pcgen/code/src/java/pcgen/io/exporttoken/WeaponToken.java 2008-09-28 17:38:36 UTC (rev 7820) @@ -2739,7 +2739,7 @@ * their race */ boolean applySize = (eqSize == iMod); String uDamString = - pc.getUnarmedDamageString(false, false, applySize); + pc.getUnarmedDamageString(false, applySize); StringTokenizer bTok = new StringTokenizer(damString, " d+-", false); Modified: Trunk/pcgen/code/src/java/plugin/exporttokens/DamageToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/exporttokens/DamageToken.java 2008-09-28 17:32:52 UTC (rev 7819) +++ Trunk/pcgen/code/src/java/plugin/exporttokens/DamageToken.java 2008-09-28 17:38:36 UTC (rev 7820) @@ -69,6 +69,6 @@ */ public static String getUnarmedToken(PlayerCharacter pc) { - return pc.getUnarmedDamageString(false, true, true); + return pc.getUnarmedDamageString(true, true); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-09-28 20:15:18
|
Revision: 7828 http://pcgen.svn.sourceforge.net/pcgen/?rev=7828&view=rev Author: thpr Date: 2008-09-28 20:15:01 +0000 (Sun, 28 Sep 2008) Log Message: ----------- SR token update Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/cdom/base/JEPFormula.java Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ObjectKey.java Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/StringKey.java Trunk/pcgen/code/src/java/pcgen/core/EquipmentModifier.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/analysis/TemplateSR.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/rules/context/ConsolidatedObjectCommitStrategy.java Trunk/pcgen/code/src/java/pcgen/rules/context/ObjectCommitStrategy.java Trunk/pcgen/code/src/java/pcgen/rules/context/ObjectContext.java Trunk/pcgen/code/src/java/plugin/lsttokens/SrLst.java Added Paths: ----------- Trunk/pcgen/code/src/java/pcgen/cdom/content/SpellResistance.java Modified: Trunk/pcgen/code/src/java/pcgen/cdom/base/JEPFormula.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/base/JEPFormula.java 2008-09-28 18:34:01 UTC (rev 7827) +++ Trunk/pcgen/code/src/java/pcgen/cdom/base/JEPFormula.java 2008-09-28 20:15:01 UTC (rev 7828) @@ -97,8 +97,8 @@ } public Number resolve(Equipment equipment, boolean primary, - PlayerCharacter apc, String string) + PlayerCharacter apc, String source) { - return equipment.getVariableValue(formula, "", primary, apc); + return equipment.getVariableValue(formula, source, primary, apc); } } Added: Trunk/pcgen/code/src/java/pcgen/cdom/content/SpellResistance.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/content/SpellResistance.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/cdom/content/SpellResistance.java 2008-09-28 20:15:01 UTC (rev 7828) @@ -0,0 +1,68 @@ +/* + * Copyright 2007 (C) Tom Parker <th...@us...> + * + * This library is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation; either version 2.1 of the License, or (at your option) + * any later version. + * + * This library is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + * details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +package pcgen.cdom.content; + +import pcgen.base.formula.Formula; +import pcgen.cdom.base.ConcretePrereqObject; + +public class SpellResistance extends ConcretePrereqObject +{ + + public static final SpellResistance NONE = new SpellResistance(Formula.ZERO); + + private final Formula reduction; + + public SpellResistance(Formula aReduction) + { + super(); + reduction = aReduction; + } + + public Formula getReduction() + { + return reduction; + } + + @Override + public String toString() + { + return reduction.toString(); + } + + @Override + public boolean equals(Object other) + { + if (other instanceof SpellResistance) + { + SpellResistance othSR = (SpellResistance) other; + return reduction.equals(othSR.reduction); + } + return false; + } + + @Override + public int hashCode() + { + return reduction.hashCode(); + } + + public String getLSTformat() + { + return reduction.toString(); + } +} Modified: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ObjectKey.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ObjectKey.java 2008-09-28 18:34:01 UTC (rev 7827) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ObjectKey.java 2008-09-28 20:15:01 UTC (rev 7828) @@ -39,6 +39,7 @@ import pcgen.cdom.content.LevelCommandFactory; import pcgen.cdom.content.LevelExchange; import pcgen.cdom.content.Modifier; +import pcgen.cdom.content.SpellResistance; import pcgen.cdom.list.ClassSkillList; import pcgen.cdom.list.ClassSpellList; import pcgen.cdom.list.DomainSpellList; @@ -217,6 +218,8 @@ public static final ObjectKey<CDOMSingleRef<PCClass>> EX_CLASS = new ObjectKey<CDOMSingleRef<PCClass>>(null); + public static final ObjectKey<SpellResistance> SR = new ObjectKey<SpellResistance>(SpellResistance.NONE); + public static final ObjectKey<SizeAdjustment> BASESIZE; public static final ObjectKey<SizeAdjustment> SIZE; Modified: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/StringKey.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/StringKey.java 2008-09-28 18:34:01 UTC (rev 7827) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/StringKey.java 2008-09-28 20:15:01 UTC (rev 7828) @@ -37,7 +37,7 @@ MASTER_BAB_FORMULA, BIRTHPLACE, BIRTHDAY, CATEGORY, BOOK_TYPE, CHOICE_STRING, DESTINATION, PAGE_USAGE, MINDEVVER, MINVER, ADD, BIO, DESCRIPTION, GENRE, HELP, APPEARANCE, CATCH_PHRASE, OUTPUT_NAME, INFO_TEXT, CHOICE_TO_MODIFY, PUB_NAME_LONG, COST, PUB_NAME_SHORT, - CURRENT_EQUIP_SET_NAME, REGION, PUB_NAME_WEB, SETTING, SR_FORMULA, TEMP_DESCRIPTION, TRAIT2, + CURRENT_EQUIP_SET_NAME, REGION, PUB_NAME_WEB, SETTING, TEMP_DESCRIPTION, TRAIT2, TRAIT1, SKIN_COLOR, HAIR_COLOR, SUB_REGION, SPEECH_TENDENCY, PHOBIAS, INTERESTS, RESIDENCE, SPELLBOOK_AUTO_ADD_KNOWN, PLAYERS_NAME, HANDED, HAIR_STYLE, PORTRAIT_PATH, EYE_COLOR, LOCATION, FILE_NAME, ABB, TARGET_AREA, NAME_TEXT, DAMAGE, DAMAGE_OVERRIDE, RATE_OF_FIRE, FUMBLE_RANGE, Modified: Trunk/pcgen/code/src/java/pcgen/core/EquipmentModifier.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/EquipmentModifier.java 2008-09-28 18:34:01 UTC (rev 7827) +++ Trunk/pcgen/code/src/java/pcgen/core/EquipmentModifier.java 2008-09-28 20:15:01 UTC (rev 7828) @@ -32,7 +32,10 @@ import java.util.Set; import java.util.StringTokenizer; +import pcgen.base.formula.Formula; import pcgen.cdom.base.Constants; +import pcgen.cdom.base.FormulaFactory; +import pcgen.cdom.content.SpellResistance; import pcgen.cdom.enumeration.FormulaKey; import pcgen.cdom.enumeration.IntegerKey; import pcgen.cdom.enumeration.ListKey; @@ -46,7 +49,6 @@ import pcgen.core.utils.MessageType; import pcgen.core.utils.ShowMessageDelegate; import pcgen.util.Delta; -import pcgen.util.Logging; import pcgen.util.chooser.ChooserFactory; import pcgen.util.chooser.ChooserInterface; @@ -59,6 +61,7 @@ public final class EquipmentModifier extends PObject implements Comparable<Object> { private static final String s_CHARGES = "CHARGES"; + private static final Formula CHOICE_FORMULA = FormulaFactory.getFormulaFor("%CHOICE"); /** * returns all BonusObj's that are "active", for example, ones that pass all @@ -353,34 +356,20 @@ return getKeyName(); } - @Override - public int getSR(final PlayerCharacter aPC) - { - Logging.errorPrint("Should not call getSR(PlayerCharacter) on EqMod"); - return 0; - } - public int getSR(Equipment parent, PlayerCharacter aPC) { - if (getSRFormula() == null) + SpellResistance sr = get(ObjectKey.SR); + if (sr == null) { return 0; } - if ("%CHOICE".equals(getSRFormula()) && parent.hasAssociations(this)) + if (sr.getReduction().equals(CHOICE_FORMULA)&& parent.hasAssociations(this)) { return Delta.parseInt(parent.getFirstAssociation(this)); } - final String srFormula = getSRFormula(); - - //if there's a current PC, go ahead and evaluate the formula - if (srFormula != null) - { - return parent.getVariableValue(srFormula, getQualifiedKey(), aPC).intValue(); - } - - return 0; + return sr.getReduction().resolve(parent, true, aPC, getQualifiedKey()).intValue(); } /** Modified: Trunk/pcgen/code/src/java/pcgen/core/PCClass.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-09-28 18:34:01 UTC (rev 7827) +++ Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-09-28 20:15:01 UTC (rev 7828) @@ -126,12 +126,6 @@ private String specialty = null; /* - * FINALALLCLASSLEVELS The SR List is level dependent - heck, it's in a - * LevelProperty, so that should be pretty obvious :) - */ - private List<LevelProperty<String>> SR = null; - - /* * FINALALLCLASSLEVELS This is pretty obvious, as these are already in a * LevelProperty... these go into the PCClassLevel */ @@ -2042,117 +2036,7 @@ return true; } - /** - * should be "5|4/-" where 5 = level, 4/- is the SR value. - * - * @param srString - */ - /* - * FINALPCCLASSANDLEVEL Input from a Tag, and factory creation of a PCClassLevel - * require this method - */ @Override - public void setSR(int aLevel, String srString) - { - if (SR == null) - { - SR = new ArrayList<LevelProperty<String>>(); - } - SR.add(LevelProperty.getLevelProperty(aLevel, srString)); - } - - /* - * FINALPCCLASSONLY Since this is part of LST file import - */ - public void clearSR() - { - SR = null; - } - - /* - * FINALPCCLASSLEVELONLY This is required to fetch the SR - * - * UNWIND the level checking will have to be unwound into the users of this - * class, as these SRs will not pass from one PCClassLevel to another unless - * they are specified... - */ - @Override - public int getSR(PlayerCharacter aPC) - { - if (aPC == null) - { - return 0; - } - - LevelProperty<String> activeLP = null; - - if (SR != null) - { - final int lvl = level; - for (LevelProperty<String> lp : SR) - { - if (lp.getLevel() > lvl) - { - continue; - } - if (activeLP == null || activeLP.getLevel() < lp.getLevel()) - { - activeLP = lp; - continue; - } - } - } - - //if there's a current PC, go ahead and evaluate the formula - if (activeLP != null) - { - return aPC - .getVariableValue(activeLP.getObject(), getQualifiedKey()) - .intValue(); - } - - return 0; - - } - - /* - * FINALPCCLASSONLY This is for building a PCClass - */ - public List<LevelProperty<String>> getSRlist() - { - if (SR == null) - { - /* - * CONSIDER This is a heavy-weight get... and inconsistent with - * getFeatList, et al. What should be the proper method (should the - * caller be required to gate on null, should these be safe gets, - * should the variables be initialized empty lists??) - thpr - * 11/10/06 - */ - SR = new ArrayList<LevelProperty<String>>(); - } - return SR; - } - - /* - * FINALPCCLASSONLY This is for editing classes - */ - public LevelProperty<String> getSRforLevel(int aLevel) - { - if (SR != null) - { - for (LevelProperty<String> lp : SR) - { - if (lp.getLevel() == aLevel) - { - return lp; - } - } - } - return null; - } - - @Override public String getPCCText() { final StringBuffer pccTxt = new StringBuffer(200); @@ -2195,15 +2079,6 @@ .unparse(me.getValue()), "\t")); } - if (SR != null) - { - for (LevelProperty<String> lp : SR) - { - pccTxt.append(lineSep).append(lp.getLevel()).append("\tSR:") - .append(lp.getObject()); - } - } - // Output the list of spells associated with the class. int cap = getSpellSupport().getMaxSpellListLevel(); if (hasMaxLevel() && cap > getSafe(IntegerKey.LEVEL_LIMIT)) @@ -4947,11 +4822,6 @@ addAllToListFor(ListKey.DAMAGE_REDUCTION, otherClass .getListFor(ListKey.DAMAGE_REDUCTION)); - if (otherClass.SR != null) - { - SR = new ArrayList<LevelProperty<String>>(otherClass.SR); - } - for (CDOMReference<Vision> ref : otherClass .getSafeListMods(Vision.VISIONLIST)) { Modified: Trunk/pcgen/code/src/java/pcgen/core/PObject.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-09-28 18:34:01 UTC (rev 7827) +++ Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-09-28 20:15:01 UTC (rev 7828) @@ -735,32 +735,6 @@ } /** - * Set the SR - * @param newSR - */ - public void setSR(int aLevel, String newSR) - { - put(StringKey.SR_FORMULA, newSR); - } - - /** - * Clear the SR - */ - public void clearSRList() - { - remove(StringKey.SR_FORMULA); - } - - /** - * Get the SR Formula - * @return the SR Formula - */ - public String getSRFormula() - { - return get(StringKey.SR_FORMULA); - } - - /** * Set the source file for this object * @param sourceFile */ @@ -1631,19 +1605,6 @@ return displayName; } - public int getSR(final PlayerCharacter aPC) - { - final String srFormula = getSRFormula(); - - //if there's a current PC, go ahead and evaluate the formula - if ((srFormula != null) && (aPC != null)) - { - return aPC.getVariableValue(srFormula, getQualifiedKey()).intValue(); - } - - return 0; - } - /** * Get the PCC text with the saved name * @return the PCC text with the saved name @@ -1761,12 +1722,6 @@ } } - String SR = get(StringKey.SR_FORMULA); - if (!(this instanceof PCClass) && (SR != null) && (SR.length() != 0)) - { - txt.append("\tSR:").append(SR); - } - 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-09-28 18:34:01 UTC (rev 7827) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-09-28 20:15:01 UTC (rev 7828) @@ -8890,39 +8890,40 @@ public int calcSR(final boolean includeEquipment) { - int SR = race.getSR(this); + int SR = race.getSafe(ObjectKey.SR).getReduction().resolve(this, race.getQualifiedKey()).intValue(); if (deity != null) { - SR = Math.max(SR, deity.getSR(this)); + SR = Math.max(SR, deity.getSafe(ObjectKey.SR).getReduction().resolve(this, deity.getQualifiedKey()).intValue()); } for (CompanionMod cMod : companionModList) { - SR = Math.max(SR, cMod.getSR(this)); + SR = Math.max(SR, cMod.getSafe(ObjectKey.SR).getReduction().resolve(this, cMod.getQualifiedKey()).intValue()); } for (PCClass pcClass : classList) { - SR = Math.max(SR, pcClass.getSR(this)); + SR = Math.max(SR, pcClass.getSafe(ObjectKey.SR).getReduction().resolve(this, pcClass.getQualifiedKey()).intValue()); } for (Ability aFeat : getFullAbilitySet()) { - SR = Math.max(SR, aFeat.getSR(this)); + SR = Math.max(SR, aFeat.getSafe(ObjectKey.SR).getReduction().resolve(this, aFeat.getQualifiedKey()).intValue()); } final List<Skill> skillList = new ArrayList<Skill>(getSkillList()); for (Skill skill : skillList) { - SR = Math.max(SR, skill.getSR(this)); + SR = Math.max(SR, skill.getSafe(ObjectKey.SR).getReduction().resolve(this, skill.getQualifiedKey()).intValue()); } for (CharacterDomain cd : characterDomainList) { if (cd.getDomain() != null) { - SR = Math.max(cd.getDomain().getSR(this), SR); + Domain r = cd.getDomain(); + SR = Math.max(r.getSafe(ObjectKey.SR).getReduction().resolve(this, r.getQualifiedKey()).intValue(), SR); } } @@ -8932,7 +8933,7 @@ { if (eq.isEquipped()) { - SR = Math.max(SR, eq.getSR(this)); + SR = Math.max(SR, eq.getSafe(ObjectKey.SR).getReduction().resolve(this, eq.getQualifiedKey()).intValue()); for (EquipmentModifier eqMod : eq.getEqModifierList(true)) { Modified: Trunk/pcgen/code/src/java/pcgen/core/analysis/TemplateSR.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/analysis/TemplateSR.java 2008-09-28 18:34:01 UTC (rev 7827) +++ Trunk/pcgen/code/src/java/pcgen/core/analysis/TemplateSR.java 2008-09-28 20:15:01 UTC (rev 7828) @@ -2,6 +2,7 @@ import pcgen.cdom.enumeration.IntegerKey; import pcgen.cdom.enumeration.ListKey; +import pcgen.cdom.enumeration.ObjectKey; import pcgen.core.PCTemplate; import pcgen.core.PlayerCharacter; @@ -29,7 +30,9 @@ public static int getSR(PCTemplate pct, int level, int hitdice, PlayerCharacter aPC) { - int aSR = pct.getSR(aPC); + String qualifiedKey = pct.getQualifiedKey(); + int aSR = pct.getSafe(ObjectKey.SR).getReduction().resolve(aPC, + qualifiedKey).intValue(); for (PCTemplate rlt : pct.getSafeListFor(ListKey.REPEATLEVEL_TEMPLATES)) { @@ -37,7 +40,8 @@ { if (lt.get(IntegerKey.LEVEL) <= level) { - aSR = Math.max(aSR, lt.getSR(aPC)); + aSR = Math.max(aSR, lt.getSafe(ObjectKey.SR).getReduction() + .resolve(aPC, qualifiedKey).intValue()); } } } @@ -46,7 +50,8 @@ { if (lt.get(IntegerKey.LEVEL) <= level) { - aSR = Math.max(aSR, lt.getSR(aPC)); + aSR = Math.max(aSR, lt.getSafe(ObjectKey.SR).getReduction() + .resolve(aPC, qualifiedKey).intValue()); } } @@ -55,7 +60,8 @@ if (lt.get(IntegerKey.HD_MAX) <= hitdice && lt.get(IntegerKey.HD_MIN) >= hitdice) { - aSR = Math.max(aSR, lt.getSR(aPC)); + aSR = Math.max(aSR, lt.getSafe(ObjectKey.SR).getReduction() + .resolve(aPC, qualifiedKey).intValue()); } } Modified: Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassLevelPanel.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassLevelPanel.java 2008-09-28 18:34:01 UTC (rev 7827) +++ Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassLevelPanel.java 2008-09-28 20:15:01 UTC (rev 7828) @@ -53,8 +53,10 @@ import pcgen.cdom.base.CDOMReference; import pcgen.cdom.base.Constants; import pcgen.cdom.base.TransitionChoice; +import pcgen.cdom.content.SpellResistance; import pcgen.cdom.enumeration.IntegerKey; import pcgen.cdom.enumeration.ListKey; +import pcgen.cdom.enumeration.ObjectKey; import pcgen.cdom.enumeration.VariableKey; import pcgen.cdom.inst.PCClassLevel; import pcgen.core.Campaign; @@ -64,7 +66,6 @@ import pcgen.core.Domain; import pcgen.core.Globals; import pcgen.core.Kit; -import pcgen.core.LevelProperty; import pcgen.core.PCClass; import pcgen.core.PCSpell; import pcgen.core.PObject; @@ -309,12 +310,6 @@ } } - - for (LevelProperty<String> lp : obj.getSRlist()) - { - levelTagList.add(new LevelTag(lp.getLevel(), LevelTag.TAG_SR, lp.getObject())); - } - /* aCol = obj.vFeatList(); if (aCol != null) @@ -340,18 +335,25 @@ for (PCClassLevel pcl : obj.getClassLevelCollection()) { + Integer cl = pcl.get(IntegerKey.LEVEL); for (Iterator<TransitionChoice<Kit>> it = obj.getSafeListFor( ListKey.KIT_CHOICE).iterator(); it.hasNext();) { TransitionChoice<Kit> s = it.next(); - LevelTag lt = new LevelTag(pcl.get(IntegerKey.LEVEL), + LevelTag lt = new LevelTag(cl, LevelTag.TAG_KIT, s.getCount() + "|" + s.getChoices().getLSTformat()); levelTagList.add(lt); } + + SpellResistance sr = obj.get(ObjectKey.SR); + if (sr != null) + { + levelTagList.add(new LevelTag(cl, LevelTag.TAG_SR, sr + .getLSTformat())); + } } - String s = obj.getRegionString(); if ((s != null) && !s.equals("")) Modified: Trunk/pcgen/code/src/java/pcgen/gui/editor/EditorMainForm.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/editor/EditorMainForm.java 2008-09-28 18:34:01 UTC (rev 7827) +++ Trunk/pcgen/code/src/java/pcgen/gui/editor/EditorMainForm.java 2008-09-28 20:15:01 UTC (rev 7828) @@ -55,6 +55,7 @@ import pcgen.cdom.base.CDOMReference; import pcgen.cdom.base.Constants; import pcgen.cdom.base.SimpleAssociatedObject; +import pcgen.cdom.content.SpellResistance; import pcgen.cdom.enumeration.AssociationKey; import pcgen.cdom.enumeration.IntegerKey; import pcgen.cdom.enumeration.ListKey; @@ -620,7 +621,7 @@ thisPObject.removeListFor(ListKey.DAMAGE_REDUCTION); thisPObject.clearPrerequisiteList(); thisPObject.clearAllSABLists(); - thisPObject.clearSRList(); + thisPObject.remove(ObjectKey.SR); thisPObject.getSpellSupport().clearSpellList(); thisPObject.clearAutoMap(); @@ -3134,11 +3135,11 @@ } } - String srString = thisPObject.getSRFormula(); + SpellResistance sr = thisPObject.get(ObjectKey.SR); - if (srString != null) + if (sr != null) { - selectedList.add("SR:" + srString); + selectedList.add("SR:" + sr.getLSTformat()); } if (anEditType != EditorConstants.EDIT_DOMAIN) Modified: Trunk/pcgen/code/src/java/pcgen/rules/context/ConsolidatedObjectCommitStrategy.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/rules/context/ConsolidatedObjectCommitStrategy.java 2008-09-28 18:34:01 UTC (rev 7827) +++ Trunk/pcgen/code/src/java/pcgen/rules/context/ConsolidatedObjectCommitStrategy.java 2008-09-28 20:15:01 UTC (rev 7828) @@ -117,6 +117,11 @@ cdo.put(sk, s); } + public void remove(CDOMObject cdo, ObjectKey<?> sk) + { + cdo.remove(sk); + } + public void put(CDOMObject cdo, IntegerKey ik, Integer i) { cdo.put(ik, i); Modified: Trunk/pcgen/code/src/java/pcgen/rules/context/ObjectCommitStrategy.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/rules/context/ObjectCommitStrategy.java 2008-09-28 18:34:01 UTC (rev 7827) +++ Trunk/pcgen/code/src/java/pcgen/rules/context/ObjectCommitStrategy.java 2008-09-28 20:15:01 UTC (rev 7828) @@ -39,6 +39,8 @@ public <T> void put(CDOMObject cdo, ObjectKey<T> sk, T s); + public void remove(CDOMObject cdo, ObjectKey<?> sk); + public void put(CDOMObject cdo, IntegerKey ik, Integer i); public void put(CDOMObject cdo, FormulaKey fk, Formula f); Modified: Trunk/pcgen/code/src/java/pcgen/rules/context/ObjectContext.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/rules/context/ObjectContext.java 2008-09-28 18:34:01 UTC (rev 7827) +++ Trunk/pcgen/code/src/java/pcgen/rules/context/ObjectContext.java 2008-09-28 20:15:01 UTC (rev 7828) @@ -110,6 +110,11 @@ edits.put(cdo, sk, s); } + public void remove(CDOMObject cdo, ObjectKey<?> sk) + { + edits.remove(cdo, sk); + } + public void put(CDOMObject cdo, StringKey sk, String s) { edits.put(cdo, sk, s); @@ -430,6 +435,11 @@ getPositive(sourceURI, cdo).put(sk, s); } + public void remove(CDOMObject cdo, ObjectKey<?> sk) + { + getPositive(sourceURI, cdo).remove(sk); + } + public void put(CDOMObject cdo, IntegerKey ik, Integer i) { getPositive(sourceURI, cdo).put(ik, i); @@ -498,6 +508,9 @@ } else { + /* + * TODO is this correct (order of ops?)? + */ return null; } } Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/SrLst.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/SrLst.java 2008-09-28 18:34:01 UTC (rev 7827) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/SrLst.java 2008-09-28 20:15:01 UTC (rev 7828) @@ -4,42 +4,61 @@ */ package plugin.lsttokens; -import pcgen.core.PObject; -import pcgen.persistence.lst.GlobalLstToken; +import pcgen.cdom.base.CDOMObject; +import pcgen.cdom.base.FormulaFactory; +import pcgen.cdom.content.SpellResistance; +import pcgen.cdom.enumeration.ObjectKey; +import pcgen.rules.context.LoadContext; +import pcgen.rules.persistence.token.CDOMPrimaryToken; /** * @author djones4 - * + * */ -public class SrLst implements GlobalLstToken +public class SrLst implements CDOMPrimaryToken<CDOMObject> { - /* - * FIXME This can only be converted after associations are no longer stored - * in the object, but instead are stored in the PC. This is due to the - * %CHOICE usage in EquipmentModifier not being handled by JEP due to use of % - * [which is the modulo function to JEP] - */ - /* - * Note: Don't need to wait for Template's LevelToken before this can be converted - * as there is no level support in templates for this token - */ - public String getTokenName() { return "SR"; } - public boolean parse(PObject obj, String value, int anInt) + public boolean parse(LoadContext context, CDOMObject obj, String value) { if (".CLEAR".equals(value)) { - obj.clearSRList(); + context.getObjectContext().remove(obj, ObjectKey.SR); } else { - obj.setSR(anInt, value); + context.getObjectContext().put(obj, ObjectKey.SR, + getSpellResistance(value)); } return true; } + + private SpellResistance getSpellResistance(String value) + { + return new SpellResistance(FormulaFactory.getFormulaFor(value)); + } + + public String[] unparse(LoadContext context, CDOMObject obj) + { + SpellResistance sr = context.getObjectContext().getObject(obj, + ObjectKey.SR); + /* + * TODO This can't unparse .CLEAR + */ + if (sr == null) + { + // Zero indicates no Token (so nothing to do) + return null; + } + return new String[] { sr.getLSTformat() }; + } + + 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. |
From: <th...@us...> - 2008-10-02 00:11:47
|
Revision: 7865 http://pcgen.svn.sourceforge.net/pcgen/?rev=7865&view=rev Author: thpr Date: 2008-10-02 00:11:37 +0000 (Thu, 02 Oct 2008) Log Message: ----------- SAB token update Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java 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/PCClass.java Trunk/pcgen/code/src/java/pcgen/core/PObject.java Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java Trunk/pcgen/code/src/java/pcgen/core/SubstitutionClass.java Trunk/pcgen/code/src/java/pcgen/core/utils/MapKey.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/exporttokens/ClassToken.java Trunk/pcgen/code/src/java/plugin/exporttokens/DeityToken.java Trunk/pcgen/code/src/java/plugin/exporttokens/RaceToken.java Trunk/pcgen/code/src/java/plugin/exporttokens/TemplateToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/SabLst.java Added Paths: ----------- Trunk/pcgen/code/src/java/pcgen/core/analysis/SpecialAbilityResolution.java Modified: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java 2008-10-01 23:55:32 UTC (rev 7864) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java 2008-10-02 00:11:37 UTC (rev 7865) @@ -224,6 +224,7 @@ public static final ListKey<FollowerLimit> FOLLOWERS = new ListKey<FollowerLimit>(); public static final ListKey<Description> DESCRIPTION = new ListKey<Description>(); public static final ListKey<ChangeProf> CHANGEPROF = new ListKey<ChangeProf>(); + public static final ListKey<SpecialAbility> SAB = new ListKey<SpecialAbility>(); /** Private constructor to prevent instantiation of this class */ private ListKey() { Modified: Trunk/pcgen/code/src/java/pcgen/core/AssociationStore.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/AssociationStore.java 2008-10-01 23:55:32 UTC (rev 7864) +++ Trunk/pcgen/code/src/java/pcgen/core/AssociationStore.java 2008-10-02 00:11:37 UTC (rev 7865) @@ -20,34 +20,35 @@ import java.util.List; import pcgen.base.util.FixedStringList; +import pcgen.cdom.base.CDOMObject; public interface AssociationStore { - public void addAssociation(PObject obj, String o); + public void addAssociation(CDOMObject obj, String o); - public void removeAssociation(PObject obj, String o); + public void removeAssociation(CDOMObject obj, String o); - public void addAssociation(PObject obj, FixedStringList o); + public void addAssociation(CDOMObject obj, FixedStringList o); - public void removeAssociation(PObject obj, FixedStringList o); + public void removeAssociation(CDOMObject obj, FixedStringList o); - public List<String> removeAllAssociations(PObject obj); + public List<String> removeAllAssociations(CDOMObject obj); - public boolean hasAssociations(PObject obj); + public boolean hasAssociations(CDOMObject obj); - public List<String> getAssociationList(PObject obj); + public List<String> getAssociationList(CDOMObject obj); - public boolean containsAssociated(PObject obj, String o); + public boolean containsAssociated(CDOMObject obj, String o); - public boolean containsAssociated(PObject obj, FixedStringList o); + public boolean containsAssociated(CDOMObject obj, FixedStringList o); - public int getSelectCorrectedAssociationCount(PObject obj); + public int getSelectCorrectedAssociationCount(CDOMObject obj); - public int getDetailedAssociationCount(PObject obj); + public int getDetailedAssociationCount(CDOMObject obj); - public List<FixedStringList> getDetailedAssociations(PObject obj); + public List<FixedStringList> getDetailedAssociations(CDOMObject obj); - public List<String> getExpandedAssociations(PObject obj); + public List<String> getExpandedAssociations(CDOMObject obj); - public String getFirstAssociation(PObject obj); + public String getFirstAssociation(CDOMObject obj); } Modified: Trunk/pcgen/code/src/java/pcgen/core/Equipment.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Equipment.java 2008-10-01 23:55:32 UTC (rev 7864) +++ Trunk/pcgen/code/src/java/pcgen/core/Equipment.java 2008-10-02 00:11:37 UTC (rev 7865) @@ -44,6 +44,7 @@ import pcgen.base.formula.Formula; import pcgen.base.lang.StringUtil; import pcgen.base.util.FixedStringList; +import pcgen.cdom.base.CDOMObject; import pcgen.cdom.base.Constants; import pcgen.cdom.enumeration.AssociationKey; import pcgen.cdom.enumeration.EqModFormatCat; @@ -6058,27 +6059,27 @@ return null; } - public void addAssociation(PObject obj, String o) + public void addAssociation(CDOMObject obj, String o) { assocSupt.addAssoc(obj, AssociationKey.CHOICES, new FixedStringList(o)); } - public void addAssociation(PObject obj, FixedStringList o) + public void addAssociation(CDOMObject obj, FixedStringList o) { assocSupt.addAssoc(obj, AssociationKey.CHOICES, o); } - public boolean containsAssociated(PObject obj, String o) + public boolean containsAssociated(CDOMObject obj, String o) { return assocSupt.containsAssoc(obj, AssociationKey.CHOICES, new FixedStringList(o)); } - public boolean containsAssociated(PObject obj, FixedStringList o) + public boolean containsAssociated(CDOMObject obj, FixedStringList o) { return assocSupt.containsAssoc(obj, AssociationKey.CHOICES, o); } - public int getSelectCorrectedAssociationCount(PObject obj) + public int getSelectCorrectedAssociationCount(CDOMObject obj) { //TODO Null here is probably a problem for the PC :/ int select = obj.getSafe(FormulaKey.SELECT).resolve(this, true, null, @@ -6086,7 +6087,7 @@ return assocSupt.getAssocCount(obj, AssociationKey.CHOICES) / select; } - public List<String> getAssociationList(PObject obj) + public List<String> getAssociationList(CDOMObject obj) { List<String> list = new ArrayList<String>(); List<FixedStringList> assocList = assocSupt.getAssocList(obj, @@ -6109,29 +6110,29 @@ return list; } - public boolean hasAssociations(PObject obj) + public boolean hasAssociations(CDOMObject obj) { return assocSupt.hasAssocs(obj, AssociationKey.CHOICES); } - public List<String> removeAllAssociations(PObject obj) + public List<String> removeAllAssociations(CDOMObject obj) { List<String> list = getAssociationList(obj); assocSupt.removeAllAssocs(obj, AssociationKey.CHOICES); return list; } - public void removeAssociation(PObject obj, String o) + public void removeAssociation(CDOMObject obj, String o) { assocSupt.removeAssoc(obj, AssociationKey.CHOICES, new FixedStringList(o)); } - public void removeAssociation(PObject obj, FixedStringList o) + public void removeAssociation(CDOMObject obj, FixedStringList o) { assocSupt.removeAssoc(obj, AssociationKey.CHOICES, o); } - public int getDetailedAssociationCount(PObject obj) + public int getDetailedAssociationCount(CDOMObject obj) { List<FixedStringList> assocs = assocSupt.getAssocList(obj, AssociationKey.CHOICES); @@ -6146,12 +6147,12 @@ return count; } - public List<FixedStringList> getDetailedAssociations(PObject obj) + public List<FixedStringList> getDetailedAssociations(CDOMObject obj) { return assocSupt.getAssocList(obj, AssociationKey.CHOICES); } - public List<String> getExpandedAssociations(PObject obj) + public List<String> getExpandedAssociations(CDOMObject obj) { List<FixedStringList> assocs = assocSupt.getAssocList(obj, AssociationKey.CHOICES); @@ -6169,7 +6170,7 @@ return list; } - public String getFirstAssociation(PObject obj) + public String getFirstAssociation(CDOMObject obj) { return assocSupt.getAssocList(obj, AssociationKey.CHOICES).get(0).get(0); } Modified: Trunk/pcgen/code/src/java/pcgen/core/PCClass.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-10-01 23:55:32 UTC (rev 7864) +++ Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-10-02 00:11:37 UTC (rev 7865) @@ -79,7 +79,6 @@ import pcgen.core.prereq.Prerequisite; import pcgen.core.spell.Spell; import pcgen.core.utils.CoreUtility; -import pcgen.core.utils.MapKey; import pcgen.core.utils.MessageType; import pcgen.core.utils.ShowMessageDelegate; import pcgen.persistence.PersistenceLayerException; @@ -2135,16 +2134,6 @@ } } - List<SpecialAbility> saList = new ArrayList<SpecialAbility>(); - addSABToList(saList, null); - for (SpecialAbility sa : saList) - { - final String src = sa.getSASource(); - final String lev = src.substring(src.lastIndexOf('|') + 1); - pccTxt.append(lineSep).append(lev).append("\tSAB:").append( - sa.toString()); - } - // TODO - Add ABILITY tokens. List<String> udamList = getListFor(ListKey.UDAM); @@ -3758,18 +3747,25 @@ // Go through the specialty list (SA) and adjust the class to the new // name // - for (int lev : mapListChar.getSecondaryKeySet(MapKey.SAB)) + for (SpecialAbility sa : getSafeListFor(ListKey.SAB)) { - for (SpecialAbility sa : mapListChar.getListFor(MapKey.SAB, lev)) + removeFromListFor(ListKey.SAB, sa); + sa = new SpecialAbility(sa.getKeyName(), sa.getSASource(), sa + .getSADesc()); + sa.setQualificationClass(oldClass, newClass); + addToListFor(ListKey.SAB, sa); + } + for (PCClassLevel pcl : getClassLevelCollection()) + { + for (SpecialAbility sa : pcl.getSafeListFor(ListKey.SAB)) { if (sa.getSASource().length() != 0) { - mapListChar.removeFromListFor(MapKey.SAB, lev, sa); - sa = - new SpecialAbility(sa.getKeyName(), sa - .getSASource(), sa.getSADesc()); + pcl.removeFromListFor(ListKey.SAB, sa); + sa = new SpecialAbility(sa.getKeyName(), sa.getSASource(), + sa.getSADesc()); sa.setQualificationClass(oldClass, newClass); - addSAB(sa, lev); + pcl.addToListFor(ListKey.SAB, sa); } } } @@ -4805,14 +4801,13 @@ setRegionString(otherClass.getRegionString()); } - for (int lev : otherClass.mapListChar.getSecondaryKeySet(MapKey.SAB)) - { - for (SpecialAbility sa : otherClass.mapListChar.getListFor(MapKey.SAB, - lev)) - { - addSAB(sa, lev); - } - } + removeListFor(ListKey.SAB); + addAllToListFor(ListKey.SAB, otherClass.getSafeListFor(ListKey.SAB)); + + /* + * TODO Does this need to have things from the Class Level objects? + * I don't think so based on deferred processing of levels... + */ addAllToListFor(ListKey.DAMAGE_REDUCTION, otherClass .getListFor(ListKey.DAMAGE_REDUCTION)); Modified: Trunk/pcgen/code/src/java/pcgen/core/PObject.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-10-01 23:55:32 UTC (rev 7864) +++ Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-10-02 00:11:37 UTC (rev 7865) @@ -51,6 +51,7 @@ 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; @@ -830,80 +831,6 @@ return spellSupport.getSpellList(-1); } - public void addSAB(SpecialAbility sa, int level) - { - mapListChar.addToListFor(MapKey.SAB, level, sa); - } - - public void clearSABList(int level) - { - mapListChar.removeListFor(MapKey.SAB, level); - } - - public void clearAllSABLists() - { - mapListChar.removeListsFor(MapKey.SAB); - } - - public void removeSAB(String s, int level) - { - List<SpecialAbility> sabs = mapListChar.getListFor(MapKey.SAB, level); - if (sabs != null) - { - for (SpecialAbility sa : sabs) - { - if (sa.getDisplayName().equals(s) - || sa.getDisplayName().startsWith(s + "|")) - { - mapListChar.removeFromListFor(MapKey.SAB, level, sa); - } - } - } - } - - public void addSABToList(List<SpecialAbility> saList, PlayerCharacter pc) - { - for (Integer lvl : mapListChar.getSecondaryKeySet(MapKey.SAB)) - { - List<SpecialAbility> sabs = mapListChar.getListFor(MapKey.SAB, lvl); - if (sabs != null) - { - for (SpecialAbility sa : sabs) - { - if (pc == null || sa.qualifies(pc)) - { - final String key = sa.getKeyName(); - final int idx = key.indexOf("%CHOICE"); - - if (idx >= 0) - { - StringBuilder sb = new StringBuilder(); - sb.append(key.substring(0, idx)); - - if (pc.hasAssociations(this)) - { - sb.append(StringUtil.joinToStringBuffer(pc.getAssociationList(this), ", ")); - } - else - { - sb.append("<undefined>"); - } - - sb.append(key.substring(idx + 7)); - sa = new SpecialAbility(sb.toString(), sa - .getSASource(), sa.getSADesc()); - saList.add(sa); - } - else - { - saList.add(sa); - } - } - } - } - } - } - /** * Get the type of PObject * @@ -1618,16 +1545,6 @@ if (!(this instanceof PCClass)) { - ArrayList<SpecialAbility> specialAbilityList = new ArrayList<SpecialAbility>(); - addSABToList(specialAbilityList, null); - for (SpecialAbility sa : specialAbilityList) - { - txt.append("\tSAB:").append(sa.toString()); - } - } - - if (!(this instanceof PCClass)) - { for (PCSpell s : getSpellList()) { txt.append("\tSPELLS:").append(s.getPCCText()); Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-10-01 23:55:32 UTC (rev 7864) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-10-02 00:11:37 UTC (rev 7865) @@ -91,6 +91,7 @@ import pcgen.core.Ability.Nature; import pcgen.core.analysis.DomainApplication; import pcgen.core.analysis.RaceStat; +import pcgen.core.analysis.SpecialAbilityResolution; import pcgen.core.analysis.SkillRankControl; import pcgen.core.analysis.TemplateSR; import pcgen.core.analysis.TemplateSelect; @@ -3141,7 +3142,7 @@ } aPObj.addSpecialAbilitiesToList(aList, this); - aPObj.addSABToList(aList, this); + SpecialAbilityResolution.addSABToList(aList, this, aPObj); } // for (CDOMObject cdo : getCDOMObjectList()) // { @@ -3149,8 +3150,16 @@ // } for (PObject po : getConditionalTemplateObjects()) { - po.addSABToList(aList, this); + SpecialAbilityResolution.addSABToList(aList, this, po); } + for (PCClass cl : classList) + { + for (int i = 1; i <= cl.getLevel(); i++) + { + PCClassLevel classLevel = cl.getClassLevel(i); + SpecialAbilityResolution.addSABToList(aList, this, classLevel); + } + } Collections.sort(aList); @@ -17896,33 +17905,33 @@ return cache.getSkillCost(this, sk, cl); } - public void addAssociation(PObject obj, String o) + public void addAssociation(CDOMObject obj, String o) { assocSupt.addAssoc(obj, AssociationKey.CHOICES, new FixedStringList(o)); } - public void addAssociation(PObject obj, FixedStringList o) + public void addAssociation(CDOMObject obj, FixedStringList o) { assocSupt.addAssoc(obj, AssociationKey.CHOICES, o); } - public boolean containsAssociated(PObject obj, String o) + public boolean containsAssociated(CDOMObject obj, String o) { return assocSupt.containsAssoc(obj, AssociationKey.CHOICES, new FixedStringList(o)); } - public boolean containsAssociated(PObject obj, FixedStringList o) + public boolean containsAssociated(CDOMObject obj, FixedStringList o) { return assocSupt.containsAssoc(obj, AssociationKey.CHOICES, o); } - public int getSelectCorrectedAssociationCount(PObject obj) + public int getSelectCorrectedAssociationCount(CDOMObject obj) { return assocSupt.getAssocCount(obj, AssociationKey.CHOICES) / obj.getSafe(FormulaKey.SELECT).resolve(this, "").intValue(); } - public List<String> getAssociationList(PObject obj) + public List<String> getAssociationList(CDOMObject obj) { List<String> list = new ArrayList<String>(); List<FixedStringList> assocList = assocSupt.getAssocList(obj, @@ -17945,29 +17954,29 @@ return list; } - public boolean hasAssociations(PObject obj) + public boolean hasAssociations(CDOMObject obj) { return assocSupt.hasAssocs(obj, AssociationKey.CHOICES); } - public List<String> removeAllAssociations(PObject obj) + public List<String> removeAllAssociations(CDOMObject obj) { List<String> list = getAssociationList(obj); assocSupt.removeAllAssocs(obj, AssociationKey.CHOICES); return list; } - public void removeAssociation(PObject obj, String o) + public void removeAssociation(CDOMObject obj, String o) { assocSupt.removeAssoc(obj, AssociationKey.CHOICES, new FixedStringList(o)); } - public void removeAssociation(PObject obj, FixedStringList o) + public void removeAssociation(CDOMObject obj, FixedStringList o) { assocSupt.removeAssoc(obj, AssociationKey.CHOICES, o); } - public int getDetailedAssociationCount(PObject obj) + public int getDetailedAssociationCount(CDOMObject obj) { List<FixedStringList> assocs = assocSupt.getAssocList(obj, AssociationKey.CHOICES); @@ -17982,12 +17991,12 @@ return count; } - public List<FixedStringList> getDetailedAssociations(PObject obj) + public List<FixedStringList> getDetailedAssociations(CDOMObject obj) { return assocSupt.getAssocList(obj, AssociationKey.CHOICES); } - public List<String> getExpandedAssociations(PObject obj) + public List<String> getExpandedAssociations(CDOMObject obj) { List<FixedStringList> assocs = assocSupt.getAssocList(obj, AssociationKey.CHOICES); @@ -18005,7 +18014,7 @@ return list; } - public String getFirstAssociation(PObject obj) + public String getFirstAssociation(CDOMObject obj) { return assocSupt.getAssocList(obj, AssociationKey.CHOICES).get(0).get(0); } Modified: Trunk/pcgen/code/src/java/pcgen/core/SubstitutionClass.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/SubstitutionClass.java 2008-10-01 23:55:32 UTC (rev 7864) +++ Trunk/pcgen/code/src/java/pcgen/core/SubstitutionClass.java 2008-10-02 00:11:37 UTC (rev 7865) @@ -109,7 +109,6 @@ aClass.removeAllAutoAbilites(aLevel); aClass.removeAllVirtualAbilites(aLevel); aClass.removeAllLevelAbilities(aLevel); - aClass.clearSABList(aLevel); // Now add in each new level line in turn. for (String theLine: newLevels) Added: Trunk/pcgen/code/src/java/pcgen/core/analysis/SpecialAbilityResolution.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/analysis/SpecialAbilityResolution.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/core/analysis/SpecialAbilityResolution.java 2008-10-02 00:11:37 UTC (rev 7865) @@ -0,0 +1,50 @@ +package pcgen.core.analysis; + +import java.util.List; + +import pcgen.base.lang.StringUtil; +import pcgen.cdom.base.CDOMObject; +import pcgen.cdom.enumeration.ListKey; +import pcgen.core.PlayerCharacter; +import pcgen.core.SpecialAbility; + +public class SpecialAbilityResolution +{ + public static void addSABToList(List<SpecialAbility> saList, PlayerCharacter pc, CDOMObject cdo) + { + for (SpecialAbility sa : cdo.getSafeListFor(ListKey.SAB)) + { + if (pc == null || sa.qualifies(pc)) + { + final String key = sa.getKeyName(); + final int idx = key.indexOf("%CHOICE"); + + if (idx >= 0) + { + StringBuilder sb = new StringBuilder(); + sb.append(key.substring(0, idx)); + + if (pc.hasAssociations(cdo)) + { + sb.append(StringUtil.joinToStringBuffer(pc + .getAssociationList(cdo), ", ")); + } + else + { + sb.append("<undefined>"); + } + + sb.append(key.substring(idx + 7)); + sa = new SpecialAbility(sb.toString(), sa.getSASource(), sa + .getSADesc()); + saList.add(sa); + } + else + { + saList.add(sa); + } + } + } + } + +} Modified: Trunk/pcgen/code/src/java/pcgen/core/utils/MapKey.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/utils/MapKey.java 2008-10-01 23:55:32 UTC (rev 7864) +++ Trunk/pcgen/code/src/java/pcgen/core/utils/MapKey.java 2008-10-02 00:11:37 UTC (rev 7865) @@ -23,7 +23,6 @@ */ package pcgen.core.utils; -import pcgen.core.SpecialAbility; /** * @author Tom Parker <th...@so...> @@ -34,7 +33,6 @@ { public static final MapKey<String, String> AUTO_ARRAY = new MapKey<String, String>(); - public static final MapKey<Integer, SpecialAbility> SAB = new MapKey<Integer, SpecialAbility>(); /** Private constructor to prevent instantiation of this class */ private MapKey() Modified: Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassLevelPanel.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassLevelPanel.java 2008-10-01 23:55:32 UTC (rev 7864) +++ Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassLevelPanel.java 2008-10-02 00:11:37 UTC (rev 7865) @@ -294,22 +294,6 @@ } - List<SpecialAbility> saList = new ArrayList<SpecialAbility>(); - obj.addSABToList(saList, null); - - if (!saList.isEmpty()) - { - for (Iterator<SpecialAbility> e = saList.iterator(); e.hasNext();) - { - SpecialAbility sa = e.next(); - String src = sa.getSASource(); - String lev = src.substring(src.lastIndexOf('|') + 1); - - LevelTag lt = new LevelTag(lev, LevelTag.TAG_SAB, sa.toString()); - levelTagList.add(lt); - } - } - /* aCol = obj.vFeatList(); if (aCol != null) @@ -352,6 +336,17 @@ levelTagList.add(new LevelTag(cl, LevelTag.TAG_SR, sr .getLSTformat())); } + + List<SpecialAbility> saList = obj.getListFor(ListKey.SAB); + + if (saList != null && !saList.isEmpty()) + { + for (SpecialAbility sa : saList) + { + levelTagList.add(new LevelTag(cl, LevelTag.TAG_SAB, sa.toString())); + } + } + } 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-01 23:55:32 UTC (rev 7864) +++ Trunk/pcgen/code/src/java/pcgen/gui/editor/EditorMainForm.java 2008-10-02 00:11:37 UTC (rev 7865) @@ -621,7 +621,7 @@ thisPObject.removeAllVariables(); thisPObject.removeListFor(ListKey.DAMAGE_REDUCTION); thisPObject.clearPrerequisiteList(); - thisPObject.clearAllSABLists(); + thisPObject.removeListFor(ListKey.SAB); thisPObject.remove(ObjectKey.SR); thisPObject.getSpellSupport().clearSpellList(); thisPObject.clearAutoMap(); @@ -3094,10 +3094,9 @@ } } - List<SpecialAbility> saList = new ArrayList<SpecialAbility>(); - thisPObject.addSABToList(saList, null); + List<SpecialAbility> saList = thisPObject.getListFor(ListKey.SAB); - if ((saList.size() != 0) && (anEditType != EditorConstants.EDIT_CLASS)) + if (saList != null && (saList.size() != 0) && (anEditType != EditorConstants.EDIT_CLASS)) { for (Iterator<SpecialAbility> e = saList.iterator(); e.hasNext();) { Modified: Trunk/pcgen/code/src/java/plugin/exporttokens/ClassToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/exporttokens/ClassToken.java 2008-10-01 23:55:32 UTC (rev 7864) +++ Trunk/pcgen/code/src/java/plugin/exporttokens/ClassToken.java 2008-10-02 00:11:37 UTC (rev 7865) @@ -35,6 +35,7 @@ import pcgen.core.PCClass; import pcgen.core.PlayerCharacter; import pcgen.core.SpecialAbility; +import pcgen.core.analysis.SpecialAbilityResolution; import pcgen.io.ExportHandler; import pcgen.io.exporttoken.Token; @@ -165,7 +166,7 @@ final List<SpecialAbility> saList = new ArrayList<SpecialAbility>(); pcclass.addSpecialAbilitiesToList(saList, aPC); - pcclass.addSABToList(saList, aPC); + SpecialAbilityResolution.addSABToList(saList, aPC, pcclass); if (saList.isEmpty()) { Modified: Trunk/pcgen/code/src/java/plugin/exporttokens/DeityToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/exporttokens/DeityToken.java 2008-10-01 23:55:32 UTC (rev 7864) +++ Trunk/pcgen/code/src/java/plugin/exporttokens/DeityToken.java 2008-10-02 00:11:37 UTC (rev 7865) @@ -41,6 +41,7 @@ import pcgen.core.PlayerCharacter; import pcgen.core.SpecialAbility; import pcgen.core.WeaponProf; +import pcgen.core.analysis.SpecialAbilityResolution; import pcgen.io.ExportHandler; import pcgen.io.exporttoken.Token; import pcgen.util.Logging; @@ -185,7 +186,7 @@ { final List<SpecialAbility> saList = new ArrayList<SpecialAbility>(); deity.addSpecialAbilitiesToList(saList, pc); - deity.addSABToList(saList, pc); + SpecialAbilityResolution.addSABToList(saList, pc, deity); if (saList.isEmpty()) { Modified: Trunk/pcgen/code/src/java/plugin/exporttokens/RaceToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/exporttokens/RaceToken.java 2008-10-01 23:55:32 UTC (rev 7864) +++ Trunk/pcgen/code/src/java/plugin/exporttokens/RaceToken.java 2008-10-02 00:11:37 UTC (rev 7865) @@ -35,6 +35,7 @@ import pcgen.core.PlayerCharacter; import pcgen.core.SettingsHandler; import pcgen.core.SpecialAbility; +import pcgen.core.analysis.SpecialAbilityResolution; import pcgen.io.ExportHandler; import pcgen.io.exporttoken.Token; import pcgen.util.PropertyFactory; @@ -99,7 +100,7 @@ final List<SpecialAbility> saList = new ArrayList<SpecialAbility>(); pc.getRace().addSpecialAbilitiesToList(saList, pc); - pc.getRace().addSABToList(saList, pc); + SpecialAbilityResolution.addSABToList(saList, pc, pc.getRace()); if (saList.isEmpty()) { Modified: Trunk/pcgen/code/src/java/plugin/exporttokens/TemplateToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/exporttokens/TemplateToken.java 2008-10-01 23:55:32 UTC (rev 7864) +++ Trunk/pcgen/code/src/java/plugin/exporttokens/TemplateToken.java 2008-10-02 00:11:37 UTC (rev 7865) @@ -34,6 +34,7 @@ import pcgen.core.PlayerCharacter; import pcgen.core.SettingsHandler; import pcgen.core.SpecialAbility; +import pcgen.core.analysis.SpecialAbilityResolution; import pcgen.core.analysis.TemplateSR; import pcgen.core.analysis.TemplateStat; import pcgen.core.prereq.PrereqHandler; @@ -226,12 +227,12 @@ { List<SpecialAbility> saList = new ArrayList<SpecialAbility>(); template.addSpecialAbilitiesToList(saList, pc); - template.addSABToList(saList, pc); + SpecialAbilityResolution.addSABToList(saList, pc, template); List<PCTemplate> subList = new ArrayList<PCTemplate>(); template.getConditionalTemplates(pc.getTotalLevels(), pc.totalHitDice(), subList); for (PCTemplate subt : subList) { - subt.addSABToList(saList, pc); + SpecialAbilityResolution.addSABToList(saList, pc, subt); } List<String> saDescList = new ArrayList<String>(); for (SpecialAbility sa : saList) Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/SabLst.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/SabLst.java 2008-10-01 23:55:32 UTC (rev 7864) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/SabLst.java 2008-10-02 00:11:37 UTC (rev 7865) @@ -1,48 +1,40 @@ package plugin.lsttokens; -import pcgen.core.Globals; +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.PCClass; -import pcgen.core.PObject; -import pcgen.core.Skill; import pcgen.core.SpecialAbility; import pcgen.core.prereq.Prerequisite; -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; -import java.util.StringTokenizer; - -public class SabLst implements GlobalLstToken +public class SabLst extends AbstractToken implements + CDOMPrimaryToken<CDOMObject> { - /* - * Template's LevelToken adjustment done by modifying - * getSpecialAbilityList() in PlayerCharacter and getSAToken in - * TemplateToken (export) - */ - /* - * TODO When this is converted to the new sytnax, getSpecialAbilityList in - * PlayerCharacter needs to be converted to look at class levels (use - * getCDOMObjects()) - */ + @Override public String getTokenName() { return "SAB"; } - public boolean parse(PObject obj, String value, int anInt) + public boolean parse(LoadContext context, CDOMObject obj, String value) { - if (obj instanceof Skill) - { - Logging.errorPrint("SA not supported in Skills"); - return false; - } - return parseSpecialAbility(obj, value, anInt); + return parseSpecialAbility(context, obj, value); } /** - * This method sets the special abilities granted by this [object]. + * This method sets the special abilities granted by this [object]. For + * efficiency, avoid calling this method except from I/O routines. * * @param obj * the PObject that is to receive the new SpecialAbility @@ -51,113 +43,150 @@ * @param level * int level at which the ability is gained */ - public boolean parseSpecialAbility(PObject obj, String value, int level) + public boolean parseSpecialAbility(LoadContext context, CDOMObject obj, + String aString) { - if (value.startsWith(".CLEAR.")) + if (isEmpty(aString) || hasIllegalSeparator('|', aString)) { - String saName = value.substring(7); - if (saName.indexOf("|") != -1) - { - Logging - .errorPrint("Cannot .CLEAR. an SAB with a | in the token: " - + value); - return false; - } - obj.removeSAB(saName, level); - return true; + return false; } - StringTokenizer tok = new StringTokenizer(value, "|"); - String token = tok.nextToken(); + StringTokenizer tok = new StringTokenizer(aString, Constants.PIPE); - if (".CLEAR".equals(token)) + String firstToken = tok.nextToken(); + if (firstToken.startsWith("PRE") || firstToken.startsWith("!PRE")) { - obj.clearSABList(level); + Logging.errorPrint("Cannot have only PRExxx subtoken in " + + getTokenName()); + return false; + } + + if (Constants.LST_DOT_CLEAR.equals(firstToken)) + { + context.getObjectContext().removeList(obj, ListKey.SAB); if (!tok.hasMoreTokens()) { return true; } - token = tok.nextToken(); + firstToken = tok.nextToken(); } - StringBuffer saName = new StringBuffer(); - saName.append(token); - SpecialAbility sa = new SpecialAbility(); + if (Constants.LST_DOT_CLEAR.equals(firstToken)) + { + Logging.errorPrint("SA tag confused by redundant '.CLEAR'" + + aString); + return false; + } - boolean isPre = false; - boolean first = false; + SpecialAbility sa = new SpecialAbility(firstToken); - while (tok.hasMoreTokens()) + if (!tok.hasMoreTokens()) { - String argument = tok.nextToken(); + sa.setName(firstToken); + context.getObjectContext().addToList(obj, ListKey.SAB, sa); + return true; + } - // Check to see if it's a PRExxx: tag - if (PreParserFactory.isPreReqString(argument)) + StringBuilder saName = new StringBuilder(); + saName.append(firstToken); + + String token = tok.nextToken(); + while (true) + { + if (Constants.LST_DOT_CLEAR.equals(token)) { - isPre = true; - try - { - PreParserFactory factory = PreParserFactory.getInstance(); - Prerequisite prereq = factory.parse(argument); - if (obj instanceof PCClass - && "var".equals(prereq.getKind())) - { - prereq.setSubKey("CLASS:" + obj.getKeyName()); - } - sa.addPrerequisite(prereq); - } - catch (PersistenceLayerException ple) - { - Logging.errorPrint(ple.getMessage(), ple); - return false; - } + Logging.errorPrint("SA tag confused by '.CLEAR' as a " + + "middle token: " + aString); + return false; } - else if (token.startsWith(".CLEAR")) + else if (token.startsWith("PRE") || token.startsWith("!PRE")) { - Logging.errorPrint("Embedded .CLEAR in " + getTokenName() - + " is not supported: " + value); - return false; + break; } else { - if (isPre) - { - Logging.errorPrint("Invalid " + getTokenName() + ": " - + value); - Logging - .errorPrint(" PRExxx must be at the END of the Token"); - return false; - } - if (!first) - { - saName.append("|"); - } - saName.append(argument); + saName.append(Constants.PIPE).append(token); + // sa.addVariable(FormulaFactory.getFormulaFor(token)); } - first = false; + + if (!tok.hasMoreTokens()) + { + // No prereqs, so we're done + // CONSIDER This is a HACK and not the long term strategy of SA: + sa.setName(saName.toString()); + context.getObjectContext().addToList(obj, ListKey.SAB, sa); + return true; + } + token = tok.nextToken(); } - + // CONSIDER This is a HACK and not the long term strategy of SA: sa.setName(saName.toString()); - if (level >= 0) + while (true) { - try + Prerequisite prereq = getPrerequisite(token); + if (prereq == null) { - sa.addPrerequisite(PreParserFactory.createLevelPrereq(obj, level)); + Logging.errorPrint(" (Did you put Abilities after the " + + "PRExxx tags in " + getTokenName() + ":?)"); + return false; } - catch (PersistenceLayerException notUsed) + /* + * The following subkey is required in order to give context to the + * variables as they are calculated (make the context the current + * class, so that items like Class Level can be correctly + * calculated). + */ + if (obj instanceof PCClass && "var".equals(prereq.getKind())) { - Logging.errorPrint("Failed to assign level prerequisite.", - notUsed); + prereq.setSubKey("CLASS:" + obj.getKeyName()); } + sa.addPrerequisite(prereq); + if (!tok.hasMoreTokens()) + { + break; + } + token = tok.nextToken(); } - if (obj instanceof PCClass) + context.getObjectContext().addToList(obj, ListKey.SAB, sa); + return true; + } + + public String[] unparse(LoadContext context, CDOMObject obj) + { + Changes<SpecialAbility> changes = context.getObjectContext() + .getListChanges(obj, ListKey.SAB); + Collection<SpecialAbility> added = changes.getAdded(); + List<String> list = new ArrayList<String>(); + if (changes.includesGlobalClear()) { - sa.setSASource("PCCLASS=" + obj.getKeyName() + "|" + level); + list.add(Constants.LST_DOT_CLEAR); } + else if (added == null || added.isEmpty()) + { + // Zero indicates no Token (and no global clear, so nothing to do) + return null; + } + if (added != null) + { + for (SpecialAbility ab : added) + { + StringBuilder sb = new StringBuilder(); + sb.append(ab.getLSTformat()); + if (ab.hasPrerequisites()) + { + sb.append(Constants.PIPE); + sb.append(getPrerequisiteString(context, ab + .getPrerequisiteList())); + } + list.add(sb.toString()); + } + } + return list.toArray(new String[list.size()]); + } - Globals.addToSASet(sa); - obj.addSAB(sa, level); - return true; + 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. |
From: <th...@us...> - 2008-10-02 00:24:58
|
Revision: 7866 http://pcgen.svn.sourceforge.net/pcgen/?rev=7866&view=rev Author: thpr Date: 2008-10-02 00:24:51 +0000 (Thu, 02 Oct 2008) Log Message: ----------- NATURALATTACKS update Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/cdom/base/Constants.java Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/FormulaKey.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/PlayerCharacter.java Trunk/pcgen/code/src/java/pcgen/core/Race.java Trunk/pcgen/code/src/java/pcgen/gui/editor/EditorMainForm.java Trunk/pcgen/code/src/java/pcgen/persistence/lst/LstSystemLoader.java Trunk/pcgen/code/src/java/pcgen/rules/context/LoadContext.java Trunk/pcgen/code/src/java/pcgen/rules/persistence/TokenLibrary.java Trunk/pcgen/code/src/java/plugin/lsttokens/NaturalattacksLst.java Added Paths: ----------- Trunk/pcgen/code/src/java/pcgen/cdom/content/DeferredResolution.java Trunk/pcgen/code/src/java/pcgen/rules/persistence/token/DeferredToken.java Modified: Trunk/pcgen/code/src/java/pcgen/cdom/base/Constants.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/base/Constants.java 2008-10-02 00:11:37 UTC (rev 7865) +++ Trunk/pcgen/code/src/java/pcgen/cdom/base/Constants.java 2008-10-02 00:24:51 UTC (rev 7866) @@ -314,5 +314,6 @@ String EQUALS = "="; String LST_CHOOSE = "CHOOSE:"; String LST_ADDCHOICE = "ADDCHOICE:"; + char CHAR_ASTERISK = '*'; public static final int NO_LEVEL_LIMIT = -1; } Added: Trunk/pcgen/code/src/java/pcgen/cdom/content/DeferredResolution.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/content/DeferredResolution.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/cdom/content/DeferredResolution.java 2008-10-02 00:24:51 UTC (rev 7866) @@ -0,0 +1,24 @@ +package pcgen.cdom.content; + +import pcgen.cdom.base.CDOMObject; +import pcgen.cdom.enumeration.ObjectKey; +import pcgen.core.SizeAdjustment; + +public class DeferredResolution +{ + + CDOMObject baseObject; + ObjectKey<SizeAdjustment> key; + + public DeferredResolution(CDOMObject obj, ObjectKey<SizeAdjustment> size) + { + baseObject = obj; + key = size; + } + + public SizeAdjustment resolve() + { + return baseObject.getSafe(key); + } + +} Modified: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/FormulaKey.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/FormulaKey.java 2008-10-02 00:11:37 UTC (rev 7865) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/FormulaKey.java 2008-10-02 00:24:51 UTC (rev 7866) @@ -23,6 +23,8 @@ import pcgen.base.enumeration.TypeSafeConstant; import pcgen.base.formula.Formula; import pcgen.base.util.CaseInsensitiveMap; +import pcgen.cdom.formula.FixedSizeFormula; +import pcgen.core.SettingsHandler; /** * @author Tom Parker (thpr [at] yahoo.com) @@ -33,7 +35,7 @@ * *Important*: This should NOT be used to store items from the DEFINE: token, * as those are Variables that should be stored using VariableKey */ -public final class FormulaKey implements TypeSafeConstant +public class FormulaKey implements TypeSafeConstant { /** @@ -82,8 +84,26 @@ public static final FormulaKey MASTER_CHECK = getConstant("MASTER_CHECK"); - public static final FormulaKey SIZE = getConstant("SIZE"); + public static final FormulaKey SIZE; + /* + * TODO Okay, this is a hack. + */ + + static + { + SIZE = new FormulaKey("SIZE", Formula.ZERO) + { + @Override + public Formula getDefault() + { + return new FixedSizeFormula(SettingsHandler.getGame().getDefaultSizeAdjustment()); + } + + }; + typeMap.put(SIZE.toString(), SIZE); + } + /** * The name of this Constant */ Modified: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java 2008-10-02 00:11:37 UTC (rev 7865) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java 2008-10-02 00:24:51 UTC (rev 7866) @@ -141,8 +141,6 @@ public static final ListKey<String> LINE = new ListKey<String>(); /** LOGO - a ListKey */ public static final ListKey<CampaignSourceEntry> FILE_LOGO = new ListKey<CampaignSourceEntry>(); - /** NATURAL_WEAPONS - a ListKey */ - public static final ListKey<Equipment> NATURAL_WEAPONS = new ListKey<Equipment>(); /** PANTHEON - a ListKey */ public static final ListKey<Pantheon> PANTHEON = new ListKey<Pantheon>(); /** RACE_PANTHEON - a ListKey */ @@ -224,6 +222,7 @@ public static final ListKey<FollowerLimit> FOLLOWERS = new ListKey<FollowerLimit>(); public static final ListKey<Description> DESCRIPTION = new ListKey<Description>(); public static final ListKey<ChangeProf> CHANGEPROF = new ListKey<ChangeProf>(); + public static final ListKey<Equipment> NATURAL_WEAPON = new ListKey<Equipment>(); public static final ListKey<SpecialAbility> SAB = new ListKey<SpecialAbility>(); /** Private constructor to prevent instantiation of this class */ Modified: Trunk/pcgen/code/src/java/pcgen/core/PCClass.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-10-02 00:11:37 UTC (rev 7865) +++ Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-10-02 00:24:51 UTC (rev 7866) @@ -127,12 +127,6 @@ private String specialty = null; /* - * FINALALLCLASSLEVELS This is pretty obvious, as these are already in a - * LevelProperty... these go into the PCClassLevel - */ - private List<LevelProperty<Equipment>> naturalWeapons = null; - - /* * PCCLASSONLY This is really an item that the PCClass knows, and then the * selected subClass, if any, is structured into the PCClassLevel during the * construction of the PCClassLevel (inheritAttributesFrom - although that @@ -1925,55 +1919,6 @@ return false; } - /** - * get the Natural Attacks for this level - * - * @return natural weapons list - */ - /* - * FINALPCCLASSLEVELONLY This is required in PCClassLevel and should be present in - * PCClass for PCClassLevel creation (in the factory) - */ - /* - * CONSIDER The fact that this does NOT override PObject would break - * EditorMainForm, if EditorMainForm was smart enough to realize that a - * PCClass can have natural weapons. Currently it does not. It would also - * need to be smart enough to deal with level dependencies of Natural - * Weapons in PCClasses, so that is non-trivial. This issue is trackered as - * 1590553 - */ - public List<Equipment> getNaturalWeapons(int aLevel) - { - if (naturalWeapons == null) - { - return new ArrayList<Equipment>(); - } - - final List<Equipment> tempArray = new ArrayList<Equipment>(); - - for (LevelProperty<Equipment> lp : naturalWeapons) - { - if (lp.getLevel() == level) - { - tempArray.add(lp.getObject()); - } - } - - return tempArray; - } - - /* - * FINALPCCLASSONLY For editing PCClasses - */ - public List<LevelProperty<Equipment>> getAllNaturalWeapons() - { - if (naturalWeapons == null) - { - return new ArrayList<LevelProperty<Equipment>>(); - } - return naturalWeapons; - } - // /* // * (non-Javadoc) // * @@ -2621,12 +2566,6 @@ } aClass.substitutionClassList = substitutionClassList; - if (naturalWeapons != null) - { - aClass.naturalWeapons = - new ArrayList<LevelProperty<Equipment>>(naturalWeapons); - } - levelMap = new TreeMap<Integer, PCClassLevel>(); for (Map.Entry<Integer, PCClassLevel> me : aClass.levelMap.entrySet()) { @@ -3398,7 +3337,8 @@ // so now assign the attributes of this class level to the // character... aPC.selectTemplates(this, aPC.isImporting()); - aPC.selectTemplates(getClassLevel(newLevel), aPC.isImporting()); + PCClassLevel classLevel = getClassLevel(newLevel); + aPC.selectTemplates(classLevel, aPC.isImporting()); // Make sure that if this Class adds a new domain that // we record where that domain came from @@ -3537,9 +3477,10 @@ } makeRegionSelection(0, aPC); addAdds(aPC); + aPC.addNaturalWeapons(getListFor(ListKey.NATURAL_WEAPON)); } - for (TransitionChoice<Kit> kit : getClassLevel(newLevel) + for (TransitionChoice<Kit> kit : classLevel .getSafeListFor(ListKey.KIT_CHOICE)) { kit.act(kit.driveChoice(aPC), aPC); @@ -3547,18 +3488,7 @@ makeRegionSelection(newLevel, aPC); // Make sure any natural weapons are added - if (naturalWeapons != null) - { - List<Equipment> natWeap = new ArrayList<Equipment>(); - for (LevelProperty<Equipment> lp : naturalWeapons) - { - if (lp.getLevel() <= newLevel) - { - natWeap.add(lp.getObject()); - } - } - aPC.addNaturalWeapons(natWeap); - } + aPC.addNaturalWeapons(classLevel.getListFor(ListKey.NATURAL_WEAPON)); } // this is a monster class, so don't worry about experience @@ -3994,8 +3924,9 @@ aPC.validateCharacterDomains(); + PCClassLevel classLevel = getClassLevel(newLevel + 1); // be sure to remove any natural weapons - for (Equipment eq : this.getNaturalWeapons(newLevel + 1)) + for (Equipment eq : classLevel.getSafeListFor(ListKey.NATURAL_WEAPON)) { /* * This is a COMPLETE hack to emulate PC.removeNaturalWeapons @@ -4827,12 +4758,8 @@ ((SubClass) otherClass).applyLevelArrayModsTo(this); } - if (otherClass.naturalWeapons != null) - { - naturalWeapons = - new ArrayList<LevelProperty<Equipment>>( - otherClass.naturalWeapons); - } + addAllToListFor(ListKey.NATURAL_WEAPON, otherClass + .getListFor(ListKey.NATURAL_WEAPON)); put(ObjectKey.LEVEL_HITDIE, otherClass.get(ObjectKey.LEVEL_HITDIE)); } @@ -4996,25 +4923,6 @@ return spMod; } - /* - * (non-Javadoc) - * - * @see pcgen.core.PObject#addNaturalWeapon(pcgen.core.Equipment, int) - */ - /* - * FINALPCCLASSANDLEVEL Input from a Tag, and factory creation of a PCClassLevel - * require this method (of course, a level independent version for PCClassLevel) - */ - @Override - public void addNaturalWeapon(final Equipment weapon, final int aLevel) - { - if (naturalWeapons == null) - { - naturalWeapons = new ArrayList<LevelProperty<Equipment>>(); - } - naturalWeapons.add(LevelProperty.getLevelProperty(aLevel, weapon)); - } - /** * Retrieve the list of spells for the class. Warning this overrides the * PObject method getSpellList and obnly returns the spells up to the level Modified: Trunk/pcgen/code/src/java/pcgen/core/PObject.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-10-02 00:11:37 UTC (rev 7865) +++ Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-10-02 00:24:51 UTC (rev 7866) @@ -345,25 +345,6 @@ } /** - * Sets the natural weapon equipment items list for this object - * @param aList - */ - public void setNaturalWeapons(final List<Equipment> aList) - { - removeListFor(ListKey.NATURAL_WEAPONS); - addAllToListFor(ListKey.NATURAL_WEAPONS, aList); - } - - /** - * Get the natural weapons list for this object - * @return the natural weapons list for this object - */ - public List<Equipment> getNaturalWeapons() - { - return getSafeListFor(ListKey.NATURAL_WEAPONS); - } - - /** * Get the list of temporary bonuses for this list * @return the list of temporary bonuses for this list */ @@ -460,17 +441,6 @@ } /** - * Add a natural weapon to the character list. - * - * @param weapon - * @param level - */ - public void addNaturalWeapon(final Equipment weapon, final int level) - { - addToListFor(ListKey.NATURAL_WEAPONS, weapon); - } - - /** * if a class implements the Cloneable interface then it should have a * public" 'clone ()' method It should be declared to throw * CloneNotSupportedException', but subclasses do not need the "throws" Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-10-02 00:11:37 UTC (rev 7865) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-10-02 00:24:51 UTC (rev 7866) @@ -6448,7 +6448,7 @@ } } - addNaturalWeapons(race.getNaturalWeapons()); + addNaturalWeapons(race.getListFor(ListKey.NATURAL_WEAPON)); getAutoLanguages(); if (!isImporting()) { @@ -7752,6 +7752,10 @@ public void addNaturalWeapons(final List<Equipment> weapons) { + if (weapons == null) + { + return; + } equipmentListAddAll(weapons); EquipSet eSet = getEquipSetByIdPath("0.1"); if (eSet != null) @@ -8287,7 +8291,7 @@ } addStartingLanguages(inTmpl, templateLanguages); getAutoLanguages(); - addNaturalWeapons(inTmpl.getNaturalWeapons()); + addNaturalWeapons(inTmpl.getListFor(ListKey.NATURAL_WEAPON)); inTmpl.chooseLanguageAutos(isImporting(), this); @@ -10641,7 +10645,7 @@ public void removeNaturalWeapons(final PObject obj) { - for (Equipment weapon : obj.getNaturalWeapons()) + for (Equipment weapon : obj.getSafeListFor(ListKey.NATURAL_WEAPON)) { // Need to make sure weapons are removed from // equip sets as well, or they will get added back @@ -16539,7 +16543,7 @@ // Add this feat to the level Info playerCharacterLevelInfo.addObject(aFeat); } - addNaturalWeapons(aFeat.getNaturalWeapons()); + addNaturalWeapons(aFeat.getListFor(ListKey.NATURAL_WEAPON)); setAggregateFeatsStable(false); calcActiveBonuses(); } @@ -16563,7 +16567,7 @@ // Add this feat to the level Info aLevelInfo.addObject(anAbility); } - addNaturalWeapons(anAbility.getNaturalWeapons()); + addNaturalWeapons(anAbility.getListFor(ListKey.NATURAL_WEAPON)); setAggregateAbilitiesStable(aCategory, false); calcActiveBonuses(); } @@ -17177,7 +17181,7 @@ .getContainedObjects()); } naturalWeaponsList.addAll(added - .getNaturalWeapons()); + .getSafeListFor(ListKey.NATURAL_WEAPON)); } } // May have added templates, so scan for them Modified: Trunk/pcgen/code/src/java/pcgen/core/Race.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Race.java 2008-10-02 00:11:37 UTC (rev 7865) +++ Trunk/pcgen/code/src/java/pcgen/core/Race.java 2008-10-02 00:24:51 UTC (rev 7866) @@ -111,56 +111,6 @@ txt.append("\tCHOOSE:LANGAUTO:").append(getChooseLanguageAutos()); } - if ((getNaturalWeapons() != null) && (getNaturalWeapons().size() > 0)) - { - final StringBuffer buffer = new StringBuffer(); - - for (Equipment natEquip : getNaturalWeapons()) - { - if (buffer.length() != 0) - { - buffer.append('|'); - } - - String eqName = natEquip.getName(); - int index = eqName.indexOf(" (Natural/Primary)"); - - if (index >= 0) - { - eqName = - eqName.substring(0, index) - + eqName.substring(index - + " (Natural/Primary)".length()); - } - - index = eqName.indexOf(" (Natural/Secondary)"); - - if (index >= 0) - { - eqName = - eqName.substring(0, index) - + eqName.substring(index - + " (Natural/Secondary)".length()); - } - - buffer.append(eqName).append(','); - buffer.append(natEquip.getType(false)).append(','); - - if (!natEquip.getSafe(ObjectKey.ATTACKS_PROGRESS)) - { - buffer.append('*'); - } - - buffer - .append( - (int) natEquip.bonusTo(null, "WEAPON", "ATTACKS", true) + 1) - .append(','); - buffer.append(natEquip.getDamage(null)); - } - - txt.append("\tNATURALATTACKS:").append(buffer.toString()); - } - return txt.toString(); } Modified: Trunk/pcgen/code/src/java/pcgen/gui/editor/EditorMainForm.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/editor/EditorMainForm.java 2008-10-02 00:11:37 UTC (rev 7865) +++ Trunk/pcgen/code/src/java/pcgen/gui/editor/EditorMainForm.java 2008-10-02 00:24:51 UTC (rev 7866) @@ -723,7 +723,8 @@ new SimpleAssociatedObject()); } - thisRace.setNaturalWeapons(pnlNaturalAttacks.getNaturalWeapons()); + thisRace.removeListFor(ListKey.NATURAL_WEAPON); + thisRace.addAllToListFor(ListKey.NATURAL_WEAPON, pnlNaturalAttacks.getNaturalWeapons()); pnlAppearance.updateData(thisPObject); pnlAge.updateData(thisPObject); @@ -1594,7 +1595,7 @@ // // Populate the natural attacks panel // - naturalAttacks = thisPObject.getNaturalWeapons(); + naturalAttacks = thisPObject.getSafeListFor(ListKey.NATURAL_WEAPON); pnlNaturalAttacks.setSelectedList(naturalAttacks); // Modified: Trunk/pcgen/code/src/java/pcgen/persistence/lst/LstSystemLoader.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/persistence/lst/LstSystemLoader.java 2008-10-02 00:11:37 UTC (rev 7865) +++ Trunk/pcgen/code/src/java/pcgen/persistence/lst/LstSystemLoader.java 2008-10-02 00:24:51 UTC (rev 7866) @@ -537,6 +537,7 @@ // Add default EQ mods eqModLoader.addDefaultEquipmentMods(context); + context.resolveDeferredTokens(); context.ref.buildDeferredObjects(); context.ref.buildDerivedObjects(); context.ref.validate(); Modified: Trunk/pcgen/code/src/java/pcgen/rules/context/LoadContext.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/rules/context/LoadContext.java 2008-10-02 00:11:37 UTC (rev 7865) +++ Trunk/pcgen/code/src/java/pcgen/rules/context/LoadContext.java 2008-10-02 00:24:51 UTC (rev 7866) @@ -25,11 +25,14 @@ import java.util.TreeSet; import pcgen.cdom.base.CDOMObject; +import pcgen.cdom.reference.ReferenceManufacturer; import pcgen.core.WeaponProf; import pcgen.core.prereq.Prerequisite; import pcgen.persistence.PersistenceLayerException; import pcgen.persistence.lst.output.prereq.PrerequisiteWriter; +import pcgen.rules.persistence.TokenLibrary; import pcgen.rules.persistence.TokenSupport; +import pcgen.rules.persistence.token.DeferredToken; import pcgen.util.Logging; public abstract class LoadContext @@ -154,40 +157,31 @@ ref.resolveReferences(); } -// public void resolveDeferredTokens() -// { -// for (DeferredToken<? extends CDOMObject> token : TokenLibrary -// .getDeferredTokens()) -// { -// processRes(token); -// } -// for (CDOMObject cdo : ref.getAllConstructedObjects()) -// { -// String cs = cdo.get(StringKey.CHOOSE_BACKUP); -// if (cs == null) -// { -// // Nothing to do (didn't have a CHOOSE that broke) -// continue; -// } -// ChooseActionContainer container = cdo.getChooseContainer(); -// if (container.getChoiceSet() != null) -// { -// // Indicates a CHOOSE token worked (except mod cases in runtime) -// continue; -// } -// // System.err.println(container.getActors()); -// // System.err.println("@" + cs); -// } -// } + public void resolveDeferredTokens() + { + for (DeferredToken<? extends CDOMObject> token : TokenLibrary + .getDeferredTokens()) + { + processRes(token); + } + } -// private <T extends CDOMObject> void processRes(DeferredToken<T> token) -// { -// Class<T> cl = token.getObjectClass(); -// for (T po : ref.getConstructedCDOMObjects(cl)) -// { -// token.process(this, po); -// } -// } + private <T extends CDOMObject> void processRes(DeferredToken<T> token) + { + Class<T> cl = token.getTokenClass(); + Collection<? extends ReferenceManufacturer> mfgs = ref + .getAllManufacturers(); + for (ReferenceManufacturer<? extends T, ?> rm : mfgs) + { + if (cl.isAssignableFrom(rm.getReferenceClass())) + { + for (T po : rm.getAllObjects()) + { + token.process(this, po); + } + } + } + } private final TokenSupport support = new TokenSupport(); Modified: Trunk/pcgen/code/src/java/pcgen/rules/persistence/TokenLibrary.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/rules/persistence/TokenLibrary.java 2008-10-02 00:11:37 UTC (rev 7865) +++ Trunk/pcgen/code/src/java/pcgen/rules/persistence/TokenLibrary.java 2008-10-02 00:24:51 UTC (rev 7866) @@ -17,7 +17,9 @@ */ package pcgen.rules.persistence; +import java.util.ArrayList; import java.util.Iterator; +import java.util.List; import java.util.NoSuchElementException; import java.util.Set; import java.util.TreeSet; @@ -31,6 +33,7 @@ import pcgen.rules.persistence.token.CDOMSubToken; import pcgen.rules.persistence.token.CDOMToken; import pcgen.rules.persistence.token.ClassWrappedToken; +import pcgen.rules.persistence.token.DeferredToken; import pcgen.rules.persistence.token.PreCompatibilityToken; import pcgen.rules.persistence.util.TokenFamily; @@ -40,8 +43,8 @@ private static final Class<CDOMObject> CDOMOBJECT_CLASS = CDOMObject.class; -// private static final List<DeferredToken<? extends CDOMObject>> deferredTokens = new ArrayList<DeferredToken<? extends CDOMObject>>(); -// + private static final List<DeferredToken<? extends CDOMObject>> deferredTokens = new ArrayList<DeferredToken<? extends CDOMObject>>(); + // private static final DoubleKeyMap<Class<?>, String, Class<ChooseLstQualifierToken<?>>> qualifierMap = new DoubleKeyMap<Class<?>, String, Class<ChooseLstQualifierToken<?>>>(); // // private static final DoubleKeyMap<Class<?>, String, Class<PrimitiveToken<?>>> primitiveMap = new DoubleKeyMap<Class<?>, String, Class<PrimitiveToken<?>>>(); @@ -102,13 +105,13 @@ // + " should not fail due to access", e); // } // } -// -// public static List<DeferredToken<? extends CDOMObject>> getDeferredTokens() -// { -// return new ArrayList<DeferredToken<? extends CDOMObject>>( -// deferredTokens); -// } -// + + public static List<DeferredToken<? extends CDOMObject>> getDeferredTokens() + { + return new ArrayList<DeferredToken<? extends CDOMObject>>( + deferredTokens); + } + // public static void addToPrimitiveMap(PrimitiveToken<?> p) // { // Class<? extends PrimitiveToken> newTokClass = p.getClass(); @@ -145,10 +148,10 @@ public static void addToTokenMap(Object newToken) { -// if (newToken instanceof DeferredToken) -// { -// deferredTokens.add((DeferredToken<?>) newToken); -// } + if (newToken instanceof DeferredToken) + { + deferredTokens.add((DeferredToken<?>) newToken); + } if (newToken instanceof CDOMPrimaryToken) { CDOMPrimaryToken<?> tok = (CDOMPrimaryToken<?>) newToken; Added: Trunk/pcgen/code/src/java/pcgen/rules/persistence/token/DeferredToken.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/rules/persistence/token/DeferredToken.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/rules/persistence/token/DeferredToken.java 2008-10-02 00:24:51 UTC (rev 7866) @@ -0,0 +1,11 @@ +package pcgen.rules.persistence.token; + +import pcgen.cdom.base.CDOMObject; +import pcgen.rules.context.LoadContext; + +public interface DeferredToken<T extends CDOMObject> +{ + public boolean process(LoadContext context, T obj); + + public Class<T> getTokenClass(); +} Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/NaturalattacksLst.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/NaturalattacksLst.java 2008-10-02 00:11:37 UTC (rev 7865) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/NaturalattacksLst.java 2008-10-02 00:24:51 UTC (rev 7866) @@ -5,267 +5,362 @@ package plugin.lsttokens; import java.math.BigDecimal; -import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.StringTokenizer; -import pcgen.base.formula.Formula; +import pcgen.cdom.base.CDOMObject; import pcgen.cdom.base.Constants; +import pcgen.cdom.content.DeferredResolution; import pcgen.cdom.enumeration.FormulaKey; import pcgen.cdom.enumeration.IntegerKey; +import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; import pcgen.cdom.enumeration.StringKey; import pcgen.cdom.inst.EquipmentHead; +import pcgen.cdom.reference.CDOMSingleRef; import pcgen.core.Equipment; -import pcgen.core.Globals; -import pcgen.core.PCTemplate; -import pcgen.core.PObject; -import pcgen.core.Race; import pcgen.core.SettingsHandler; import pcgen.core.SizeAdjustment; import pcgen.core.WeaponProf; -import pcgen.persistence.lst.GlobalLstToken; -import pcgen.rules.context.AbstractReferenceContext; +import pcgen.core.bonus.BonusObj; +import pcgen.rules.context.Changes; +import pcgen.rules.context.LoadContext; +import pcgen.rules.persistence.token.AbstractToken; +import pcgen.rules.persistence.token.CDOMPrimaryToken; +import pcgen.rules.persistence.token.DeferredToken; import pcgen.util.Logging; /** * @author djones4 - * + * */ -public class NaturalattacksLst implements GlobalLstToken +public class NaturalattacksLst extends AbstractToken implements + CDOMPrimaryToken<CDOMObject>, DeferredToken<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 - */ + private static final Class<WeaponProf> WEAPONPROF_CLASS = WeaponProf.class; + /** * @see pcgen.persistence.lst.LstToken#getTokenName() */ + @Override public String getTokenName() { return "NATURALATTACKS"; //$NON-NLS-1$ } /** - * @see pcgen.persistence.lst.GlobalLstToken#parse(pcgen.core.PObject, java.lang.String, int) - */ - public boolean parse(PObject obj, String value, int anInt) - { - // first entry is primary, others are secondary - // lets try the format: - // NATURALATTACKS:primary weapon name,num attacks,damage|secondary1 weapon - // name,num attacks,damage|secondary2..... - // damage will be of the form XdY+Z or XdY-Z - List<Equipment> naturalWeapons = parseNaturalAttacks(obj, value); - for (Equipment weapon : naturalWeapons) - { - obj.addNaturalWeapon(weapon, anInt); - } - return true; - } - - /** * NATURAL WEAPONS CODE <p/>first natural weapon is primary, the rest are * secondary; NATURALATTACKS:primary weapon name,weapon type,num * attacks,damage|secondary1 weapon name,weapon type,num - * attacks,damage|secondary2 format is exactly as it would be in an equipment - * lst file Type is of the format Weapon.Natural.Melee.Bludgeoning number of - * attacks is the number of attacks with that weapon at BAB (for primary), or - * BAB - 5 (for secondary) - * @param obj - * @param aString - * @return List + * attacks,damage|secondary2 format is exactly as it would be in an + * equipment lst file Type is of the format Weapon.Natural.Melee.Bludgeoning + * number of attacks is the number of attacks with that weapon at BAB (for + * primary), or BAB - 5 (for secondary) */ - private static List<Equipment> parseNaturalAttacks(PObject obj, - String aString) + public boolean parse(LoadContext context, CDOMObject obj, String value) { + if (isEmpty(value) || hasIllegalSeparator('|', value)) + { + return false; + } // Currently, this isn't going to work with monk attacks // - their unarmed stuff won't be affected. - String aSize = "M"; - if (obj instanceof PCTemplate || obj instanceof Race) - { - /* - * TODO This is actually broken - This is accidentally(?) order - * dependent, meaning if SIZE appears after NATURALATTACKS this will - * have bad problems vs. if it appears before. This order dependence - * should be removed, but that really requires the Formula for Size - * be projected into both Race and Equipment - */ - Formula f = obj.get(FormulaKey.SIZE); - if (f != null) - { - aSize = f.toString(); - } - } + /* + * This does not immediately resolve the Size, because it is an order of + * operations issue. This token must allow the SIZE token to appear + * AFTER this token in the LST file. Thus a deferred resolution (using a + * Resolver) is required. + */ + DeferredResolution dr = new DeferredResolution(obj, ObjectKey.SIZE); - if (aSize == null) - { - aSize = "M"; - } - int count = 1; - boolean onlyOne = false; + StringTokenizer attackTok = new StringTokenizer(value, Constants.PIPE); - final StringTokenizer attackTok = new StringTokenizer(aString, "|"); - - // Make a preliminary guess at whether this is an "only" attack - if (attackTok.countTokens() == 1) - { - onlyOne = true; - } - // This is wrong as we need to replace old natural weapons // with "better" ones - List<Equipment> naturalWeapons = new ArrayList<Equipment>(); while (attackTok.hasMoreTokens()) { - StringTokenizer aTok = - new StringTokenizer(attackTok.nextToken(), ","); - Equipment anEquip = createNaturalWeapon(aTok, aSize); + String tokString = attackTok.nextToken(); + if (hasIllegalSeparator(',', tokString)) + { + return false; + } + Equipment anEquip = createNaturalWeapon(context, obj, tokString, dr); - if (anEquip != null) + if (anEquip == null) { - if (count == 1) - { - anEquip.setModifiedName("Natural/Primary"); - } - else - { - anEquip.setModifiedName("Natural/Secondary"); - } + Logging.errorPrint("Natural Weapon Creation Failed for : " + + tokString); + return false; + } - if (onlyOne && anEquip.isOnlyNaturalWeapon()) - { - anEquip.setOnlyNaturalWeapon(true); - } - else - { - anEquip.setOnlyNaturalWeapon(false); - } - - anEquip.setOutputIndex(0); - anEquip.setOutputSubindex(count); - naturalWeapons.add(anEquip); + if (count == 1) + { + anEquip.setModifiedName("Natural/Primary"); } + else + { + anEquip.setModifiedName("Natural/Secondary"); + } + anEquip.setOutputIndex(0); + anEquip.setOutputSubindex(count); + // these values need to be locked. + anEquip.setQty(new Float(1)); + anEquip.setNumberCarried(new Float(1)); + + context.obj.addToList(obj, ListKey.NATURAL_WEAPON, anEquip); count++; } - return naturalWeapons; + return true; } /** - * Create the Natural weapon equipment item aTok = primary weapon name,weapon - * type,num attacks,damage for Example: + * Create the Natural weapon equipment item aTok = primary weapon + * name,weapon type,num attacks,damage for Example: * Tentacle,Weapon.Natural.Melee.Slashing,*4,1d6 + * * @param aTok - * @param aSize + * @param size * @return natural weapon */ - private static Equipment createNaturalWeapon(StringTokenizer aTok, - String aSize) + private Equipment createNaturalWeapon(LoadContext context, CDOMObject obj, + String wpn, DeferredResolution size) { - final String attackName = aTok.nextToken(); + StringTokenizer commaTok = new StringTokenizer(wpn, Constants.COMMA); - if (attackName.equalsIgnoreCase(Constants.s_NONE)) + int numTokens = commaTok.countTokens(); + // TODO This is wrong :P + if (numTokens != 4 && numTokens != 5) { + Logging.errorPrint("Invalid Build of " + "Natural Weapon in " + + getTokenName() + ": " + wpn); return null; } - Equipment anEquip = new Equipment(); - final String profType = aTok.nextToken(); + String attackName = commaTok.nextToken(); - anEquip.setName(attackName); - anEquip.setTypeInfo(profType); - anEquip.put(ObjectKey.WEIGHT, BigDecimal.ZERO); - if (aSize.length() > 1) { - aSize = aSize.toUpperCase().substring(0, 1); + if (attackName.equalsIgnoreCase(Constants.LST_NONE)) + { + Logging.errorPrint("Attempt to Build 'None' as a " + + "Natural Weapon in " + getTokenName() + ": " + wpn); + return null; } - - SizeAdjustment sa = SettingsHandler.getGame().getSizeAdjustmentNamed(aSize); - anEquip.put(ObjectKey.SIZE, sa); - anEquip.put(ObjectKey.BASESIZE, sa); - String numAttacks = aTok.nextToken(); - boolean attacksProgress = true; + Equipment anEquip = new Equipment(); + anEquip.setName(attackName); + anEquip.put(ObjectKey.PARENT, obj); + /* + * This really can't be raw equipment... It really never needs to be + * referred to, but this means that duplicates are never being detected + * and resolved... this needs to have a KEY defined, to keep it + * unique... hopefully this is good enough :) + * + * CONSIDER This really isn't that great, because it's String dependent, + * and may not remove identical items... it certainly works, but is ugly + */ + // anEquip.setKeyName(obj.getClass().getSimpleName() + "," + // + obj.getKeyName() + "," + wpn); + /* + * Perhaps the construction above should be through context just to + * guarantee uniqueness of the key?? - that's too paranoid + */ - if ((numAttacks.length() > 0) && (numAttacks.charAt(0) == '*')) - { - numAttacks = numAttacks.substring(1); - attacksProgress = false; - } + EquipmentHead equipHead = anEquip.getEquipmentHead(1); - int bonusAttacks = 0; - - try + String profType = commaTok.nextToken(); + if (hasIllegalSeparator('.', profType)) { - bonusAttacks = Integer.parseInt(numAttacks) - 1; + return null; } - catch (NumberFormatException exc) + StringTokenizer dotTok = new StringTokenizer(profType, Constants.DOT); + while (dotTok.hasMoreTokens()) { - Logging.errorPrint("Non-numeric value for number of attacks: '" - + numAttacks + "'"); + String wt = dotTok.nextToken(); + anEquip.setTypeInfo(wt); } - if (bonusAttacks > 0) + String numAttacks = commaTok.nextToken(); + boolean attacksFixed = numAttacks.length() > 0 + && numAttacks.charAt(0) == '*'; + if (attacksFixed) { + numAttacks = numAttacks.substring(1); + } + anEquip.put(ObjectKey.ATTACKS_PROGRESS, Boolean.valueOf(!attacksFixed)); + try + { + int bonusAttacks = Integer.parseInt(numAttacks) - 1; anEquip.addBonusList("WEAPON|ATTACKS|" + bonusAttacks); - anEquip.setOnlyNaturalWeapon(false); } - else + catch (NumberFormatException exc) { - anEquip.setOnlyNaturalWeapon(true); + Logging.errorPrint("Non-numeric value for number of attacks in " + + getTokenName() + ": '" + numAttacks + "'"); + return null; } - EquipmentHead head = anEquip.getEquipmentHead(1); - head.put(StringKey.DAMAGE, aTok.nextToken()); - head.put(IntegerKey.CRIT_RANGE, 1); - head.put(IntegerKey.CRIT_MULT, 2); - AbstractReferenceContext ref = Globals.getContext().ref; - ref.constructIfNecessary(WeaponProf.class, attackName); - anEquip.put(ObjectKey.WEAPON_PROF, ref.getCDOMReference(WeaponProf.class, attackName)); + equipHead.put(StringKey.DAMAGE, commaTok.nextToken()); // sage_sam 02 Dec 2002 for Bug #586332 // allow hands to be required to equip natural weapons - int handsRequired = 0; - - if (aTok.hasMoreTokens()) + if (commaTok.hasMoreTokens()) { - final String hString = aTok.nextToken(); - + final String hString = commaTok.nextToken(); try { - handsRequired = Integer.parseInt(hString); + equipHead.put(IntegerKey.SLOTS, Integer.valueOf(Integer + .parseInt(hString))); } catch (NumberFormatException exc) { Logging.errorPrint("Non-numeric value for hands required: '" - + hString + "'"); + + hString + "'"); + return null; } } - anEquip.put(IntegerKey.SLOTS, handsRequired); + anEquip.put(ObjectKey.WEIGHT, BigDecimal.ZERO); - //these values need to be locked. - anEquip.setQty(new Float(1)); - anEquip.setNumberCarried(new Float(1)); - anEquip.put(ObjectKey.ATTACKS_PROGRESS, attacksProgress); + context.ref.constructIfNecessary(WEAPONPROF_CLASS, attackName); + CDOMSingleRef<WeaponProf> wp = context.ref.getCDOMReference( + WEAPONPROF_CLASS, attackName); + anEquip.put(ObjectKey.WEAPON_PROF, wp); + anEquip.addAutoArray("WEAPONPROF", attackName); //$NON-NLS-1$ - // Check if the proficiency needs created - WeaponProf prof = Globals.getContext().ref.silentlyGetConstructedCDOMObject(WeaponProf.class, attackName); + equipHead.put(IntegerKey.CRIT_RANGE, Integer.valueOf(1)); + equipHead.put(IntegerKey.CRIT_MULT, Integer.valueOf(2)); - if (prof == null) + return anEquip; + } + + public String[] unparse(LoadContext context, CDOMObject obj) + { + Changes<Equipment> changes = context.getObjectContext().getListChanges( + obj, ListKey.NATURAL_WEAPON); + Collection<Equipment> eqadded = changes.getAdded(); + if (eqadded == null || eqadded.isEmpty()) { - prof = new WeaponProf(); - prof.setTypeInfo(profType); - prof.setName(attackName); - prof.setKeyName(attackName); - Globals.getContext().ref.importObject(prof); + return null; } + StringBuilder sb = new StringBuilder(); + boolean first = true; + for (Equipment lstw : eqadded) + { + if (!first) + { + sb.append(Constants.PIPE); + } + Equipment eq = Equipment.class.cast(lstw); + String name = eq.getDisplayName(); + // TODO objcontext.getString(eq, StringKey.NAME); + if (name == null) + { + context.addWriteMessage(getTokenName() + + " expected Equipment to have a name"); + return null; + } + sb.append(name).append(Constants.COMMA); + String type = eq.getType(); + if (type == null || type.length() == 0) + { + context.addWriteMessage(getTokenName() + + " expected Equipment to have a type"); + return null; + } + sb.append(type); + sb.append(Constants.COMMA); + Boolean attProgress = eq.get(ObjectKey.ATTACKS_PROGRESS); + if (attProgress == null) + { + context.addWriteMessage(getTokenName() + + " expected Equipment to know ATTACKS_PROGRESS state"); + return null; + } + else if (!attProgress.booleanValue()) + { + sb.append(Constants.CHAR_ASTERISK); + } + List<BonusObj> bonuses = eq.getBonusList(); + if (bonuses == null || bonuses.isEmpty()) + { + sb.append("1"); + } + else + { + if (bonuses.size() != 1) + { + context.addWriteMessage(getTokenName() + + " expected only one BONUS on Equipment: " + + bonuses); + return null; + } + // TODO Validate BONUS type? + BonusObj extraAttacks = bonuses.iterator().next(); + sb.append(Integer.parseInt(extraAttacks.getValue()) + 1); + } + sb.append(Constants.COMMA); + EquipmentHead head = eq.getEquipmentHeadReference(1); + if (head == null) + { + context.addWriteMessage(getTokenName() + + " expected an EquipmentHead on Equipment"); + return null; + } + String damage = head.get(StringKey.DAMAGE); + if (damage == null) + { + context.addWriteMessage(getTokenName() + + " expected a Damage on EquipmentHead"); + return null; + } + sb.append(damage); - anEquip.addAutoArray("WEAPONPROF", attackName); //$NON-NLS-1$ - return anEquip; + Integer hands = head.get(IntegerKey.SLOTS); + if (hands != null) + { + sb.append(',').append(hands); + } + + first = false; + } + return new String[] { sb.toString() }; } + + public Class<CDOMObject> getTokenClass() + { + return CDOMObject.class; + } + + public boolean process(LoadContext context, CDOMObject obj) + { + List<Equipment> natWeapons = obj.getListFor(ListKey.NATURAL_WEAPON); + if (natWeapons != null) + { + try + { + int isize = obj.getSafe(FormulaKey.SIZE).resolve(null, "") + .intValue(); + SizeAdjustment size = SettingsHandler.getGame() + .getSizeAdjustmentAtIndex(isize); + for (Equipment e : natWeapons) + { + e.put(ObjectKey.BASESIZE, size); + e.put(ObjectKey.SIZE, size); + } + } + catch (NullPointerException npe) + { + Logging.errorPrint("SIZE in " + + obj.getClass().getSimpleName() + " " + + obj.getKeyName() + " must not be a variable " + + "if it contains a NATURALATTACKS token"); + } + } + return true; + } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-10-02 00:26:22
|
Revision: 7867 http://pcgen.svn.sourceforge.net/pcgen/?rev=7867&view=rev Author: thpr Date: 2008-10-02 00:26:19 +0000 (Thu, 02 Oct 2008) Log Message: ----------- remove accidental dead code Modified Paths: -------------- Trunk/pcgen/code/src/java/plugin/lsttokens/NaturalattacksLst.java Removed Paths: ------------- Trunk/pcgen/code/src/java/pcgen/cdom/content/DeferredResolution.java Deleted: Trunk/pcgen/code/src/java/pcgen/cdom/content/DeferredResolution.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/content/DeferredResolution.java 2008-10-02 00:24:51 UTC (rev 7866) +++ Trunk/pcgen/code/src/java/pcgen/cdom/content/DeferredResolution.java 2008-10-02 00:26:19 UTC (rev 7867) @@ -1,24 +0,0 @@ -package pcgen.cdom.content; - -import pcgen.cdom.base.CDOMObject; -import pcgen.cdom.enumeration.ObjectKey; -import pcgen.core.SizeAdjustment; - -public class DeferredResolution -{ - - CDOMObject baseObject; - ObjectKey<SizeAdjustment> key; - - public DeferredResolution(CDOMObject obj, ObjectKey<SizeAdjustment> size) - { - baseObject = obj; - key = size; - } - - public SizeAdjustment resolve() - { - return baseObject.getSafe(key); - } - -} Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/NaturalattacksLst.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/NaturalattacksLst.java 2008-10-02 00:24:51 UTC (rev 7866) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/NaturalattacksLst.java 2008-10-02 00:26:19 UTC (rev 7867) @@ -11,7 +11,6 @@ import pcgen.cdom.base.CDOMObject; import pcgen.cdom.base.Constants; -import pcgen.cdom.content.DeferredResolution; import pcgen.cdom.enumeration.FormulaKey; import pcgen.cdom.enumeration.IntegerKey; import pcgen.cdom.enumeration.ListKey; @@ -74,7 +73,6 @@ * AFTER this token in the LST file. Thus a deferred resolution (using a * Resolver) is required. */ - DeferredResolution dr = new DeferredResolution(obj, ObjectKey.SIZE); int count = 1; StringTokenizer attackTok = new StringTokenizer(value, Constants.PIPE); @@ -89,7 +87,7 @@ { return false; } - Equipment anEquip = createNaturalWeapon(context, obj, tokString, dr); + Equipment anEquip = createNaturalWeapon(context, obj, tokString); if (anEquip == null) { @@ -129,7 +127,7 @@ * @return natural weapon */ private Equipment createNaturalWeapon(LoadContext context, CDOMObject obj, - String wpn, DeferredResolution size) + String wpn) { StringTokenizer commaTok = new StringTokenizer(wpn, Constants.COMMA); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-10-03 02:26:33
|
Revision: 7882 http://pcgen.svn.sourceforge.net/pcgen/?rev=7882&view=rev Author: thpr Date: 2008-10-03 02:26:27 +0000 (Fri, 03 Oct 2008) Log Message: ----------- clean up hassubclass & hassubstitutionclass Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/PCClass.java Trunk/pcgen/code/src/java/pcgen/core/chooser/ClassChoiceManager.java Trunk/pcgen/code/src/java/pcgen/core/npcgen/NPCGenerator.java Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassBasePanel.java Trunk/pcgen/code/src/java/pcgen/gui/editor/EditorMainForm.java Trunk/pcgen/code/src/java/pcgen/persistence/lst/PCClassLoader.java Trunk/pcgen/code/src/java/pcgen/rules/context/AbstractReferenceContext.java Trunk/pcgen/code/src/java/plugin/lsttokens/pcclass/HassubclassToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/pcclass/HassubstitutionlevelToken.java Modified: Trunk/pcgen/code/src/java/pcgen/core/PCClass.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-10-03 02:21:03 UTC (rev 7881) +++ Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-10-03 02:26:27 UTC (rev 7882) @@ -231,31 +231,6 @@ // private TreeSet<Language> languageBonus = new TreeSet<Language>(); /* - * ALLCLASSLEVELS This goes into each PCClassLevel from PCClass in order to - * indicate if the given PCClassLevel is actualy a SubClass - * - * CONSIDER Technically, that's not true ... this is really an indication of - * whether the class HAS subclasses or not (an abstract test, not a practical - * "a subclass has been selected" test. Is this therefore duplicate information?? - * - * Can I DELETEVARIABLE? - */ - private boolean hasSubClass = false; - - /* - * ALLCLASSLEVELS This goes into each PCClassLevel from PCClass in order to - * indicate if the given PCClassLevel is actualy a SubstitutionClass - * - * CONSIDER Technically, that's not true ... this is really an indication of - * whether the class HAS substitution classes or not (an abstract test, not - * a practical "a substitution class has been selected" test. Is this - * therefore duplicate information?? - * - * Can I DELETEVARIABLE? - */ - private boolean hasSubstitutionClass = false; - - /* * TYPESAFETY This is definitely something that needs to NOT be a String, * but it gets VERY complicated to do that, since the keys are widely used * in the variable processor. @@ -909,31 +884,6 @@ } /* - * PCCLASSANDLEVEL Since this (or a new boolean identifier, perhaps, to - * avoid confusion) is both a tag and an identifier for each class level as - * to whether the subclass is activated, this is required in both locations. - * - * Trying to DELETEMETHOD by deleting HASSUBCLASS - thpr 11/6/06 - */ - public final void setHasSubClass(final boolean arg) - { - hasSubClass = arg; - } - - /* - * PCCLASSANDLEVEL Since this (or a new boolean identifier, perhaps, to - * avoid confusion) is both a tag and an identifier for each class level as - * to whether the substitution class is activated, this is required in both - * locations. - * - * Trying to DELETEMETHOD by deleting HASSUBSTITUTIONCLASS - thpr 11/6/06 - */ - public final void setHasSubstitutionClass(final boolean arg) - { - hasSubstitutionClass = arg; - } - - /* * FINALPCCLASSANDLEVEL This is required in PCClassLevel and PCClass because it * is a Tag */ @@ -1953,15 +1903,6 @@ pccTxt.append("CLASS:").append(getDisplayName()); pccTxt.append(super.getPCCText(false)); - if (hasSubClass) - { - pccTxt.append("\tHASSUBCLASS:Y"); - } - if (hasSubstitutionClass) - { - pccTxt.append("\tHASSUBSTITUTIONLEVEL:Y"); - } - if (prohibitedSchools != null) { pccTxt.append('\t').append("PROHIBITED:"); @@ -2465,27 +2406,6 @@ } /* - * PCCLASSANDLEVEL Since this (or a new boolean identifier, perhaps, to - * avoid confusion) is both a tag and an identifier for each class level as - * to whether the subclass is activated, this is required in both locations. - */ - public final boolean hasSubClass() - { - return hasSubClass; - } - - /* - * PCCLASSANDLEVEL Since this (or a new boolean identifier, perhaps, to - * avoid confusion) is both a tag and an identifier for each class level as - * to whether the substitution class is activated, this is required in both - * locations. - */ - public final boolean hasSubstitutionClass() - { - return hasSubstitutionClass; - } - - /* * PCCLASSANDLEVEL Since this is required in both places... */ @Override Modified: Trunk/pcgen/code/src/java/pcgen/core/chooser/ClassChoiceManager.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/chooser/ClassChoiceManager.java 2008-10-03 02:21:03 UTC (rev 7881) +++ Trunk/pcgen/code/src/java/pcgen/core/chooser/ClassChoiceManager.java 2008-10-03 02:26:27 UTC (rev 7882) @@ -81,7 +81,7 @@ { for (PCClass aClass : refContext.getConstructedCDOMObjects(PCClass.class)) { - if(aClass.hasSubClass()) + if(aClass.containsListFor(ListKey.SUB_CLASS)) { for (PCClass aSubClass : aClass.getListFor(ListKey.SUB_CLASS)) { @@ -112,7 +112,7 @@ if(bMatch) { - if(aClass.hasSubClass()) + if(aClass.containsListFor(ListKey.SUB_CLASS)) { for (PCClass aSubClass : aClass.getListFor(ListKey.SUB_CLASS)) { @@ -133,7 +133,7 @@ if(aClass != null) { availableList.add(aClass); - if(aClass.hasSubClass()) + if(aClass.containsListFor(ListKey.SUB_CLASS)) { for (PCClass aSubClass : aClass.getListFor(ListKey.SUB_CLASS)) { Modified: Trunk/pcgen/code/src/java/pcgen/core/npcgen/NPCGenerator.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/npcgen/NPCGenerator.java 2008-10-03 02:21:03 UTC (rev 7881) +++ Trunk/pcgen/code/src/java/pcgen/core/npcgen/NPCGenerator.java 2008-10-03 02:26:27 UTC (rev 7882) @@ -28,6 +28,7 @@ import pcgen.base.util.WeightedCollection; import pcgen.cdom.base.Constants; +import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; import pcgen.cdom.enumeration.StringKey; import pcgen.core.Ability; @@ -657,7 +658,7 @@ } final PCClass classCopy = aClass.clone(); - if ( classCopy.hasSubClass() ) + if ( classCopy.containsListFor(ListKey.SUB_CLASS) ) { selectSubClass(aPC, classCopy); } Modified: Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassBasePanel.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassBasePanel.java 2008-10-03 02:21:03 UTC (rev 7881) +++ Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassBasePanel.java 2008-10-03 02:26:27 UTC (rev 7882) @@ -65,7 +65,6 @@ class ClassBasePanel extends BasePanel { private JCheckBox chkVisible; - private JCheckBox hasSubClass; private JCheckBox modToSkills; private JTextField abbreviation; private JTextField exClass; @@ -144,7 +143,6 @@ } } context.unconditionallyProcess(obj, "EXCLASS", exClass.getText().trim()); - obj.setHasSubClass(hasSubClass.getSelectedObjects() != null); obj.put(ObjectKey.MOD_TO_SKILLS, modToSkills.getSelectedObjects() != null); obj.put(ObjectKey.VISIBILITY, chkVisible.getSelectedObjects() == null ? Visibility.HIDDEN : Visibility.DEFAULT); @@ -224,7 +222,6 @@ } String[] exc = context.unparse(obj, "EXCLASS"); exClass.setText(exc == null ? "" : exc[0]); - hasSubClass.setSelected(obj.hasSubClass()); Boolean mts = obj.get(ObjectKey.MOD_TO_SKILLS); modToSkills.setSelected(mts == null ? true : mts); chkVisible.setSelected(obj.getSafe(ObjectKey.VISIBILITY).equals(Visibility.DEFAULT)); @@ -259,7 +256,6 @@ exchangeLevel = new JTextField(); startSkillPoints = new JTextField(); exClass = new JTextField(); - hasSubClass = new JCheckBox(); modToSkills = new JCheckBox(); chkVisible = new JCheckBox(); @@ -309,9 +305,6 @@ gridBagConstraints = buildConstraints(gridBagConstraints, 0, 2, true); add(tempLabel, gridBagConstraints); - gridBagConstraints = buildConstraints(gridBagConstraints, 1, 2, true); - add(hasSubClass, gridBagConstraints); - tempLabel = new JLabel("Mod To Skills:"); gridBagConstraints = buildConstraints(gridBagConstraints, 2, 2, true); add(tempLabel, gridBagConstraints); Modified: Trunk/pcgen/code/src/java/pcgen/gui/editor/EditorMainForm.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/editor/EditorMainForm.java 2008-10-03 02:21:03 UTC (rev 7881) +++ Trunk/pcgen/code/src/java/pcgen/gui/editor/EditorMainForm.java 2008-10-03 02:26:27 UTC (rev 7882) @@ -1453,7 +1453,7 @@ { availableFavouredClassList.add(aClass.getKeyName()); } - if (aClass.hasSubClass()) + if (aClass.containsListFor(ListKey.SUB_CLASS)) { for (SubClass subClass : aClass.getListFor(ListKey.SUB_CLASS)) { @@ -1461,7 +1461,7 @@ + "." + subClass.getKeyName()); } } - if (aClass.hasSubstitutionClass()) + if (aClass.containsListFor(ListKey.SUBSTITUTION_CLASS)) { for (SubstitutionClass subClass : aClass.getListFor(ListKey.SUBSTITUTION_CLASS)) { @@ -1852,7 +1852,7 @@ { availableFavouredClassesList.add(aClass.getKeyName()); } - if (aClass.hasSubClass()) + if (aClass.containsListFor(ListKey.SUB_CLASS)) { for (SubClass subClass : aClass.getListFor(ListKey.SUB_CLASS)) { @@ -1860,7 +1860,7 @@ + "." + subClass.getKeyName()); } } - if (aClass.hasSubstitutionClass()) + if (aClass.containsListFor(ListKey.SUBSTITUTION_CLASS)) { for (SubstitutionClass subClass : aClass.getListFor(ListKey.SUBSTITUTION_CLASS)) { Modified: Trunk/pcgen/code/src/java/pcgen/persistence/lst/PCClassLoader.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/persistence/lst/PCClassLoader.java 2008-10-03 02:21:03 UTC (rev 7881) +++ Trunk/pcgen/code/src/java/pcgen/persistence/lst/PCClassLoader.java 2008-10-03 02:26:27 UTC (rev 7882) @@ -345,20 +345,6 @@ + " has token " + token + " which is ignored"); continue; } - else if (token.equals("HASSUBCLASS")) - { - Logging.deprecationPrint("Class " + pcClass.getDisplayName() - + " has token HASSUBCLASS which should be " - + "changed to HASSUBCLASS:YES"); - pcClass.setHasSubClass(true); - } - else if (token.equals("HASSUBSTITUTIONLEVEL")) - { - Logging.deprecationPrint("Class " + pcClass.getDisplayName() - + " has token HASSUBSTITUTIONLEVEL which should be " - + "changed to HASSUBSTITUTIONLEVEL:YES"); - pcClass.setHasSubstitutionClass(true); - } int colonLoc = token.indexOf(':'); if (colonLoc == -1) { Modified: Trunk/pcgen/code/src/java/pcgen/rules/context/AbstractReferenceContext.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/rules/context/AbstractReferenceContext.java 2008-10-03 02:21:03 UTC (rev 7881) +++ Trunk/pcgen/code/src/java/pcgen/rules/context/AbstractReferenceContext.java 2008-10-03 02:26:27 UTC (rev 7882) @@ -318,7 +318,7 @@ // .getConstructedCDOMObjects(SUBCLASS_CLASS, SubClassCategory // .getConstant(key)); // for (CDOMSubClass subcl : subclasses) - if (pcc.hasSubClass()) + if (pcc.containsListFor(ListKey.SUB_CLASS)) { SubClassCategory cat = SubClassCategory.getConstant(key); for (SubClass subcl : pcc.getListFor(ListKey.SUB_CLASS)) Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/pcclass/HassubclassToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/pcclass/HassubclassToken.java 2008-10-03 02:21:03 UTC (rev 7881) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/pcclass/HassubclassToken.java 2008-10-03 02:26:27 UTC (rev 7882) @@ -16,7 +16,7 @@ public boolean parse(PCClass pcclass, String value, int level) { - pcclass.setHasSubClass(value.startsWith("Y")); + //TODO Need to deprecate this token return true; } } Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/pcclass/HassubstitutionlevelToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/pcclass/HassubstitutionlevelToken.java 2008-10-03 02:21:03 UTC (rev 7881) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/pcclass/HassubstitutionlevelToken.java 2008-10-03 02:26:27 UTC (rev 7882) @@ -16,7 +16,7 @@ public boolean parse(PCClass pcclass, String value, int level) { - pcclass.setHasSubstitutionClass(value.startsWith("Y")); + //TODO Need to deprecate this token return true; } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jde...@us...> - 2008-10-04 04:52:40
|
Revision: 7896 http://pcgen.svn.sourceforge.net/pcgen/?rev=7896&view=rev Author: jdempsey Date: 2008-10-04 04:52:11 +0000 (Sat, 04 Oct 2008) Log Message: ----------- FReq: Assigning Languages via kits Part1 - LANGBONUS support Issue#: 2016425 Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoSpecialAbilities.java Added Paths: ----------- Trunk/pcgen/code/src/java/pcgen/core/kit/KitLangBonus.java Trunk/pcgen/code/src/java/plugin/lsttokens/kit/LangBonusToken.java Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-10-04 01:05:29 UTC (rev 7895) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-10-04 04:52:11 UTC (rev 7896) @@ -18145,4 +18145,68 @@ return sb.toString(); } + /** + * Populate the langange lists for this PC. + * + * @param availableLangs The list of languages available for selection as bonus languages + * @param selectedLangs The list of already selected bonus languages + * @param excludedLangs The list of lnguages that cannot be selected + */ + public void buildLangLists(final List<Language> availableLangs, final List<Language> selectedLangs, final List<Language> excludedLangs) + { + SortedSet<Language> autoLangs = getAutoLanguages(); + Skill speakLanguage = null; + + final List<Skill> skillList = new ArrayList<Skill>(getSkillList()); + for (Skill aSkill : skillList) + { + if (aSkill.getChoiceString().indexOf( + PropertyFactory.getString("in_language")) >= 0) + { + speakLanguage = aSkill; + } + } + + for (final Language aLang : getLanguageBonusSelectionList()) + { + if (aLang != null) + { + if (PrereqHandler.passesAll(aLang.getPrerequisiteList(), this, aLang)) + { + availableLangs.add(aLang); + } + } + } + // + // Only show selections that are not automatically + // granted or granted via the "Speak Language" skill + // Remove any language selected via "Speak Language" + // from the list of available selections + // + for (Language aLang : getLanguagesList()) + { + boolean addLang = false; + + if ((speakLanguage != null) + && containsAssociated(speakLanguage, aLang.getKeyName())) + { + addLang = false; + } + else if (!autoLangs.contains(aLang)) + { + addLang = true; + } + + if (addLang) + { + selectedLangs.add(aLang); + } + else + { + availableLangs.remove(aLang); + excludedLangs.add(aLang); + } + } + } + } Added: Trunk/pcgen/code/src/java/pcgen/core/kit/KitLangBonus.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/kit/KitLangBonus.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/core/kit/KitLangBonus.java 2008-10-04 04:52:11 UTC (rev 7896) @@ -0,0 +1,183 @@ +/* + * KitLangBonus.java + * Copyright 2008 (C) James Dempsey + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Created on 2/10/2008 16:50:38 + * + * $Id: $ + */ +package pcgen.core.kit; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +import pcgen.base.lang.StringUtil; +import pcgen.core.Kit; +import pcgen.core.Language; +import pcgen.core.PlayerCharacter; + +/** + * Deals with applying a bonus language via a Kit + * + * Last Editor: $Author: $ + * Last Edited: $Date: $ + * + * @author James Dempsey <jde...@us...> + * @version $Revision: $ + */ +public class KitLangBonus extends BaseKit implements Serializable, Cloneable +{ + // Only change the UID when the serialized form of the class has also changed + private static final long serialVersionUID = 1; + + /** The list of language names. */ + private List<String> langList = new ArrayList<String>(); + + // These members store the state of an instance of this class. They are + // not cloned. + private transient List<Language> theLanguages = new ArrayList<Language>(); + + /** + * Constructor. + * + * @param aLangList The list of language keys + */ + public KitLangBonus(final List<String> aLangList) + { + this.langList.addAll(aLangList); + } + + /** + * Actually applies the bonus languages to this PC. + * + * @param aPC The PlayerCharacter the languages are to be applied to + */ + public void apply(PlayerCharacter aPC) + { + aPC.addLanguages(theLanguages); + } + + /** + * Prepare the languages to be added and test their application. + * + * @param aPC The character to be processed. + * @param aKit The kit being processed + * @param warnings List of warnigns. + * + * @return true, if the languages could be added + */ + public boolean testApply(Kit aKit, PlayerCharacter aPC, List<String> warnings) + { + if (langList.isEmpty()) + { + return false; + } + + final List<Language> availableLangs = new ArrayList<Language>(); + final List<Language> selectedLangs = new ArrayList<Language>(); + final List<Language> excludedLangs = new ArrayList<Language>(); + + int numLanguages = aPC.languageNum(false); + + aPC.buildLangLists(availableLangs, selectedLangs, excludedLangs); + + numLanguages -= selectedLangs.size(); + if (numLanguages <= 0) + { + return false; + } + + theLanguages = new ArrayList<Language>(numLanguages); + for (String langKey : langList) + { + Language lang = findLanguageInListByKey(availableLangs, langKey); + if (lang == null) + { + warnings.add( + "LANGUAGE: Could not add bonus language \"" + + langKey + "\""); + } + else + { + theLanguages.add(lang); + if (theLanguages.size() >= numLanguages) + { + break; + } + } + } + + if (langList.size() > numLanguages) + { + warnings.add("LANGUAGE: Too many bonus languages specified. " + + (langList.size() - numLanguages) + " had to be ignored."); + } + + if (theLanguages.size() > 0) + { + return true; + } + return false; + } + + /** + * Retrieve a language from a list based on its key. + * + * @param langList The list of languages + * @param langKey The key of the language to be retrieved. + * @return The language, or null if there is no match. + */ + private Language findLanguageInListByKey( + final List<Language> langList, String langKey) + { + for (Language language : langList) + { + if (langKey.equalsIgnoreCase(language.getKeyName())) + { + return language; + } + } + return null; + } + + /* (non-Javadoc) + * @see pcgen.core.kit.BaseKit#clone() + */ + @Override + public KitLangBonus clone() + { + return (KitLangBonus) super.clone(); + } + + /* (non-Javadoc) + * @see pcgen.core.kit.BaseKit#getObjectName() + */ + public String getObjectName() + { + return "Languages"; + } + + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() + { + return StringUtil.join(langList, ", "); + } +} Modified: Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoSpecialAbilities.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoSpecialAbilities.java 2008-10-04 01:05:29 UTC (rev 7895) +++ Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoSpecialAbilities.java 2008-10-04 04:52:11 UTC (rev 7896) @@ -66,11 +66,9 @@ import pcgen.core.Race; import pcgen.core.RuleConstants; import pcgen.core.SettingsHandler; -import pcgen.core.Skill; import pcgen.core.SpecialAbility; import pcgen.core.WeaponProf; import pcgen.core.analysis.SkillLanguage; -import pcgen.core.prereq.PrereqHandler; import pcgen.core.utils.MessageType; import pcgen.core.utils.ShowMessageDelegate; import pcgen.gui.AddSpecialAbility; @@ -174,7 +172,7 @@ List<Language> availableLangs = new ArrayList<Language>(); List<Language> selectedLangs = new ArrayList<Language>(); List<Language> excludedLangs = new ArrayList<Language>(); - buildLangLists(availableLangs, selectedLangs, excludedLangs); + pc.buildLangLists(availableLangs, selectedLangs, excludedLangs); if (selectedLangs.size() < (numLanguages)) { @@ -462,7 +460,7 @@ int numLanguages = pc.languageNum(false); - buildLangLists(availableLangs, selectedLangs, excludedLangs); + pc.buildLangLists(availableLangs, selectedLangs, excludedLangs); Globals.sortPObjectListByName(availableLangs); @@ -508,70 +506,6 @@ } } - /** - * Populate the langange lists for this PC. - * @param availableLangs - * @param selectedLangNames - * @param excludedLangs - */ - private void buildLangLists(final List<Language> availableLangs, - final List<Language> selectedLangs, final List<Language> excludedLangs) - { - SortedSet<Language> autoLangs = pc.getAutoLanguages(); - Skill speakLanguage = null; - - final List<Skill> skillList = new ArrayList<Skill>(pc.getSkillList()); - for (Skill aSkill : skillList) - { - if (aSkill.getChoiceString().indexOf( - PropertyFactory.getString("in_language")) >= 0) - { - speakLanguage = aSkill; - } - } - - for (final Language aLang : pc.getLanguageBonusSelectionList()) - { - if (aLang != null) - { - if (PrereqHandler.passesAll(aLang.getPrerequisiteList(), pc, aLang)) - { - availableLangs.add(aLang); - } - } - } - // - // Only show selections that are not automatically - // granted or granted via the "Speak Language" skill - // Remove any language selected via "Speak Language" - // from the list of available selections - // - for (Language aLang : pc.getLanguagesList()) - { - boolean addLang = false; - - if ((speakLanguage != null) - && pc.containsAssociated(speakLanguage, aLang.getKeyName())) - { - addLang = false; - } - else if (!autoLangs.contains(aLang)) - { - addLang = true; - } - - if (addLang) - { - selectedLangs.add(aLang); - } - else - { - availableLangs.remove(aLang); - excludedLangs.add(aLang); - } - } - } - private void removeSpecialAbility() { List<String> aList = new ArrayList<String>(); Added: Trunk/pcgen/code/src/java/plugin/lsttokens/kit/LangBonusToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/kit/LangBonusToken.java (rev 0) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/kit/LangBonusToken.java 2008-10-04 04:52:11 UTC (rev 7896) @@ -0,0 +1,100 @@ +/* + * LangBonusToken.java + * Copyright 2008 (C) James Dempsey + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Created on 2/10/2008 15:57:15 + * + * $Id: $ + */ +package plugin.lsttokens.kit; + +import java.net.URI; +import java.util.ArrayList; +import java.util.List; +import java.util.StringTokenizer; + +import pcgen.cdom.base.Constants; +import pcgen.core.Kit; +import pcgen.core.kit.KitLangBonus; +import pcgen.persistence.PersistenceLayerException; +import pcgen.persistence.SystemLoader; +import pcgen.persistence.lst.KitLstToken; +import pcgen.util.Logging; + +/** + * The Class <code>LangBonusToken</code> handles the LANGBONUS kit tag. + * + * Last Editor: $Author: $ + * Last Edited: $Date: $ + * + * @author James Dempsey <jde...@us...> + * @version $Revision: $ + */ +public class LangBonusToken extends KitLstToken +{ + + /** + * Gets the name of the tag this class will parse. + * + * @return Name of the tag this class handles + */ + public String getTokenName() + { + return "LANGBONUS"; + } + + /** + * Handles parsing the LANGBONUS tag. + * + * @param aKit the Kit object to add this information to + * @param value the token string + * @param source the source + * + * @return true if parse OK + * + * @throws PersistenceLayerException the persistence layer exception + */ + @Override + public boolean parse(Kit aKit, String value, URI source) + throws PersistenceLayerException + { + final StringTokenizer colToken = + new StringTokenizer(value, SystemLoader.TAB_DELIM); + + String token = colToken.nextToken(); + + if (colToken.hasMoreTokens()) + { + Logging.log(Logging.LST_ERROR, "Extra tokens on the " + + getTokenName() + " line " + getTokenName() + ":" + value + + " ignored."); + } + + List<String> langKeys = new ArrayList<String>(); + final StringTokenizer langToken = + new StringTokenizer(token, Constants.PIPE); + while (langToken.hasMoreTokens()) + { + langKeys.add(langToken.nextToken()); + } + + KitLangBonus klb = new KitLangBonus(langKeys); + + aKit.addObject(klb); + return true; + } +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-10-02 21:28:13
|
Revision: 7875 http://pcgen.svn.sourceforge.net/pcgen/?rev=7875&view=rev Author: thpr Date: 2008-10-02 21:25:32 +0000 (Thu, 02 Oct 2008) Log Message: ----------- warning stomping & dead code removal Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/Equipment.java Trunk/pcgen/code/src/java/pcgen/core/PCClass.java Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java Trunk/pcgen/code/src/java/pcgen/core/analysis/DomainApplication.java Trunk/pcgen/code/src/java/pcgen/core/analysis/EquipmentChoiceDriver.java Trunk/pcgen/code/src/java/pcgen/gui/utils/SwingChooser.java Trunk/pcgen/code/src/java/pcgen/util/chooser/RandomChooser.java Trunk/pcgen/code/src/java/plugin/lsttokens/DescLst.java Trunk/pcgen/code/src/java/plugin/lsttokens/deprecated/Damage.java Trunk/pcgen/code/src/java/plugin/lsttokens/deprecated/MoveBonus.java Trunk/pcgen/code/src/java/plugin/lsttokens/deprecated/ToHit.java Trunk/pcgen/code/src/java/plugin/pretokens/test/PreSkillTester.java Modified: Trunk/pcgen/code/src/java/pcgen/core/Equipment.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Equipment.java 2008-10-02 12:46:11 UTC (rev 7874) +++ Trunk/pcgen/code/src/java/pcgen/core/Equipment.java 2008-10-02 21:25:32 UTC (rev 7875) @@ -3928,20 +3928,6 @@ } /** - * Sets the size attribute of the Equipment object - * - * @param sizeString - * The new size value - */ - private void setSize(String sizeString) { - if (sizeString.length() > 1) { - sizeString = sizeString.toUpperCase().substring(0, 1); - } - - put(ObjectKey.SIZE, SettingsHandler.getGame().getSizeAdjustmentNamed(sizeString)); - } - - /** * Gets the specialAbilityList attribute of the Equipment object * * @param eqModList Modified: Trunk/pcgen/code/src/java/pcgen/core/PCClass.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-10-02 12:46:11 UTC (rev 7874) +++ Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-10-02 21:25:32 UTC (rev 7875) @@ -38,7 +38,6 @@ import pcgen.base.formula.Formula; import pcgen.base.lang.StringUtil; -import pcgen.base.util.DoubleKeyMap; import pcgen.cdom.base.AssociatedPrereqObject; import pcgen.cdom.base.CDOMListObject; import pcgen.cdom.base.CDOMObject; @@ -156,27 +155,6 @@ // PCLevelInfo /* - * ALLCLASSLEVELS The virtual feats [based on their level or LevelProperty] - * (not the raw Strings) need to be stored in EACH individual PCClassLevel. - * (This object is level dependent based on the input Tag and the use of a - * Map) - */ - /* - * REFACTOR Should decide whether this should be LevelProperty<Ability> and - * allow multiple instances of the same level within the List... that is how - * other variables are working - not this one because of the conversion from - * vFeatMap (which didn't use LevelProperty) - */ - private List<LevelProperty<List<Ability>>> vFeatList = null; - - /* - * ALLCLASSLEVELS Hard to tell here yet, since this is part of the Ability - * project, but this will need similar support to vFeatList?? - */ - private DoubleKeyMap<AbilityCategory, Integer, List<Ability>> vAbilityMap = - null; - - /* * ALLCLASSLEVELS skillPool is part each PCClassLevel and what that level * grants to each PlayerCharacter (added by the PCClassLevel Factory, not * by a tag) @@ -2098,28 +2076,6 @@ return pccTxt.toString(); } - /* - * PCCLASSANDLEVEL This is required in PCClassLevel and should be present in - * PCClass for PCClassLevel creation (in the factory) - */ - public List<Ability> getVirtualFeatList(final int aLevel) - { - final List<Ability> aList = new ArrayList<Ability>(); - - if (vFeatList != null) - { - for (LevelProperty<List<Ability>> lp : vFeatList) - { - if (lp.getLevel() <= aLevel) - { - aList.addAll(lp.getObject()); - } - } - } - - return aList; - } - /** * Sets qualified BonusObj's to "active" * @@ -2300,42 +2256,6 @@ } /** - * Adds virtual feats to the vFeatList - * - * @param aLevel - * level - * @param vList - * list of feats - */ - /* - * PCCLASSANDLEVEL Input from a Tag, and factory creation of a PCClassLevel - * require this method - */ - public void addVirtualFeats(final int aLevel, final List<Ability> vList) - { - if (vFeatList == null) - { - vFeatList = new ArrayList<LevelProperty<List<Ability>>>(); - } - boolean found = false; - for (LevelProperty<List<Ability>> lp : vFeatList) - { - if (lp.getLevel() == aLevel) - { - found = true; - lp.getObject().addAll(vList); - } - } - if (!found) - { - List<Ability> arrayList = new ArrayList<Ability>(vList); - vFeatList.add(LevelProperty.getLevelProperty(aLevel, arrayList)); - } - - super.addVirtualFeats(vList); - } - - /** * returns the value at which another attack is gained attackCycle of 4 * means a second attack is gained at a BAB of +5/+1 * @@ -2518,18 +2438,6 @@ } spellCache = null; spellCacheValid = false; - if (vFeatList != null) - { - //I guess a shallow clone is OK???? already was that way ... - thpr 11/2/06 - aClass.vFeatList = - new ArrayList<LevelProperty<List<Ability>>>(vFeatList); - } - if (vAbilityMap != null) - { - aClass.vAbilityMap = - new DoubleKeyMap<AbilityCategory, Integer, List<Ability>>( - vAbilityMap); - } // if ( theAutoAbilities != null ) // { // aClass.theAutoAbilities = new DoubleKeyMap<AbilityCategory, Integer, List<String>>(theAutoAbilities); @@ -3950,62 +3858,7 @@ } } - /** - * This method can be called to determine if the number of extra HD for - * purposes of skill points, feats, etc. See MM p. 11 extracted 03 Dec 2002 - * by sage_sam for bug #646816 - * - * @param aPC - * currently selected PlayerCharacter - * @param hdTotal - * int number of monster HD the character has - * @return int number of HD considered "Extra" - */ /* - * DELETEMETHOD This seems like something that violates the hardcoding rules - - * need to check what this should really be and how it should be structured - * in the code, new tags, etc. Message sent to PCGen-Experimental on Yahoo - */ - private static int getExtraHD(final PlayerCharacter aPC, final int hdTotal) - { - // Determine the EHD modifier based on the size category - final int sizeInt = aPC.getRace().getSafe( - FormulaKey.SIZE).resolve(aPC, "").intValue(); - final int ehdMod; - - switch (sizeInt) - { - case 8: // Collossal - ehdMod = 32; - - break; - - case 7: // Gargantuan - ehdMod = 16; - - break; - - case 6: // Huge - ehdMod = 4; - - break; - - case 5: // Large - ehdMod = 2; - - break; - - default: // Medium and smaller - ehdMod = 1; - - break; - } - - // EHD = total HD - base HD for size (min of zero) - return Math.max(0, hdTotal - ehdMod); - } - - /* * PCCLASSLEVELONLY This calculation is dependent upon the class level * and is therefore appropriate only for PCClassLevel */ @@ -4050,59 +3903,6 @@ return false; } - /* - * This method calculates skill modifier for a monster character. - * - * Created(Extracted from addLevel) 20 Nov 2002 by sage_sam for bug #629643 - * and updated to fix the bug. - */ - private int getMonsterSkillPointMod(final PlayerCharacter aPC, - final int total) - { - int spMod = 0; - final int lockedMonsterSkillPoints = - (int) aPC.getTotalBonusTo("MONSKILLPTS", "LOCKNUMBER"); - - // Set the monster's base skills at the first level - if (total == 1) - { - if (lockedMonsterSkillPoints == 0) - { - spMod = (int) aPC.getTotalBonusTo("MONSKILLPTS", "NUMBER"); - } - else - { - spMod = lockedMonsterSkillPoints; - } - } - - // This is not the first level added... - else - { - if (getExtraHD(aPC, total) > 0) - { - spMod = getSafe(FormulaKey.START_SKILL_POINTS).resolve(aPC, - classKey).intValue(); - if (lockedMonsterSkillPoints == 0) - { - spMod += (int) aPC.getTotalBonusTo("SKILLPOINTS", "NUMBER"); - } - else - { - spMod += lockedMonsterSkillPoints; - } - spMod = updateBaseSkillMod(aPC, spMod); - } - } - - if (spMod < 0) - { - spMod = 0; - } - - return spMod; - } - /** * Build a caster level map for this class. The map will be of the form * <String,String> where the key is the spell level and the value is the Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-10-02 12:46:11 UTC (rev 7874) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-10-02 21:25:32 UTC (rev 7875) @@ -12105,18 +12105,6 @@ return s; } - private int getTotalClassLevels() - { - int total = 0; - - for (PCClass pcClass : classList) - { - total += pcClass.getLevel(); - } - - return total; - } - /** * get the total number of character levels a character has. A character * level is any class level that is not a monster level Modified: Trunk/pcgen/code/src/java/pcgen/core/analysis/DomainApplication.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/analysis/DomainApplication.java 2008-10-02 12:46:11 UTC (rev 7874) +++ Trunk/pcgen/code/src/java/pcgen/core/analysis/DomainApplication.java 2008-10-02 21:25:32 UTC (rev 7875) @@ -137,8 +137,8 @@ if ((choiceString.length() > 0) && !pc.isImporting() && !choiceString.startsWith("FEAT|")) { - ChooserUtilities.modChoices(d, new ArrayList(), new ArrayList(), - true, pc, true, null); + ChooserUtilities.modChoices(d, new ArrayList<Object>(), + new ArrayList<Object>(), true, pc, true, null); } if (!pc.isImporting()) Modified: Trunk/pcgen/code/src/java/pcgen/core/analysis/EquipmentChoiceDriver.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/analysis/EquipmentChoiceDriver.java 2008-10-02 12:46:11 UTC (rev 7874) +++ Trunk/pcgen/code/src/java/pcgen/core/analysis/EquipmentChoiceDriver.java 2008-10-02 21:25:32 UTC (rev 7875) @@ -131,7 +131,7 @@ chooser.setVisible(false); chooser.setTitle("Select modifier (" + aString + ")"); chooser.setAvailableList(secondaryChoice); - chooser.setSelectedList(new ArrayList()); + chooser.setSelectedList(new ArrayList<Object>()); chooser.setTotalChoicesAvail(1); chooser.setVisible(true); Modified: Trunk/pcgen/code/src/java/pcgen/gui/utils/SwingChooser.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/utils/SwingChooser.java 2008-10-02 12:46:11 UTC (rev 7874) +++ Trunk/pcgen/code/src/java/pcgen/gui/utils/SwingChooser.java 2008-10-02 21:25:32 UTC (rev 7875) @@ -1080,56 +1080,6 @@ // mSelectedData, mSelectedList, mSelectedTerminator); } - private static interface ColumnSetter - { - /** - * Set the column names - * @param columnNames - */ - void setColumnNames(List columnNames); - } - - private static List createInputList(final List modelColumnNames, - final List defaultColumnNames, final List selectedList, - final List columnNames, final ColumnSetter setter) - { - // Store the selected items - final List inputList = selectedList; - - // Determine if we can avoid setting columns - if (columnNames != null) - { - if ((modelColumnNames != null) - && (columnNames.size() == modelColumnNames.size())) - { - for (int i = 0, length = columnNames.size(); i < length; i++) - { - // If a column doesn't match, set the columns and stop checking - if (!columnNames.get(i).equals(modelColumnNames.get(i))) - { - setter.setColumnNames(columnNames); - - break; - } - } - } - - // Set the columns if something doesn't match - else - { - setter.setColumnNames(columnNames); - } - } - - // Only set the column names if they haven't already defaulted - else if (modelColumnNames != defaultColumnNames) - { - setter.setColumnNames(columnNames); - } - - return inputList; - } - private static void updateTable(final JTableEx aTable, final ChooserTableModel aTableModel, final List anInputList, final String aLineTerminator) Modified: Trunk/pcgen/code/src/java/pcgen/util/chooser/RandomChooser.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/util/chooser/RandomChooser.java 2008-10-02 12:46:11 UTC (rev 7874) +++ Trunk/pcgen/code/src/java/pcgen/util/chooser/RandomChooser.java 2008-10-02 21:25:32 UTC (rev 7875) @@ -44,10 +44,6 @@ /** Whether or not to allow duplicate choices */ private boolean theAllowDuplicatesFlag = false; - /** Whether or not to force mPool=0 when closing */ - // TODO - Should this be used? - private boolean theZeroPoolFlag = true; - private int selectionsPerUnitCost = 1; private int totalSelectionsAvailable = 1; @@ -135,7 +131,7 @@ */ public void setPoolFlag(boolean poolFlag) { - theZeroPoolFlag = poolFlag; + // Do Nothing } /** Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/DescLst.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/DescLst.java 2008-10-02 12:46:11 UTC (rev 7874) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/DescLst.java 2008-10-02 21:25:32 UTC (rev 7875) @@ -34,6 +34,7 @@ /** * @see pcgen.persistence.lst.LstToken#getTokenName() */ + @Override public String getTokenName() { return "DESC"; //$NON-NLS-1$ Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/deprecated/Damage.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/deprecated/Damage.java 2008-10-02 12:46:11 UTC (rev 7874) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/deprecated/Damage.java 2008-10-02 21:25:32 UTC (rev 7875) @@ -38,6 +38,7 @@ { private static final String[] bonusHandled = {"DAMAGE"}; + @Override protected boolean parseToken(final String token) { if (token.startsWith("TYPE=")) @@ -52,11 +53,13 @@ return true; } + @Override protected String unparseToken(final Object obj) { return (String) obj; } + @Override protected String[] getBonusesHandled() { return bonusHandled; Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/deprecated/MoveBonus.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/deprecated/MoveBonus.java 2008-10-02 12:46:11 UTC (rev 7874) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/deprecated/MoveBonus.java 2008-10-02 21:25:32 UTC (rev 7875) @@ -46,6 +46,7 @@ /* (non-Javadoc) * @see pcgen.core.bonus.BonusObj#parseToken(java.lang.String) */ + @Override protected boolean parseToken(final String token) { for (int i = 0; i < bonusTags.length; ++i) @@ -73,6 +74,7 @@ /* (non-Javadoc) * @see pcgen.core.bonus.BonusObj#unparseToken(java.lang.Object) */ + @Override protected String unparseToken(final Object obj) { if (obj instanceof Integer) @@ -86,6 +88,7 @@ /* (non-Javadoc) * @see pcgen.core.bonus.BonusObj#getBonusesHandled() */ + @Override protected String[] getBonusesHandled() { return bonusHandled; Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/deprecated/ToHit.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/deprecated/ToHit.java 2008-10-02 12:46:11 UTC (rev 7874) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/deprecated/ToHit.java 2008-10-02 21:25:32 UTC (rev 7875) @@ -40,6 +40,7 @@ private static final String[] bonusTags = {"TOHIT"}; + @Override protected boolean parseToken(final String token) { for (int i = 0; i < bonusTags.length; ++i) @@ -64,6 +65,7 @@ return true; } + @Override protected String unparseToken(final Object obj) { if (obj instanceof Integer) @@ -74,6 +76,7 @@ return (String) obj; } + @Override protected String[] getBonusesHandled() { return bonusHandled; Modified: Trunk/pcgen/code/src/java/plugin/pretokens/test/PreSkillTester.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/pretokens/test/PreSkillTester.java 2008-10-02 12:46:11 UTC (rev 7874) +++ Trunk/pcgen/code/src/java/plugin/pretokens/test/PreSkillTester.java 2008-10-02 21:25:32 UTC (rev 7875) @@ -305,52 +305,4 @@ } return runningTotal; } - private SkillMatcher getSkillMatcher() - { - return new SkillMatcher(); - } - public class SkillMatcher - { - private int runningTotal=0; - private boolean matchesFound = false; - private boolean foundOneMatch = false; - private int totalRanks =0; - - public final int getTotalRanks() - { - return totalRanks; - } - public final void incrementTotalRanks(final int num) - { - totalRanks += num; - } - protected final int getRunningTotal() - { - return runningTotal; - } - protected final void setRunningTotal(int runningTotal) - { - this.runningTotal = runningTotal; - } - protected final boolean isMatchesFound() - { - return matchesFound; - } - protected final void setMatchesFound(boolean matchesFound) - { - this.matchesFound = matchesFound; - } - protected final boolean isFoundOneMatch() - { - return foundOneMatch; - } - protected final void setFoundOneMatch(boolean SkillFound) - { - this.foundOneMatch = SkillFound; - } - protected final void setTotalRanks(int totalRanks) - { - this.totalRanks = totalRanks; - } - } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-10-05 19:58:12
|
Revision: 7953 http://pcgen.svn.sourceforge.net/pcgen/?rev=7953&view=rev Author: thpr Date: 2008-10-05 19:58:04 +0000 (Sun, 05 Oct 2008) Log Message: ----------- eliminate redundant code Modified Paths: -------------- Trunk/pcgen/code/src/java/gmgen/plugin/PcgCombatant.java Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorPC.java Modified: Trunk/pcgen/code/src/java/gmgen/plugin/PcgCombatant.java =================================================================== --- Trunk/pcgen/code/src/java/gmgen/plugin/PcgCombatant.java 2008-10-05 19:54:40 UTC (rev 7952) +++ Trunk/pcgen/code/src/java/gmgen/plugin/PcgCombatant.java 2008-10-05 19:58:04 UTC (rev 7953) @@ -803,7 +803,7 @@ includeSkills = SettingsHandler.getSkillsTab_IncludeSkills(); } - ArrayList<Skill> skillList = + List<Skill> skillList = pc.getSkillListInOutputOrder(pc .getPartialSkillList(Visibility.OUTPUT_ONLY)); boolean firstLine = true; Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-10-05 19:54:40 UTC (rev 7952) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-10-05 19:58:04 UTC (rev 7953) @@ -502,23 +502,10 @@ * @return A list of the character's skills matching the visibility * criteria. */ - public ArrayList<Skill> getPartialSkillList(Visibility vis) + public List<Skill> getPartialSkillList(Visibility vis) { // Now select the required set of skills, based on their visibility. - ArrayList<Skill> aList = new ArrayList<Skill>(); - - for (Skill aSkill : skillList) - { - final Visibility skillVis = aSkill.getSafe(ObjectKey.VISIBILITY); - - if ((vis == Visibility.DEFAULT) || (skillVis == Visibility.DEFAULT) - || (skillVis == vis)) - { - aList.add(aSkill); - } - - } - return aList; + return Globals.getObjectsOfVisibility(skillList, vis); } /** @@ -2969,7 +2956,7 @@ * * @return An ArrayList of the skill objects in output order. */ - public ArrayList<Skill> getSkillListInOutputOrder() + public List<Skill> getSkillListInOutputOrder() { return getSkillListInOutputOrder(new ArrayList<Skill>(getSkillList())); } @@ -2986,8 +2973,8 @@ * * @return An ArrayList of the skill objects in output order. */ - public ArrayList<Skill> getSkillListInOutputOrder( - final ArrayList<Skill> sortedList) + public List<Skill> getSkillListInOutputOrder( + final List<Skill> sortedList) { final PlayerCharacter pc = this; Collections.sort(sortedList, new Comparator<Skill>() Modified: Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorPC.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorPC.java 2008-10-05 19:54:40 UTC (rev 7952) +++ Trunk/pcgen/code/src/java/pcgen/core/VariableProcessorPC.java 2008-10-05 19:58:04 UTC (rev 7953) @@ -785,8 +785,7 @@ { // We use the list in output order to ensure the size // does not include hidden skills - final ArrayList<Skill> skillList = getPc().getSkillListInOutputOrder(); - skillList.trimToSize(); + final List<Skill> skillList = getPc().getSkillListInOutputOrder(); valString = Integer.toString(skillList.size()); } else if (valString.startsWith("COUNT[SKILLTYPE=") || valString.startsWith("COUNT[SKILLTYPE.")) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-10-11 00:58:49
|
Revision: 8032 http://pcgen.svn.sourceforge.net/pcgen/?rev=8032&view=rev Author: thpr Date: 2008-10-11 00:58:45 +0000 (Sat, 11 Oct 2008) Log Message: ----------- ADD:EQUIP token update Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbility.java Trunk/pcgen/code/src/java/plugin/lsttokens/add/EquipToken.java Removed Paths: ------------- Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityEquipment.java Modified: Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbility.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbility.java 2008-10-11 00:26:22 UTC (rev 8031) +++ Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbility.java 2008-10-11 00:58:45 UTC (rev 8032) @@ -461,10 +461,6 @@ { return new LevelAbilityClassSkills(aowner, aLevel, aString); } - else if (aString.startsWith("EQUIP")) - { - return new LevelAbilityEquipment(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/LevelAbilityEquipment.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityEquipment.java 2008-10-11 00:26:22 UTC (rev 8031) +++ Trunk/pcgen/code/src/java/pcgen/core/levelability/LevelAbilityEquipment.java 2008-10-11 00:58:45 UTC (rev 8032) @@ -1,152 +0,0 @@ -/* - * LevelAbilityFeat.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, 10:11 PM - * - * Current Ver: $Revision$ - * Last Editor: $Author$ - * Last Edited: $Date$ - * - */ -package pcgen.core.levelability; - -import pcgen.core.Equipment; -import pcgen.core.EquipmentList; -import pcgen.core.Globals; -import pcgen.core.PObject; -import pcgen.core.PlayerCharacter; -import pcgen.core.pclevelinfo.PCLevelInfo; -import pcgen.core.prereq.PrereqHandler; -import pcgen.util.Logging; -import pcgen.util.chooser.ChooserInterface; - -import java.util.Collections; -import java.util.List; - -/** - * Represents a equipment that a character gets when gaining a level - * (an ADD:EQUIP entry in the LST file). - * - * @author Felipe Diniz <fd...@im...> - * @version $Revision$ - */ -final class LevelAbilityEquipment extends LevelAbility -{ - LevelAbilityEquipment(final PObject aowner, final int aLevel, final String aString) - { - super(aowner, aLevel, aString); - } - - List<String> getChoicesList(final String bString, final PlayerCharacter aPC) - { - final List<String> aList = super.getChoicesList(bString.substring(6), 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("Equipment Choice"); - - 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 ( String equipmentName : selectedList ) - { - final Equipment aEquipment = Globals.getContext().ref - .silentlyGetConstructedCDOMObject(Equipment.class, - equipmentName); - - if (aEquipment == null) - { - Logging.errorPrint("LevelAbilityEquipment: Equipment not found: " + equipmentName); - - break; - } - - final Equipment bEquipment = aEquipment.clone(); - bEquipment.setQty(1); - aPC.addEquipment(bEquipment); - } - 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 (aToken.startsWith("TYPE=") || aToken.startsWith("TYPE.")) - { - final String eqType = aToken.substring(5); - List<Equipment> equip = EquipmentList.getEquipmentOfType( eqType, "" ); - for ( Equipment eq : equip ) - { - anArrayList.add( eq.getDisplayName() ); - } - } - else - { - final String equipmentName = aToken; - final Equipment aEquipment = Globals.getContext().ref - .silentlyGetConstructedCDOMObject(Equipment.class, - equipmentName); - - if (aEquipment == null) - { - Logging.errorPrint("LevelAbilityEquipment: Equipment not found: " + equipmentName); - - return; - } - - if (!aPC.getEquipmentMasterList().contains(aEquipment)) - { - if (PrereqHandler.passesAll(aEquipment.getPrerequisiteList(), aPC, aEquipment)) - { - anArrayList.add(aToken); - } - } - } - } -} Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/add/EquipToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/add/EquipToken.java 2008-10-11 00:26:22 UTC (rev 8031) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/add/EquipToken.java 2008-10-11 00:58:45 UTC (rev 8032) @@ -17,42 +17,163 @@ */ package plugin.lsttokens.add; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.StringTokenizer; + +import pcgen.base.formula.Formula; +import pcgen.cdom.base.CDOMObject; +import pcgen.cdom.base.CDOMReference; +import pcgen.cdom.base.ChoiceActor; +import pcgen.cdom.base.ChoiceSet; import pcgen.cdom.base.Constants; -import pcgen.core.PObject; -import pcgen.persistence.lst.AddLstToken; +import pcgen.cdom.base.FormulaFactory; +import pcgen.cdom.base.TransitionChoice; +import pcgen.cdom.choiceset.QualifiedDecorator; +import pcgen.cdom.choiceset.ReferenceChoiceSet; +import pcgen.cdom.enumeration.ListKey; +import pcgen.core.Equipment; +import pcgen.core.PlayerCharacter; +import pcgen.rules.context.Changes; +import pcgen.rules.context.LoadContext; +import pcgen.rules.persistence.TokenUtilities; +import pcgen.rules.persistence.token.AbstractToken; +import pcgen.rules.persistence.token.CDOMSecondaryToken; import pcgen.util.Logging; -public class EquipToken implements AddLstToken +public class EquipToken extends AbstractToken implements + CDOMSecondaryToken<CDOMObject>, ChoiceActor<Equipment> { - public boolean parse(PObject target, String value, int level) + private static final Class<Equipment> EQUIPMENT_CLASS = Equipment.class; + + public String getParentToken() { + return "ADD"; + } + + private String getFullName() + { + return getParentToken() + ":" + getTokenName(); + } + + @Override + public String getTokenName() + { + return "EQUIP"; + } + + public boolean parse(LoadContext context, CDOMObject obj, String value) + { + if (value.length() == 0) + { + Logging.errorPrint(getFullName() + " may not have empty argument"); + return false; + } int pipeLoc = value.indexOf(Constants.PIPE); - String countString; + Formula count; String items; if (pipeLoc == -1) { - countString = "1"; + count = Formula.ONE; items = value; } else { - if (pipeLoc != value.lastIndexOf(Constants.PIPE)) + String countString = value.substring(0, pipeLoc); + count = FormulaFactory.getFormulaFor(countString); + if (count.isStatic() && count.resolve(null, "").doubleValue() <= 0) { - Logging.errorPrint("Syntax of ADD:" + getTokenName() - + " only allows one | : " + value); + Logging + .errorPrint("Count in " + getFullName() + + " must be > 0"); return false; } - countString = value.substring(0, pipeLoc); items = value.substring(pipeLoc + 1); } - target.addAddList(level, getTokenName() + "(" + items + ")" - + countString); + + if (isEmpty(items) || hasIllegalSeparator(',', items)) + { + return false; + } + + List<CDOMReference<Equipment>> refs = new ArrayList<CDOMReference<Equipment>>(); + StringTokenizer tok = new StringTokenizer(items, Constants.COMMA); + while (tok.hasMoreTokens()) + { + String tokText = tok.nextToken(); + CDOMReference<Equipment> lang = TokenUtilities.getTypeOrPrimitive( + context, EQUIPMENT_CLASS, tokText); + if (lang == null) + { + Logging.errorPrint(" Error was encountered while parsing " + + getFullName() + ": " + value + + " had an invalid reference: " + tokText); + return false; + } + refs.add(lang); + } + + ReferenceChoiceSet<Equipment> rcs = new ReferenceChoiceSet<Equipment>( + refs); + ChoiceSet<Equipment> cs = new ChoiceSet<Equipment>(getFullName(), + new QualifiedDecorator<Equipment>(rcs)); + TransitionChoice<Equipment> tc = new TransitionChoice<Equipment>(cs, + count); + context.getObjectContext().addToList(obj, ListKey.ADD, tc); + tc.setTitle("Equipment Choice"); + tc.setChoiceActor(this); return true; } - public String getTokenName() + public String[] unparse(LoadContext context, CDOMObject obj) { - return "EQUIP"; + Changes<TransitionChoice<?>> grantChanges = context.getObjectContext() + .getListChanges(obj, ListKey.ADD); + Collection<TransitionChoice<?>> addedItems = grantChanges.getAdded(); + if (addedItems == null || addedItems.isEmpty()) + { + // Zero indicates no Token + return null; + } + List<String> addStrings = new ArrayList<String>(); + for (TransitionChoice<?> container : addedItems) + { + ChoiceSet<?> cs = container.getChoices(); + if (EQUIPMENT_CLASS.equals(cs.getChoiceClass())) + { + Formula f = container.getCount(); + if (f == null) + { + context.addWriteMessage("Unable to find " + getFullName() + + " Count"); + return null; + } + String fString = f.toString(); + StringBuilder sb = new StringBuilder(); + if (!"1".equals(fString)) + { + sb.append(fString).append(Constants.PIPE); + } + sb.append(cs.getLSTformat()); + addStrings.add(sb.toString()); + + // assoc.getAssociation(AssociationKey.CHOICE_MAXCOUNT); + } + } + return addStrings.toArray(new String[addStrings.size()]); } + + public Class<CDOMObject> getTokenClass() + { + return CDOMObject.class; + } + + public void applyChoice(Equipment choice, PlayerCharacter pc) + { + Equipment bEquipment = choice.clone(); + bEquipment.setQty(1); + pc.addEquipment(bEquipment); + } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <th...@us...> - 2008-10-14 22:41:54
|
Revision: 8075 http://pcgen.svn.sourceforge.net/pcgen/?rev=8075&view=rev Author: thpr Date: 2008-10-14 22:41:43 +0000 (Tue, 14 Oct 2008) Log Message: ----------- CONTAINS token rebuild Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/cdom/base/Constants.java Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/IntegerKey.java Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ObjectKey.java Trunk/pcgen/code/src/java/pcgen/core/Equipment.java Trunk/pcgen/code/src/java/plugin/lsttokens/equipment/ContainsToken.java Added Paths: ----------- Trunk/pcgen/code/src/java/pcgen/cdom/helper/Capacity.java Modified: Trunk/pcgen/code/src/java/pcgen/cdom/base/Constants.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/base/Constants.java 2008-10-14 22:01:10 UTC (rev 8074) +++ Trunk/pcgen/code/src/java/pcgen/cdom/base/Constants.java 2008-10-14 22:41:43 UTC (rev 8075) @@ -315,5 +315,6 @@ String LST_CHOOSE = "CHOOSE:"; String LST_ADDCHOICE = "ADDCHOICE:"; char CHAR_ASTERISK = '*'; + char PERCENT = '%'; public static final int NO_LEVEL_LIMIT = -1; } Modified: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/IntegerKey.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/IntegerKey.java 2008-10-14 22:01:10 UTC (rev 8074) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/IntegerKey.java 2008-10-14 22:41:43 UTC (rev 8075) @@ -136,6 +136,8 @@ public static final IntegerKey UMULT = getConstant("UMULT"); + public static final IntegerKey CONTAINER_REDUCE_WEIGHT = getConstant("CONTAINER_REDUCE_WEIGHT"); + /* * TODO Okay, this is a hack. This should probably be a FormulaKey rather * than an IntegerKey in order to properly handle this strange delegation. 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:01:10 UTC (rev 8074) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java 2008-10-14 22:41:43 UTC (rev 8075) @@ -39,6 +39,7 @@ import pcgen.cdom.content.LevelCommandFactory; import pcgen.cdom.helper.Aspect; import pcgen.cdom.helper.AttackCycle; +import pcgen.cdom.helper.Capacity; import pcgen.cdom.helper.FollowerLimit; import pcgen.cdom.helper.PointCost; import pcgen.cdom.helper.Qualifier; @@ -244,6 +245,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<Capacity> CAPACITY = new ListKey<Capacity>(); private static CaseInsensitiveMap<ListKey<?>> map = null; Modified: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ObjectKey.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ObjectKey.java 2008-10-14 22:01:10 UTC (rev 8074) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ObjectKey.java 2008-10-14 22:41:43 UTC (rev 8075) @@ -40,6 +40,7 @@ import pcgen.cdom.content.LevelExchange; import pcgen.cdom.content.Modifier; import pcgen.cdom.content.SpellResistance; +import pcgen.cdom.helper.Capacity; import pcgen.cdom.list.ClassSkillList; import pcgen.cdom.list.ClassSpellList; import pcgen.cdom.list.DomainSpellList; @@ -223,6 +224,12 @@ public static final ObjectKey<SpellProhibitor> CHOICE = new ObjectKey<SpellProhibitor>(null); + public static final ObjectKey<Boolean> CONTAINER_CONSTANT_WEIGHT = new ObjectKey<Boolean>(Boolean.FALSE); + + public static final ObjectKey<BigDecimal> CONTAINER_WEIGHT_CAPACITY = new ObjectKey<BigDecimal>(null); + + public static final ObjectKey<Capacity> TOTAL_CAPACITY = new ObjectKey<Capacity>(null); + public static final ObjectKey<SizeAdjustment> BASESIZE; public static final ObjectKey<SizeAdjustment> SIZE; Added: Trunk/pcgen/code/src/java/pcgen/cdom/helper/Capacity.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/helper/Capacity.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/cdom/helper/Capacity.java 2008-10-14 22:41:43 UTC (rev 8075) @@ -0,0 +1,98 @@ +/* + * 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 pcgen.cdom.helper; + +import java.math.BigDecimal; + +public class Capacity +{ + + public static BigDecimal UNLIMITED = new BigDecimal(-1); + /* + * CONSIDER Need to flesh out how this works; depends on how Capacity + * interacts with the core... - Tom Parker 3/1/07 + */ + public static final Capacity ANY = new Capacity(null, UNLIMITED); + + private final String type; + + private final BigDecimal limit; + + public Capacity(String typ, BigDecimal cap) + { + type = typ; + limit = cap; + } + + public BigDecimal getCapacity() + { + return limit; + } + + public String getType() + { + return type; + } + + public static Capacity getTotalCapacity(BigDecimal d) + { + return new Capacity(null, d); + } + + @Override + public String toString() + { + StringBuilder sb = new StringBuilder(); + sb.append("Capacity: "); + sb.append(type == null ? "Total" : type); + sb.append('='); + sb.append(UNLIMITED.equals(limit) ? "UNLIMITED" : limit); + return sb.toString(); + } + + @Override + public int hashCode() + { + return type == null ? 0 : type.hashCode() ^ limit.hashCode(); + } + + @Override + public boolean equals(Object o) + { + if (o instanceof Capacity) + { + Capacity other = (Capacity) o; + if (type == null) + { + if (other.type != null) + { + return false; + } + } + else + { + if (!type.equals(other.type)) + { + return false; + } + } + return limit.equals(other.limit); + } + return false; + } +} Modified: Trunk/pcgen/code/src/java/pcgen/core/Equipment.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Equipment.java 2008-10-14 22:01:10 UTC (rev 8074) +++ Trunk/pcgen/code/src/java/pcgen/core/Equipment.java 2008-10-14 22:41:43 UTC (rev 8075) @@ -54,6 +54,7 @@ import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; import pcgen.cdom.enumeration.StringKey; +import pcgen.cdom.helper.Capacity; import pcgen.cdom.inst.EquipmentHead; import pcgen.cdom.modifier.ChangeArmorType; import pcgen.cdom.reference.CDOMDirectSingleRef; @@ -93,8 +94,6 @@ { private static final long serialVersionUID = 1; - private static final int UNLIMITED_CAPACITY = -1; - private static final String EQMOD_WEIGHT = "_WEIGHTADD"; private static final String EQMOD_DAMAGE = "_DAMAGE"; @@ -200,21 +199,11 @@ private int numberEquipped; - private Float containerWeightCapacity = (float) 0; - - private Integer containerReduceWeight = 0; - - private boolean containerConstantWeight; - - private boolean d_acceptsChildren; - private boolean isOnlyNaturalWeapon; - private Map<String, Float> d_acceptsTypes = new HashMap<String, Float>(); - private Map<String, Float> d_childTypes = new HashMap<String, Float>(); - private String containerCapacityString = ""; + private String containerCapacityString = null; private String containerContentsString = ""; @@ -2185,7 +2174,7 @@ * @return true if the Equipment can take children. */ public boolean acceptsChildren() { - return d_acceptsChildren; + return get(ObjectKey.CONTAINER_WEIGHT_CAPACITY) != null; } /** @@ -2725,19 +2714,9 @@ eq.numberEquipped = numberEquipped; eq.qty = qty; eq.outputIndex = outputIndex; - eq.containerWeightCapacity = containerWeightCapacity; - eq.containerReduceWeight = containerReduceWeight; - eq.d_acceptsChildren = d_acceptsChildren; - eq.d_acceptsTypes = new HashMap<String, Float>(d_acceptsTypes); - - eq.containerConstantWeight = containerConstantWeight; - eq.d_childTypes = new HashMap<String, Float>(d_childTypes); - eq.containerContentsString = containerContentsString; - eq.containerCapacityString = containerCapacityString; - eq.d_containedEquipment = new ArrayList<Equipment>(d_containedEquipment); @@ -3346,7 +3325,8 @@ // // Adjust the capacity of the container (if it is one) // - if (containerCapacityString.length() > 0) + BigDecimal weightCap = get(ObjectKey.CONTAINER_WEIGHT_CAPACITY); + if (weightCap != null) { double mult = 1.0; @@ -3357,23 +3337,26 @@ eq.typeList(), 1.0); } - if (containerWeightCapacity.intValue() != -1) + BigDecimal multbd = new BigDecimal(mult); + if (!Capacity.UNLIMITED.equals(weightCap)) { - containerWeightCapacity = - new Float(eq.containerWeightCapacity.doubleValue() - * mult); + // CONSIDER ICK, ICK, direct access bad + put(ObjectKey.CONTAINER_WEIGHT_CAPACITY, weightCap + .multiply(multbd)); } - if (getAcceptsTypeCount() > 0) + List<Capacity> capacity = removeListFor(ListKey.CAPACITY); + if (capacity != null) { - for (String aString : eq.d_acceptsTypes.keySet()) + for (Capacity cap : capacity) { - Float aWeight = eq.getAcceptsType(aString); - - if (aWeight.intValue() != -1) + BigDecimal content = cap.getCapacity(); + if (!Capacity.UNLIMITED.equals(content)) { - aWeight = new Float(aWeight.doubleValue() * mult); - setAcceptsType(aString, aWeight); + content = content.multiply(multbd); } + // CONSIDER ICK, ICK, direct access bad + addToListFor(ListKey.CAPACITY, new Capacity(cap + .getType(), content)); } } @@ -3513,51 +3496,11 @@ } /** - * Update the container contents String - */ - public void updateContainerContentsString() { - containerContentsString = ""; - - final StringBuffer tempStringBuffer = new StringBuffer( - getChildCount() * 20); - - // Make sure there's no bug here. - if (acceptsChildren() - && (getBaseContainedWeight(true) >= 0.0f)) { - tempStringBuffer.append( - Globals.getGameModeUnitSet().displayWeightInUnitSet( - getBaseContainedWeight(true).doubleValue())) - .append(Globals.getGameModeUnitSet().getWeightUnit()); - } else { - // have to put something - tempStringBuffer.append("0.0 "); - tempStringBuffer.append(Globals.getGameModeUnitSet() - .getWeightUnit()); - } - - for (int e = 0; e < getChildCount(); ++e) { - final Equipment anEquip = (Equipment) getChild(e); - - if (anEquip.getQty() > 0.0f) { - tempStringBuffer.append(", "); - tempStringBuffer.append(BigDecimalHelper.trimZeros(anEquip - .getQty().toString())); - tempStringBuffer.append(" "); - tempStringBuffer.append(anEquip); - } - } - - containerContentsString = tempStringBuffer.toString(); - } - - /** * Updates the containerContentsString from children of this item * * @param pc The PC carrying the item */ public void updateContainerContentsString(final PlayerCharacter pc) { - containerContentsString = ""; - final StringBuffer tempStringBuffer = new StringBuffer( getChildCount() * 20); @@ -3665,45 +3608,6 @@ return true; } - /** - * For a container, sets the types that will be accepted, and how many - * of them the item can hold - * - * @param parameter - * the Type to accept - * @param acceptsType - * How many it will accept - */ - private void setAcceptsType( - final String parameter, - final Float acceptsType) { - - d_acceptsTypes.put(parameter.toUpperCase(), acceptsType); - } - - /** - * If this item is a container that accepts the Type of equipment - * then the capacity for that type of equipment will be returned. - * If the object is not a container capable of holding Equipment of - * type aType, then null is returned. - * - * @param aType the Type of equipment - * - * @return The acceptsTypes value - */ - private Float getAcceptsType(final String aType) { - return d_acceptsTypes.get(aType.toUpperCase()); - } - - /** - * Gets the number of accepted types - * - * @return The number of distinct types - */ - private int getAcceptsTypeCount() { - return d_acceptsTypes.size(); - } - private int getAltTypeCount() { if (altTypeList == null) { return 0; @@ -4138,7 +4042,14 @@ * @return The acceptsTypes value */ private boolean acceptsType(final String aString) { - return d_acceptsTypes.containsKey(aString.toUpperCase()); + for (Capacity cap : getSafeListFor(ListKey.CAPACITY)) + { + if (cap.getType().equalsIgnoreCase(aString)) + { + return true; + } + } + return false; } private void addAltType(final String type) { @@ -4263,8 +4174,10 @@ final PlayerCharacter aPC, final Float aFloat) { - return containerWeightCapacity.intValue() == -1 || - (aFloat + getContainedWeight(aPC)) <= containerWeightCapacity; + BigDecimal weightCap = get(ObjectKey.CONTAINER_WEIGHT_CAPACITY); + return weightCap != null + && (Capacity.UNLIMITED.equals(weightCap) || + (aFloat + getContainedWeight(aPC)) <= weightCap.doubleValue()); } /** @@ -4280,13 +4193,8 @@ final SortedSet<String> aTypeList, final Float aQuant) { - if (acceptsType("Any")) { - if (getAcceptsType("Any").intValue() == -1) { - return true; - } - } - - return !("".equals(pickChildType(aTypeList, aQuant))); + return Capacity.ANY.equals(get(ObjectKey.TOTAL_CAPACITY)) + || !("".equals(pickChildType(aTypeList, aQuant))); } private List<EquipmentModifier> cloneEqModList(final boolean primary) { @@ -4460,41 +4368,47 @@ final SortedSet<String> aTypeList, final Float quantToAdd) { - Float acceptsType = getAcceptsType("TOTAL"); - - // Sanity check - if (acceptsType == null) { - acceptsType = 0f; - } - + Capacity totalCap = get(ObjectKey.TOTAL_CAPACITY); + BigDecimal capValue = totalCap.getCapacity(); + if (getChildType("Total") == null) { setChildType("Total", 0f); } String canContain = ""; - if ((getChildType("Total") + quantToAdd) <= acceptsType) { - for (String aType : aTypeList) { - if (!"".equals(canContain)) { - break; - } - if (acceptsType(aType)) { - if (containsChildType(aType) && - ((getChildType(aType) + quantToAdd) <= getAcceptsType(aType))) { - canContain = aType; - } else if (quantToAdd <= getAcceptsType(aType)) { - canContain = aType; + if ((getChildType("Total") + quantToAdd) <= capValue.doubleValue()) { + boolean anyContain = false; + float childType = containsChildType("Any") ? getChildType("Any") : 0.0f; + CAPFOR: for (Capacity c : getSafeListFor(ListKey.CAPACITY)) + { + String capType = c.getType(); + double val = c.getCapacity().doubleValue(); + for (String aType : aTypeList) { + if (capType.equalsIgnoreCase(aType)) + { + if (containsChildType(aType) + && ((getChildType(aType) + quantToAdd) <= val) + || quantToAdd <= val) + { + canContain = aType; + break CAPFOR; + } } + else if ("Any".equalsIgnoreCase(capType)) + { + if ((childType + quantToAdd) <= val) { + anyContain = true; + } + } } } + - if (("".equals(canContain)) && acceptsType("Any")) { + if (("".equals(canContain)) && anyContain) { if (!containsChildType("Any")) { setChildType("Any", (float) 0); } - - if ((getChildType("Any") + quantToAdd) <= getAcceptsType("Any")) { - canContain = "Any"; - } + canContain = "Any"; } } @@ -4781,27 +4695,31 @@ final StringBuffer tempStringBuffer = new StringBuffer(); boolean comma = false; - if (containerWeightCapacity.intValue() != -1) { - tempStringBuffer.append(containerWeightCapacity).append(' ') + BigDecimal weightCap = get(ObjectKey.CONTAINER_WEIGHT_CAPACITY); + if (weightCap != null && !Capacity.UNLIMITED.equals(weightCap)) + { + tempStringBuffer.append(weightCap).append(' ') .append(Globals.getGameModeUnitSet().getWeightUnit()); comma = true; } - if (getAcceptsTypeCount() > 0) { - for (String aString : d_acceptsTypes.keySet()) { + List<Capacity> capacity = getListFor(ListKey.CAPACITY); + if (capacity != null) { + for (Capacity c : capacity) { if (comma) { tempStringBuffer.append(", "); comma = false; } - - if (getAcceptsType(aString).intValue() != -1) { - tempStringBuffer.append( - getAcceptsType(aString).floatValue()).append(' '); - tempStringBuffer.append(aString); + + BigDecimal capValue = c.getCapacity(); + if (!Capacity.UNLIMITED.equals(capValue)) + { + tempStringBuffer.append(capValue).append(' '); + tempStringBuffer.append(c.getType()); comma = true; - } else if (!"TOTAL".equals(aString)) { + } else if (c.getType() != null) { comma = true; - tempStringBuffer.append(aString); + tempStringBuffer.append(c.getType()); } } } @@ -5552,7 +5470,7 @@ Float total = (float) 0; - if ((containerConstantWeight && !effective) || (getChildCount() == 0)) { + if ((getSafe(ObjectKey.CONTAINER_CONSTANT_WEIGHT) && !effective) || (getChildCount() == 0)) { return total; } @@ -5569,8 +5487,9 @@ } } - if (containerReduceWeight > 0) { - total *= (containerReduceWeight.floatValue() / 100); + Integer crw = get(IntegerKey.CONTAINER_REDUCE_WEIGHT); + if (crw != null && crw != 0) { + total *= (crw.floatValue() / 100); } return total; @@ -5590,7 +5509,7 @@ final boolean effective) { Float total = 0f; - if ((containerConstantWeight && !effective) || (getChildCount() == 0)) { + if ((getSafe(ObjectKey.CONTAINER_CONSTANT_WEIGHT) && !effective) || (getChildCount() == 0)) { return total; } @@ -5610,8 +5529,9 @@ } } - if (containerReduceWeight > 0) { - total *= (containerReduceWeight.floatValue() / 100); + Integer crw = get(IntegerKey.CONTAINER_REDUCE_WEIGHT); + if (crw != null && crw != 0) { + total *= (crw.floatValue() / 100); } return total; @@ -5677,6 +5597,10 @@ * @return The containerContentsString value */ public String getContainerContentsString() { + if (containerContentsString == null) + { + updateContainerContentsString(null); + } return containerContentsString; } @@ -5707,134 +5631,15 @@ // --------------------------- /** - * Set the container properties of this item - * - * @param tokenString The list of types and quantities that this item - * may contain - */ - public void setContainer(final String tokenString) { - setContainer(null, tokenString); - } - - /** - * Sets the container attribute of the Equipment object - * - * @param pc The PC that has the Equipment - * - * @param tokenString - * The new container value - */ - public void setContainer(final PlayerCharacter pc, final String tokenString) { - - d_acceptsChildren = true; - - final StringTokenizer aTok = new StringTokenizer(tokenString, "|"); - - if (aTok.hasMoreTokens()) { - String bString = aTok.nextToken(); - - if ((bString != null) && (bString.charAt(0) == '*')) { - containerConstantWeight = true; - bString = bString.substring(1); - } - - if ((bString != null) && (bString.indexOf('%') > 0)) { - final int pos = bString.indexOf('%'); - final String redString = bString.substring(0, pos); - bString = bString.substring(pos + 1); - - try { - containerReduceWeight = Integer.valueOf(redString); - } catch (NumberFormatException ex) { - Logging.errorPrint("Error in CONTAINS line: " + tokenString); - containerReduceWeight = 0; - } - } - - try { - containerWeightCapacity = new Float(bString); - if (containerWeightCapacity < 0) - { - Logging.deprecationPrint(getKeyName() - + " Weight Capacity must be >= 0: " + bString - + "\n use 'UNLIM' (not -1) for unlimited Capacity"); - } - } catch (NumberFormatException ex) { - if (!"UNLIM".equals(bString)) - { - Logging.log(Logging.LST_ERROR, "Error in CONTAINS line: " + tokenString - + "\n" + " " + bString - + " was not a number or 'UNLIM'"); - } - containerWeightCapacity = (float) UNLIMITED_CAPACITY; - } - } else { - containerWeightCapacity = (float) UNLIMITED_CAPACITY; - } - - boolean limited = true; - if (!aTok.hasMoreTokens()) { - limited = false; - setAcceptsType("Any", (float) UNLIMITED_CAPACITY); - } - - Float aFloat = 0f; - while (aTok.hasMoreTokens()) { - final StringTokenizer typeTok = - new StringTokenizer(aTok.nextToken(), "="); - String itemType = typeTok.nextToken(); - - Float itemNumber; - if (typeTok.hasMoreTokens()) { - String itemCount = typeTok.nextToken(); - if ("UNLIM".equals(itemCount)) - { - limited = false; - itemNumber = (float) UNLIMITED_CAPACITY; - } - else - { - itemNumber = new Float(itemCount); - - if (itemNumber < 0) - { - Logging.errorPrint(getKeyName() + " Item Count for " - + itemType + " must be > 0: " + itemCount - + "\n use 'UNLIM' (not -1) for unlimited Count"); - } - - if (limited) { - aFloat += itemNumber; - } - } - } else { - limited = false; - itemNumber = (float) UNLIMITED_CAPACITY; - } - - if (!"Any".equals(itemType) && !"Total".equals(itemType)) { - setAcceptsType(itemType, itemNumber); - } else { - setAcceptsType(itemType, itemNumber); - } - } - - if (!acceptsType("Total")) { - Float f = limited ? aFloat : (float) UNLIMITED_CAPACITY; - - setAcceptsType("Total", f); - } - - updateContainerCapacityString(); - updateContainerContentsString(pc); - } - - /** * Gets the containerCapacityString attribute of the Equipment object * * @return The containerCapacityString value */ public String getContainerCapacityString() { + if (containerCapacityString == null) + { + updateContainerCapacityString(); + } return containerCapacityString; } Modified: Trunk/pcgen/code/src/java/plugin/lsttokens/equipment/ContainsToken.java =================================================================== --- Trunk/pcgen/code/src/java/plugin/lsttokens/equipment/ContainsToken.java 2008-10-14 22:01:10 UTC (rev 8074) +++ Trunk/pcgen/code/src/java/plugin/lsttokens/equipment/ContainsToken.java 2008-10-14 22:41:43 UTC (rev 8075) @@ -1,22 +1,304 @@ package plugin.lsttokens.equipment; +import java.math.BigDecimal; +import java.util.Collection; +import java.util.StringTokenizer; + +import pcgen.cdom.base.Constants; +import pcgen.cdom.enumeration.IntegerKey; +import pcgen.cdom.enumeration.ListKey; +import pcgen.cdom.enumeration.ObjectKey; +import pcgen.cdom.helper.Capacity; import pcgen.core.Equipment; -import pcgen.persistence.lst.EquipmentLstToken; +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.BigDecimalHelper; +import pcgen.util.Logging; /** - * Deals with CONTAINS token + * Deals with CONTAINS token */ -public class ContainsToken implements EquipmentLstToken +public class ContainsToken extends AbstractToken implements + CDOMPrimaryToken<Equipment> { + @Override public String getTokenName() { return "CONTAINS"; } - public boolean parse(Equipment eq, String value) + public boolean parse(LoadContext context, Equipment eq, String value) { - eq.setContainer(value); + if (isEmpty(value) || hasIllegalSeparator('|', value)) + { + return false; + } + + StringTokenizer pipeTok = new StringTokenizer(value, Constants.PIPE); + + /* + * TODO I believe this needs to clear the List and if it already + * contains something, then should it provide an informational message? + */ + String weightCapacity = pipeTok.nextToken(); + + boolean hadAsterisk = false; + if (weightCapacity.charAt(0) == Constants.CHAR_ASTERISK) + { + hadAsterisk = true; + context.getObjectContext().put(eq, + ObjectKey.CONTAINER_CONSTANT_WEIGHT, Boolean.TRUE); + weightCapacity = weightCapacity.substring(1); + } + + int percentLoc = weightCapacity.indexOf(Constants.PERCENT); + if (percentLoc != weightCapacity.lastIndexOf(Constants.PERCENT)) + { + Logging.addParseMessage(Logging.LST_ERROR, + "Cannot have two weight reduction " + + "characters (indicated by %): " + value); + return false; + } + if (percentLoc != -1) + { + if (hadAsterisk) + { + Logging.addParseMessage(Logging.LST_ERROR, + "Cannot have Constant Weight (indicated by *) " + + "and weight reduction (indicated by %): " + + value); + return false; + } + String redString = weightCapacity.substring(0, percentLoc); + weightCapacity = weightCapacity.substring(percentLoc + 1); + + try + { + context.getObjectContext().put(eq, + IntegerKey.CONTAINER_REDUCE_WEIGHT, + Integer.valueOf(redString)); + } + catch (NumberFormatException ex) + { + Logging.addParseMessage(Logging.LST_ERROR, + "Weight Reduction (indicated by %) must be an integer: " + + value); + return false; + } + } + + BigDecimal weightCap; + if ("UNLIM".equals(weightCapacity)) + { + weightCap = Capacity.UNLIMITED; + } + else + { + try + { + weightCap = BigDecimalHelper.trimBigDecimal(new BigDecimal( + weightCapacity)); + if (BigDecimal.ZERO.compareTo(weightCap) > 0) + { + Logging + .addParseMessage( + Logging.LST_ERROR, + "Weight Capacity must be >= 0: " + + weightCapacity + + "\n Use 'UNLIM' (not -1) for unlimited Count"); + return false; + } + } + catch (NumberFormatException ex) + { + Logging.addParseMessage(Logging.LST_ERROR, + "Weight Capacity must be 'UNLIM or a number >= 0: " + + weightCapacity); + return false; + } + } + context.getObjectContext().put(eq, ObjectKey.CONTAINER_WEIGHT_CAPACITY, + weightCap); + + Capacity totalCap = null; + boolean limited = true; + if (!pipeTok.hasMoreTokens()) + { + limited = false; + totalCap = Capacity.ANY; + } + + BigDecimal limitedCapacity = BigDecimal.ZERO; + + while (pipeTok.hasMoreTokens()) + { + String typeString = pipeTok.nextToken(); + int equalLoc = typeString.indexOf(Constants.EQUALS); + if (equalLoc != typeString.lastIndexOf(Constants.EQUALS)) + { + return false; + } + if (equalLoc == -1) + { + limited = false; + context.getObjectContext().addToList(eq, ListKey.CAPACITY, + new Capacity(typeString, Capacity.UNLIMITED)); + } + else + { + String itemType = typeString.substring(0, equalLoc); + String itemNumString = typeString.substring(equalLoc + 1); + BigDecimal itemNumber; + if ("UNLIM".equals(itemNumString)) + { + limited = false; + itemNumber = Capacity.UNLIMITED; + } + else + { + try + { + itemNumber = BigDecimalHelper + .trimBigDecimal(new BigDecimal(itemNumString)); + } + catch (NumberFormatException ex) + { + Logging.addParseMessage(Logging.LST_ERROR, + "Item Number for " + itemType + + " must be 'UNLIM' or a number > 0: " + + itemNumString); + return false; + } + if (BigDecimal.ZERO.compareTo(itemNumber) >= 0) + { + Logging.addParseMessage(Logging.LST_ERROR, + "Cannot have negative quantity of " + itemType + + ": " + value); + return false; + } + } + if (limited) + { + limitedCapacity = limitedCapacity.add(itemNumber); + } + context.getObjectContext().addToList(eq, ListKey.CAPACITY, + new Capacity(itemType, itemNumber)); + } + } + + if (totalCap == null) + { + BigDecimal totalCapacity = limited ? limitedCapacity + : Capacity.UNLIMITED; + totalCap = Capacity.getTotalCapacity(totalCapacity); + } + + context.getObjectContext().put(eq, ObjectKey.TOTAL_CAPACITY, totalCap); return true; } + + public String[] unparse(LoadContext context, Equipment eq) + { + Changes<Capacity> changes = context.getObjectContext().getListChanges( + eq, ListKey.CAPACITY); + if (changes == null || changes.isEmpty()) + { + return null; + } + StringBuilder sb = new StringBuilder(); + + Boolean b = context.getObjectContext().getObject(eq, + ObjectKey.CONTAINER_CONSTANT_WEIGHT); + if (b != null && b.booleanValue()) + { + sb.append(Constants.CHAR_ASTERISK); + } + + Integer reducePercent = context.getObjectContext().getInteger(eq, + IntegerKey.CONTAINER_REDUCE_WEIGHT); + if (reducePercent != null) + { + sb.append(reducePercent).append(Constants.PERCENT); + } + + BigDecimal cap = context.getObjectContext().getObject(eq, + ObjectKey.CONTAINER_WEIGHT_CAPACITY); + if (cap == null) + { + // CONSIDER ERROR?? + return null; + } + if (Capacity.UNLIMITED.equals(cap)) + { + sb.append("UNLIM"); + } + else + { + sb.append(cap); + } + + Collection<Capacity> capacityList = changes.getAdded(); + if (capacityList.size() == 1) + { + for (Capacity c : capacityList) + { + if (c.getType() == null + && Capacity.UNLIMITED.equals(c.getCapacity())) + { + // Special Case: Nothing additional + return new String[] { sb.toString() }; + } + } + } + BigDecimal limitedCapacity = BigDecimal.ZERO; + boolean limited = true; + Capacity total = null; + for (Capacity c : capacityList) + { + String capType = c.getType(); + if (capType == null) + { + total = c; + } + else + { + sb.append(Constants.PIPE); + BigDecimal thisCap = c.getCapacity(); + sb.append(capType); + if (Capacity.UNLIMITED.equals(thisCap)) + { + limited = false; + } + else + { + if (limited) + { + limitedCapacity = limitedCapacity.add(thisCap); + } + sb.append(Constants.EQUALS).append(thisCap); + } + } + } + if (total == null) + { + // Error + return null; + } + if (!limitedCapacity.equals(total.getCapacity()) + && !Capacity.UNLIMITED.equals(total.getCapacity())) + { + // Need to write out total + sb.append("Total").append(Constants.EQUALS).append( + total.getCapacity()); + } + return new String[] { sb.toString() }; + } + + public Class<Equipment> getTokenClass() + { + return Equipment.class; + } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
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. |