Add two prototype factions, extend quest bundles with reputationGrants and factionGateRules, freeze five-quest roster in validate_content.py, and sync minimal server quest roster parity for green startup tests. |
||
|---|---|---|
| .. | ||
| abilities | ||
| encounters | ||
| factions | ||
| items | ||
| mastery | ||
| npc-behaviors | ||
| quests | ||
| recipes | ||
| resource-nodes | ||
| reward-tables | ||
| schemas | ||
| skills | ||
| README.md | ||
README.md
Content data
Data-driven definitions (skills, items, recipes, quests) validated in CI with JSON Schema.
| Path | Purpose |
|---|---|
schemas/ |
JSON Schema files (*.schema.json) |
skills/ |
Skill catalogs; each row matches schemas/skill-def.schema.json — stable id, allowedXpSourceKinds for E2.M1 / E2.M2 |
mastery/ |
Mastery catalogs; each file matches schemas/mastery-catalog.schema.json — stable branchId / perkId, tier gates via skill level (E2.M3) |
items/ |
Item catalogs; each row matches schemas/item-def.schema.json — stable id, stackMax, inventorySlotKind for E3.M3 |
recipes/ |
Recipe catalogs; each row matches schemas/recipe-def.schema.json — stable id, recipeKind, requiredSkillId, inputs/outputs for E3.M2 |
abilities/ |
Combat ability catalogs; each row matches schemas/ability-def.schema.json — stable id, baseDamage, cooldownSeconds for E5.M1 |
npc-behaviors/ |
NPC behavior archetype catalogs; each row matches schemas/npc-behavior-def.schema.json — stable id, archetypeKind, aggro/leash radii, telegraph + attack timings for E5.M2 |
encounters/ |
Encounter templates; each row matches schemas/encounter-def.schema.json — stable id, completion criteria, rewardTableId for E5.M3 |
reward-tables/ |
Reward table catalogs; each row matches schemas/reward-table.schema.json — stable id, fixedGrants referencing frozen item ids for E5.M3 |
quests/ |
Quest catalogs; each row matches schemas/quest-def.schema.json (steps via quest-step-def.schema.json, objectives via quest-objective-def.schema.json) — stable id, prerequisiteQuestIds, optional factionGateRules, step/objective graph for E7.M1 / E7.M3 |
factions/ |
Faction catalogs; each row matches schemas/faction-def.schema.json — stable id, standing band for E7.M3 |
resource-nodes/ |
Resource node + yield catalogs; node rows match schemas/resource-node-def.schema.json, yield rows match schemas/resource-yield-row.schema.json — stable nodeDefId, gatherLens, maxGathers for E3.M1 |
Prototype Slice 1 (NEO-33): CI expects exactly three skill rows with ids salvage, refine, intrusion (gather + process + tech). Each row must declare allowedXpSourceKinds (non-empty); see E2.M1 — Designer note: allowedXpSourceKinds for what each kind means for grant wiring.
Prototype Slice 2 — resource nodes (NEO-57): CI expects exactly four nodeDefId values aligned to E3.M1 gather lens freeze — one row per gatherLens; exactly one yield row per node referencing scrap_metal_bulk only. Do not rename nodeDefId after ship. See E3M1-prototype-backlog.md and NEO-57 plan.
Prototype Slice 1 — items (NEO-50): CI expects exactly six item rows with ids scrap_metal_bulk, refined_plate_stock, field_stim_mk0, survey_drone_kit, contract_handoff_token, prototype_armor_shell — one row per prototypeRole (material through equip_stub). Do not rename ids after ship—change displayName only. See E3.M3 — Designer note and freeze table.
Prototype Slice 3 — recipes (E3M2-01): CI expects exactly eight recipe ids aligned to E3.M2 recipe freeze — at least one process and one make row; all requiredSkillId values refine; every input/output itemId from the frozen item catalog. Do not rename recipe id after ship. See E3M2-prototype-backlog.md.
Prototype E5 Slice 1 — abilities (NEO-76): CI expects exactly four ability ids aligned to E5.M1 ability freeze — prototype_pulse, prototype_guard, prototype_dash, prototype_burst. Do not rename ability id after ship—change displayName only. See E5M1-prototype-backlog.md and NEO-76 plan.
Prototype E5 Slice 2 — NPC behaviors (NEO-87): CI expects exactly three npc behavior ids aligned to E5.M2 behavior freeze — prototype_melee_pressure, prototype_ranged_control, prototype_elite_mini_boss. Each row requires leashRadius > aggroRadius. Do not rename behavior id after ship—change displayName only. See E5M2-prototype-backlog.md and NEO-87 plan.
Prototype E5 Slice 3 — encounters + rewards (NEO-100): CI expects exactly one encounter id prototype_combat_pocket and one reward table id prototype_combat_pocket_clear aligned to E5.M3 encounter freeze. requiredNpcInstanceIds must match the three E5.M2 NPC instance ids; fixedGrants reference frozen item ids only. Do not rename ids after ship—change displayName only. See E5M3-prototype-backlog.md.
Prototype E7 Slice 1 — quests (NEO-112): CI expects exactly four quest ids aligned to E7.M1 quest freeze — prototype_quest_gather_intro, prototype_quest_refine_intro, prototype_quest_combat_intro, prototype_quest_operator_chain. Objective itemId / recipeId / encounterId cross-refs must resolve to frozen item, recipe, and encounter catalogs; prerequisiteQuestIds must be acyclic and reference known quest ids; operator chain terminal step is inventory_has_item contract_handoff_token ×1. Do not rename quest id after ship—change displayName only. See E7M1-prototype-backlog.md and NEO-112 plan.
Prototype E7 Slice 2 — quest completion bundles (NEO-124): Each frozen quest id must include completionRewardBundle with itemGrants / skillXpGrants per E7.M2 completion freeze. Bundle itemGrants[].itemId must resolve to the frozen item catalog; skillXpGrants[].skillId must resolve to a skill that lists mission_reward in allowedXpSourceKinds. Omit empty itemGrants. See E7M2-prototype-backlog.md and NEO-124 plan.
Prototype E7 Slice 3 — factions + gated quest line (NEO-133): CI expects exactly two faction ids aligned to E7.M3 faction freeze — prototype_faction_grid_operators, prototype_faction_rust_collective. Quest roster expands to five ids (four E7.M1 onboarding + prototype_quest_grid_contract). factionGateRules[].factionId and completionRewardBundle.reputationGrants[].factionId must resolve to the frozen faction catalog; grid contract shape is frozen in CI. See E7M3-pre-production-backlog.md and NEO-133 plan.
Prototype Slice 4 (NEO-45): CI expects exactly one MasteryTrack for salvage only (refine / intrusion have no mastery rows yet). Tier 1 @ skill level 2 is a mutually exclusive branch pick (scrap_efficiency vs bulk_haul) with no perks; tier 2 @ level 4 unlocks one perk per branch path. Do not rename branchId / perkId after ship—change displayName only. See E2.M3 — Designer note and freeze table.
Server load path and hot-reload policy are TBD; keep files versioned here as the source of truth.
Validate locally (same as PR gate):
pip install -r scripts/requirements-content.txt
python scripts/validate_content.py
python scripts/check_decomposition_language.py