Expanded characters

RpgExpandedProfile adds independent hpAdjustment, fpAdjustment, willAdjustment, perceptionAdjustment, speedQuarterAdjustment and moveAdjustment to the existing Lite profile. Speed uses quarter-point increments. The normal source bounds apply unless rules.exceptionalCharacteristics is set by the author. That option permits exceptional construction; it does not grant unimplemented anatomy, scale or combat rules.

rpgExpandedCharacterAmounts(profile) returns signed cost components. rpgExpandedCharacterCost(profile, negativeOnly) returns total cost or the sum of negative components. rpgExpandedValidateCharacter(profile) checks secondary bounds, budgets, unique training, prerequisites, existing trait exclusions, language identities and the single native-language allowance. It rejects invalid characters rather than silently reducing purchased scores.

Set pointBudget and disadvantageLimit explicitly. The native-language allowance is applied by RpgLiteLanguage.cost(), not by adding spendable points. This is a creation validator; it must not be used as a blanket post-advancement budget check. The milestone does not yet supply an expanded advancement validator for every possible contribution.

Feature modules add owned RpgExpandedContribution instances to contributions. Each has a unique id, an owner matching the profile, amounts(profile) and validate(profile). Status, rank and reputation participate in this accounting. Implement a concrete effect separately when adding an authored feature: a point contribution alone does not grant an executable advantage.

The Town Registry example creates a 34-point investigator: IQ 11 costs 20, Will +1 costs 5, two skill investments cost 4, and reputation costs 5. Its budget is 40. Source mapping: full-2008 B14-B17, B23-B30 and B170.