<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://159.203.101.162/w/index.php?action=history&amp;feed=atom&amp;title=Current_Architecture_Projects</id>
	<title>Current Architecture Projects - Revision history</title>
	<link rel="self" type="application/atom+xml" href="http://159.203.101.162/w/index.php?action=history&amp;feed=atom&amp;title=Current_Architecture_Projects"/>
	<link rel="alternate" type="text/html" href="http://159.203.101.162/w/index.php?title=Current_Architecture_Projects&amp;action=history"/>
	<updated>2026-05-17T14:23:23Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.31.1</generator>
	<entry>
		<id>http://159.203.101.162/w/index.php?title=Current_Architecture_Projects&amp;diff=3554&amp;oldid=prev</id>
		<title>Tom Parker at 20:07, 5 April 2014</title>
		<link rel="alternate" type="text/html" href="http://159.203.101.162/w/index.php?title=Current_Architecture_Projects&amp;diff=3554&amp;oldid=prev"/>
		<updated>2014-04-05T20:07:36Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;http://159.203.101.162/w/index.php?title=Current_Architecture_Projects&amp;amp;diff=3554&amp;amp;oldid=3529&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Tom Parker</name></author>
		
	</entry>
	<entry>
		<id>http://159.203.101.162/w/index.php?title=Current_Architecture_Projects&amp;diff=3529&amp;oldid=prev</id>
		<title>Tom Parker: Created page with &quot;{| align=&quot;right&quot;   | __TOC__   |}  PCGen Architecture work =6.3 Projects= ==Ability Cleanup== ===Ability Cloning Work=== ====Methods to Remove==== getAbilityNature ~ 10228 use...&quot;</title>
		<link rel="alternate" type="text/html" href="http://159.203.101.162/w/index.php?title=Current_Architecture_Projects&amp;diff=3529&amp;oldid=prev"/>
		<updated>2014-02-19T02:45:12Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;{| align=&amp;quot;right&amp;quot;   | __TOC__   |}  PCGen Architecture work =6.3 Projects= ==Ability Cleanup== ===Ability Cloning Work=== ====Methods to Remove==== getAbilityNature ~ 10228 use...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{| align=&amp;quot;right&amp;quot;&lt;br /&gt;
  | __TOC__&lt;br /&gt;
  |}&lt;br /&gt;
