I'm planning to do this in two general phases, each comprising several stages: first, by formally specifying key parts of characters like attributes, skills, metatype, so on and soforth, working from the inside out to create a complete character, and second by working from the outside in to take gearlists originally specified as lists of strings and change anything that should hold information in and of itself into a structure with a specification of its own.
While I'm eventually planning on producing a proper BNF specification, for right now it'll be just descriptive text.
So the first thing I need from the community is help specifying primary attributes (Body, Quickness, Strength, Intelligence, Willpower, Charisma). This gets made meaningfully more complicated by the existence of Otaku, who have their RML modified without a corresponding bonus to the attribute, and by the fact that some things add attribute points (permanently or temporarily) but don't affect skill cost or pool size. Does anyone see any additional information that needs to be preserved other than the following? The structure is what I plan on using, but all values are strings giving information on what data type should be present in actual attribute data. Where data has additional constraints not reflected in formal datatype, I've noted it in parentheses.
CODE
%YAML 1.1 # Character specification
---!Primary_Attribute
attribute_name: "Unicode string"
natural_value: "Integer (natural number <= rml)"
augmented_offset: "Integer" # offset from natural value due to cyberware or other causes that do not affect pools or training costs. Optional, default = 0
temporary_offset: "Integer" # offset from temporary causes that affect pools but not training costs. Optional, default = 0
rml: "Integer (natural number)" # including modifiers from metatype or high values of Infirm. Optional, default = rmax. One of the two must be specified.
rmax: "Integer (natural number >= rml)" # optional, default = ceiling(1.5*rml)
...
---!Primary_Attribute
attribute_name: "Unicode string"
natural_value: "Integer (natural number <= rml)"
augmented_offset: "Integer" # offset from natural value due to cyberware or other causes that do not affect pools or training costs. Optional, default = 0
temporary_offset: "Integer" # offset from temporary causes that affect pools but not training costs. Optional, default = 0
rml: "Integer (natural number)" # including modifiers from metatype or high values of Infirm. Optional, default = rmax. One of the two must be specified.
rmax: "Integer (natural number >= rml)" # optional, default = ceiling(1.5*rml)
...
Anything I missed?
~J