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>
This commit is contained in:
commit
fb00954954
37 changed files with 2730 additions and 0 deletions
165
content/schema/character.yaml
Normal file
165
content/schema/character.yaml
Normal file
|
|
@ -0,0 +1,165 @@
|
|||
# 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."
|
||||
Loading…
Add table
Add a link
Reference in a new issue