Every system in the actor.rpg.stats record lives under its own top-level key — a single record can hold D&D, Cyberpunk 2020, Mage, and RPG Maker stats at the same time, without conflict. You only implement the fields you need.
This reference covers the field-level structure of every built-in system. All fields are optional unless noted. The schema is designed for forward compatibility — unknown fields are preserved on read, partial records are valid, and new systems are added without breaking existing data.
If you're building a game and want to use one of these systems, or add your own, see the Game Systems section in the Developer Guide.
| Key | System |
dnd | D&D 5th Edition |
dcc | Dungeon Crawl Classics |
cyberpunk2020 | Cyberpunk 2020 |
mage | Mage: The Ascension |
vampire | Vampire: The Masquerade 5e |
rmmz | RPG Maker MZ |
playtopia | Playtopia Quest |
reverie | Reverie House |
custom | User-Defined (legacy) |
Raw lexicon files are available for direct integration:
D&D 5e is the most fully-featured system in the schema. It covers the complete official character sheet across a set of independent sub-objects — you can include only the parts your game actually uses. A record containing nothing but abilities and hp is perfectly valid; there's no obligation to store spell slots just because you have a combat block.
Sub-objects are stored under nested keys within stats.dnd. Ability modifiers and skill modifiers are not stored directly — the UI calculates them from the raw scores and proficiency bonus at read time.
Partial records work fine. Only store the sub-objects you actually need. The sheet renderer gracefully omits empty sections.
Identity dnd.identity
| Field | Type | Notes |
race | string | max 100 chars |
class | string | max 100 chars |
level | integer | min 1 |
background | string | max 100 chars |
alignment | string | max 50 chars (e.g. "Chaotic Neutral") |
xp | integer | min 0 |
proficiency | integer | min 0 — proficiency bonus value |
Abilities dnd.abilities
All six core ability scores. Modifiers are calculated by the UI (floor((score − 10) / 2)).
| Field | Type | Notes |
str | integer | 1–30 |
dex | integer | 1–30 |
con | integer | 1–30 |
int | integer | 1–30 |
wis | integer | 1–30 |
cha | integer | 1–30 |
Hit Points dnd.hp
| Field | Type | Notes |
current | integer | min 0 |
max | integer | min 1 |
temp | integer | min 0 |
Combat dnd.combat
| Field | Type | Notes |
ac | integer ≥ 0 | Armor Class |
speed | integer ≥ 0 | Movement speed in feet |
initiative | integer | Initiative bonus (can be negative) |
hitDice | string (20) | e.g. "3d8" |
hitDiceUsed | integer ≥ 0 | Number of hit dice already spent |
Conditions dnd.conditions
| Field | Type | Notes |
inspiration | boolean | |
exhaustion | integer 0–6 | |
deathSaves.successes | integer 0–3 | Nested inside conditions.deathSaves |
deathSaves.failures | integer 0–3 | Nested inside conditions.deathSaves |
Saving Throws dnd.saves
Each field stores the total modifier (ability mod + proficiency, as applicable). Values are integers and can be negative.
| Field | Stat |
str | Strength save |
dex | Dexterity save |
con | Constitution save |
int | Intelligence save |
wis | Wisdom save |
cha | Charisma save |
Skills dnd.skills
All 18 skills store the total modifier (integer, can be negative). Half-proficiency, expertise, and jack-of-all-trades bonuses should be baked in before saving.
| Field | Base Ability | Field | Base Ability |
acrobatics | DEX | medicine | WIS |
animalHandling | WIS | nature | INT |
arcana | INT | perception | WIS |
athletics | STR | performance | CHA |
deception | CHA | persuasion | CHA |
history | INT | religion | INT |
insight | WIS | sleightOfHand | DEX |
intimidation | CHA | stealth | DEX |
investigation | INT | survival | WIS |
Passives dnd.passives
| Field | Type | Notes |
perception | integer | Typically 10 + Perception modifier |
investigation | integer | Typically 10 + Investigation modifier |
insight | integer | Typically 10 + Insight modifier |
Attacks dnd.attacks
An array of attack entries (max 20). Each object:
| Field | Type | Notes |
name | string (100) | Weapon or ability name |
bonus | string (20) | Attack roll bonus, e.g. "+5" |
damage | string (20) | Damage dice, e.g. "1d8" |
damageBonus | integer | Flat damage bonus added to roll |
damageType | string (30) | e.g. "piercing", "fire" |
Equipment dnd.equipment
| Field | Type | Max |
weapons | string | 500 chars |
armor | string | 200 chars |
gear | string | 2000 chars |
treasure | string | 1000 chars |
Coinage dnd.coinage
| Field | Denomination |
cp | Copper pieces (integer ≥ 0) |
sp | Silver pieces |
ep | Electrum pieces |
gp | Gold pieces |
pp | Platinum pieces |
Personality dnd.personality
| Field | Type | Max |
traits | string | 1000 chars |
ideals | string | 500 chars |
bonds | string | 500 chars |
flaws | string | 500 chars |
backstory | string | 5000 chars |
Text Fields dnd.*
| Field | Type | Notes |
proficiencies | string | Armor, weapon, and tool proficiency list (free text) |
languages | string | Languages known (free text) |
features | string | Class features, racial traits, and feats (free text) |
Spellcasting dnd.spellcasting
| Field | Type | Notes |
ability | string (3) | Spellcasting ability abbreviation: INT, WIS, or CHA |
dc | integer ≥ 1 | Spell save DC |
attack | integer | Spell attack bonus |
slots | array (max 9) | Each entry: { level: integer 1–9, total: integer, used: integer } |
spells.cantrips | array of string (max 20) | Cantrip names |
spells.l1–spells.l9 | array of string | Prepared spell names per level (l1–l5 max 30, l6–l9 max 20) |
DCC has the most specialized schema in the collection — deed dice, mercurial magic, spellburn, a 0-level funnel, and probabilistic thief skills that scale with level rather than proficiency. It reflects a deliberately different mechanical philosophy from 5e.
Level 0 funnel characters are fully supported — identity.level starts at 0. Class feature blocks are conditional: populate only the block matching your character's class, and the sheet renderer will show only that section.
Demihuman classes: Dwarves use the warrior block; Elves use the wizard block. This matches how their abilities are structured mechanically in the rulebook.
Identity dcc.identity
| Field | Type | Notes |
occupation | string (100) | 0-level occupation (e.g. "Rutabaga Farmer") |
class | string (100) | Character class — determines which class section renders |
title | string (100) | Class title for current level (e.g. "Evoker" at Wizard 3) |
level | integer 0–10 | 0 = funnel character |
xp | integer ≥ 0 | |
alignment | string (20) | Lawful, Neutral, or Chaotic |
Abilities dcc.abilities
DCC uses its own modifier table (3=−3, 4–5=−2, 6–8=−1, 9–12=0, 13–15=+1, 16–17=+2, 18–24=+3), not the 5e formula. Modifiers are calculated by the UI. The *Base fields track pre-spellburn values so spellburn can be recovered incrementally.
| Field | Type | Notes |
str | integer 1–24 | Current Strength (may be reduced by spellburn) |
agi | integer 1–24 | Agility |
sta | integer 1–24 | Stamina (may be reduced by spellburn) |
int | integer 1–24 | Intelligence |
per | integer 1–24 | Personality |
luk | integer 1–24 | Luck |
strBase | integer 1–24 | Pre-spellburn Strength (for recovery tracking) |
agiBase | integer 1–24 | Pre-spellburn Agility |
staBase | integer 1–24 | Pre-spellburn Stamina |
Luck dcc.luck
| Field | Type | Notes |
birthAugur | string (100) | Birth augur table result name |
birthAugurEffect | string (200) | Description of the augur's mechanical effect |
startingLuck | integer 1–24 | Luck score at character creation (used by some augur effects) |
luckyWeapon | string (100) | Halfling and some Warrior lucky weapon type |
Hit Points dcc.hp
| Field | Type |
current | integer ≥ 0 |
max | integer ≥ 1 |
Combat dcc.combat
| Field | Type | Notes |
ac | integer ≥ 0 | Armor Class |
speed | integer ≥ 0 | Movement speed in feet |
initiative | integer | Initiative modifier |
actionDie | string (20) | Action die expression, e.g. "d20" or "d20+d14" |
attackMod | integer | Base attack modifier |
critDie | string (10) | Critical hit die, e.g. "d8" |
critTable | string (20) | Critical hit table reference, e.g. "III" |
fumbleDie | string (10) | Fumble die, e.g. "d6" |
Saving Throws dcc.saves
| Field | Save |
ref | Reflex (integer, can be negative) |
fort | Fortitude |
will | Will |
Attacks dcc.attacks
Array of weapon attacks (max 10). Each entry:
| Field | Type | Notes |
name | string (100) | Weapon name |
type | string (20) | e.g. "melee", "ranged" |
attackMod | string (30) | Attack modifier expression, e.g. "+3" or "+d3+1" |
damage | string (30) | Damage dice, e.g. "1d8" |
damageBonus | string (30) | Flat damage bonus |
range | string (30) | Range if applicable |
notes | string (200) | Special properties, crit effects, etc. |
Class Sections (conditional)
Only populate the block matching the character's class. The sheet renders each section only when identity.class matches the relevant class name, or when the block already contains data. Setting data in a class block without a matching class name will still display.
Warrior / Dwarf dcc.warrior
| Field | Type | Notes |
deedDie | string (10) | Current deed die size, e.g. "d3", "d7" |
mightyDeeds | array of string (max 20) | Named mighty deeds the character has learned |
luckyWeapon | string (100) | Lucky weapon type (Warriors) |
shieldBash | boolean | Dwarf shield bash ability |
infravision | integer ≥ 0 | Dwarf infravision range in feet |
undergroundSkills | integer ≥ 0 | Dwarf underground stone-sense bonus |
smellGold | boolean | Dwarf smell gold ability |
Wizard / Elf dcc.wizard
| Field | Type | Notes |
spellCheckMod | integer | Spell check modifier |
maxSpellLevel | integer 1–5 | Highest spell level accessible |
patron | string (100) | Patron name if any |
patronBond | string (500) | Patron bond description / taints |
knownSpells | array (max 50) | Each entry: { name, level 1–5, mercurialMagic string(500), mercurialRoll integer 1–100, lost boolean, notes string(500) } |
corruption | array (max 20) | Each entry: { type string(20), effect string(500), source string(100), permanent boolean } |
corruptionText | string (2000) | Free-text corruption notes |
spellburn.strBurned | integer ≥ 0 | Strength currently burned |
spellburn.agiBurned | integer ≥ 0 | Agility currently burned |
spellburn.staBurned | integer ≥ 0 | Stamina currently burned |
spellburn.recoveryRate | integer ≥ 0 | Points recovered per night's rest |
Cleric dcc.cleric
| Field | Type | Notes |
deity | string (100) | Deity name |
spellCheckMod | integer | Spell check modifier |
maxSpellLevel | integer 1–5 | Highest spell level accessible |
disapprovalRange | integer 1–20 | Natural rolls at or below this trigger disapproval |
disapprovalTable | string (100) | Custom disapproval table reference if applicable |
turnUnholyDie | string (10) | Turn unholy die expression, e.g. "d10" |
layOnHandsDie | string (10) | Lay on hands die, e.g. "d3" |
holySymbol | string (100) | Holy symbol description |
unholy | boolean | True for Chaotic clerics |
knownSpells | array (max 50) | Each entry: { name, level 1–5, sinful boolean, notes string(500) } |
Thief dcc.thief
Thief skills store the raw die modifier for a d20 roll — e.g. +3 means roll d20+3 against a static target number. This is not a 5e DC system; the modifier scales as the thief levels up.
| Field | Type |
backstab | integer ≥ 0 — Backstab attack bonus (not a skill check) |
luckyWeapon | string (100) |
alignment | string (20) |
skills.sneakSilently | integer |
skills.hideInShadows | integer |
skills.pickPocket | integer |
skills.climbSheerSurfaces | integer |
skills.pickLock | integer |
skills.findTrap | integer |
skills.disableTrap | integer |
skills.forgeDocument | integer |
skills.disguiseSelf | integer |
skills.readLanguages | integer |
skills.handlePoison | integer |
skills.castSpellFromScroll | integer |
Halfling dcc.halfling
| Field | Type | Notes |
twoWeaponFighting | boolean | Two-weapon fighting ability unlocked |
infravision | integer ≥ 0 | Infravision range in feet (typically 30) |
sneakAndHide | integer | Combined sneak/hide modifier |
luckyWeapon | string (100) | Luck-bound weapon type |
goodLuckCharm | boolean | Good luck charm ability |
luckSpentOnAllies | integer ≥ 0 | Luck points spent on behalf of allies (tracked separately) |
Equipment & Coinage dcc.equipment / dcc.coinage
| Field | Type | Notes |
equipment.weapons | string (500) | Weapon list (free text) |
equipment.armor | string (200) | Armor worn |
equipment.armorCheckPenalty | integer ≥ 0 | ACP for skills requiring movement |
equipment.shield | string (100) | Shield description |
equipment.tradeGoods | string (500) | Trade goods (important for 0-level funnel characters) |
equipment.gear | string (2000) | General gear |
equipment.treasure | string (1000) | Treasure and valuables |
coinage.cp | integer ≥ 0 | Copper pieces |
coinage.sp | integer ≥ 0 | Silver pieces |
coinage.gp | integer ≥ 0 | Gold pieces |
Text Fields dcc.*
| Field | Notes |
languages | Languages known (string, free text) |
notes | Character biography, backstory, and general notes (string) |
abilitiesNotes | Special ability notes beyond the class section fields (string) |
A full Cyberpunk 2020 sheet for Night City operators. It covers all nine STAT scores, every skill across the attribute groups, the wound track by severity level, armor by hit location zone, weapons, a ten-slot cyberware roster, and a notes field.
Stats are stored as integers (0–10). Humanity is a string rather than an integer to support the current/base format common in CP2020 sheets (e.g. "38/40"). Skills that derive from an attribute base display as a ratio in the UI but are stored independently.
Identity & Derived cyberpunk2020.*
| Field | Type | Notes |
handle | string | Street name |
role | string | Character role (Solo, Netrunner, Rockerboy, etc.) |
campaign | string | Campaign name |
nationality | string | Nationality |
age | string | Age |
gender | string | Gender |
reputation | string | Street reputation label |
currentIP | string | Current Improvement Points |
humanity | string | Humanity score (may be formatted as "38/40") |
save | integer | Save value (equals Body Type) |
btwc | integer | Body Type Modifier (BTM; negative values allowed) |
totalHp / currentHp | integer | Hit points |
Stats cyberpunk2020.* (0–10 each)
| Field | Stat | Notes |
int | Intelligence | |
ref / refBase | Reflexes | ref is modified (after cyberware); refBase is unmodified |
tech | Technical Ability | |
cool | Cool | |
attr | Attractiveness | |
luck | Luck | |
ma | Movement Allowance | |
body | Body Type | |
emp / empBase | Empathy | emp is modified; empBase is unmodified |
Role Ability cyberpunk2020.roleSkill1
| Field | Type | Notes |
roleSkill1 | object | Primary role ability — { title: string, base: string, value: integer 0–10 } |
Skills cyberpunk2020.* (all integer 0–10)
| Attribute | Skills |
| ATTR | personalGrooming, wardrobeStyle |
| BODY | endurance, strengthFeat, swimming |
| COOL/WILL | interrogation, intimidate, oratory, resistTortDrug, streetwise |
| EMP | humanPerception, interview, leadership, seduction, socialEmp, persuasion, perform |
| INT | accounting, anthropology, awarenessNotice, biology, botany, chemistry, composition, diagnoseIllness, education, expertiseInt, gamble, geology, hideEvade, historyGen, language1, language2, library, mathematics, physics, stockMarket, systemKnowledge, teaching, wilderness, zoology |
| REF | archery, athletics, brawling, dance, dodge, driving, fencing, handgun, heavyWeapons, martialArts, melee, motorcycle, pilotFixed, pilotRotor, pilotVectored, rifle, stealth, submachinegun |
| TECH | aeroTech, avTech, basicTech, cryotankOp, cybertechTech, demolitions, disguise, electronics2, electroSec, firstAid, forgery, gyroTech, paintDraw, paramedic, photography, pickLock, pickPocket, playInstrument, weaponsSmith |
Combat cyberpunk2020.*
| Field | Type | Notes |
woundLight through woundMortal3 | integer 0–5 | 7 wound level rows, each holding a 0–5 pip count. Rows: Light (–0), Serious (–1), Critical (–2), Mortal 0–3 (–3 to –6) |
armor1sp–armor7sp | string | Stop Power per zone (Head, Body Front/Back, R/L Arm, R/L Leg) |
armor1ev–armor7ev | string | Encumbrance Value per zone |
weapon1–weapon5 | object | Each: { name, type, wa, con, avl, dmg, rng, shots, rel } |
Cyberware & Notes cyberpunk2020.*
| Field | Type | Notes |
ware1–ware10 | object | Each: { type, name, hl, cost } — type is the cyberware category, hl is Humanity Loss |
cpNotes | string (5000) | General character notes |
A complete Mage: The Ascension (Revised/WoD) sheet. This is the World of Darkness version — Arete to 10, Quintessence and Paradox on a shared 20-step wheel, Willpower with separate permanent (dots) and temporary (squares) tracks, and all nine Spheres.
Attributes, Abilities, and Sphere ratings all use the standard 1–5 dot scale. Health is stored as a filled-level count (0 = Unharmed, 7 = Incapacitated) rather than individual box states. Backgrounds and Traits use named slot objects with a label and dot value.
Identity mage.*
| Field | Type | Notes |
nature | string (100) | Psychological nature archetype |
demeanor | string (100) | Outward demeanor archetype |
essence | string (100) | Mage essence type (Dynamic, Pattern, Primordial, Questing) |
affiliation | string (100) | Tradition, Technocratic Convention, or Disparate |
sect | string (100) | Sub-group within the affiliation |
concept | string (100) | One-line character concept |
Attributes mage.* (all integer 0–5)
| Category | Fields |
| Physical | strength, dexterity, stamina |
| Social | charisma, manipulation, appearance |
| Mental | perception, intelligence, wits |
Abilities mage.* (all integer 0–5)
| Category | Fields |
| Talents | alertness, art, athletics, awareness, brawl, empathy, expression, intimidation, leadership, streetwise, subterfuge |
| Skills | crafts, drive, etiquette, firearms, martialarts, meditation, melee, research, stealth, survival, technology |
| Knowledges | academics, computer, cosmology, enigmas, esoterica, investigation, law, medicine, occult, politics, science |
Spheres mage.* (all integer 0–5)
| Field | Domain |
correspondence | Space, distance, travel |
entropy | Chaos, decay, probability |
forces | Energy, fire, electricity, weather |
life | Living matter, healing, shapeshifting |
matter | Inert substances, alchemy |
mind | Thoughts, perception, illusion |
prime | Quintessence, Resonance, Nodes |
spirit | Umbra, spirits, the Gauntlet |
time | Temporal perception and manipulation |
Backgrounds & Traits mage.*
Named dot-rated entries. Each stored as { title: string(50), value: integer 0–5 }.
| Field | Slots | Notes |
background1–background5 | 5 | Backgrounds (Allies, Arcane, Avatar, Destiny, Fame, Library, etc.) |
trait1–trait5 | 5 | Other advantages, merits, or flaws |
Ratings & Pools mage.*
| Field | Type | Notes |
arete | integer 0–10 | Arete dot rating |
willpower | object | { permanent: integer 1–10, temporary: integer 0–10 } — permanent = dots, temporary = filled squares |
quintessence | integer 0–20 | Quintessence pool (top half of the Wheel of Ptah) |
paradox | integer 0–20 | Paradox pool (bottom half of the Wheel of Ptah) |
health | integer 0–7 | Filled health levels: 0 = Unharmed, 7 = Incapacitated |
Experience & Notes mage.*
| Field | Type | Notes |
experience | integer ≥ 0 | Experience points |
notes | string (5000) | Character notes, backstory, and cabal info |
A complete Vampire: The Masquerade 5th Edition sheet. Attributes and Skills follow the standard three-category layout. Trackers — Health, Willpower, Humanity, Hunger, and Blood Potency — are stored as integer pip counts rather than sub-objects, which makes them easy to compare and do arithmetic on.
Disciplines use named slot objects, each holding a dot rating and up to five named Powers. Advantages (Backgrounds, Merits, Flaws) share a common { type, value } object structure across all their slot groups.
Identity vampire.*
| Field | Type | Notes |
name | string (100) | Character name |
concept | string (100) | Character concept |
chronicle | string (100) | Chronicle name |
ambition | string (200) | Long-term ambition |
desire | string (200) | Short-term desire |
predator | string (32) | Predator type (Alleycat, Bagger, Cleaver, etc.) |
clan | string (32) | Vampire clan |
generation | string (16) | Generation (e.g. "13th") |
sire | string (100) | Sire's name |
Attributes vampire.* (all integer 0–5)
| Category | Fields |
| Physical | strength, dexterity, stamina |
| Social | charisma, manipulation, composure |
| Mental | intelligence, wits, resolve |
Skills vampire.* (all integer 0–5)
| Category | Fields |
| Physical | athletics, brawl, craft, drive, firearms, larceny, melee, stealth, survival |
| Social | animalKen, etiquette, insight, intimidation, leadership, performance, persuasion, streetwise, subterfuge |
| Mental | academics, awareness, finance, investigation, medicine, occult, politics, science, technology |
Morality vampire.*
| Field | Type | Notes |
tenet1–tenet6 | string (500) | Chronicle Tenets — shared moral laws of the chronicle |
touchstone1–touchstone6 | string (500) | Personal Touchstones & Convictions anchoring the character to Humanity |
clanBane1–clanBane6 | string (500) | Clan Bane manifestations specific to this character |
Disciplines vampire.*
| Field | Type | Notes |
disc1–disc6 | object | Each: { type: string(50), value: integer 0–5, power1–power5: string(100) } — type is the Discipline name (e.g. Animalism), value is the dot rating, powers are named abilities |
Trackers vampire.*
All tracker values are stored as integer pip counts (filled squares), not as sub-objects.
| Field | Range | Notes |
health | 0–15 | Damage pips filled (15 total boxes) |
willpower | 0–15 | Willpower pips spent |
humanity | 0–10 | Humanity level (10 = fully human, 0 = the Beast) |
hunger | 0–5 | Hunger level; 5 = frenzying |
bloodPotency | 0–10 | Blood Potency level |
Blood Potency Details vampire.*
Text labels derived from the Blood Potency table. Store the label for the character's current potency level.
| Field | Type | Notes |
bloodSurge | string (50) | Blood Surge bonus, e.g. "+2 dice" |
powerBonus | string (50) | Discipline power bonus at this potency |
feedingPenalty | string (50) | Feeding restriction descriptor |
mendAmount | string (50) | Superficial damage mended per Rouse, e.g. "1 Superficial" |
rouseReroll | string (50) | Rouse check re-roll threshold |
baneSeverity | string (50) | Bane Severity rating |
resonance | string (20) | Current resonance type: Choleric, Melancholy, Phlegmatic, or Sanguine |
hunting | string (32) | Hunting ground or style description |
Advantages vampire.*
All advantage slots store { type: string(64), value: integer 0–5 } where type is the name of the background, merit, or flaw.
| Field | Slots | Notes |
bg1–bg9 | 9 | Backgrounds (Allies, Contacts, Herd, Haven, etc.) |
merit1–merit7 | 7 | Merits |
flaw1–flaw7 | 7 | Flaws |
Haven vampire.*
| Field | Type | Notes |
havenName | string (100) | Haven location name |
havenNone | boolean | True if the character has no haven |
havenRating | integer 0–5 | Haven dot rating |
havenFeat1–havenFeat4 | object | Haven merit/flaw features: { type: string(64), value: integer 0–5 } |
Experience & Weapons vampire.*
| Field | Type | Notes |
expTotal | integer ≥ 0 | Total experience earned |
expSpent | integer ≥ 0 | Experience spent on advancement |
weapon1–weapon6 | object | Each: { name: string(64), dmg: string(32) } |
Biography vampire.*
| Field | Type | Notes |
trueAge | integer ≥ 0 | True age in years since birth |
apparentAge | integer ≥ 0 | Age frozen at the Embrace |
dateOfBirth | string (100) | |
dateOfDeath | string (100) | Date of the Embrace |
appearance | string (5000) | Physical description |
distinguishingFeatures | string (5000) | Notable features |
history | string (5000) | Mortal history and unlife chronicle |
possessions | string (5000) | Notable possessions and havens |
notes | string (5000) | General notes |
Maps directly to the standard RPG Maker MZ actor parameters (MHP, MMP, ATK, DEF, MAT, MDF, AGI, LUK), plus level, class name, XP, and current HP/MP/TP. Storing these in the player's PDS lets compatible games carry a character's progression forward across different sessions and titles without relying on local save files.
| Field | Type | Range | Description |
| level | integer | ≥ 1 | Character level |
| class | string | max 100 | Class name |
| xp | integer | ≥ 0 | Total experience points |
| hp | integer | ≥ 0 | Current hit points |
| maxHp | integer | ≥ 1 | Maximum hit points |
| mp | integer | ≥ 0 | Current magic points |
| maxMp | integer | ≥ 0 | Maximum magic points |
| tp | integer | ≥ 0 | Current tactical points |
| maxTp | integer | ≥ 0 | Maximum tactical points |
| atk | integer | ≥ 1 | Attack power |
| def | integer | ≥ 1 | Defense |
| mat | integer | ≥ 1 | Magic attack |
| mdf | integer | ≥ 1 | Magic defense |
| agi | integer | ≥ 1 | Agility |
| luk | integer | ≥ 1 | Luck |
| hit | integer | 0–100 | Hit rate (%) |
| eva | integer | 0–100 | Evasion rate (%) |
| cri | integer | 0–100 | Critical rate (%) |
The character schema for Playtopia Quest — a lightweight social RPG where your class is how you move through the world, not what spells you have. Classes run from Artist to Weirdo. Alignment is chaos-adjacent. Your bestFriend and worstEnemy are stored as AT Protocol handles.
| Field | Type | Values / Range | Description |
| class | string | Artist, Coder, Gamer, Suit, Weirdo | Character class |
| alignment | string | Ordered, Neutral, Chaotic | Character alignment |
| level | integer | ≥ 1 | Character level |
| health | integer | 0–3 | Health (hearts) |
| bestFriend | string | max 253 | Best friend (AT Protocol handle) |
| worstEnemy | string | max 253 | Worst enemy (AT Protocol handle) |
| traits | array | max 16 items | Personal trait names |
| catchphrase | string | max 200 | Character catchphrase |
| faveColour | string | max 7 | Favourite colour (hex code) |
The spectrum system used by Reverie House. Rather than the traditional good/evil and law/chaos axes, Reverie positions a character across six philosophical dimensions. The combination of values determines an octant classification, which carries narrative meaning within that world.
| Field | Type | Range | Description |
| octant | string | see below | Octant classification |
| oblivion | integer | 0–100 | Oblivion axis |
| entropy | integer | 0–100 | Entropy axis |
| authority | integer | 0–100 | Authority axis |
| liberty | integer | 0–100 | Liberty axis |
| skeptic | integer | 0–100 | Skeptic axis |
| receptive | integer | 0–100 | Receptive axis |
Known octants: adaptive, chaotic, prepared, intended, contented, assertive, ordered, guarded, equilibrium, singling, confused
The original catch-all key from before dedicated system keys were added. The stats[] array accepts any named stat with an optional range and category grouping. It still works, but new integrations should use their own top-level key — the custom key is limited to a single system definition in one record.
Legacy format. The
custom key is supported for backwards compatibility but should not be used for new systems. Use a unique top-level key like
mygame instead — see the
System Keys section of the Developer Guide.
Top-Level Fields
| Field | Type | Range | Description |
| systemName | string | max 100 | Name of the custom system |
| systemVersion | string | max 50 | Version identifier |
| stats | array | — | Array of stat entries (see below) |
Stat Entry Fields
| Field | Type | Required | Description |
| name | string | Yes | Stat name (max 50) |
| value | integer | Yes | Current value |
| min | integer | No | Minimum allowed value |
| max | integer | No | Maximum allowed value |
| category | string | No | Category grouping (max 50) |
Designing a New System: If your game becomes popular enough to warrant its own dedicated system key in the lexicon, reach out via the
contact page. We're actively expanding the schema to support new systems as they find community adoption.