xyvera/content/schema/character.yaml
caoimhinr fb00954954 Initial scaffold: Nakama backend, Godot client, content schema
Sets up the Step 1 (Project Foundation) and Step 2 (Content Schemas) scaffold
from the implementation sequence. Includes Docker Compose stack, Nakama
TypeScript module stubs, PostgreSQL migration, Godot 4 project shell with
scene stubs and NakamaClient singleton, YAML content schemas for all entity
types, and example data for 3 characters, 2 jobs, and all 7 core resources.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-02 23:33:06 +02:00

165 lines
4.7 KiB
YAML

# character.yaml — schema definition for Xyvera character content files
#
# Every file under content/data/characters/ must conform to this schema.
# Run `tools/validate_content.py` to check all data files against schemas.
#
# Design notes from spec:
# - Rarity: R / SR / SSR / UR (four-tier PoC model; full ladder naming deferred)
# - Combat roles: recon, sabotage, healer, support, tank, glass_cannon
# - Profession roles: miner, lumberjack, researcher, construction, farmer, trainer
# - Male and female presentation variants are art/naming only; mechanics identical
# - No duplicate-dependency model: progression uses universal materials, bonds,
# and assignment mastery
$schema: "xyvera/content-schema/character/v1"
type: object
required:
- id
- name
- rarity
- combat_role
- profession
- base_stats
- skills
- suitability_bonuses
properties:
id:
type: string
description: "Unique character identifier. Snake_case. Shared between male/female variants."
pattern: "^[a-z][a-z0-9_]*$"
example: "lyra_stoneheart"
name:
type: object
description: "Display names for each presentation variant."
required: [female]
properties:
female:
type: string
example: "Lyra Stoneheart"
male:
type: string
example: "Leon Stoneheart"
additionalProperties: false
rarity:
type: string
enum: [R, SR, SSR, UR]
description: "R = common filler, SR = reliable specialist, SSR = premium, UR = rare/prestige"
combat_role:
type: string
enum: [recon, sabotage, healer, support, tank, glass_cannon]
profession:
type: string
enum: [miner, lumberjack, researcher, construction, farmer, trainer]
description: "Primary village assignment profession. Used to determine suitability bonuses."
region_origin:
type: string
description: "World region this character is associated with. Affects banner pools and event tags."
example: "heartwood_vale"
element:
type: string
enum: [fire, water, earth, wind, light, shadow, null]
description: "Optional elemental archetype. 'null' means no element."
default: "null"
personality:
type: string
description: "Short personality descriptor used for relationship flavor and dialogue tags."
example: "stoic_protector"
base_stats:
type: object
description: "Stats at level 1 / ascension 0. Scaling is applied by the server formula."
required: [hp, attack, defense, speed]
properties:
hp:
type: integer
minimum: 1
attack:
type: integer
minimum: 1
defense:
type: integer
minimum: 1
speed:
type: integer
minimum: 1
crit_rate:
type: number
minimum: 0.0
maximum: 1.0
default: 0.05
crit_damage:
type: number
minimum: 1.0
default: 1.5
additionalProperties: false
skills:
type: array
description: "Character skills. First entry is the combat passive; second is the signature active."
minItems: 1
maxItems: 4
items:
type: object
required: [id, name, description, type]
properties:
id:
type: string
pattern: "^[a-z][a-z0-9_]*$"
name:
type: string
description:
type: string
type:
type: string
enum: [passive, active, ultimate]
max_level:
type: integer
minimum: 1
maximum: 10
default: 5
upgrade_cost_per_level:
type: object
description: "Resource costs to advance one skill level. Keys are resource IDs."
additionalProperties:
type: integer
minimum: 0
suitability_bonuses:
type: object
description: >
Multiplier applied to passive output when this character is assigned to a matching
job slot. A character with their primary profession gets 1.5x; secondary gets 1.2x;
unmatched gets 1.0x (no bonus). These values override the defaults.
properties:
primary_profession_multiplier:
type: number
minimum: 1.0
default: 1.5
secondary_professions:
type: array
items:
type: string
enum: [miner, lumberjack, researcher, construction, farmer, trainer]
description: "Additional professions where this character earns the secondary bonus."
additionalProperties: false
bond_hooks:
type: array
description: "Relationship flavor tags used to unlock bond dialogue and minor stat bonuses."
items:
type: string
example: ["loyalty", "mentor", "rival"]
lore_summary:
type: string
description: "One or two sentence background. Minimal story as per spec."