neon-sprawl/content/schemas/ability-def.schema.json

42 lines
1.7 KiB
JSON

{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://neon-sprawl.local/schemas/ability-def.json",
"title": "AbilityDef",
"description": "Single combat ability row for catalogs (e.g. content/abilities/*_abilities.json). IDs are stable forever—rename display in displayName only. See docs/decomposition/modules/E5_M1_CombatRulesEngine.md.",
"type": "object",
"additionalProperties": false,
"required": ["id", "displayName", "baseDamage", "maxRange", "cooldownSeconds"],
"properties": {
"id": {
"type": "string",
"pattern": "^[a-z][a-z0-9_]*$",
"description": "Immutable ability key for hotbar bindings, cast requests, telemetry, and combat resolution. Never change after content ships; add a new id if the ability splits."
},
"displayName": {
"type": "string",
"minLength": 1,
"description": "Player-facing label; safe to change without migrating character data."
},
"baseDamage": {
"type": "integer",
"minimum": 0,
"description": "Deterministic damage dealt on successful combat resolve in prototype Slice 1 (no miss/crit RNG)."
},
"maxRange": {
"type": "number",
"exclusiveMinimum": 0,
"description": "Horizontal maximum reach for this ability at combat resolve (XZ-only at runtime)."
},
"cooldownSeconds": {
"type": "number",
"exclusiveMinimum": 0,
"description": "Per-ability cooldown duration applied on successful resolve once E5.M1 wires catalog timing."
},
"abilityKind": {
"type": "string",
"description": "Optional UX grouping for HUD and tooling (attack vs utility vs movement).",
"enum": ["attack", "utility", "movement"]
}
}
}