From: <th...@us...> - 2008-08-06 02:15:06
|
Revision: 7367 http://pcgen.svn.sourceforge.net/pcgen/?rev=7367&view=rev Author: thpr Date: 2008-08-06 02:15:01 +0000 (Wed, 06 Aug 2008) Log Message: ----------- Template/Race FAVCLASS and Race MONSTERCLASS Token update Modified Paths: -------------- Trunk/pcgen/code/src/java/pcgen/cdom/base/CDOMObject.java Trunk/pcgen/code/src/java/pcgen/cdom/base/CDOMObjectUtilities.java Trunk/pcgen/code/src/java/pcgen/cdom/choiceset/ReferenceChoiceSet.java Trunk/pcgen/code/src/java/pcgen/cdom/choiceset/SpellReferenceChoiceSet.java Trunk/pcgen/code/src/java/pcgen/cdom/content/LevelCommandFactory.java Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ObjectKey.java Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/StringKey.java Trunk/pcgen/code/src/java/pcgen/cdom/reference/ReferenceUtilities.java Trunk/pcgen/code/src/java/pcgen/core/AbilityUtilities.java Trunk/pcgen/code/src/java/pcgen/core/BioSet.java Trunk/pcgen/code/src/java/pcgen/core/PCClass.java Trunk/pcgen/code/src/java/pcgen/core/PCTemplate.java Trunk/pcgen/code/src/java/pcgen/core/PObject.java Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java Trunk/pcgen/code/src/java/pcgen/core/Race.java Trunk/pcgen/code/src/java/pcgen/core/Skill.java Trunk/pcgen/code/src/java/pcgen/core/SubClass.java Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassAbilityPanel.java Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassLevelPanel.java Trunk/pcgen/code/src/java/pcgen/gui/editor/EditorMainForm.java Trunk/pcgen/code/src/java/pcgen/gui/editor/RaceBasePanel.java Trunk/pcgen/code/src/java/pcgen/gui/filter/FilterFactory.java Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoRaces.java Trunk/pcgen/code/src/java/pcgen/gui/tabs/InfoSummary.java Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Creator.java Trunk/pcgen/code/src/java/pcgen/io/PCGVer2Parser.java Trunk/pcgen/code/src/java/pcgen/persistence/lst/LstSystemLoader.java Trunk/pcgen/code/src/java/pcgen/persistence/lst/TokenStore.java Trunk/pcgen/code/src/java/pcgen/rules/context/AbstractReferenceContext.java Trunk/pcgen/code/src/java/pcgen/rules/context/ConsolidatedListCommitStrategy.java Trunk/pcgen/code/src/java/pcgen/rules/context/ListChanges.java Trunk/pcgen/code/src/java/pcgen/rules/context/ListContext.java Trunk/pcgen/code/src/java/pcgen/rules/persistence/TokenUtilities.java Trunk/pcgen/code/src/java/plugin/encounter/EncounterPlugin.java Trunk/pcgen/code/src/java/plugin/exporttokens/FavoredClassToken.java Trunk/pcgen/code/src/java/plugin/exporttokens/FavoredListToken.java Trunk/pcgen/code/src/java/plugin/exporttokens/RaceToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/KitLst.java Trunk/pcgen/code/src/java/plugin/lsttokens/QualifyToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/add/LanguageToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/add/TemplateToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/deity/DomainsToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/pcclass/KnownspellsToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/pcclass/SkilllistToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/pcclass/SpelllistToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/race/FavclassToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/race/MonsterclassToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/spell/ClassesToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/spell/DomainsToken.java Trunk/pcgen/code/src/java/plugin/lsttokens/template/FavoredclassToken.java Trunk/pcgen/code/src/test/pcgen/core/PCClassTest.java Trunk/pcgen/code/src/test/pcgen/core/PCTemplateTest.java Trunk/pcgen/code/src/test/pcgen/core/PlayerCharacterTest.java Trunk/pcgen/code/src/test/pcgen/core/prereq/PreHDTest.java Trunk/pcgen/code/src/test/pcgen/core/prereq/PreLevelTest.java Added Paths: ----------- Trunk/pcgen/code/src/java/pcgen/cdom/base/ChoiceActor.java Trunk/pcgen/code/src/java/pcgen/cdom/base/TransitionChoice.java Trunk/pcgen/code/src/java/pcgen/cdom/choiceset/ClassReferenceChoiceSet.java Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/SubClassCategory.java Removed Paths: ------------- Trunk/pcgen/code/src/java/pcgen/cdom/content/ChoiceActor.java Trunk/pcgen/code/src/java/pcgen/cdom/content/TransitionChoice.java Trunk/pcgen/code/src/java/pcgen/persistence/lst/PCTemplateLoader.java Trunk/pcgen/code/src/java/pcgen/persistence/lst/PCTemplateLstToken.java Modified: Trunk/pcgen/code/src/java/pcgen/cdom/base/CDOMObject.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/base/CDOMObject.java 2008-08-06 01:04:47 UTC (rev 7366) +++ Trunk/pcgen/code/src/java/pcgen/cdom/base/CDOMObject.java 2008-08-06 02:15:01 UTC (rev 7367) @@ -28,7 +28,6 @@ import pcgen.base.formula.Formula; import pcgen.base.util.DoubleKeyMapToList; -import pcgen.cdom.content.TransitionChoice; import pcgen.cdom.enumeration.FormulaKey; import pcgen.cdom.enumeration.IntegerKey; import pcgen.cdom.enumeration.ListKey; Modified: Trunk/pcgen/code/src/java/pcgen/cdom/base/CDOMObjectUtilities.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/base/CDOMObjectUtilities.java 2008-08-06 01:04:47 UTC (rev 7366) +++ Trunk/pcgen/code/src/java/pcgen/cdom/base/CDOMObjectUtilities.java 2008-08-06 02:15:01 UTC (rev 7367) @@ -18,7 +18,9 @@ package pcgen.cdom.base; import java.util.Collection; +import java.util.Comparator; + /** * CDOMObjectUtilities is a utility class designed to provide utility methods * when working with pcgen.cdom.base.CDOMObject Objects @@ -26,6 +28,16 @@ public final class CDOMObjectUtilities { + public static final Comparator<CDOMObject> CDOM_SORTER = + new Comparator<CDOMObject>() + { + + public int compare(CDOMObject arg0, CDOMObject arg1) + { + return compareKeys(arg0, arg1); + } + }; + private CDOMObjectUtilities() { //Utility class should not be constructed @@ -73,4 +85,31 @@ return result.toString(); } + public static int compareKeys(CDOMObject arg0, CDOMObject arg1) + { + String base = arg0.getKeyName(); + if (base == null) + { + if (arg1.getKeyName() == null) + { + return 0; + } + else + { + return -1; + } + } + else + { + if (arg1.getKeyName() == null) + { + return 1; + } + else + { + return base.compareTo(arg1.getKeyName()); + } + } + } + } Copied: Trunk/pcgen/code/src/java/pcgen/cdom/base/ChoiceActor.java (from rev 7353, Trunk/pcgen/code/src/java/pcgen/cdom/content/ChoiceActor.java) =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/base/ChoiceActor.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/cdom/base/ChoiceActor.java 2008-08-06 02:15:01 UTC (rev 7367) @@ -0,0 +1,8 @@ +package pcgen.cdom.base; + +import pcgen.core.PlayerCharacter; + +public interface ChoiceActor<T> +{ + public void applyChoice(T choice, PlayerCharacter pc); +} Copied: Trunk/pcgen/code/src/java/pcgen/cdom/base/TransitionChoice.java (from rev 7353, Trunk/pcgen/code/src/java/pcgen/cdom/content/TransitionChoice.java) =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/base/TransitionChoice.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/cdom/base/TransitionChoice.java 2008-08-06 02:15:01 UTC (rev 7367) @@ -0,0 +1,148 @@ +/* + * Copyright 2007, 2008 (C) Tom Parker <th...@us...> + * + * This library is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation; either version 2.1 of the License, or (at your option) + * any later version. + * + * This library is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + * details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +package pcgen.cdom.base; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Set; + +import pcgen.base.formula.Formula; +import pcgen.core.PlayerCharacter; +import pcgen.util.StringPClassUtil; +import pcgen.util.chooser.ChooserFactory; +import pcgen.util.chooser.ChooserInterface; + +/** + * This is a transitional class from PCGen 5.15+ to the final CDOM core. It is + * provided as convenience to hold a set of choices and the number of choices + * allowed, prior to final implementation of the new choice system + * + * @param <T> + */ +public class TransitionChoice<T> +{ + + private final ChoiceSet<? extends T> choices; + private final Formula choiceCount; + private String title; + private boolean required = true; + private ChoiceActor<T> choiceActor; + + public TransitionChoice(ChoiceSet<? extends T> cs, Formula count) + { + choices = cs; + choiceCount = count; + } + + public ChoiceSet<? extends T> getChoices() + { + return choices; + } + + public Formula getCount() + { + return choiceCount; + } + + @Override + public boolean equals(Object obj) + { + if (obj instanceof TransitionChoice) + { + TransitionChoice<?> other = (TransitionChoice<?>) obj; + return choiceCount.equals(other.choiceCount) + && choices.equals(other.choices); + } + return false; + } + + @Override + public int hashCode() + { + return choiceCount.hashCode() * 29 + choices.hashCode(); + } + + public Collection<? extends T> driveChoice(PlayerCharacter pc) + { + ChooserInterface c = ChooserFactory.getChooserInstance(); + int intValue = choiceCount.resolve(pc, "").intValue(); + c.setPoolFlag(required); + if (intValue == Integer.MAX_VALUE) + { + c.setPickAll(true); + } + else + { + c.setTotalChoicesAvail(intValue); + } + if (title == null) + { + title = + "Choose a " + + StringPClassUtil.getStringFor(choices + .getChoiceClass()); + } + c.setTitle(title); + Set<? extends T> set = choices.getSet(pc); + if (c.pickAll() || intValue == set.size()) + { + return set; + } + else + { + c.setAvailableList(new ArrayList<T>(set)); + c.setVisible(true); + return c.getSelectedList(); + } + } + + public void setTitle(String string) + { + title = string; + } + + public void setRequired(boolean b) + { + required = b; + } + + public void setChoiceActor(ChoiceActor<T> ca) + { + choiceActor = ca; + } + + public void act(Collection<? extends T> driveChoice, PlayerCharacter apc) + { + if (choiceActor == null) + { + throw new IllegalStateException( + "Cannot act without a defined ChoiceActor"); + } + for (T choice : driveChoice) + { + choiceActor.applyChoice(choice, apc); + apc.addAssociation(this, choice); + } + } + + public T castChoice(Object o) + { + return (T) o; + } + +} Added: Trunk/pcgen/code/src/java/pcgen/cdom/choiceset/ClassReferenceChoiceSet.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/choiceset/ClassReferenceChoiceSet.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/cdom/choiceset/ClassReferenceChoiceSet.java 2008-08-06 02:15:01 UTC (rev 7367) @@ -0,0 +1,180 @@ +/* + * Copyright 2006 (C) Tom Parker <th...@us...> + * + * This library is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation; either version 2.1 of the License, or (at your option) + * any later version. + * + * This library is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + * details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, write to the Free Software Foundation, Inc., + * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Created on October 29, 2006. + * + * Current Ver: $Revision: 1111 $ Last Editor: $Author: boomer70 $ Last Edited: + * $Date: 2006-06-22 21:22:44 -0400 (Thu, 22 Jun 2006) $ + */ +package pcgen.cdom.choiceset; + +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; +import java.util.TreeSet; + +import pcgen.cdom.base.CDOMReference; +import pcgen.cdom.base.Constants; +import pcgen.cdom.base.PrimitiveChoiceSet; +import pcgen.cdom.reference.ReferenceUtilities; +import pcgen.core.PCClass; +import pcgen.core.PlayerCharacter; + +/** + * A ClassReferenceChoiceSet contains references to PCClass Objects. + * + * The contents of a ClassReferenceChoiceSet is defined at construction of the + * ClassReferenceChoiceSet. The contents of a ClassReferenceChoiceSet is fixed, + * and will not vary by the PlayerCharacter used to resolve the + * ClassReferenceChoiceSet. + * + * @param <T> + * The class of object this ReferenceChoiceSet contains. + */ +public class ClassReferenceChoiceSet implements PrimitiveChoiceSet<PCClass> +{ + + /** + * The underlying Set of CDOMReferences that contain the objects in this + * ClassReferenceChoiceSet + */ + private final Set<CDOMReference<? extends PCClass>> set; + + /** + * Constructs a new ClassReferenceChoiceSet which contains the Set of + * objects contained within the given CDOMReferences. The CDOMReferences do + * not need to be resolved at the time of construction of the + * ClassReferenceChoiceSet. + * + * This constructor is reference-semantic, meaning that ownership of the + * Collection provided to this constructor is not transferred. Modification + * of the Collection (after this constructor completes) does not result in + * modifying the ClassReferenceChoiceSet, and the ClassReferenceChoiceSet + * will not modify the given Collection. + * + * @param col + * A Collection of CDOMReferences which define the Set of objects + * contained within the ClassReferenceChoiceSet + * @throws IllegalArgumentException + * if the given Collection is null or empty. + */ + public ClassReferenceChoiceSet( + Collection<? extends CDOMReference<? extends PCClass>> col) + { + super(); + if (col == null) + { + throw new IllegalArgumentException( + "Choice Collection cannot be null"); + } + if (col.isEmpty()) + { + throw new IllegalArgumentException( + "Choice Collection cannot be empty"); + } + set = new HashSet<CDOMReference<? extends PCClass>>(col); + } + + /** + * Returns a representation of this ClassReferenceChoiceSet, suitable for + * storing in an LST file. + */ + public String getLSTformat() + { + Set<CDOMReference<?>> sortedSet = new TreeSet<CDOMReference<?>>( + ReferenceUtilities.REFERENCE_SORTER); + sortedSet.addAll(set); + return ReferenceUtilities.joinLstFormat(sortedSet, Constants.COMMA); + } + + /** + * The class of object this ClassReferenceChoiceSet contains. + * + * The behavior of this method is undefined if the CDOMReference objects + * provided during the construction of this ClassReferenceChoiceSet are not + * yet resolved. + * + * @return The class of object this ClassReferenceChoiceSet contains. + */ + public Class<PCClass> getChoiceClass() + { + return PCClass.class; + } + + /** + * Returns a Set containing the Objects which this ClassReferenceChoiceSet + * contains. The contents of a ClassReferenceChoiceSet is fixed, and will + * not vary by the PlayerCharacter used to resolve the + * ClassReferenceChoiceSet. + * + * The behavior of this method is undefined if the CDOMReference objects + * provided during the construction of this ClassReferenceChoiceSet are not + * yet resolved. + * + * This method is reference-semantic, meaning that ownership of the Set + * returned by this method will be transferred to the calling object. + * Modification of the returned Set should not result in modifying the + * ClassReferenceChoiceSet, and modifying the ClassReferenceChoiceSet after + * the Set is returned should not modify the Set. + * + * @return A Set containing the Objects which this ClassReferenceChoiceSet + * contains. + */ + public Set<PCClass> getSet(PlayerCharacter pc) + { + Set<PCClass> returnSet = new HashSet<PCClass>(); + for (CDOMReference<? extends PCClass> ref : set) + { + returnSet.addAll(ref.getContainedObjects()); + } + return returnSet; + } + + /** + * Returns the consistent-with-equals hashCode for this + * ClassReferenceChoiceSet + * + * @see java.lang.Object#hashCode() + */ + @Override + public int hashCode() + { + return set.size(); + } + + /** + * Returns true if this ClassReferenceChoiceSet is equal to the given + * Object. Equality is defined as being another ClassReferenceChoiceSet + * object with equal underlying contents. + * + * @see java.lang.Object#equals(java.lang.Object) + */ + @Override + public boolean equals(Object o) + { + if (o == this) + { + return true; + } + if (o instanceof ClassReferenceChoiceSet) + { + ClassReferenceChoiceSet other = (ClassReferenceChoiceSet) o; + return set.equals(other.set); + } + return false; + } +} Modified: Trunk/pcgen/code/src/java/pcgen/cdom/choiceset/ReferenceChoiceSet.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/choiceset/ReferenceChoiceSet.java 2008-08-06 01:04:47 UTC (rev 7366) +++ Trunk/pcgen/code/src/java/pcgen/cdom/choiceset/ReferenceChoiceSet.java 2008-08-06 02:15:01 UTC (rev 7367) @@ -33,7 +33,6 @@ import pcgen.cdom.base.PrimitiveChoiceSet; import pcgen.cdom.reference.ReferenceUtilities; import pcgen.core.PlayerCharacter; -import pcgen.rules.persistence.TokenUtilities; /** * A ReferenceChoiceSet contains references to Objects. Often these are @@ -96,7 +95,7 @@ public String getLSTformat() { Set<CDOMReference<?>> sortedSet = new TreeSet<CDOMReference<?>>( - TokenUtilities.REFERENCE_SORTER); + ReferenceUtilities.REFERENCE_SORTER); sortedSet.addAll(set); return ReferenceUtilities.joinLstFormat(sortedSet, Constants.COMMA); } Modified: Trunk/pcgen/code/src/java/pcgen/cdom/choiceset/SpellReferenceChoiceSet.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/choiceset/SpellReferenceChoiceSet.java 2008-08-06 01:04:47 UTC (rev 7366) +++ Trunk/pcgen/code/src/java/pcgen/cdom/choiceset/SpellReferenceChoiceSet.java 2008-08-06 02:15:01 UTC (rev 7367) @@ -29,9 +29,9 @@ import pcgen.cdom.base.Constants; import pcgen.cdom.base.PrimitiveChoiceSet; import pcgen.cdom.list.DomainSpellList; +import pcgen.cdom.reference.ReferenceUtilities; import pcgen.core.PlayerCharacter; import pcgen.core.spell.Spell; -import pcgen.rules.persistence.TokenUtilities; /** * A SpellReferenceChoiceSet contains references to CDOMListObjects. This is a @@ -93,7 +93,7 @@ public String getLSTformat() { Set<CDOMReference<?>> sortedSet = new TreeSet<CDOMReference<?>>( - TokenUtilities.REFERENCE_SORTER); + ReferenceUtilities.REFERENCE_SORTER); sortedSet.addAll(set); StringBuilder sb = new StringBuilder(); List<CDOMReference<?>> domainList = new ArrayList<CDOMReference<?>>(); Deleted: Trunk/pcgen/code/src/java/pcgen/cdom/content/ChoiceActor.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/content/ChoiceActor.java 2008-08-06 01:04:47 UTC (rev 7366) +++ Trunk/pcgen/code/src/java/pcgen/cdom/content/ChoiceActor.java 2008-08-06 02:15:01 UTC (rev 7367) @@ -1,8 +0,0 @@ -package pcgen.cdom.content; - -import pcgen.core.PlayerCharacter; - -public interface ChoiceActor<T> -{ - public void applyChoice(T choice, PlayerCharacter pc); -} Modified: Trunk/pcgen/code/src/java/pcgen/cdom/content/LevelCommandFactory.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/content/LevelCommandFactory.java 2008-08-06 01:04:47 UTC (rev 7366) +++ Trunk/pcgen/code/src/java/pcgen/cdom/content/LevelCommandFactory.java 2008-08-06 02:15:01 UTC (rev 7367) @@ -21,10 +21,10 @@ import pcgen.cdom.base.ConcretePrereqObject; import pcgen.cdom.base.Constants; import pcgen.cdom.reference.CDOMSingleRef; +import pcgen.cdom.reference.ReferenceUtilities; import pcgen.core.PCClass; import pcgen.core.PlayerCharacter; import pcgen.core.SettingsHandler; -import pcgen.rules.persistence.TokenUtilities; /** * A LevelCommandFactory is used to identify a PCClass which is to be applied @@ -159,7 +159,7 @@ */ public int compareTo(LevelCommandFactory other) { - int i = TokenUtilities.REFERENCE_SORTER.compare(pcClass, other.pcClass); + int i = ReferenceUtilities.REFERENCE_SORTER.compare(pcClass, other.pcClass); if (i == 0) { if (levels.equals(other.levels)) Deleted: Trunk/pcgen/code/src/java/pcgen/cdom/content/TransitionChoice.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/content/TransitionChoice.java 2008-08-06 01:04:47 UTC (rev 7366) +++ Trunk/pcgen/code/src/java/pcgen/cdom/content/TransitionChoice.java 2008-08-06 02:15:01 UTC (rev 7367) @@ -1,149 +0,0 @@ -/* - * Copyright 2007, 2008 (C) Tom Parker <th...@us...> - * - * This library is free software; you can redistribute it and/or modify it under - * the terms of the GNU Lesser General Public License as published by the Free - * Software Foundation; either version 2.1 of the License, or (at your option) - * any later version. - * - * This library is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more - * details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this library; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package pcgen.cdom.content; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Set; - -import pcgen.base.formula.Formula; -import pcgen.cdom.base.ChoiceSet; -import pcgen.core.PlayerCharacter; -import pcgen.util.StringPClassUtil; -import pcgen.util.chooser.ChooserFactory; -import pcgen.util.chooser.ChooserInterface; - -/** - * This is a transitional class from PCGen 5.15+ to the final CDOM core. It is - * provided as convenience to hold a set of choices and the number of choices - * allowed, prior to final implementation of the new choice system - * - * @param <T> - */ -public class TransitionChoice<T> -{ - - private final ChoiceSet<? extends T> choices; - private final Formula choiceCount; - private String title; - private boolean required = true; - private ChoiceActor<T> choiceActor; - - public TransitionChoice(ChoiceSet<? extends T> cs, Formula count) - { - choices = cs; - choiceCount = count; - } - - public ChoiceSet<? extends T> getChoices() - { - return choices; - } - - public Formula getCount() - { - return choiceCount; - } - - @Override - public boolean equals(Object obj) - { - if (obj instanceof TransitionChoice) - { - TransitionChoice<?> other = (TransitionChoice<?>) obj; - return choiceCount.equals(other.choiceCount) - && choices.equals(other.choices); - } - return false; - } - - @Override - public int hashCode() - { - return choiceCount.hashCode() * 29 + choices.hashCode(); - } - - public Collection<? extends T> driveChoice(PlayerCharacter pc) - { - ChooserInterface c = ChooserFactory.getChooserInstance(); - int intValue = choiceCount.resolve(pc, "").intValue(); - c.setPoolFlag(required); - if (intValue == Integer.MAX_VALUE) - { - c.setPickAll(true); - } - else - { - c.setTotalChoicesAvail(intValue); - } - if (title == null) - { - title = - "Choose a " - + StringPClassUtil.getStringFor(choices - .getChoiceClass()); - } - c.setTitle(title); - Set<? extends T> set = choices.getSet(pc); - if (c.pickAll() || intValue == set.size()) - { - return set; - } - else - { - c.setAvailableList(new ArrayList<T>(set)); - c.setVisible(true); - return c.getSelectedList(); - } - } - - public void setTitle(String string) - { - title = string; - } - - public void setRequired(boolean b) - { - required = b; - } - - public void setChoiceActor(ChoiceActor<T> ca) - { - choiceActor = ca; - } - - public void act(Collection<? extends T> driveChoice, PlayerCharacter apc) - { - if (choiceActor == null) - { - throw new IllegalStateException( - "Cannot act without a defined ChoiceActor"); - } - for (T choice : driveChoice) - { - choiceActor.applyChoice(choice, apc); - apc.addAssociation(this, choice); - } - } - - public T castChoice(Object o) - { - return (T) o; - } - -} Modified: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java 2008-08-06 01:04:47 UTC (rev 7366) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ListKey.java 2008-08-06 02:15:01 UTC (rev 7367) @@ -27,9 +27,9 @@ import pcgen.base.formula.Formula; import pcgen.cdom.base.CDOMReference; +import pcgen.cdom.base.TransitionChoice; import pcgen.cdom.content.KnownSpellIdentifier; import pcgen.cdom.content.LevelCommandFactory; -import pcgen.cdom.content.TransitionChoice; import pcgen.cdom.helper.AttackCycle; import pcgen.cdom.helper.PointCost; import pcgen.cdom.helper.Qualifier; @@ -47,6 +47,7 @@ import pcgen.core.EquipmentModifier; import pcgen.core.Kit; import pcgen.core.Language; +import pcgen.core.PCClass; import pcgen.core.PCStat; import pcgen.core.Movement; import pcgen.core.PCTemplate; @@ -207,6 +208,7 @@ public static final ListKey<CDOMReference<PCTemplate>> REMOVE_TEMPLATES = new ListKey<CDOMReference<PCTemplate>>(); public static final ListKey<Vision> VISION_CACHE = new ListKey<Vision>(); public static final ListKey<TransitionChoice<?>> ADD = new ListKey<TransitionChoice<?>>(); + public static final ListKey<CDOMReference<? extends PCClass>> FAVORED_CLASS = new ListKey<CDOMReference<? extends PCClass>>(); public static final ListKey<Qualifier> QUALIFY = new ListKey<Qualifier>(); public static final ListKey<DamageReduction> DAMAGE_REDUCTION = new ListKey<DamageReduction>(); public static final ListKey<PCStat> UNLOCKED_STATS = new ListKey<PCStat>(); Modified: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ObjectKey.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ObjectKey.java 2008-08-06 01:04:47 UTC (rev 7366) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/ObjectKey.java 2008-08-06 02:15:01 UTC (rev 7367) @@ -33,10 +33,11 @@ import pcgen.base.util.CaseInsensitiveMap; import pcgen.cdom.base.CDOMListObject; import pcgen.cdom.base.Category; +import pcgen.cdom.base.TransitionChoice; import pcgen.cdom.content.ChallengeRating; import pcgen.cdom.content.HitDie; +import pcgen.cdom.content.LevelCommandFactory; import pcgen.cdom.content.Modifier; -import pcgen.cdom.content.TransitionChoice; import pcgen.cdom.list.ClassSkillList; import pcgen.cdom.list.ClassSpellList; import pcgen.cdom.list.DomainSpellList; @@ -45,6 +46,7 @@ import pcgen.core.ArmorProf; import pcgen.core.Equipment; import pcgen.core.PCAlignment; +import pcgen.core.PCClass; import pcgen.core.PCStat; import pcgen.core.SettingsHandler; import pcgen.core.ShieldProf; @@ -202,6 +204,12 @@ public static final ObjectKey<Load> UNENCUMBERED_ARMOR = new ObjectKey<Load>(Load.LIGHT); + public static final ObjectKey<Boolean> ANY_FAVORED_CLASS = new ObjectKey<Boolean>(Boolean.FALSE); + + public static final ObjectKey<TransitionChoice<PCClass>> FAVCLASS_CHOICE = new ObjectKey<TransitionChoice<PCClass>>(null); + + public static final ObjectKey<LevelCommandFactory> MONSTER_CLASS = new ObjectKey<LevelCommandFactory>(null); + public static final ObjectKey<CDOMSingleRef<Equipment>> BASE_ITEM = new ObjectKey<CDOMSingleRef<Equipment>>(null); public static final ObjectKey<SizeAdjustment> BASESIZE; Modified: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/StringKey.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/StringKey.java 2008-08-06 01:04:47 UTC (rev 7366) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/StringKey.java 2008-08-06 02:15:01 UTC (rev 7367) @@ -33,5 +33,5 @@ */ public enum StringKey { - NAME, KEY_NAME, WORSHIPPERS, TITLE, HOLY_ITEM, MASTER_HP_FORMULA, MASTER_CHECK_FORMULA, MASTER_BAB_FORMULA, BIRTHPLACE, BIRTHDAY, CATEGORY, BOOK_TYPE, CHOICE_STRING, DESTINATION, PAGE_USAGE, MINDEVVER, MINVER, ADD, BIO, DESCRIPTION, GENRE, HELP, APPEARANCE, CATCH_PHRASE, OUTPUT_NAME, INFO_TEXT, CHOICE_TO_MODIFY, PUB_NAME_LONG, COST, PUB_NAME_SHORT, CURRENT_EQUIP_SET_NAME, REGION, PUB_NAME_WEB, SETTING, SR_FORMULA, TEMP_DESCRIPTION, TRAIT2, TRAIT1, SKIN_COLOR, HAIR_COLOR, RACIAL_FAVORED_CLASS, SUB_REGION, SPEECH_TENDENCY, PHOBIAS, INTERESTS, RESIDENCE, SPELLBOOK_AUTO_ADD_KNOWN, PLAYERS_NAME, HANDED, HAIR_STYLE, PORTRAIT_PATH, EYE_COLOR, LOCATION, FILE_NAME, ABB, TARGET_AREA, NAME_TEXT, DAMAGE, DAMAGE_OVERRIDE, RATE_OF_FIRE, FUMBLE_RANGE, LISTTYPE, SPELLTYPE + NAME, KEY_NAME, WORSHIPPERS, TITLE, HOLY_ITEM, MASTER_HP_FORMULA, MASTER_CHECK_FORMULA, MASTER_BAB_FORMULA, BIRTHPLACE, BIRTHDAY, CATEGORY, BOOK_TYPE, CHOICE_STRING, DESTINATION, PAGE_USAGE, MINDEVVER, MINVER, ADD, BIO, DESCRIPTION, GENRE, HELP, APPEARANCE, CATCH_PHRASE, OUTPUT_NAME, INFO_TEXT, CHOICE_TO_MODIFY, PUB_NAME_LONG, COST, PUB_NAME_SHORT, CURRENT_EQUIP_SET_NAME, REGION, PUB_NAME_WEB, SETTING, SR_FORMULA, TEMP_DESCRIPTION, TRAIT2, TRAIT1, SKIN_COLOR, HAIR_COLOR, SUB_REGION, SPEECH_TENDENCY, PHOBIAS, INTERESTS, RESIDENCE, SPELLBOOK_AUTO_ADD_KNOWN, PLAYERS_NAME, HANDED, HAIR_STYLE, PORTRAIT_PATH, EYE_COLOR, LOCATION, FILE_NAME, ABB, TARGET_AREA, NAME_TEXT, DAMAGE, DAMAGE_OVERRIDE, RATE_OF_FIRE, FUMBLE_RANGE, LISTTYPE, SPELLTYPE } Added: Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/SubClassCategory.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/SubClassCategory.java (rev 0) +++ Trunk/pcgen/code/src/java/pcgen/cdom/enumeration/SubClassCategory.java 2008-08-06 02:15:01 UTC (rev 7367) @@ -0,0 +1,185 @@ +/* + * Copyright (c) 2006 Tom Parker <th...@us...> + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU Lesser General Public License as published by the Free + * Software Foundation; either version 2.1 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more + * details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ +package pcgen.cdom.enumeration; + +import java.util.Collection; +import java.util.Collections; + +import pcgen.base.enumeration.TypeSafeConstant; +import pcgen.base.util.CaseInsensitiveMap; +import pcgen.cdom.base.Category; +import pcgen.core.SubClass; + +/** + * @author Tom Parker (thpr [at] yahoo.com) + * + * This Class is a Type Safe Constant. + */ +public final class SubClassCategory implements TypeSafeConstant, Category<SubClass> +{ + + /** + * This Map contains the mappings from Strings to the Type Safe Constant + */ + private static CaseInsensitiveMap<SubClassCategory> typeMap; + + /** + * This is used to provide a unique ordinal to each constant in this class + */ + private static int ordinalCount = 0; + + /** + * The name of this Constant + */ + private final String fieldName; + + /** + * The ordinal of this Constant + */ + private final transient int ordinal; + + private boolean defined = false; + + private SubClassCategory(String name) + { + ordinal = ordinalCount++; + fieldName = name; + } + + /** + * Converts this Constant to a String (returns the name of this Constant) + * + * @return The string representatin (name) of this Constant + */ + @Override + public String toString() + { + return fieldName; + } + + /** + * Gets the ordinal of this Constant + */ + public int getOrdinal() + { + return ordinal; + } + + public void define() + { + defined = true; + } + + public boolean isDefined() + { + return defined; + } + + /** + * Returns the constant for the given String (the search for the constant is + * case insensitive). If the constant does not already exist, a new Constant + * is created with the given String as the name of the Constant. + * + * @param s + * The name of the constant to be returned + * @return The Constant for the given name + */ + public static SubClassCategory getConstant(String s) + { + if (typeMap == null) + { + typeMap = new CaseInsensitiveMap<SubClassCategory>(); + } + String lookup = s.replace('_', ' '); + SubClassCategory o = typeMap.get(lookup); + if (o == null) + { + /* + * TODO FIXME Should .,| or other stuff be banned here? (probably) + */ + if (s.length() == 0) + { + throw new IllegalArgumentException( + "Type Name cannot be zero length"); + } + o = new SubClassCategory(lookup); + typeMap.put(lookup, o); + } + return o; + } + + /** + * Returns the constant for the given String (the search for the constant is + * case insensitive). If the constant does not already exist, an + * IllegalArgumentException is thrown. + * + * @param s + * The name of the constant to be returned + * @return The Constant for the given name + */ + public static SubClassCategory valueOf(String s) + { + if (typeMap == null) + { + typeMap = new CaseInsensitiveMap<SubClassCategory>(); + } + SubClassCategory o = typeMap.get(s); + if (o == null) + { + throw new IllegalArgumentException(s); + } + return o; + } + + /** + * Returns a Collection of all of the Constants in this Class. + * + * This collection maintains a reference to the Constants in this Class, so + * if a new Constant is created, the Collection returned by this method will + * be modified. (Beware of ConcurrentModificationExceptions) + * + * @return a Collection of all of the Constants in this Class. + */ + public static Collection<SubClassCategory> getAllConstants() + { + if (typeMap == null) + { + return null; + } + return Collections.unmodifiableCollection(typeMap.values()); + } + + /** + * Clears all of the Constants in this Class (forgetting the mapping from + * the String to the Constant). + */ + /* + * CONSIDER Need to consider the ramifications of this on TypeSafeMap, since + * this does not (and really cannot) reset the ordinal count... Does this + * method need to be renamed, such that it is clearConstantMap? - Tom + * Parker, Feb 28, 2007 + */ + public static void clearConstants() + { + if (typeMap != null) + { + typeMap.clear(); + } + } + +} Modified: Trunk/pcgen/code/src/java/pcgen/cdom/reference/ReferenceUtilities.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/cdom/reference/ReferenceUtilities.java 2008-08-06 01:04:47 UTC (rev 7366) +++ Trunk/pcgen/code/src/java/pcgen/cdom/reference/ReferenceUtilities.java 2008-08-06 02:15:01 UTC (rev 7367) @@ -18,6 +18,7 @@ package pcgen.cdom.reference; import java.util.Collection; +import java.util.Comparator; import java.util.Set; import java.util.TreeSet; @@ -32,6 +33,15 @@ public final class ReferenceUtilities { + public static final Comparator<CDOMReference<?>> REFERENCE_SORTER = new Comparator<CDOMReference<?>>() + { + + public int compare(CDOMReference<?> arg0, CDOMReference<?> arg1) + { + return compareRefs(arg0, arg1); + } + }; + private ReferenceUtilities() { // Cannot construct utility class @@ -121,4 +131,21 @@ return StringUtil.join(resultSet, separator); } + + public static int compareRefs(CDOMReference<?> arg0, CDOMReference<?> arg1) + { + if (arg0 instanceof CDOMSingleRef) + { + if (!(arg1 instanceof CDOMSingleRef)) + { + return -1; + } + return arg0.getName().compareTo(arg1.getName()); + } + if (arg1 instanceof CDOMSingleRef) + { + return 1; + } + return arg0.getName().compareTo(arg1.getName()); + } } Modified: Trunk/pcgen/code/src/java/pcgen/core/AbilityUtilities.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/AbilityUtilities.java 2008-08-06 01:04:47 UTC (rev 7366) +++ Trunk/pcgen/code/src/java/pcgen/core/AbilityUtilities.java 2008-08-06 02:15:01 UTC (rev 7367) @@ -24,7 +24,7 @@ package pcgen.core; import pcgen.cdom.base.CDOMReference; -import pcgen.cdom.content.TransitionChoice; +import pcgen.cdom.base.TransitionChoice; import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; import pcgen.core.pclevelinfo.PCLevelInfo; Modified: Trunk/pcgen/code/src/java/pcgen/core/BioSet.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/BioSet.java 2008-08-06 01:04:47 UTC (rev 7366) +++ Trunk/pcgen/code/src/java/pcgen/core/BioSet.java 2008-08-06 02:15:01 UTC (rev 7367) @@ -26,7 +26,7 @@ package pcgen.core; import pcgen.cdom.base.Constants; -import pcgen.cdom.content.TransitionChoice; +import pcgen.cdom.base.TransitionChoice; import pcgen.cdom.enumeration.ListKey; import pcgen.core.bonus.Bonus; import pcgen.core.bonus.BonusObj; Modified: Trunk/pcgen/code/src/java/pcgen/core/PCClass.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-08-06 01:04:47 UTC (rev 7366) +++ Trunk/pcgen/code/src/java/pcgen/core/PCClass.java 2008-08-06 02:15:01 UTC (rev 7367) @@ -45,10 +45,11 @@ import pcgen.cdom.base.CDOMReference; import pcgen.cdom.base.Constants; import pcgen.cdom.base.FormulaFactory; +import pcgen.cdom.base.TransitionChoice; import pcgen.cdom.content.HitDie; import pcgen.cdom.content.KnownSpellIdentifier; +import pcgen.cdom.content.LevelCommandFactory; import pcgen.cdom.content.Modifier; -import pcgen.cdom.content.TransitionChoice; import pcgen.cdom.enumeration.FormulaKey; import pcgen.cdom.enumeration.IntegerKey; import pcgen.cdom.enumeration.ListKey; @@ -1762,10 +1763,6 @@ { if (level > curLevel || aPC.isImporting()) { - final boolean isMonsterClass = - aPC.getRace().getMonsterClass() != null - && aPC.getRace().getMonsterClass() - .equalsIgnoreCase(this.getKeyName()); Integer mLevPerFeat = get(IntegerKey.LEVELS_PER_FEAT); int startLevel; int rangeLevel; @@ -3752,8 +3749,15 @@ // 4 levels of Giant, so it does not get a stat increase at // 4th level because that is already taken into account in // its racial stat modifiers, but it will get one at 8th - if (total <= aPC.getRace().getMonsterClassLevels()) + LevelCommandFactory lcf = aPC.getRace().get(ObjectKey.MONSTER_CLASS); + int monLevels = 0; + if (lcf != null) { + monLevels = lcf.getLevelCount().resolve(aPC, "").intValue(); + } + + if (total <= monLevels) + { processBonusStats = false; } } @@ -5556,4 +5560,9 @@ return spellCache != null; } + public String getFullKey() + { + return getKeyName(); + } + } Modified: Trunk/pcgen/code/src/java/pcgen/core/PCTemplate.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PCTemplate.java 2008-08-06 01:04:47 UTC (rev 7366) +++ Trunk/pcgen/code/src/java/pcgen/core/PCTemplate.java 2008-08-06 02:15:01 UTC (rev 7367) @@ -52,8 +52,6 @@ // Static properties // ///////////////////////////////////////////////////////////////////// - private String favoredClass = ""; - /** * Get the total adjustment to Challenge rating of a character at a given * level (Class and Hit Dice). This will include the absolute adjustment @@ -101,30 +99,6 @@ } /** - * Set the name of a favoured class to add to the Character this Template is - * applied to - * - * @param newClass - * the name of the class - */ - public void setFavoredClass(final String newClass) - { - favoredClass = newClass; - } - - /** - * Get a string that is the name of a single favoured class to be added to - * the character this Template is applied to. Each Template can only add a - * single favoured class. - * - * @return the name of the favoured class to add - */ - public String getFavoredClass() - { - return favoredClass; - } - - /** * Produce a tailored PCC output, used for saving custom templates. * * @return PCC Text @@ -145,11 +119,6 @@ txt.append("\tCHOOSE:LANGAUTO:").append(getChooseLanguageAutos()); } - if ((favoredClass != null) && (favoredClass.length() > 0)) - { - txt.append("\tFAVOREDCLASS:").append(favoredClass); - } - txt.append(super.getPCCText(false)); return txt.toString(); Modified: Trunk/pcgen/code/src/java/pcgen/core/PObject.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-08-06 01:04:47 UTC (rev 7366) +++ Trunk/pcgen/code/src/java/pcgen/core/PObject.java 2008-08-06 02:15:01 UTC (rev 7367) @@ -48,7 +48,7 @@ import pcgen.cdom.base.CDOMObject; import pcgen.cdom.base.CDOMReference; import pcgen.cdom.base.Constants; -import pcgen.cdom.content.TransitionChoice; +import pcgen.cdom.base.TransitionChoice; import pcgen.cdom.enumeration.IntegerKey; import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; Modified: Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-08-06 01:04:47 UTC (rev 7366) +++ Trunk/pcgen/code/src/java/pcgen/core/PlayerCharacter.java 2008-08-06 02:15:01 UTC (rev 7367) @@ -60,13 +60,14 @@ import pcgen.base.util.TreeMapToList; import pcgen.cdom.base.AssociatedPrereqObject; import pcgen.cdom.base.CDOMObject; +import pcgen.cdom.base.CDOMObjectUtilities; import pcgen.cdom.base.CDOMReference; import pcgen.cdom.base.Constants; +import pcgen.cdom.base.TransitionChoice; import pcgen.cdom.content.ChallengeRating; import pcgen.cdom.content.HitDie; import pcgen.cdom.content.LevelCommandFactory; import pcgen.cdom.content.Modifier; -import pcgen.cdom.content.TransitionChoice; import pcgen.cdom.enumeration.AssociationKey; import pcgen.cdom.enumeration.FormulaKey; import pcgen.cdom.enumeration.Gender; @@ -219,7 +220,7 @@ private Map<String, String> activeBonusMap = new TreeMap<String, String>(); private Race race = null; - private final SortedSet<String> favoredClasses = new TreeSet<String>(); + private PCClass selectedFavoredClass = null; private final StatList statList = new StatList(this); // List of Kit objects @@ -2268,21 +2269,17 @@ } } - // // Add additional HD if required - // newClass = Globals.getClassNamed(race.getType()); - PCClass aClass = - Globals.getContext().ref.silentlyGetConstructedCDOMObject(PCClass.class, race.getMonsterClass()); + LevelCommandFactory lcf = race.get(ObjectKey.MONSTER_CLASS); final int usedHD = followerMaster.getUsedHD(); addHD -= usedHD; // if ((newClass != null) && (addHD != 0)) - if ((aClass != null) && (addHD != 0)) + if ((lcf != null) && (addHD != 0)) { // set the new HD (but only do it once!) - // incrementClassLevel(addHD, newClass, true); - incrementClassLevel(addHD, aClass, true); + incrementClassLevel(addHD, lcf.getPCClass(), true); followerMaster.setUsedHD(addHD + usedHD); setDirty(true); } @@ -2308,7 +2305,7 @@ .intValue()) { // first zero current - fSkill.setZeroRanks(aClass, this); + fSkill.setZeroRanks(lcf == null ? null : lcf.getPCClass(), this); // We don't pass in a class here so that the real // skills can be distinguished from the ones from // the master. @@ -5766,21 +5763,37 @@ * * @author Thomas Behr 08-03-02 */ - public SortedSet<String> getFavoredClasses() + public SortedSet<PCClass> getFavoredClasses() { - final SortedSet<String> favored = new TreeSet<String>(favoredClasses); + /* + * CONSIDER Can this be cached? + */ + SortedSet<PCClass> favored = new TreeSet<PCClass>(CDOMObjectUtilities.CDOM_SORTER); + if (selectedFavoredClass != null) + { + favored.add(selectedFavoredClass); + } + + List<CDOMReference<? extends PCClass>> favClass = getRace().getListFor( + ListKey.FAVORED_CLASS); + if (favClass != null) + { + for (CDOMReference<? extends PCClass> ref : favClass) + { + favored.addAll(ref.getContainedObjects()); + } + } + for (PCTemplate template : templateList) { - StringTokenizer aTok = - new StringTokenizer(template.getFavoredClass(), "|"); - while (aTok.hasMoreTokens()) + List<CDOMReference<? extends PCClass>> fc = template + .getListFor(ListKey.FAVORED_CLASS); + if (fc != null) { - String favoredClass = aTok.nextToken(); - if ((favoredClass.length() != 0) - && !favored.contains(favoredClass)) + for (CDOMReference<? extends PCClass> ref : fc) { - favored.add(favoredClass); + favored.addAll(ref.getContainedObjects()); } } } @@ -5795,29 +5808,29 @@ */ public int getFavoredClassLevel() { + final SortedSet<PCClass> aList = getFavoredClasses(); int level = 0; - if (getRace().getFavoredClass().equalsIgnoreCase("ANY")) + int max = 0; + boolean isAny = getRace().getSafe(ObjectKey.ANY_FAVORED_CLASS); + + for (PCClass cl : aList) { for (PCClass pcClass : classList) { - if (pcClass.isType("Base")) + if (isAny) { - level = Math.max(level, pcClass.getLevel()); + max = Math.max(max, pcClass.getLevel()); } - } - } - else - { - for (PCClass pcClass : classList) - { - if (pcClass.getDisplayName().equals(getStringFor(StringKey.RACIAL_FAVORED_CLASS))) + if (cl.getKeyName().equals(pcClass.getKeyName())) { - level = pcClass.getLevel(); + level += pcClass.getLevel(); + break; } } } - return level; + return Math.max(level, max); } + /** * Calculates total bonus from Feats * @@ -6281,25 +6294,15 @@ cachedWeaponProfs = null; - if (stringChar.containsKey(StringKey.RACIAL_FAVORED_CLASS)) - { - removeFavoredClass(stringChar - .get(StringKey.RACIAL_FAVORED_CLASS)); - } - removeNaturalWeapons(race); removeTemplatesFrom(race); - if ((race.getMonsterClass() != null) - && (race.getMonsterClassLevels() != 0)) + selectedFavoredClass = null; + LevelCommandFactory lcf = race.get(ObjectKey.MONSTER_CLASS); + if (lcf != null) { - final PCClass mclass = - Globals.getContext().ref.silentlyGetConstructedCDOMObject(PCClass.class, race.getMonsterClass()); - - if (mclass != null) - { - incrementClassLevel(race.getMonsterClassLevels() * -1, + final PCClass mclass = lcf.getPCClass(); + incrementClassLevel(lcf.getLevelCount().resolve(this, "").intValue() * -1, mclass, true); - } } } @@ -6343,15 +6346,14 @@ new ArrayList<PCLevelInfo>(pcLevelInfo); pcLevelInfo.clear(); // Make sure monster classes are added first - if (!isImporting() && (race.getMonsterClass() != null) - && (race.getMonsterClassLevels() != 0)) + if (!isImporting()) { - final PCClass mclass = - Globals.getContext().ref.silentlyGetConstructedCDOMObject(PCClass.class, race.getMonsterClass()); - if (mclass != null) + LevelCommandFactory lcf = race.get(ObjectKey.MONSTER_CLASS); + if (lcf != null) { - incrementClassLevel(race.getMonsterClassLevels(), - mclass, true); + PCClass mclass = lcf.getPCClass(); + incrementClassLevel(lcf.getLevelCount().resolve(this, "") + .intValue(), mclass, true); } } @@ -6398,9 +6400,11 @@ addNaturalWeapons(race.getNaturalWeapons()); getAutoLanguages(); + if (!isImporting()) + { + selectRacialFavoredClass(); + } - getRacialFavoredClasses(isImporting()); - selectTemplates(race, isImporting()); // gets and adds templates race.chooseLanguageAutos(isImporting(), this); @@ -10278,8 +10282,8 @@ public double multiclassXPMultiplier() { final HashSet<PCClass> unfavoredClasses = new HashSet<PCClass>(); - final SortedSet<String> aList = getFavoredClasses(); - boolean hasAny = false; + final SortedSet<PCClass> aList = getFavoredClasses(); + boolean hasAny = hasAnyFavoredClass(); PCClass maxClass = null; PCClass secondClass = null; int maxClassLevel = 0; @@ -10287,57 +10291,20 @@ int xpPenalty = 0; double xpMultiplier = 1.0; - if (aList.contains("Any")) - { - hasAny = true; - } - for (PCClass pcClass : classList) { if (!pcClass.hasXPPenalty()) { continue; } - boolean found = false; - String classKey = pcClass.getKeyName(); String subClassKey = pcClass.getSubClassKey(); - if (subClassKey.equals("None")) + PCClass evalClass = pcClass; + if (!subClassKey.equals("None")) { - subClassKey = ""; + evalClass = pcClass.getSubClassKeyed(subClassKey); } - if (aList.contains(pcClass.getDisplayClassName())) + if (!aList.contains(evalClass)) { - //Old 5.x style match - found = true; - } - else if (aList.contains(pcClass.toString())) - { - //Old 5.x style match - found = true; - } - else - { - if (subClassKey.length() == 0) - { - if (aList.contains(classKey) - || aList.contains(classKey + "." + classKey)) - { - //6.x style match (key) - found = true; - } - } - else - { - //Sub Class or Subst Class - if (aList.contains(classKey + "." + subClassKey)) - { - //New 6.x style match - found = true; - } - } - } - if (!found) - { unfavoredClasses.add(pcClass); if (pcClass.getLevel() > maxClassLevel) @@ -10389,6 +10356,23 @@ return xpMultiplier; } + public boolean hasAnyFavoredClass() + { + if (getRace().getSafe(ObjectKey.ANY_FAVORED_CLASS)) + { + return true; + } + + for (PCTemplate template : templateList) + { + if (template.getSafe(ObjectKey.ANY_FAVORED_CLASS)) + { + return true; + } + } + return false; + } + public int naturalAC() { return calcACOfType("NaturalArmor"); @@ -11287,26 +11271,6 @@ return -1; } - public boolean addFavoredClass(final String aString) - { - if (aString.length() == 0) - { - return false; - } - StringTokenizer tok = new StringTokenizer(aString, Constants.PIPE); - while (tok.hasMoreTokens()) - { - String fc = tok.nextToken(); - if ((fc.length() != 0) && !favoredClasses.contains(fc)) - { - favoredClasses.add(fc); - setDirty(true); - } - } - - return true; - } - void addFreeLanguage(final Language aLang) { this.languages.add(aLang); @@ -11314,24 +11278,6 @@ setDirty(true); } - boolean removeFavoredClass(final String aString) - { - StringTokenizer tok = new StringTokenizer(aString, Constants.PIPE); - boolean mod = false; - while (tok.hasMoreTokens()) - { - String fc = tok.nextToken(); - if ((fc.length() != 0) && favoredClasses.contains(fc)) - { - favoredClasses.remove(fc); - setDirty(true); - mod = true; - } - } - - return mod; - } - void removeVariable(final String variableString) { for (Iterator<String> e = variableList.iterator(); e.hasNext();) @@ -12034,91 +11980,14 @@ return hasWeaponProfKeyed(wp.getKeyName()); } - private SortedSet<String> getRacialFavoredClasses(boolean isImporting) + private void selectRacialFavoredClass() { - String rfc = getRace().getFavoredClass(); - - if (!isImporting && rfc.startsWith("CHOOSE:")) + TransitionChoice<PCClass> fcChoice = getRace().get( + ObjectKey.FAVCLASS_CHOICE); + if (fcChoice != null) { - final List<PCClass> availableList = new ArrayList<PCClass>(); - - // WARNING: This is a temporary hack to make favored class selection work for - // the Pathfinder gamemode until the new FAVCLASS mechanism can be implemented - // and the race object can call choosers. - // - // FAVCLASS:CHOOSE:ALL creates a chooser of all visible non-monster base classes - // - if (rfc.equalsIgnoreCase("CHOOSE:ALL")) - { - for (PCClass pcClass : Globals.getContext().ref.getConstructedCDOMObjects(PCClass.class)) - { - if (pcClass.isType("Base") && !pcClass.isType("Monster") && - pcClass.getSafe(ObjectKey.VISIBILITY).equals(Visibility.DEFAULT)) - { - if (pcClass.hasSubClass()) - { - if (pcClass.getSafe(ObjectKey.ALLOWBASECLASS)) - { - availableList.add(pcClass); - } - for (PCClass subClass : pcClass.getSubClassList()) - { - availableList.add(subClass); - } - } - else - { - availableList.add(pcClass); - } - } - } - } - else - { - final StringTokenizer tok = - new StringTokenizer(rfc.substring(7), "|"); - while (tok.hasMoreTokens()) - { - String cl = tok.nextToken(); - int dotLoc = cl.indexOf("."); - if (dotLoc == -1) - { - //Base Class - final PCClass pcClass = - Globals.getContext().ref.silentlyGetConstructedCDOMObject(PCClass.class, cl); - if (pcClass != null) - { - availableList.add(pcClass); - } - } - else - { - //Sub Class - final PCClass pcClass = - Globals.getContext().ref.silentlyGetConstructedCDOMObject(PCClass.class, cl.substring(dotLoc + 1)); - if (pcClass != null) - { - availableList.add(pcClass); - } - } - } - } - final List<PCClass> selectedList = new ArrayList<PCClass>(1); - Globals.getChoiceFromList("Select favored class", availableList, - selectedList, 1, true); - rfc = selectedList.get(0).getKeyName(); + selectedFavoredClass = fcChoice.driveChoice(this).iterator().next(); } - - if (addFavoredClass(rfc)) - { - setStringFor(StringKey.RACIAL_FAVORED_CLASS, rfc); - } - else - { - removeStringFor(StringKey.RACIAL_FAVORED_CLASS); - } - - return favoredClasses; } private List<String> getSelectedArmorProfList() @@ -14846,7 +14715,7 @@ aClone.tempBonusList.addAll(tempBonusList); aClone.tempBonusFilters.addAll(tempBonusFilters); aClone.race = race; - aClone.favoredClasses.addAll(favoredClasses); + aClone.selectedFavoredClass = selectedFavoredClass; aClone.statList.clear(); for (PCStat stat : statList) @@ -18027,4 +17896,14 @@ return null; } + public PCClass getSelectedFavoredClass() + { + return selectedFavoredClass; + } + + public void setSelectedFavoredClass(PCClass sfc) + { + selectedFavoredClass = sfc; + } + } Modified: Trunk/pcgen/code/src/java/pcgen/core/Race.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Race.java 2008-08-06 01:04:47 UTC (rev 7366) +++ Trunk/pcgen/code/src/java/pcgen/core/Race.java 2008-08-06 02:15:01 UTC (rev 7367) @@ -44,9 +44,6 @@ */ public final class Race extends PObject { - private String favoredClass = Constants.EMPTY_STRING; - private String monsterClass = null; - private int monsterClassLevels = 0; /** * Checks if this race's advancement is limited. @@ -71,36 +68,6 @@ return new Point2D.Double(width.doubleValue(), height.doubleValue()); } - public void setFavoredClass(final String newClass) - { - favoredClass = newClass; - } - - public String getFavoredClass() - { - return favoredClass; - } - - public void setMonsterClass(final String string) - { - monsterClass = string; - } - - public String getMonsterClass() - { - return monsterClass; - } - - public void setMonsterClassLevels(final int num) - { - monsterClassLevels = num; - } - - public int getMonsterClassLevels() - { - return monsterClassLevels; - } - /** * Retrieve Unarmed Damage according to the Race * @return UDAM damage die (ie 1d3) @@ -138,11 +105,6 @@ this), "\t")); txt.append("\t"); - if ((favoredClass != null) && (favoredClass.length() > 0)) - { - txt.append("\tFAVCLASS:").append(favoredClass); - } - if ((getChooseLanguageAutos() != null) && (getChooseLanguageAutos().length() > 0)) { @@ -199,12 +161,6 @@ txt.append("\tNATURALATTACKS:").append(buffer.toString()); } - if (monsterClass != null && !"(None)".equals(monsterClass)) - { - txt.append("\tMONSTERCLASS:").append(monsterClass); - txt.append(':').append(monsterClassLevels); - } - return txt.toString(); } @@ -216,7 +172,6 @@ try { aRace = (Race) super.clone(); - aRace.favoredClass = favoredClass; } catch (CloneNotSupportedException exc) { Modified: Trunk/pcgen/code/src/java/pcgen/core/Skill.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/Skill.java 2008-08-06 01:04:47 UTC (rev 7366) +++ Trunk/pcgen/code/src/java/pcgen/core/Skill.java 2008-08-06 02:15:01 UTC (rev 7367) @@ -28,7 +28,7 @@ import java.util.StringTokenizer; import pcgen.cdom.base.Constants; -import pcgen.cdom.content.TransitionChoice; +import pcgen.cdom.base.TransitionChoice; import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; import pcgen.cdom.enumeration.SkillCost; Modified: Trunk/pcgen/code/src/java/pcgen/core/SubClass.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/core/SubClass.java 2008-08-06 01:04:47 UTC (rev 7366) +++ Trunk/pcgen/code/src/java/pcgen/core/SubClass.java 2008-08-06 02:15:01 UTC (rev 7367) @@ -25,6 +25,8 @@ import java.util.ArrayList; import java.util.List; +import pcgen.cdom.base.CategorizedCDOMObject; +import pcgen.cdom.base.Category; import pcgen.cdom.enumeration.IntegerKey; import pcgen.persistence.PersistenceLayerException; import pcgen.persistence.lst.CampaignSourceEntry; @@ -37,7 +39,7 @@ * @author Bryan McRoberts <mer...@us...> * @version $Revision$ */ -public final class SubClass extends PCClass +public final class SubClass extends PCClass implements CategorizedCDOMObject<SubClass> { private List<String> levelArray = null; private String choice = null; @@ -195,4 +197,24 @@ } return displayInfo.toString(); } + + private Category<SubClass> category; + + public Category<SubClass> getCDOMCategory() + { + return category; + } + + public void setCDOMCategory(Category<SubClass> cat) + { + category = cat; + } + + @Override + public String getFullKey() + { + return category.toString() + "." + super.getFullKey(); + } + + } Modified: Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassAbilityPanel.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassAbilityPanel.java 2008-08-06 01:04:47 UTC (rev 7366) +++ Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassAbilityPanel.java 2008-08-06 02:15:01 UTC (rev 7367) @@ -39,8 +39,8 @@ import pcgen.base.lang.StringUtil; import pcgen.cdom.base.CDOMListObject; import pcgen.cdom.base.Constants; +import pcgen.cdom.base.TransitionChoice; import pcgen.cdom.content.HitDie; -import pcgen.cdom.content.TransitionChoice; import pcgen.cdom.enumeration.IntegerKey; import pcgen.cdom.enumeration.ListKey; import pcgen.cdom.enumeration.ObjectKey; Modified: Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassLevelPanel.java =================================================================== --- Trunk/pcgen/code/src/java/pcgen/gui/editor/ClassLevelPanel.java 2008-08-06 01:04... [truncated message content] |