The Computing Layer
SPAECIMH deliberately keeps the game math in the system, not in your head or in your prose. A small set of fields on the Character file are computed: the sheet solves them from other fields every time it renders. As a builder, what matters is that you understand the formulas — because the whole difficultly/combat machinery of the system bends around them, and because a wrong input upstream quietly corrupts every number downstream.
The five formulas that move the world
Every one is base × 5 × ORIGIN, where ORIGIN is the tier number. The system's rule — "always calculate from the base value; never re-add the tier where it is already in the formula" — is the difference between a Mortal with 60 Mana and 300. Keep it straight.
| Derived field | Formula |
|---|---|
| Mana (MA) | IN × 5 × ORIGIN |
| Health (HP) | EN × 5 × ORIGIN |
| Carry | ST × 5 × ORIGIN (kg) |
| Money | 4d6 × 500 × ORIGIN — rolled, not typed |
A fourth computed field, attribute points spent, sums the six base attributes — a running check that the character respects its TAP. And originName maps the numeric tier to its label (Mortal I – Fragile … God III – Demiurge) so the sheet never shows a bare number where a name is wanted.
Why derived fields are read-only
Computed fields have no stored value. When a Character file is read, the sheet reports the derived numbers; when it is written, the sheet rejects them. This is a feature, not a quirk. It means a field can never drift out of sync with its inputs — you cannot hand-edit Health to a bigger number without the base Endurance actually changing. If a character's numbers feel wrong, fix the inputs: the base attribute, the ORIGIN. Never try to fix the output.
Editing a formula
The formulas are not magic; they are declared on the Character file type, and they can be changed. When you change one, hold to the pattern:
- Change the expression in the schema, not values in files.
- Keep it a pure function of the sheet's own fields. The formulas read the base attributes and ORIGIN from the same file. A formula that reaches outside its own character for inputs is fragile and must load its reference explicitly.
- Default to
??so a missing value reads as something sane rather than poisoning the result.($self.attributes?.endurance ?? 0)is safe; a bare$self.attributes.enduranceon a sheet with no attributes set blows the whole derived block to silent nothing.
Checking your work
The fastest way to validate a build is arithmetic against the handbook: a Tier 2 character with Endurance 14 must read Health 14 × 5 × 2 = 140. If a file reads any other number, the base input or the ORIGIN is wrong — hunt the input, not the output. The moment a character's derived row disagrees with the handbook by hand-calc, the file is broken even if it renders.
The one caveat about computed combat checks
The 4d6 check formula — SUM + Modifier ≤ Attribute — is not stored on any file; it is a master-adjudicated rule. What the sheet stores is the compare-target (the attribute). When you build entries that feed combat — weapons, armor, monsters — make sure their numbers line up with the check and damage rules in the Player's Handbook. The machine compares; you build things worth comparing.