&lt;br /&gt;
PCGen Architecture work&lt;br /&gt;
=6.3 Projects=&lt;br /&gt;
==Ability Cleanup==&lt;br /&gt;
===Ability Cloning Work===&lt;br /&gt;
====Methods to Remove====&lt;br /&gt;
getAbilityNature ~ 10228 used by the facade (does the facade need to think of a CNAbility as the AbilityFacade?)&lt;br /&gt;
&lt;br /&gt;
getAbilityCategory ~ 10221 used by CATEGORY property in output tokens ... Why is .CATEGORY legal when it is ambiguous? see https://groups.yahoo.com/neo/groups/pcgen_experimental/conversations/messages/17128&lt;br /&gt;
&lt;br /&gt;
getFullAbilitySet ~ 9135 used by gui2 to initialize temp bonuses - why isn't getBonusContainer used?&lt;br /&gt;
&lt;br /&gt;
getAbilityList ~ 10207 (widely used at this point)&lt;br /&gt;
&lt;br /&gt;
getAggregateAbilityListNoDupes ~9024 used in getCDOMObjectList (then temp bonuses &amp;amp; spells)&lt;br /&gt;
&lt;br /&gt;
getAggregateAbilityList ~8995 used in getAbilityKeyed, and prerequisites ...Why can PREABILITY be used without a CATEGORY? What is the use case there? see https://groups.yahoo.com/neo/groups/pcgen_experimental/conversations/messages/17135&lt;br /&gt;
&lt;br /&gt;
getAggregateFeatList ~ 8974 used in bonuses, see TEST-97, see removeFeatAggregate.23264.TEST-97.patch&lt;br /&gt;
&lt;br /&gt;
hasVisibleAbility ~ 9062 used in AbilityCategory's isVisible ... Why are Ability Categories visible based on export and not display? That doesn't make a ton of sense - note to James&lt;br /&gt;
&lt;br /&gt;
getAllAbilities ~ 8507 used in PCG I/O&lt;br /&gt;
&lt;br /&gt;
getAbilityKeyed ~ 8924 used in PCG I/O&lt;br /&gt;
&lt;br /&gt;
getAutomaticAbilityKeyed ~ 8912 used in PCG I/O&lt;br /&gt;
&lt;br /&gt;
getSelecctedAbilities ~ 8966 needs replacement by CNAbility usage&lt;br /&gt;
&lt;br /&gt;
hasUserVirtualAbility ~10134 directly tied to cloning, will be removed as a side effect&lt;br /&gt;
&lt;br /&gt;
hasAbilityKeyed ~8907&lt;br /&gt;
&lt;br /&gt;
====Chooseable====&lt;br /&gt;
Race, Template, CNAbility, Skill, Domain become Chooseable objects&lt;br /&gt;
&lt;br /&gt;
Requires split of ADD/CHOOSE (complete)&lt;br /&gt;
&lt;br /&gt;
Requires Ability cloning cleanup on PlayerCharacter to be completed to the point where the getAssociation related methods can take a Chooseable&lt;br /&gt;
&lt;br /&gt;
getAssociation breakout cannot yet be completed, see: assocbreakout.23247.patch&lt;br /&gt;
&lt;br /&gt;
====Disambiguation====&lt;br /&gt;
Much of this (and how to replace methods) is based on whether items are called as a driver (what made the CHOOSE selection) or the target (the entire ability).&lt;br /&gt;
&lt;br /&gt;
A destructive exploration is here: assocbreakout.23247.patch&lt;br /&gt;
&lt;br /&gt;
The tracker: http://jira.pcgen.org/browse/CODE-2473&lt;br /&gt;
&lt;br /&gt;
http://jira.pcgen.org/browse/CODE-2465&lt;br /&gt;
&lt;br /&gt;
Eliminate NEEDS_SAVING for Virtual Abilities (store in a different facet if necessary)&lt;br /&gt;
&lt;br /&gt;
Facet Reduction: Abilities are currently handled in two facets and needs to be reduced to one&lt;br /&gt;
&lt;br /&gt;
==LST Editor==&lt;br /&gt;
===Weaknesses===&lt;br /&gt;
CATEGORY token is not editor friendly&lt;br /&gt;
&lt;br /&gt;
KEY token is not editor friendly&lt;br /&gt;
&lt;br /&gt;
PC Class Level repeatlevel does not properly parse for edit context&lt;br /&gt;
&lt;br /&gt;
Kits are not at all editor friendly&lt;br /&gt;
&lt;br /&gt;
Ability Category is not at all editor friendly&lt;br /&gt;
&lt;br /&gt;
==Core View==&lt;br /&gt;
Getting Abilities into core view requires the Ability Cleanup to be completed, since the system must have facets in the general form expected by perspectives&lt;br /&gt;
&lt;br /&gt;
===Get Skill Costs into Perspectives===&lt;br /&gt;
This has some unique challenges since it is not one object type. Once you pass through certain objects (looking backwards through the event tree) you end up with the PCClass disappearing or other things dropping out, so the Perspective somehow has to display that.&lt;br /&gt;
&lt;br /&gt;
See: skillcostmetafirstpass.23125.patch&lt;br /&gt;
&lt;br /&gt;
===Templates===&lt;br /&gt;
====Facet Flow====&lt;br /&gt;
TemplateInputFacet -&amp;gt; TemplateSelectionFacet -&amp;gt; UnconditionalTemplateFacet -&amp;gt; TemplateFacet&lt;br /&gt;
&lt;br /&gt;
TemplateSelectionFacet -&amp;gt; ChooseDriverFacet&lt;br /&gt;
&lt;br /&gt;
Input knows of a PCTemplate (and forces the CHOOSE if necessary), the TemplateSelectionFacet has a Selection, not just the PCTemplate, and then Unconditional and the model (TemplateFacet) hold just the PCTemplate&lt;br /&gt;
&lt;br /&gt;
Problem: The flow of facets changes object classes multiple times. This is going to be complicated to write into the coreview system and makes templates different from something like languages. I'd rather it be similar.&lt;br /&gt;
&lt;br /&gt;
Problem: TemplateInputFacet, in order to know which Selection&amp;lt;&amp;gt; is related to a Template (so the remove can be symmetric) is &amp;quot;fooling&amp;quot; the TemplateSelectionFacet to say that the source is the original PCTemplate. This allows add/remove symmetry, but the REAL source cannot be stored. Right now this is somewhat academic (as addTemplate() in PlayerCharacter never asks for the source), but in order to get things into the core view system, we want to know that source, so we want to enhance addTemplate on PlayerCharacter, and then store the real source later on (And be able to know that for any Template)&lt;br /&gt;
&lt;br /&gt;
====Required Flow====&lt;br /&gt;
TemplateInputFacet -&amp;gt; TemplateSelectionFacet -&amp;gt; ChooseDriverFacet&lt;br /&gt;
&lt;br /&gt;
TemplateInputFacet -&amp;gt; UnconditionalTemplateFacet -&amp;gt; TemplateFacet&lt;br /&gt;
&lt;br /&gt;
This way the unconditional flow matches how other objects will look, and the selection is solely responsible for the association on the Template. This also means TemplateSelectionFacet becomes an AbstractAssociationFacet (thus more aptly named for its behavior than an AbstractSourcedListFacet)&lt;br /&gt;
&lt;br /&gt;
In the future Domains and Races will change flow to match template&lt;br /&gt;
&lt;br /&gt;
====Conditional Templates====&lt;br /&gt;
These are done in a &amp;quot;pull&amp;quot; fashion, and we want to do more &amp;quot;push&amp;quot;. This work is in ConditionalTemplateFacet.&lt;br /&gt;
&lt;br /&gt;
Improve for consistency and for the Core View system. Right now we have visibility to conditionally granted but not conditional (but not granted).&lt;br /&gt;
&lt;br /&gt;
See: CODE-2442.condtemplatename.23102.patch&lt;br /&gt;
&lt;br /&gt;
See: template perspective.23082.patch&lt;br /&gt;
&lt;br /&gt;
http://jira.pcgen.org/browse/CODE-2006&lt;br /&gt;
&lt;br /&gt;
==Conditional Skills==&lt;br /&gt;
Need to get conditional skills broken out into separate objects. Proposal is here: https://groups.yahoo.com/neo/groups/pcgen_developers/conversations/messages/3773&lt;br /&gt;
&lt;br /&gt;
===Facet Structure===&lt;br /&gt;
NonExclusiveSkillsFacet: New, gives the non-exclusive skills into the CCSKILL list&lt;br /&gt;
&lt;br /&gt;
MasterToSkillCostFacet: imports the costs on the global objects when a PCClass is added to the PC&lt;br /&gt;
&lt;br /&gt;
SkillFacet (model) needs to meet the following criteria: Has a Rank, has a BONUS:SKILLRANK, non-exclusive and useuntrained&lt;br /&gt;
&lt;br /&gt;
BONUS:SKILLRANK is the main problem in that the current Bonus notification system is not aligned to do an entire bonus type. The current patch does not detect BONUS:SKILLRANK&lt;br /&gt;
&lt;br /&gt;
===SkillsFilter===&lt;br /&gt;
Remove SkillsFilter to be only for the UI and not impact the core&lt;br /&gt;
&lt;br /&gt;
Issue here is how to do &amp;quot;forward&amp;quot; processing for skills&lt;br /&gt;
&lt;br /&gt;
See: skill filter first pass.23117.patch&lt;br /&gt;
&lt;br /&gt;
===SkillsOutputOrder enum===&lt;br /&gt;
The switch where this is used makes it fragile if a new filter is added&lt;br /&gt;
&lt;br /&gt;
Should be made into an &amp;quot;intelligent&amp;quot; enumeration rather than just being values and those values used in a switch to get behavior&lt;br /&gt;
&lt;br /&gt;
See: skill filter step1.23121.patch&lt;br /&gt;
&lt;br /&gt;
==Facets==&lt;br /&gt;
===Facet work===&lt;br /&gt;
Bonus MONSKILLPOINTS/LOCKNUMBER needs a wrapping facet on adding a template&lt;br /&gt;
&lt;br /&gt;
Template Facet perspective needs source of the Template to be saved&lt;br /&gt;
&lt;br /&gt;
CompanionMods are still done in a loop in PlayerCharacter - need to put in a facet&lt;br /&gt;
&lt;br /&gt;
===Consistency===&lt;br /&gt;
http://jira.pcgen.org/browse/CODE-2442&lt;br /&gt;
&lt;br /&gt;
==BUGS: Potential==&lt;br /&gt;
It appears ADD/CHOOSE on MULT:YES abilities no longer respects choices that have already been made; introduced in 6.3&lt;br /&gt;
&lt;br /&gt;
MoveResult.getBaseMovement seems to be wrong as it is ignoring the load&lt;br /&gt;
&lt;br /&gt;
TemplateExportToken feats method seems to be buggy as it ignores the level and HD parameters&lt;br /&gt;
&lt;br /&gt;
PersistenceManager methods are called (including clear, and checking for presence of campaigns). These are no longer used by gui2 and should be removed, see: http://jira.pcgen.org/browse/CODE-1891 http://jira.pcgen.org/browse/CODE-1890 http://jira.pcgen.org/browse/CODE-1889&lt;br /&gt;
&lt;br /&gt;
Description seems to ignore the Feat name when %FEAT is used with a specific Feat ... Need to check if this feature is at all used or valuable. see https://groups.yahoo.com/neo/groups/pcgen_experimental/conversations/messages/17087&lt;br /&gt;
&lt;br /&gt;
Compatibility tokens may be spitting information into ParseResult even if they fail, which is bad as they should silently fail&lt;br /&gt;
&lt;br /&gt;
It looks like an item with BONUS that contains &amp;lt;this&amp;gt; will fail if it is subsequently .COPY='d&lt;br /&gt;
&lt;br /&gt;
===Class Loader===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SUBSTITUTIONCLASS:A&lt;br /&gt;
LEVEL:1&lt;br /&gt;
CLASS:B&lt;br /&gt;
LEVEL:2&lt;br /&gt;
CLASS:a.MOD&lt;br /&gt;
LEVEL:3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Does PCClass loader have an issue? with order of ops&lt;br /&gt;
&lt;br /&gt;
Where is LEVEL:3 placed? may be CLASS:B??&lt;br /&gt;
&lt;br /&gt;
We need a complete test pass to determine if all ways to add an Ability respect MULT and STACK. This involves finishing itest/tokenmodel.ability&lt;br /&gt;
&lt;br /&gt;
==Documentation==&lt;br /&gt;
Need to doc facets explanation, see https://groups.yahoo.com/neo/groups/pcgen_developers/conversations/messages/3721&lt;br /&gt;
&lt;br /&gt;
Primitive and Qualifier Architecture (Gabriel taking the first pass on the Wiki): https://groups.yahoo.com/neo/groups/pcgen_developers/conversations/messages/3682&lt;br /&gt;
&lt;br /&gt;
Review adding a new token documentation, see https://groups.yahoo.com/neo/groups/pcgen_developers/conversations/messages/3529&lt;br /&gt;
&lt;br /&gt;
Need to document Visibility/View usage&lt;br /&gt;
&lt;br /&gt;
==Known Bugs==&lt;br /&gt;
===Leveling Up===&lt;br /&gt;
add/remove/add class levels causes a major bug with epic characters, need to consider how this is addressed in 6.3&lt;br /&gt;
&lt;br /&gt;
===Template Choose/Level===&lt;br /&gt;
A Template with a CHOOSE which is added by a PCClass level produces an interaction that causes PCGen to dump stack&lt;br /&gt;
&lt;br /&gt;
====Problem is interaction====&lt;br /&gt;
CHOOSE on a Template is fired regardless of the source. For Ability objects, this is only done with directly selected by the user - otherwise it has to be done by passing in an association&lt;br /&gt;
&lt;br /&gt;
ADD: was made properly symmetric in the 6.3 branch, so fixing a tiny piece CODE-3 is literally what caused this regression&lt;br /&gt;
&lt;br /&gt;
When we add a class level, we increment the level, test if it passes the PREREQs, decrement the level, then re-add the level. This is a disaster from an object thrashing perspective and given how CHOOSE is fired on a template is a problem&lt;br /&gt;
&lt;br /&gt;
====Solution is non-trivial====&lt;br /&gt;
Just fixing that the item can be null (the naive fix) will still cause the CHOOSE to be fired twice&lt;br /&gt;
&lt;br /&gt;
Regressing back the CODE-3 fix just kicks the can down the road on the issue&lt;br /&gt;
&lt;br /&gt;
Should probably justify the difference in CHOOSE behavior vs Ability in any solution&lt;br /&gt;
&lt;br /&gt;
Strategic solution would be a better method of doing incrementing levels, but that is a &amp;quot;hard&amp;quot; problem, in that it is complex&lt;br /&gt;
&lt;br /&gt;
On option is to take a page from the ADD: system when a Kit is being applied or a PC is being loaded and set a variable to say &amp;quot;don't process this stuff right now&amp;quot;. That can be activated for two different situations: Both the Template Choose/Level problem as well as the epic interaction&lt;br /&gt;
&lt;br /&gt;
=Refactoring=&lt;br /&gt;
==Type safety==&lt;br /&gt;
Make SubClassFacet Type Safe, see subclassfacet-typesafe.22718.patch&lt;br /&gt;
&lt;br /&gt;
LoadInfo refers to sizes&lt;br /&gt;
&lt;br /&gt;
http://jira.pcgen.org/browse/CODE-1929&lt;br /&gt;
&lt;br /&gt;
==Class Moves==&lt;br /&gt;
===Export Tokens===&lt;br /&gt;
io.exporttoken.StatToken can be moved to a plugin&lt;br /&gt;
&lt;br /&gt;
io.exporttoken.WeaponhToken can be moved to a plugin&lt;br /&gt;
&lt;br /&gt;
io.exporttoken.TotalToken can be moved to a plugin&lt;br /&gt;
&lt;br /&gt;
===Static Method Moves===&lt;br /&gt;
AttackInfo.getAttackInfo can be moved to an export token&lt;br /&gt;
&lt;br /&gt;
===CDOM===&lt;br /&gt;
pcgen.util.enumeration.Visibility can be promoted to cdom.enumeration&lt;br /&gt;
&lt;br /&gt;
pcgen.util.enumeration.View can be promoted to cdom.enumeration&lt;br /&gt;
&lt;br /&gt;
==PC Associations==&lt;br /&gt;
===Eliminate SPECIALTY association===&lt;br /&gt;
See elim-specialty-assoc.22785.patch&lt;br /&gt;
&lt;br /&gt;
Problem: This breaks Quasvin as redundant information was saved but the redundant data is no longer relevant to the PC: https://groups.yahoo.com/neo/groups/pcgen_developers/conversations/topics/3688&lt;br /&gt;
&lt;br /&gt;
http://jira.pcgen.org/browse/CODE-1908&lt;br /&gt;
&lt;br /&gt;
==General Cleanup==&lt;br /&gt;
FOP0205HandlerImpl seems to be unused, see https://groups.yahoo.com/neo/groups/pcgen_developers/conversations/messages/3833&lt;br /&gt;
&lt;br /&gt;
Refactoring for Clarity (Gabriel's Suggestions): https://groups.yahoo.com/neo/groups/pcgen_developers/conversations/messages/3782&lt;br /&gt;
&lt;br /&gt;
Would be nice to improve the use of generics in gui2 (they are ignored in many locations where they could be used), see improvegui2generics.23033.patch&lt;br /&gt;
&lt;br /&gt;
Eliminate catching of Exceptions without further messaging of the underlying issue&lt;br /&gt;
&lt;br /&gt;
==Unit Tests==&lt;br /&gt;
===Cleanup===&lt;br /&gt;
TokenLibrary.addBonusClass is called widely in test cases (as a static call) and should be consolidated into the testcommon directory in some form&lt;br /&gt;
&lt;br /&gt;
==SkillBuffers==&lt;br /&gt;
These probably DO deserve a default size as per the tracker indicating as such&lt;br /&gt;
&lt;br /&gt;
See: stringbuffer size.23000.patch&lt;br /&gt;
&lt;br /&gt;
=Strategic Projects=&lt;br /&gt;
==Localization==&lt;br /&gt;
===Type Safety===&lt;br /&gt;
A number of items need to be made type safe to handle L10N&lt;br /&gt;
&lt;br /&gt;
RacePantheon (Deity)&lt;br /&gt;
&lt;br /&gt;
===Incompatible Tokens===&lt;br /&gt;
A number of tokens are incompatible with L10N because they cannot easily be matched (DESC, BENEFIT, generally any free-form String that is allowed to appear multiple times (Spells will also have a bunch)&lt;br /&gt;
&lt;br /&gt;
These may not matter as much if we use PO files? But it will make the PO files very sensitive to tiny data changes. Is there a compromise?&lt;br /&gt;
&lt;br /&gt;
Also, how would replacements be handled?&lt;br /&gt;
&lt;br /&gt;
===General Concepts===&lt;br /&gt;
We must not make producing a data set materially more complicated than it is today (no requirement to put %L10NNAME% type gunk into data)&lt;br /&gt;
&lt;br /&gt;
We should target an ability to tell us if l10n is complete for any given data set&lt;br /&gt;
&lt;br /&gt;
I need to understand more about L10N than I do today - I need to understand this issue: http://wiki.pcgen.org/Localization&lt;br /&gt;
&lt;br /&gt;
Proposal, see: http://wiki.pcgen.org/Internationalization&lt;br /&gt;
&lt;br /&gt;
===PO Files===&lt;br /&gt;
What tools are available for PO files that make a difference?&lt;br /&gt;
&lt;br /&gt;
Are there any tools to help create PO files in Java since we know what needs to be translated?&lt;br /&gt;
&lt;br /&gt;
What is the advantage if we use PO files vs using a custom format?&lt;br /&gt;
&lt;br /&gt;
==Formula Parser==&lt;br /&gt;
This work is significant since any changes we make in the Formula Parser can't be leveraged by something like the bonus manager until a subsequent revision&lt;br /&gt;
&lt;br /&gt;
Initial work done in 2010 time frame by Nuance to get the Parser up and running&lt;br /&gt;
&lt;br /&gt;
===Remaining TODOs===&lt;br /&gt;
Get new formulas into a set of plugins rather than direct injection into maps&lt;br /&gt;
&lt;br /&gt;
Change operations to be able to handle Number, Number as the parameters and return Number. Allows integer math when possible (Eric is looking at this as an initial project)&lt;br /&gt;
&lt;br /&gt;
====Conversion of Terms/Formulas====&lt;br /&gt;
Convert existing terms/formulas to the new formula parser. A representation of what has been done is in this destructive exploration: formulacompleted.patch&lt;br /&gt;
&lt;br /&gt;
Goal is to avoid the use of pattern matching that is used by the current system. In many cases, there are only a limited number of choices that the pattern match worked to handle, and these can be explicitly built&lt;br /&gt;
&lt;br /&gt;
A=B get converted to two different objects: A becomes a DotEqualFormula and then a scoped term, B being the scope. CL is implemented as an example in the sandbox&lt;br /&gt;
&lt;br /&gt;
===General Concepts===&lt;br /&gt;
====Formulas====&lt;br /&gt;
=====Pluggable=====&lt;br /&gt;
getFunctionName() plus an interface to define which form&lt;br /&gt;
&lt;br /&gt;
loaded like we do the lst tokens today&lt;br /&gt;
&lt;br /&gt;
=====Three forms=====&lt;br /&gt;
Paren formulas&lt;br /&gt;
&lt;br /&gt;
e.g. today's count() function and the other items in plugin.jepformula&lt;br /&gt;
&lt;br /&gt;
BracketFormula&lt;br /&gt;
&lt;br /&gt;
The COUNT is the bracketfunction&lt;br /&gt;
&lt;br /&gt;
The string CLASSES is called as a BracketTerm in the scope of COUNT&lt;br /&gt;
&lt;br /&gt;
Calling as a term prevents COUNT from having to implement a huge IF statement and allows expansion in a separate plugin&lt;br /&gt;
&lt;br /&gt;
Compatibility with the old COUNT system, e.g. COUNT[CLASSES].&lt;br /&gt;
&lt;br /&gt;
DotEqual Functions&lt;br /&gt;
&lt;br /&gt;
These are actually &amp;quot;derived&amp;quot; from terms as they are not separated by the parser&lt;br /&gt;
&lt;br /&gt;
Things like CL=x or CL.x&lt;br /&gt;
&lt;br /&gt;
Strange &amp;quot;trace&amp;quot;&lt;br /&gt;
&lt;br /&gt;
(1) term system separates out CL=x into two items, CL is a EqualFormula name, x is the argument&lt;br /&gt;
&lt;br /&gt;
(2) CL EqualFormula instance is loaded and passed the argument&lt;br /&gt;
&lt;br /&gt;
(3) CL EqualFormula calls back to the FormulaScope and asks it to resolve a term &amp;quot;in scope&amp;quot; of the argument&lt;br /&gt;
&lt;br /&gt;
(4) The &amp;quot;CL&amp;quot; term with a scope of PCClass.class &amp;lt;x&amp;gt; is called for resolution&lt;br /&gt;
&lt;br /&gt;
=====Validation=====&lt;br /&gt;
Every formula needs to be able to indicate if it is valid or not. This includes both checking the function name (the system will probably do this) as well as all of the arguments of the function&lt;br /&gt;
&lt;br /&gt;
Every formula needs to be able to indicate if it is static (for optimization at runtime)&lt;br /&gt;
&lt;br /&gt;
Parsing does not indicate it is valid. IT could be CNT[CLAZZES], which is not valid because CNT is not a bracketfunction and CLAZZES is not a bracketterm&lt;br /&gt;
&lt;br /&gt;
If not valid, it needs to return WHY it is not valid - much like tokens return ParseResult.FAIL, Formulas need to return a FormulaValidity that indicates success or the problem (pcgen.base.formula.error)&lt;br /&gt;
&lt;br /&gt;
====Terms====&lt;br /&gt;
Individual items that can be &amp;quot;solved&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Can be global, e.g. HANDS&lt;br /&gt;
&lt;br /&gt;
=====Scope=====&lt;br /&gt;
Scope is provided by the object from which the formula is called (what is called the source today)&lt;br /&gt;
&lt;br /&gt;
Hope to move scope to a more active system that does not depend on String Scope&lt;br /&gt;
&lt;br /&gt;
Can have a scope, such as &amp;quot;CL&amp;quot; having to be resolved for a class.&lt;br /&gt;
&lt;br /&gt;
=====Resolution=====&lt;br /&gt;
Inconsistent with how formulas are handled. That is a bit confusing, but given that formulas need validation, evaluation, static check, it may be better NOT to isolate them the same way as terms&lt;br /&gt;
&lt;br /&gt;
DO take PlayerCharacter as an argument to resolve. This is managed by the FormulaScope implementation which is then allowed to be PlayerCharacter-aware (and note the delegation path is to request term resolution from the scope, NOT to get the Term from the scope and then resolve it&lt;br /&gt;
&lt;br /&gt;
===Main Goals===&lt;br /&gt;
====Isolated from PCGen====&lt;br /&gt;
Isolated via FormulaScope interface&lt;br /&gt;
&lt;br /&gt;
Note pcgen.base.formula.base does NOT have PlayerCharacter as an argument - it should NOT.&lt;br /&gt;
&lt;br /&gt;
Have a system that can be fully unit tested independent of PCGen. Therefore, no references to CDOMObjects or (especially) PlayerCharacter can be in the formula parser. Legal in Formulas and Terms since those are plugins&lt;br /&gt;
&lt;br /&gt;
Minimize customization to classes related to the parser - walk the tree when possible. (few svn stored classes in pcgen.base.formula.parse)&lt;br /&gt;
&lt;br /&gt;
Have the ability to detect use of different types of formulas and deprecate them individually&lt;br /&gt;
&lt;br /&gt;
Temporarily compatible with JEP (try new system first, then old)&lt;br /&gt;
&lt;br /&gt;
==Equipment==&lt;br /&gt;
Equipment primitive behavior (e.g. TYPE) can be modified by an EqMod, but that modification must occur in context (Note: Difficult to do this with just a modifier if there is any complexity beyond one level of EqMods)&lt;br /&gt;
&lt;br /&gt;
EqMods can trigger the removal of other EqMods (in context to parent Equipment)&lt;br /&gt;
&lt;br /&gt;
Proposal for Equipment Variables&lt;br /&gt;
&lt;br /&gt;
Equipment needs to be promoted to a &amp;quot;full&amp;quot; object, on the level with PlayerCharacter&lt;br /&gt;
&lt;br /&gt;
Proposal for Equipment to be able to contain other Equipment, needs to handle this in terms of character possession&lt;br /&gt;
&lt;br /&gt;
Does Equipment have a &amp;quot;contains&amp;quot; set such that a PREITEM has to search up the entire &amp;quot;tree&amp;quot; hierarchically? How is that handled? Alternative seems to be that if the PC possesses an item, it must be in the PC's item list. This may end up storing redundant information, however&lt;br /&gt;
&lt;br /&gt;
Is there a way to control the size of Equipment items so that most primitive items do not take up large quantities of memory? (what is the transition threshold and is this done with a strategy of some form?)&lt;br /&gt;
&lt;br /&gt;
Need to finish separating the system so it does not have primary/secondary heads (but numbered)&lt;br /&gt;
&lt;br /&gt;
Equipment would have its own resolution system, facets, etc as necessary&lt;br /&gt;
&lt;br /&gt;
==Bonus System Redesign==&lt;br /&gt;
Proposal posted, see: http://wiki.pcgen.org/Bonus_Subsystem_Design&lt;br /&gt;
&lt;br /&gt;
Breakout of types of Bonuses: http://wiki.pcgen.org/Bonus_Subsystem_Thoughts&lt;br /&gt;
&lt;br /&gt;
Bonuses need to &amp;quot;lose&amp;quot; ownBonuses to get away from ugly behavior&lt;br /&gt;
&lt;br /&gt;
===Tokens===&lt;br /&gt;
Nee to provide special consideration to the tokens we have that are &amp;quot;bonuses in disguise&amp;quot; and whether they should just become pure bonuses&lt;br /&gt;
&lt;br /&gt;
Needs to include a token rebuild that includes better type safety (if they refer to a skill, we need to know if that name is valid or not)&lt;br /&gt;
&lt;br /&gt;
Need some special attention on duplicate bonuses, and deciding what the &amp;quot;long term plan&amp;quot; is - combat has a number of bonuses that are available in multiple ways&lt;br /&gt;
&lt;br /&gt;
Is there work that needs to be considered for bonuses that really aren't? Meaning bonuses that are actually acting as locks. This makes the name &amp;quot;bonus&amp;quot; rather confusing since it is a lock not a bonus&lt;br /&gt;
&lt;br /&gt;
http://jira.pcgen.org/browse/CODE-2502&lt;br /&gt;
&lt;br /&gt;
==Export==&lt;br /&gt;
===Token Rebuild proposal===&lt;br /&gt;
http://jira.pcgen.org/browse/CODE-1904&lt;br /&gt;
&lt;br /&gt;
see: http://wiki.pcgen.org/Dev_Meeting_Log_20091114&lt;br /&gt;
&lt;br /&gt;
===Freemarker direct object access===&lt;br /&gt;
Questions: https://groups.yahoo.com/neo/groups/pcgen_developers/conversations/messages/3795&lt;br /&gt;
&lt;br /&gt;
Provides a way to avoid the complicated token rebuild - focus on core code&lt;br /&gt;
&lt;br /&gt;
Addition abstraction advantages in that input tokens can directly write properties to output without core knowledge if the map functions of freemarker work as per my questions&lt;br /&gt;
&lt;br /&gt;
Looks to be a better solution than the Token Rebuild proposed earlier - less code for us to maintain&lt;br /&gt;
&lt;br /&gt;
http://jira.pcgen.org/browse/CODE-2419&lt;br /&gt;
&lt;br /&gt;
==Performance==&lt;br /&gt;
Bonus System String processing is probably our major performance issue&lt;br /&gt;
&lt;br /&gt;
CollectionToAbilitySelection got a cleanup for infiniteloop but the same code exists in AbilityRefFromChoiceSet&lt;br /&gt;
&lt;br /&gt;
==Token Updates==&lt;br /&gt;
===Type Safety===&lt;br /&gt;
Deity RacePantheon needs type safety&lt;br /&gt;
&lt;br /&gt;
Template/RaceType&lt;br /&gt;
&lt;br /&gt;
Template/Genderlock&lt;br /&gt;
&lt;br /&gt;
Skill/ACheck&lt;br /&gt;
&lt;br /&gt;
===Error/Enforcement===&lt;br /&gt;
Sponsor ImageSmallToken should be deprecated as the code is never used&lt;br /&gt;
&lt;br /&gt;
Need to have a check on Ability object names, if X is a mult:yes ability then X(a) must be prohibited. While we support this currently in the parsing, there are other later subsystems that end up with ambiguity - specifically if the item appers in ADD:FEAT as an example, the two cannot be distinguished&lt;br /&gt;
&lt;br /&gt;
ChooseLst should probably check that CHOOSE is present on an object if any choice actors are present on an object&lt;br /&gt;
&lt;br /&gt;
CHOOSE:ABILITY and CHOOSE:ABILITYSELECTION the categories need to be a parent category not a pool, see https://groups.yahoo.com/neo/groups/pcgen_experimental/conversations/messages/17129&lt;br /&gt;
&lt;br /&gt;
MULT:YES abilities can be given MULT:NO behavior and that probably deserves a warning. The main problem is that if a MULT:YES Ability provides something like ADD:FEAT|Dodge, then Dodge will only be applied once, not the number of times the Ability is taken. That's because ADD is a MULT:NO behavior of the Ability. There are other examples, but the point is that it should be possible to know MULT:NO behaviors and warn on usage, see: detect mult single conflicts.22912.patch&lt;br /&gt;
&lt;br /&gt;
===Consistency===&lt;br /&gt;
%LIST Consistency&lt;br /&gt;
&lt;br /&gt;
Bracketed PRE: PCClass/PCClassLevel (ADDDOMAINS, Domain)&lt;br /&gt;
&lt;br /&gt;
Deprecate TEMPLATE:x.REMOVE and implement REMOVE:TEMPLATE&lt;br /&gt;
&lt;br /&gt;
Can PreMultParser be moved to a plugin??&lt;br /&gt;
&lt;br /&gt;
CSKILL and CCSKILL use LIST not %LIST&lt;br /&gt;
&lt;br /&gt;
MONCSKILL uses LIST not %LIST&lt;br /&gt;
&lt;br /&gt;
===Abstraction===&lt;br /&gt;
====AbstractFormula====&lt;br /&gt;
=====Stat=====&lt;br /&gt;
Statmod&lt;br /&gt;
&lt;br /&gt;
=====PCClass=====&lt;br /&gt;
startskillpts&lt;br /&gt;
&lt;br /&gt;
crformula&lt;br /&gt;
&lt;br /&gt;
=====race=====&lt;br /&gt;
leveladjustment&lt;br /&gt;
&lt;br /&gt;
=====eqMod=====&lt;br /&gt;
cost&lt;br /&gt;
&lt;br /&gt;
costpre&lt;br /&gt;
&lt;br /&gt;
=====Equipment=====&lt;br /&gt;
pageuse&lt;br /&gt;
&lt;br /&gt;
=====global=====&lt;br /&gt;
select&lt;br /&gt;
&lt;br /&gt;
=====template=====&lt;br /&gt;
leveladjustment&lt;br /&gt;
&lt;br /&gt;
====AbstractBoolean====&lt;br /&gt;
=====Skill=====&lt;br /&gt;
Useuntrained&lt;br /&gt;
&lt;br /&gt;
Exclusive&lt;br /&gt;
&lt;br /&gt;
=====Template=====&lt;br /&gt;
Removable&lt;br /&gt;
&lt;br /&gt;
=====Stat=====&lt;br /&gt;
Rolled&lt;br /&gt;
&lt;br /&gt;
=====Alignment=====&lt;br /&gt;
valid for deity&lt;br /&gt;
&lt;br /&gt;
validforfollower&lt;br /&gt;
&lt;br /&gt;
=====Size=====&lt;br /&gt;
isdefaultsize&lt;br /&gt;
&lt;br /&gt;
=====Global=====&lt;br /&gt;
Descispi&lt;br /&gt;
&lt;br /&gt;
nameispi&lt;br /&gt;
&lt;br /&gt;
=====EqMod=====&lt;br /&gt;
AssignToAll&lt;br /&gt;
&lt;br /&gt;
costdouble&lt;br /&gt;
&lt;br /&gt;
=====Ability=====&lt;br /&gt;
Mult&lt;br /&gt;
&lt;br /&gt;
Stack&lt;br /&gt;
&lt;br /&gt;
=====PCClass=====&lt;br /&gt;
IsMonster&lt;br /&gt;
&lt;br /&gt;
memorize&lt;br /&gt;
&lt;br /&gt;
spellbook&lt;br /&gt;
&lt;br /&gt;
allowbaseclass&lt;br /&gt;
&lt;br /&gt;
modtoskills&lt;br /&gt;
&lt;br /&gt;
=====campaign=====&lt;br /&gt;
showinmenu&lt;br /&gt;
&lt;br /&gt;
islicensed&lt;br /&gt;
&lt;br /&gt;
ismature&lt;br /&gt;
&lt;br /&gt;
isogl&lt;br /&gt;
&lt;br /&gt;
=====cmod=====&lt;br /&gt;
usemasterskill&lt;br /&gt;
&lt;br /&gt;
====AbstractString====&lt;br /&gt;
=====Template=====&lt;br /&gt;
AppliedName&lt;br /&gt;
&lt;br /&gt;
=====PCClass=====&lt;br /&gt;
ClassType&lt;br /&gt;
&lt;br /&gt;
ItemCreate&lt;br /&gt;
&lt;br /&gt;
SpellType&lt;br /&gt;
&lt;br /&gt;
Does this need to be deprecated?&lt;br /&gt;
&lt;br /&gt;
Abb&lt;br /&gt;
&lt;br /&gt;
=====EqMod=====&lt;br /&gt;
FumbleRange&lt;br /&gt;
&lt;br /&gt;
=====Equipment=====&lt;br /&gt;
RateOfFire&lt;br /&gt;
&lt;br /&gt;
FumbleRange&lt;br /&gt;
&lt;br /&gt;
=====Deity=====&lt;br /&gt;
Worshippers&lt;br /&gt;
&lt;br /&gt;
Title&lt;br /&gt;
&lt;br /&gt;
Symbol&lt;br /&gt;
&lt;br /&gt;
Appearance&lt;br /&gt;
&lt;br /&gt;
=====Campaign=====&lt;br /&gt;
Setting&lt;br /&gt;
&lt;br /&gt;
PubNameWeb&lt;br /&gt;
&lt;br /&gt;
PubNameShort&lt;br /&gt;
&lt;br /&gt;
PubNameLong&lt;br /&gt;
&lt;br /&gt;
Help&lt;br /&gt;
&lt;br /&gt;
Genre&lt;br /&gt;
&lt;br /&gt;
=====Ability=====&lt;br /&gt;
AppliedName&lt;br /&gt;
&lt;br /&gt;
=====Global=====&lt;br /&gt;
Sortkey&lt;br /&gt;
&lt;br /&gt;
===New Token Todo===&lt;br /&gt;
EquipmentModifier CHOOSE tokens need update to new subtoken format&lt;br /&gt;
&lt;br /&gt;
AbilityCategory should be converted to a CDOMObject and the fields moved to the maps and the tokens updated: Specifically one value here is reuse of ObjectKey's default on getSafe for Visibility&lt;br /&gt;
&lt;br /&gt;
==Idealism==&lt;br /&gt;
===Token separation===&lt;br /&gt;
====CHOOSE====&lt;br /&gt;
Primitive PObject.FEAT= needs to have CHOOSE_INFO reference moved to PlayerCharacter&lt;br /&gt;
&lt;br /&gt;
LoadContext.validateAssociations makes specific reference to CHOOSE_INFO but that is tied to the CHOOSE plugin&lt;br /&gt;
&lt;br /&gt;
PrerequisiteUtilities makes specific reference to CHOOSE_INFO, tied to CHOOSE, move to PlayerCharacter&lt;br /&gt;
&lt;br /&gt;
===Enumerations===&lt;br /&gt;
Delete AbilityCategory.ALL&lt;br /&gt;
&lt;br /&gt;
Delete Nature.ALL&lt;br /&gt;
&lt;br /&gt;
===Interfaces===&lt;br /&gt;
Should LoadContext really be an interface?&lt;br /&gt;
&lt;br /&gt;
Should UnconstructedValidator really be an interface?&lt;br /&gt;
&lt;br /&gt;
===Eliminate Token Magic===&lt;br /&gt;
Template/Subregion has YES&lt;br /&gt;
&lt;br /&gt;
Template/SubRace has YES&lt;br /&gt;
&lt;br /&gt;
Template/Region has YES&lt;br /&gt;
&lt;br /&gt;
==PRE/REQ==&lt;br /&gt;
===Design Issues===&lt;br /&gt;
We have some items that are &amp;quot;prerequisites&amp;quot; (tested when the object is added to the PC) and some that are &amp;quot;requirements&amp;quot; (continually tested). Need to be able to put both on object and distinguish them&lt;br /&gt;
&lt;br /&gt;
Prerequisites are not currently parsed as other items, and as such are not catching typos and otherwise type-safe&lt;br /&gt;
&lt;br /&gt;
There are a number of things that cannot be done in Prerequisites&lt;br /&gt;
&lt;br /&gt;
===Limitations to overcome===&lt;br /&gt;
There are requirements that include things like: 2 Skills of TYPE=Foo of rank 5. The problem we have is that if we list TYPE=Foo twice, then the same skill can match&lt;br /&gt;
&lt;br /&gt;
The processing system we have today has trouble distinguishing between success and accumulation. For things like total number of skill ranks adding up to a number, we have to hack the prerequiste system to handle that, and at that point there are complexities in making that work in PREMULT and also situations that can cause it to fail. The solution is to have Prerequisites return a more complex object that indicates total matches, success, etc. and allow a later decision maker to interpret as necessary.&lt;br /&gt;
&lt;br /&gt;
Right now there is a tit-for-tat system with qualification. Meaning you can write a PRE, and then have a QUALIFY override it and then a PRE:Q: override THAT. Well, that becomes confusing over time and basically ends up in infinite escalation where one item requires more and more text each time. Can you imagine PRE:Q:Q:Q:xxx and QUALIFY:P:P:xxx trying to compete?&lt;br /&gt;
&lt;br /&gt;
http://wiki.pcgen.org/Prerequisite-using_Token_rebuild&lt;br /&gt;
&lt;br /&gt;
=Isolation=&lt;br /&gt;
==Core/Output Isolation==&lt;br /&gt;
Special Ability processing to Strings is happening in PlayerCharacter&lt;br /&gt;
&lt;br /&gt;
http://jira.pcgen.org/browse/CODE-1911&lt;br /&gt;
&lt;br /&gt;
==Core/UI Isolation==&lt;br /&gt;
Stat rolling is happening in PlayerCharacter - isn't this a user like function and thus where should it be?&lt;br /&gt;
&lt;br /&gt;
===Events===&lt;br /&gt;
Rather than subscribing to domainFacet, I think there should be a &amp;quot;display interface&amp;quot; for the core that lets you get a ListFacade&amp;lt;Domain&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It will NOT be an AbstractListFacade&amp;lt;Domain&amp;gt;, but rather one that basically decorates domainFacet and translates the events that way we can keep that translation code localized to that one class (must be event driven per James)&lt;br /&gt;
&lt;br /&gt;
Does NOT duplicate what is in the facades today, just moves it (end up with two &amp;quot;facade sublayers&amp;quot; talking to each other, one that makes &amp;quot;one way in/out&amp;quot; of the core and the other that insulates the UI elements from the core classes&lt;br /&gt;
&lt;br /&gt;
====Prototype====&lt;br /&gt;
Clean up Domain interaction with the UI as a test case for isolation&lt;br /&gt;
&lt;br /&gt;
Make available Domains a list that is processed in the core (allowed perspective)&lt;br /&gt;
&lt;br /&gt;
Also serves as a prototype interface for the Freemarker template use?&lt;br /&gt;
&lt;br /&gt;
http://jira.pcgen.org/browse/CODE-1913&lt;br /&gt;
&lt;br /&gt;
=Strategic Thoughts=&lt;br /&gt;
==Channels==&lt;br /&gt;
Long term thoughts when dealing with things like numerical values&lt;br /&gt;
&lt;br /&gt;
Example is something like HANDS on a PC&lt;br /&gt;
&lt;br /&gt;
Modifications that are necessary: Lock, Modify (+-*/), Limit&lt;br /&gt;
&lt;br /&gt;
Need to be able to define a channel, the modify the channel&lt;br /&gt;
&lt;br /&gt;
Need to cleanly address order of operations without having tons of tit-for-tat situations (the PREREQ system of Qualified and :Q: to override that is a tit-for-tat system that has no end&lt;br /&gt;
&lt;br /&gt;
List Channels may also be considered definition, modification&lt;br /&gt;
&lt;br /&gt;
There may need to be a namespace of some form for channels - things like class skill lists for classes could be considered a list, but are in context to a class. Stat value is another one that has a context (the stat)&lt;br /&gt;
&lt;br /&gt;
=Strategic Issues=&lt;br /&gt;
==Retroactivity==&lt;br /&gt;
Retroactive behavior (or lack thereof) is causing issues (and worse, data design changes)&lt;br /&gt;
&lt;br /&gt;
This causes &amp;quot;time travel&amp;quot; problems. What if a level 3 item is retroactive and causes a prereq at level 2 to fail? (or the parent of the retroactive item?)&lt;br /&gt;
&lt;br /&gt;
==Context==&lt;br /&gt;
Globals.getContext is very overused and causes issues with testing&lt;br /&gt;
&lt;br /&gt;
Persistence decodeChoice often requries a call to LoadContext and should be passed in not implicit and grabbed from Globals&lt;br /&gt;
&lt;br /&gt;
==Fragility==&lt;br /&gt;
PCClass.inheritAttributesFrom is fragile, and implies certain behaviors, need a better method of handling this (can overlayCDOMObject work?)&lt;br /&gt;
&lt;br /&gt;
==Data Copying and Modification==&lt;br /&gt;
Need a good strategic method for Variables and Bonuses to handle .COPY= elegantly&lt;br /&gt;
&lt;br /&gt;
==Domain Source==&lt;br /&gt;
===DefaultDomainSource===&lt;br /&gt;
One of the challenges we have in Domains is there is an ability to assign a &amp;quot;default domain source&amp;quot; for the Domain - meaning that it is possible that the intended source is destroyed. It also means that if Domains are added to the &amp;quot;Core View&amp;quot; system that the source may not be correct.&lt;br /&gt;
&lt;br /&gt;
The example as to why a default is a problem is a dual-class Cleric, Druid: If each gets a domain, both of the domains should not be assigned to the default source (whichever class was taken first) So it seems to me that just like some of the other UI elements, we should have a list of the classes (those that allow Domains anyway).&lt;br /&gt;
&lt;br /&gt;
===Requirements===&lt;br /&gt;
Goal: eliminate the default and make Domain sources a full behavior.&lt;br /&gt;
&lt;br /&gt;
We can &amp;quot;pre-select&amp;quot; the class if there is only one that allows domains to avoid another click by the user (this should be a key design criteria)&lt;br /&gt;
&lt;br /&gt;
A class can have itself listed in the Bonus without hardcoding the name (This hopefully has a side effect/benefit on other BONUS tokens of the same nature, and over time we can look at removing some of the code in PCClassKeyChange.changeReferences())&lt;br /&gt;
&lt;br /&gt;
===Deprecate BONUS:DOMAIN|NUMBER===&lt;br /&gt;
The problem is that we have BONUS:DOMAIN|NUMBER If this is always attached to a PCClass, it's not a big deal. If there are bonuses elsewhere, we're pretty much in trouble.&lt;br /&gt;
&lt;br /&gt;
This would be replaced by: BONUS:DOMAIN|x| where x is a class&lt;br /&gt;
&lt;br /&gt;
(1) Compatibility assumes there isn't a class called Number. If we can't make that assumption we can use something like BONUS:DOMAINCOUNT|x|&lt;br /&gt;
&lt;br /&gt;
(2) For any Ability in which the old format is used, we need to add a CHOOSE:CLASS|x and make the BONUS: use %LIST in place of Number. None of the abilities today has another CHOOSE (well, one uses NOCHOICE, but that's no big deal to replace)&lt;br /&gt;
&lt;br /&gt;
(3) Use in the classes themselves becomes a problem. I'd therefore propose we support: %THIS as something referring to itself.&lt;br /&gt;
&lt;br /&gt;
==Hardcoding==&lt;br /&gt;
===Magic===&lt;br /&gt;
TYPE=Natural is magical for Equipment and we need to consider when and how this should drive filtering of objects&lt;br /&gt;
&lt;br /&gt;
Spell isAllowed method hardcodes Potion (defaulting to false) and should be moved to GameMode&lt;br /&gt;
&lt;br /&gt;
PlayerCharacter initializes both INNATE and KNOWN spellbooks by default&lt;br /&gt;
&lt;br /&gt;
PlayerCharacter getSpellRange has hardcoded formulas for spell ranges CLOSE, MEDIUM, etc.&lt;br /&gt;
&lt;br /&gt;
exporttoken.Armor has hardcoded sizes when looking @ additional move&lt;br /&gt;
&lt;br /&gt;
SystemHP.isDNDMassive has hardcoded sizes, also may be buggy because it may be abbreviations that are actually returned?&lt;br /&gt;
&lt;br /&gt;
===Constants===&lt;br /&gt;
Constants.FEAT is specific and should probably be removed&lt;br /&gt;
&lt;br /&gt;
Equipment Locations in Constants need to be extracted to Game Mode&lt;br /&gt;
&lt;br /&gt;
=Major Systems=&lt;br /&gt;
==Primitive/Qualifier==&lt;br /&gt;
AbilityRefChoiceSet appears to use what is a Primitive in the parenthesis, and has similar/complicated parsing code for the contents. Can/should this be delegated to primitive(s)&lt;br /&gt;
&lt;br /&gt;
Using primitives outside CHOOSE, now part of a proposal, see : https://groups.yahoo.com/neo/groups/pcgen_developers/conversations/messages/3760&lt;br /&gt;
&lt;br /&gt;
==GUI2==&lt;br /&gt;
===Speak Languages===&lt;br /&gt;
pcgen.core.Dataset needs a better method to identify the speak language skill&lt;br /&gt;
&lt;br /&gt;
http://jira.pcgen.org/browse/CODE-2014&lt;br /&gt;
&lt;br /&gt;
===Missing Capabilities===&lt;br /&gt;
WEAPONBONUS is missing from the GUI2&lt;br /&gt;
&lt;br /&gt;
Visual Quirk: is there a reason we sort items after they are displayed?&lt;br /&gt;
&lt;br /&gt;
=Administrative=&lt;br /&gt;
==JIRA==&lt;br /&gt;
Move PrettyList out of CODE-, see: https://groups.yahoo.com/neo/groups/pcgen_developers/conversations/messages/3765&lt;/div&gt;</summary>
		<author><name>Tom Parker</name></author>
		
	</entry>
</feed>