376 lines
12 KiB
JSON
376 lines
12 KiB
JSON
{
|
|
"$schema": "../../../schema/entity-definition.json",
|
|
"id": "character",
|
|
"name": "Player Character",
|
|
"description": "5e Player Character entity with ability scores, proficiencies, hit points, and inventory.",
|
|
"ruleset_id": "open5e",
|
|
"version": "1.0.0",
|
|
"default_template": "character_sheet",
|
|
"allowed_templates": [
|
|
"character_sheet",
|
|
"character_sheet_alt",
|
|
"spellcasting_sheet",
|
|
"stat_block",
|
|
"character_card",
|
|
"character_list_item"
|
|
],
|
|
"schema": {
|
|
"type": "object",
|
|
"required": ["level", "abilities", "hit_points"],
|
|
"properties": {
|
|
"level": {
|
|
"type": "integer",
|
|
"minimum": 1,
|
|
"maximum": 20,
|
|
"description": "Total character level."
|
|
},
|
|
"class": {
|
|
"type": "string",
|
|
"description": "Primary class of the character."
|
|
},
|
|
"race": {
|
|
"type": "string",
|
|
"description": "Character race / species."
|
|
},
|
|
"background": {
|
|
"type": "string",
|
|
"description": "Character background."
|
|
},
|
|
"alignment": {
|
|
"type": "string",
|
|
"description": "Ethical and moral alignment."
|
|
},
|
|
"experience_points": {
|
|
"type": "integer",
|
|
"minimum": 0
|
|
},
|
|
"armor_class": {
|
|
"type": ["integer", "object"],
|
|
"description": "Armor class value or extended property with shield/dex/item modifiers."
|
|
},
|
|
"equipped_armor": {
|
|
"type": ["object", "null"],
|
|
"description": "Currently equipped body armor item snapshot or reference. null if unarmored.",
|
|
"properties": {
|
|
"id": { "type": "string" },
|
|
"name": { "type": "string" },
|
|
"armor_category": {
|
|
"type": "string",
|
|
"enum": ["light", "medium", "heavy"]
|
|
},
|
|
"ac_base": { "type": "integer" },
|
|
"dex_cap": { "type": ["integer", "null"] },
|
|
"stealth_disadvantage": { "type": "boolean" },
|
|
"strength_requirement": { "type": ["integer", "null"] }
|
|
}
|
|
},
|
|
"equipped_shield": {
|
|
"type": ["object", "null"],
|
|
"description": "Currently equipped shield item snapshot or reference. null if no shield is equipped.",
|
|
"properties": {
|
|
"id": { "type": "string" },
|
|
"name": { "type": "string" },
|
|
"ac_bonus": { "type": "integer", "default": 2 },
|
|
"stealth_disadvantage": { "type": "boolean" },
|
|
"strength_requirement": { "type": ["integer", "null"] }
|
|
}
|
|
},
|
|
"speed": {
|
|
"type": "integer",
|
|
"description": "Base walking speed in feet."
|
|
},
|
|
"hit_points": {
|
|
"type": "object",
|
|
"required": ["current", "max"],
|
|
"properties": {
|
|
"current": { "type": "integer" },
|
|
"max": { "type": "integer" },
|
|
"temp": { "type": "integer", "default": 0 }
|
|
}
|
|
},
|
|
"abilities": {
|
|
"type": "object",
|
|
"description": "Core 5e ability scores.",
|
|
"required": [
|
|
"strength",
|
|
"dexterity",
|
|
"constitution",
|
|
"intelligence",
|
|
"wisdom",
|
|
"charisma"
|
|
],
|
|
"properties": {
|
|
"strength": { "type": ["integer", "object"] },
|
|
"dexterity": { "type": ["integer", "object"] },
|
|
"constitution": { "type": ["integer", "object"] },
|
|
"intelligence": { "type": ["integer", "object"] },
|
|
"wisdom": { "type": ["integer", "object"] },
|
|
"charisma": { "type": ["integer", "object"] }
|
|
}
|
|
},
|
|
"player_name": {
|
|
"type": "string",
|
|
"description": "Name of the player controlling this character."
|
|
},
|
|
"subclass": {
|
|
"type": "string",
|
|
"description": "Character archetype or subclass (e.g. Hunter, Champion, Evoker)."
|
|
},
|
|
"inspiration": {
|
|
"type": ["boolean", "integer"],
|
|
"default": false,
|
|
"description": "Heroic inspiration state or count."
|
|
},
|
|
"initiative": {
|
|
"type": ["integer", "object"],
|
|
"description": "Initiative modifier (typically dexterity modifier plus bonuses)."
|
|
},
|
|
"hit_dice": {
|
|
"type": "object",
|
|
"properties": {
|
|
"total": { "type": ["integer", "string"] },
|
|
"current": { "type": ["integer", "string"] },
|
|
"dice": { "type": "string" }
|
|
}
|
|
},
|
|
"death_saves": {
|
|
"type": "object",
|
|
"properties": {
|
|
"successes": {
|
|
"type": "integer",
|
|
"minimum": 0,
|
|
"maximum": 3,
|
|
"default": 0
|
|
},
|
|
"failures": {
|
|
"type": "integer",
|
|
"minimum": 0,
|
|
"maximum": 3,
|
|
"default": 0
|
|
}
|
|
}
|
|
},
|
|
"saving_throws": {
|
|
"type": ["array", "object"],
|
|
"description": "Saving throw proficiencies and bonuses."
|
|
},
|
|
"skills": {
|
|
"type": ["array", "object"],
|
|
"description": "Skill proficiencies and bonuses across the 18 standard 5e skills."
|
|
},
|
|
"passive_perception": {
|
|
"type": ["integer", "object"],
|
|
"description": "Passive Wisdom (Perception) score: typically 10 + perception bonus."
|
|
},
|
|
"other_proficiencies_and_languages": {
|
|
"type": "object",
|
|
"properties": {
|
|
"armor": { "type": "array", "items": { "type": "string" } },
|
|
"weapons": { "type": "array", "items": { "type": "string" } },
|
|
"tools": { "type": "array", "items": { "type": "string" } },
|
|
"languages": { "type": "array", "items": { "type": "string" } }
|
|
}
|
|
},
|
|
"attacks": {
|
|
"type": "array",
|
|
"description": "Weapons and spell attacks for the Attacks & Spellcasting section.",
|
|
"items": {
|
|
"type": "object",
|
|
"required": ["name"],
|
|
"properties": {
|
|
"name": { "type": "string" },
|
|
"atk_bonus": { "type": ["string", "integer"] },
|
|
"damage": { "type": "string" },
|
|
"damage_type": { "type": "string" },
|
|
"range": { "type": "string" },
|
|
"notes": { "type": "string" }
|
|
}
|
|
}
|
|
},
|
|
"currency": {
|
|
"type": "object",
|
|
"properties": {
|
|
"cp": { "type": "integer", "default": 0 },
|
|
"sp": { "type": "integer", "default": 0 },
|
|
"ep": { "type": "integer", "default": 0 },
|
|
"gp": { "type": "integer", "default": 0 },
|
|
"pp": { "type": "integer", "default": 0 }
|
|
}
|
|
},
|
|
"personality_traits": { "type": ["string", "array"] },
|
|
"ideals": { "type": ["string", "array"] },
|
|
"bonds": { "type": ["string", "array"] },
|
|
"flaws": { "type": ["string", "array"] },
|
|
"features_and_traits": {
|
|
"type": "array",
|
|
"description": "Class, racial, and background features.",
|
|
"items": {
|
|
"type": "object",
|
|
"required": ["name"],
|
|
"properties": {
|
|
"name": { "type": "string" },
|
|
"source": { "type": "string" },
|
|
"desc": { "type": "string" }
|
|
}
|
|
}
|
|
},
|
|
"character_details": {
|
|
"type": "object",
|
|
"properties": {
|
|
"age": { "type": ["integer", "string"] },
|
|
"height": { "type": "string" },
|
|
"weight": { "type": "string" },
|
|
"eyes": { "type": "string" },
|
|
"skin": { "type": "string" },
|
|
"hair": { "type": "string" },
|
|
"appearance": { "type": "string" },
|
|
"backstory": { "type": "string" },
|
|
"allies_and_organizations": { "type": ["string", "array"] },
|
|
"treasure": { "type": ["string", "array"] }
|
|
}
|
|
},
|
|
"spellcasting": {
|
|
"type": "object",
|
|
"properties": {
|
|
"class": { "type": "string" },
|
|
"ability": { "type": "string" },
|
|
"save_dc": { "type": ["integer", "object"] },
|
|
"attack_bonus": { "type": ["integer", "object"] },
|
|
"cantrips": {
|
|
"type": "array",
|
|
"items": { "type": ["string", "object"] }
|
|
},
|
|
"slots": {
|
|
"type": "object",
|
|
"description": "Spell slot counts per spell level 1-9.",
|
|
"additionalProperties": {
|
|
"type": "object",
|
|
"properties": {
|
|
"total": { "type": "integer" },
|
|
"expended": { "type": "integer", "default": 0 }
|
|
}
|
|
}
|
|
},
|
|
"spells": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object",
|
|
"required": ["name"],
|
|
"properties": {
|
|
"name": { "type": "string" },
|
|
"level": { "type": "integer", "minimum": 0, "maximum": 9 },
|
|
"prepared": { "type": "boolean", "default": false },
|
|
"desc": { "type": "string" }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"inventory": {
|
|
"type": "array",
|
|
"description": "List of carried items.",
|
|
"items": {
|
|
"type": "object",
|
|
"required": ["id", "name"],
|
|
"properties": {
|
|
"id": { "type": "string" },
|
|
"entity_ref": {
|
|
"type": "string",
|
|
"description": "Optional relative path or identifier of the base item entity."
|
|
},
|
|
"name": { "type": "string" },
|
|
"quantity": { "type": "integer", "default": 1 },
|
|
"weight": { "type": "number", "default": 0 },
|
|
"equipped": { "type": "boolean", "default": false },
|
|
"ac_base": { "type": "integer" },
|
|
"dex_cap": { "type": ["integer", "null"] },
|
|
"ac_bonus": { "type": "integer" },
|
|
"grants_modifiers": {
|
|
"type": "array",
|
|
"items": {
|
|
"type": "object",
|
|
"properties": {
|
|
"target": { "type": "string" },
|
|
"value": { "type": ["number", "string"] },
|
|
"type": { "type": "string" },
|
|
"source": { "type": "string" }
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"additionalProperties": true
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"calculated_properties": {
|
|
"armor_class": {
|
|
"expr": "10 + (equipped_armor ? (equipped_armor.ac_modifier !== undefined ? equipped_armor.ac_modifier : equipped_armor.ac_base - 10) : 0) + (equipped_armor && equipped_armor.dex_cap !== null ? (equipped_armor.dex_cap === 0 ? min(0, abilities.dexterity.modifier) : min(equipped_armor.dex_cap, abilities.dexterity.modifier)) : abilities.dexterity.modifier) + (equipped_shield ? equipped_shield.ac_bonus : 0) + sum(filter(armor_class.modifiers, m => m.active && m.type !== 'armor' && m.type !== 'ability'))",
|
|
"type": "integer",
|
|
"dependencies": [
|
|
"equipped_armor",
|
|
"equipped_shield",
|
|
"abilities.dexterity.modifier",
|
|
"armor_class.modifiers"
|
|
],
|
|
"description": "5e Armor Class calculation: base 10 + armor modifier (e.g. +1 for leather, +8 for plate) + dexterity modifier (capped by armor; heavy armor caps positive dex to 0 but allows negative penalties) + shield bonus + active external modifiers."
|
|
},
|
|
"proficiency_bonus": {
|
|
"expr": "floor((level - 1) / 4) + 2",
|
|
"type": "integer",
|
|
"dependencies": ["level"],
|
|
"description": "Standard 5e proficiency bonus calculation."
|
|
},
|
|
"ability_modifiers.strength": {
|
|
"expr": "floor((abilities.strength - 10) / 2)",
|
|
"type": "integer",
|
|
"dependencies": ["abilities.strength"]
|
|
},
|
|
"ability_modifiers.dexterity": {
|
|
"expr": "floor((abilities.dexterity - 10) / 2)",
|
|
"type": "integer",
|
|
"dependencies": ["abilities.dexterity"]
|
|
},
|
|
"ability_modifiers.constitution": {
|
|
"expr": "floor((abilities.constitution - 10) / 2)",
|
|
"type": "integer",
|
|
"dependencies": ["abilities.constitution"]
|
|
},
|
|
"ability_modifiers.intelligence": {
|
|
"expr": "floor((abilities.intelligence - 10) / 2)",
|
|
"type": "integer",
|
|
"dependencies": ["abilities.intelligence"]
|
|
},
|
|
"ability_modifiers.wisdom": {
|
|
"expr": "floor((abilities.wisdom - 10) / 2)",
|
|
"type": "integer",
|
|
"dependencies": ["abilities.wisdom"]
|
|
},
|
|
"ability_modifiers.charisma": {
|
|
"expr": "floor((abilities.charisma - 10) / 2)",
|
|
"type": "integer",
|
|
"dependencies": ["abilities.charisma"]
|
|
}
|
|
},
|
|
"default_values": {
|
|
"level": 1,
|
|
"equipped_armor": null,
|
|
"equipped_shield": null,
|
|
"abilities": {
|
|
"strength": 10,
|
|
"dexterity": 10,
|
|
"constitution": 10,
|
|
"intelligence": 10,
|
|
"wisdom": 10,
|
|
"charisma": 10
|
|
},
|
|
"hit_points": {
|
|
"current": 10,
|
|
"max": 10,
|
|
"temp": 0
|
|
},
|
|
"speed": 30,
|
|
"inventory": []
|
|
}
|
|
}
|