diff --git a/content/_meta/README.md b/content/_meta/README.md index 0800a891a..1412d8343 100644 --- a/content/_meta/README.md +++ b/content/_meta/README.md @@ -4,3 +4,47 @@ Directories prefixed with `_` are infrastructure, not game content. The server c - `_meta/` — Infrastructure metadata (this directory) - `_schema/` — JSON Schema validation files (draft 2020-12) + +## Directory Hierarchy + +Content is organized hierarchically to match the game universe: + +``` +content/ + content.yaml # Manifest: campaign list, glob discovery patterns + global/ # Cross-campaign shared content (factions, enums, knowledge) + campaigns/ + {campaign}/ # e.g., "main" + campaign.yaml + systems/ + {system}/ # e.g., "krenn" + system.yaml + stations/ + {station}/ # e.g., "sova" + station.yaml + districts/ + {district}/ # e.g., "transit" + district.yaml + npcs/ + locations/ + triangles/ + dialogue/ + monologue/ + routines/ + templates/ +``` + +## Canonical ID Derivation + +Identity is derived from directory path at load time — no redundant ID fields in YAML. + +- **District:** `{system}.{station}.{district}` (e.g., `krenn.sova.transit`) +- **NPC (within district):** `npc:{slug}` (e.g., `npc:kael-davan`) +- **NPC (cross-district):** `npc:{district}.{slug}` (e.g., `npc:transit.kael-davan`) +- **Location:** `{system}.{station}.{district}.location.{slug}` + +## Content Discovery + +The loader reads `content.yaml` for enabled campaigns and their glob patterns. +District discovery uses `systems/**/districts/*/district.yaml` — no per-district +manifest entry needed. Adding a district = creating a directory with district.yaml. diff --git a/content/_schema/campaign.schema.json b/content/_schema/campaign.schema.json new file mode 100644 index 000000000..37d54c93c --- /dev/null +++ b/content/_schema/campaign.schema.json @@ -0,0 +1,22 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "campaign.schema.json", + "title": "Campaign Metadata", + "description": "Campaign definition file — one per campaign directory (D-003).", + "type": "object", + "required": ["display_name", "description"], + "additionalProperties": false, + "properties": { + "display_name": { + "type": "string", + "minLength": 1 + }, + "description": { + "type": "string" + }, + "version": { + "type": "string", + "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$" + } + } +} diff --git a/content/_schema/district.schema.json b/content/_schema/district.schema.json index 43bf67a5e..c5ba67c71 100644 --- a/content/_schema/district.schema.json +++ b/content/_schema/district.schema.json @@ -2,15 +2,15 @@ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "district.schema.json", "title": "District Metadata", - "description": "District definition file — one per district directory (D-036).", + "description": "District definition file — one per district directory (D-036). Identity derived from directory path.", "type": "object", - "required": ["display_name", "system", "station", "district", "description", "locations", "npc_count"], + "required": ["display_name", "description", "locations", "npc_count"], "additionalProperties": false, "properties": { "canonical_id": { "type": "string", "pattern": "^[a-z]+\\.[a-z]+\\.[a-z-]+$", - "description": "Optional — derived from directory path at load time. If present, must match {system}.{station}.{district}." + "description": "Deprecated — derived from directory path at load time. If present, must match {system}.{station}.{district}." }, "display_name": { "type": "string", @@ -18,15 +18,18 @@ }, "system": { "type": "string", - "pattern": "^[a-z]+$" + "pattern": "^[a-z]+$", + "description": "Deprecated — derived from directory path." }, "station": { "type": "string", - "pattern": "^[a-z]+$" + "pattern": "^[a-z]+$", + "description": "Deprecated — derived from directory path." }, "district": { "type": "string", - "pattern": "^[a-z-]+$" + "pattern": "^[a-z-]+$", + "description": "Deprecated — derived from directory path." }, "description": { "type": "string", diff --git a/content/_schema/npc-profile.schema.json b/content/_schema/npc-profile.schema.json index 584135461..5b23c3a97 100644 --- a/content/_schema/npc-profile.schema.json +++ b/content/_schema/npc-profile.schema.json @@ -9,8 +9,8 @@ "properties": { "canonical_id": { "type": "string", - "pattern": "^npc:[a-z][a-z0-9-]*$", - "description": "Short-form canonical ID: npc:{slug}" + "pattern": "^npc:([a-z][a-z0-9-]+\\.)?[a-z][a-z0-9-]*$", + "description": "Canonical ID: npc:{slug} (within district) or npc:{district}.{slug} (cross-district)" }, "display_name": { "type": "string", @@ -167,7 +167,7 @@ "properties": { "target": { "type": "string", - "pattern": "^npc:[a-z][a-z0-9-]*$" + "pattern": "^npc:([a-z][a-z0-9-]+\\.)?[a-z][a-z0-9-]*$" }, "kind": { "type": "string", diff --git a/content/_schema/station.schema.json b/content/_schema/station.schema.json new file mode 100644 index 000000000..63f91bd2a --- /dev/null +++ b/content/_schema/station.schema.json @@ -0,0 +1,26 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "station.schema.json", + "title": "Station Metadata", + "description": "Station definition file — one per station directory (D-036).", + "type": "object", + "required": ["display_name"], + "additionalProperties": false, + "properties": { + "display_name": { + "type": "string", + "minLength": 1 + }, + "description": { + "type": "string" + }, + "districts": { + "type": "array", + "items": { + "type": "string", + "pattern": "^[a-z][a-z0-9-]*$" + }, + "uniqueItems": true + } + } +} diff --git a/content/_schema/system.schema.json b/content/_schema/system.schema.json new file mode 100644 index 000000000..5733ab01e --- /dev/null +++ b/content/_schema/system.schema.json @@ -0,0 +1,26 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "system.schema.json", + "title": "Star System Metadata", + "description": "System definition file — one per system directory (D-036).", + "type": "object", + "required": ["display_name"], + "additionalProperties": false, + "properties": { + "display_name": { + "type": "string", + "minLength": 1 + }, + "description": { + "type": "string" + }, + "stations": { + "type": "array", + "items": { + "type": "string", + "pattern": "^[a-z][a-z0-9-]*$" + }, + "uniqueItems": true + } + } +} diff --git a/content/campaigns/main/campaign.yaml b/content/campaigns/main/campaign.yaml new file mode 100644 index 000000000..580e41efd --- /dev/null +++ b/content/campaigns/main/campaign.yaml @@ -0,0 +1,7 @@ +# Main Campaign metadata (D-003) +display_name: "The Settled Reach" +description: > + The core campaign. Set in a universe of wormhole-connected star systems, + neural lattice technology, and faction-driven politics. Occlusion-based + detective game with combat elements. +version: "0.1.0" diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/maintenance-corridors/ring-operative.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/maintenance-corridors/ring-operative.yaml new file mode 100644 index 000000000..3dda7d312 --- /dev/null +++ b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/maintenance-corridors/ring-operative.yaml @@ -0,0 +1,2 @@ +# TODO: Revise structure when automatic dialogue/monologue generators mature (D-028 Tier 2). +# Dialogue: ring-operative at Maintenance Corridors diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-last-shift/bar-owner.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-last-shift/bar-owner.yaml new file mode 100644 index 000000000..88c87ec6d --- /dev/null +++ b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-last-shift/bar-owner.yaml @@ -0,0 +1,2 @@ +# TODO: Revise structure when automatic dialogue/monologue generators mature (D-028 Tier 2). +# Dialogue: bar-owner at The Last Shift diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-last-shift/bar-regular.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-last-shift/bar-regular.yaml new file mode 100644 index 000000000..0de4ccb95 --- /dev/null +++ b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-last-shift/bar-regular.yaml @@ -0,0 +1,2 @@ +# TODO: Revise structure when automatic dialogue/monologue generators mature (D-028 Tier 2). +# Dialogue: bar-regular at The Last Shift diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-last-shift/bartender.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-last-shift/bartender.yaml new file mode 100644 index 000000000..446433be0 --- /dev/null +++ b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-last-shift/bartender.yaml @@ -0,0 +1,2 @@ +# TODO: Revise structure when automatic dialogue/monologue generators mature (D-028 Tier 2). +# Dialogue: bartender at The Last Shift diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-terminal/courier.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-terminal/courier.yaml new file mode 100644 index 000000000..fa38656a7 --- /dev/null +++ b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-terminal/courier.yaml @@ -0,0 +1,2 @@ +# TODO: Revise structure when automatic dialogue/monologue generators mature (D-028 Tier 2). +# Dialogue: courier at The Terminal diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-terminal/dock-worker.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-terminal/dock-worker.yaml new file mode 100644 index 000000000..91d1b6884 --- /dev/null +++ b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-terminal/dock-worker.yaml @@ -0,0 +1,2 @@ +# TODO: Revise structure when automatic dialogue/monologue generators mature (D-028 Tier 2). +# Dialogue: dock-worker at The Terminal diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-terminal/new-hire.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-terminal/new-hire.yaml new file mode 100644 index 000000000..acc580252 --- /dev/null +++ b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-terminal/new-hire.yaml @@ -0,0 +1,2 @@ +# TODO: Revise structure when automatic dialogue/monologue generators mature (D-028 Tier 2). +# Dialogue: new-hire at The Terminal diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-terminal/scheduler.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-terminal/scheduler.yaml new file mode 100644 index 000000000..06371e336 --- /dev/null +++ b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-terminal/scheduler.yaml @@ -0,0 +1,2 @@ +# TODO: Revise structure when automatic dialogue/monologue generators mature (D-028 Tier 2). +# Dialogue: scheduler at The Terminal diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-terminal/shift-supervisor.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-terminal/shift-supervisor.yaml new file mode 100644 index 000000000..3c5c35f79 --- /dev/null +++ b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/dialogue/the-terminal/shift-supervisor.yaml @@ -0,0 +1,2 @@ +# TODO: Revise structure when automatic dialogue/monologue generators mature (D-028 Tier 2). +# Dialogue: shift-supervisor at The Terminal diff --git a/content/districts/sova-transit/district.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/district.yaml similarity index 65% rename from content/districts/sova-transit/district.yaml rename to content/campaigns/main/systems/krenn/stations/sova/districts/transit/district.yaml index d9654c10f..4aefb6f45 100644 --- a/content/districts/sova-transit/district.yaml +++ b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/district.yaml @@ -1,10 +1,7 @@ # Sova Transit District metadata (D-036) -# Source of truth for identity: directory path (districts/sova-transit/). -# canonical_id is derived from the path at load time by ContentValidator. +# Identity derived from directory path: campaigns/main/systems/krenn/stations/sova/districts/transit/ +# canonical_id: krenn.sova.transit (derived at load time by ContentValidator) display_name: "Sova Transit District" -system: "krenn" -station: "sova" -district: "transit" description: > A 40-year-old prefab-modular-retrofitted freight logistics hub on Station Sova. Three social sites: The Terminal (logistics hub), The Last Shift (bar), diff --git a/content/districts/sova-transit/locations/maintenance-corridors.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/locations/maintenance-corridors.yaml similarity index 100% rename from content/districts/sova-transit/locations/maintenance-corridors.yaml rename to content/campaigns/main/systems/krenn/stations/sova/districts/transit/locations/maintenance-corridors.yaml diff --git a/content/districts/sova-transit/locations/the-last-shift.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/locations/the-last-shift.yaml similarity index 100% rename from content/districts/sova-transit/locations/the-last-shift.yaml rename to content/campaigns/main/systems/krenn/stations/sova/districts/transit/locations/the-last-shift.yaml diff --git a/content/districts/sova-transit/locations/the-terminal.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/locations/the-terminal.yaml similarity index 100% rename from content/districts/sova-transit/locations/the-terminal.yaml rename to content/campaigns/main/systems/krenn/stations/sova/districts/transit/locations/the-terminal.yaml diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/detective/general.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/detective/general.yaml new file mode 100644 index 000000000..d8df251ae --- /dev/null +++ b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/detective/general.yaml @@ -0,0 +1,2 @@ +# TODO: Revise structure when automatic dialogue/monologue generators mature (D-028 Tier 2). +# Monologue: detective at general diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/detective/maintenance-corridors.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/detective/maintenance-corridors.yaml new file mode 100644 index 000000000..3c7758eb9 --- /dev/null +++ b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/detective/maintenance-corridors.yaml @@ -0,0 +1,2 @@ +# TODO: Revise structure when automatic dialogue/monologue generators mature (D-028 Tier 2). +# Monologue: detective at maintenance-corridors diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/detective/the-last-shift.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/detective/the-last-shift.yaml new file mode 100644 index 000000000..ef61e3f81 --- /dev/null +++ b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/detective/the-last-shift.yaml @@ -0,0 +1,2 @@ +# TODO: Revise structure when automatic dialogue/monologue generators mature (D-028 Tier 2). +# Monologue: detective at the-last-shift diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/detective/the-terminal.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/detective/the-terminal.yaml new file mode 100644 index 000000000..d3d199329 --- /dev/null +++ b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/detective/the-terminal.yaml @@ -0,0 +1,2 @@ +# TODO: Revise structure when automatic dialogue/monologue generators mature (D-028 Tier 2). +# Monologue: detective at the-terminal diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/smuggler/general.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/smuggler/general.yaml new file mode 100644 index 000000000..46efbe223 --- /dev/null +++ b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/smuggler/general.yaml @@ -0,0 +1,2 @@ +# TODO: Revise structure when automatic dialogue/monologue generators mature (D-028 Tier 2). +# Monologue: smuggler at general diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/smuggler/maintenance-corridors.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/smuggler/maintenance-corridors.yaml new file mode 100644 index 000000000..b1bdb0778 --- /dev/null +++ b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/smuggler/maintenance-corridors.yaml @@ -0,0 +1,2 @@ +# TODO: Revise structure when automatic dialogue/monologue generators mature (D-028 Tier 2). +# Monologue: smuggler at maintenance-corridors diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/smuggler/the-last-shift.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/smuggler/the-last-shift.yaml new file mode 100644 index 000000000..24304988d --- /dev/null +++ b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/smuggler/the-last-shift.yaml @@ -0,0 +1,2 @@ +# TODO: Revise structure when automatic dialogue/monologue generators mature (D-028 Tier 2). +# Monologue: smuggler at the-last-shift diff --git a/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/smuggler/the-terminal.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/smuggler/the-terminal.yaml new file mode 100644 index 000000000..9c7de827b --- /dev/null +++ b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/monologue/smuggler/the-terminal.yaml @@ -0,0 +1,2 @@ +# TODO: Revise structure when automatic dialogue/monologue generators mature (D-028 Tier 2). +# Monologue: smuggler at the-terminal diff --git a/content/districts/sova-transit/npcs/devra.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/devra.yaml similarity index 100% rename from content/districts/sova-transit/npcs/devra.yaml rename to content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/devra.yaml diff --git a/content/districts/sova-transit/npcs/drin.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/drin.yaml similarity index 100% rename from content/districts/sova-transit/npcs/drin.yaml rename to content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/drin.yaml diff --git a/content/districts/sova-transit/npcs/harek.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/harek.yaml similarity index 100% rename from content/districts/sova-transit/npcs/harek.yaml rename to content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/harek.yaml diff --git a/content/districts/sova-transit/npcs/kael-davan.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/kael-davan.yaml similarity index 100% rename from content/districts/sova-transit/npcs/kael-davan.yaml rename to content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/kael-davan.yaml diff --git a/content/districts/sova-transit/npcs/lera-sessik.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/lera-sessik.yaml similarity index 100% rename from content/districts/sova-transit/npcs/lera-sessik.yaml rename to content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/lera-sessik.yaml diff --git a/content/districts/sova-transit/npcs/maret-korr.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/maret-korr.yaml similarity index 100% rename from content/districts/sova-transit/npcs/maret-korr.yaml rename to content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/maret-korr.yaml diff --git a/content/districts/sova-transit/npcs/naia-tamm.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/naia-tamm.yaml similarity index 100% rename from content/districts/sova-transit/npcs/naia-tamm.yaml rename to content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/naia-tamm.yaml diff --git a/content/districts/sova-transit/npcs/olin.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/olin.yaml similarity index 100% rename from content/districts/sova-transit/npcs/olin.yaml rename to content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/olin.yaml diff --git a/content/districts/sova-transit/npcs/pell.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/pell.yaml similarity index 100% rename from content/districts/sova-transit/npcs/pell.yaml rename to content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/pell.yaml diff --git a/content/districts/sova-transit/npcs/renn.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/renn.yaml similarity index 100% rename from content/districts/sova-transit/npcs/renn.yaml rename to content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/renn.yaml diff --git a/content/districts/sova-transit/npcs/resha.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/resha.yaml similarity index 100% rename from content/districts/sova-transit/npcs/resha.yaml rename to content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/resha.yaml diff --git a/content/districts/sova-transit/npcs/sabel.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/sabel.yaml similarity index 100% rename from content/districts/sova-transit/npcs/sabel.yaml rename to content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/sabel.yaml diff --git a/content/districts/sova-transit/npcs/sera-venn.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/sera-venn.yaml similarity index 100% rename from content/districts/sova-transit/npcs/sera-venn.yaml rename to content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/sera-venn.yaml diff --git a/content/districts/sova-transit/npcs/sess.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/sess.yaml similarity index 100% rename from content/districts/sova-transit/npcs/sess.yaml rename to content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/sess.yaml diff --git a/content/districts/sova-transit/npcs/tav.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/tav.yaml similarity index 100% rename from content/districts/sova-transit/npcs/tav.yaml rename to content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/tav.yaml diff --git a/content/districts/sova-transit/npcs/torek-lintar.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/torek-lintar.yaml similarity index 100% rename from content/districts/sova-transit/npcs/torek-lintar.yaml rename to content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/torek-lintar.yaml diff --git a/content/districts/sova-transit/npcs/voss.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/voss.yaml similarity index 100% rename from content/districts/sova-transit/npcs/voss.yaml rename to content/campaigns/main/systems/krenn/stations/sova/districts/transit/npcs/voss.yaml diff --git a/content/districts/sova-transit/routines/schedules.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/routines/schedules.yaml similarity index 100% rename from content/districts/sova-transit/routines/schedules.yaml rename to content/campaigns/main/systems/krenn/stations/sova/districts/transit/routines/schedules.yaml diff --git a/content/districts/sova-transit/templates/.gitkeep b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/templates/.gitkeep similarity index 100% rename from content/districts/sova-transit/templates/.gitkeep rename to content/campaigns/main/systems/krenn/stations/sova/districts/transit/templates/.gitkeep diff --git a/content/districts/sova-transit/triangles/bar-tensions.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/triangles/bar-tensions.yaml similarity index 100% rename from content/districts/sova-transit/triangles/bar-tensions.yaml rename to content/campaigns/main/systems/krenn/stations/sova/districts/transit/triangles/bar-tensions.yaml diff --git a/content/districts/sova-transit/triangles/hub-power.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/triangles/hub-power.yaml similarity index 100% rename from content/districts/sova-transit/triangles/hub-power.yaml rename to content/campaigns/main/systems/krenn/stations/sova/districts/transit/triangles/hub-power.yaml diff --git a/content/districts/sova-transit/triangles/informant-question.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/triangles/informant-question.yaml similarity index 100% rename from content/districts/sova-transit/triangles/informant-question.yaml rename to content/campaigns/main/systems/krenn/stations/sova/districts/transit/triangles/informant-question.yaml diff --git a/content/districts/sova-transit/triangles/worried-knowledge.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/triangles/worried-knowledge.yaml similarity index 100% rename from content/districts/sova-transit/triangles/worried-knowledge.yaml rename to content/campaigns/main/systems/krenn/stations/sova/districts/transit/triangles/worried-knowledge.yaml diff --git a/content/districts/sova-transit/triangles/worried-partner.yaml b/content/campaigns/main/systems/krenn/stations/sova/districts/transit/triangles/worried-partner.yaml similarity index 100% rename from content/districts/sova-transit/triangles/worried-partner.yaml rename to content/campaigns/main/systems/krenn/stations/sova/districts/transit/triangles/worried-partner.yaml diff --git a/content/campaigns/main/systems/krenn/stations/sova/station.yaml b/content/campaigns/main/systems/krenn/stations/sova/station.yaml new file mode 100644 index 000000000..79acac6dc --- /dev/null +++ b/content/campaigns/main/systems/krenn/stations/sova/station.yaml @@ -0,0 +1,7 @@ +# Station Sova metadata (D-036) +display_name: "Station Sova" +description: > + A freight logistics station in the Krenn system. 40-year-old prefab-modular + facility serving the span gate's cargo throughput. ~12,000 population. +districts: + - "transit" diff --git a/content/campaigns/main/systems/krenn/system.yaml b/content/campaigns/main/systems/krenn/system.yaml new file mode 100644 index 000000000..2885563c4 --- /dev/null +++ b/content/campaigns/main/systems/krenn/system.yaml @@ -0,0 +1,8 @@ +# Krenn System metadata (D-036) +display_name: "Krenn System" +description: > + A mid-tier system connected via the Sova span gate. Industrial economy + centered on freight logistics and lattice component trade. ~2.4M population, + ~180 years settled. +stations: + - "sova" diff --git a/content/content.yaml b/content/content.yaml index a62b6031c..b8cf26b1a 100644 --- a/content/content.yaml +++ b/content/content.yaml @@ -1,7 +1,11 @@ # Content manifest — The Settled Reach v0.1 -# The server reads this first to discover enabled districts and load order. +# The server reads this first to discover campaigns and content layout. +# District discovery uses glob patterns — no per-district listing needed. version: "0.1.0" -districts: - - id: "sova-transit" - path: "districts/sova-transit" + +campaigns: + - id: "main" + path: "campaigns/main" enabled: true + discovery: + districts: "systems/**/districts/*/district.yaml" diff --git a/content/districts/sova-transit/dialogue/maintenance-corridors/ring-operative.yaml b/content/districts/sova-transit/dialogue/maintenance-corridors/ring-operative.yaml deleted file mode 100644 index a5cc92125..000000000 --- a/content/districts/sova-transit/dialogue/maintenance-corridors/ring-operative.yaml +++ /dev/null @@ -1 +0,0 @@ -# Dialogue: ring-operative at Maintenance Corridors diff --git a/content/districts/sova-transit/dialogue/the-last-shift/bar-owner.yaml b/content/districts/sova-transit/dialogue/the-last-shift/bar-owner.yaml deleted file mode 100644 index 565ae4882..000000000 --- a/content/districts/sova-transit/dialogue/the-last-shift/bar-owner.yaml +++ /dev/null @@ -1 +0,0 @@ -# Dialogue: bar-owner at The Last Shift diff --git a/content/districts/sova-transit/dialogue/the-last-shift/bar-regular.yaml b/content/districts/sova-transit/dialogue/the-last-shift/bar-regular.yaml deleted file mode 100644 index 6f99a3176..000000000 --- a/content/districts/sova-transit/dialogue/the-last-shift/bar-regular.yaml +++ /dev/null @@ -1 +0,0 @@ -# Dialogue: bar-regular at The Last Shift diff --git a/content/districts/sova-transit/dialogue/the-last-shift/bartender.yaml b/content/districts/sova-transit/dialogue/the-last-shift/bartender.yaml deleted file mode 100644 index 27b53f4a7..000000000 --- a/content/districts/sova-transit/dialogue/the-last-shift/bartender.yaml +++ /dev/null @@ -1 +0,0 @@ -# Dialogue: bartender at The Last Shift diff --git a/content/districts/sova-transit/dialogue/the-terminal/courier.yaml b/content/districts/sova-transit/dialogue/the-terminal/courier.yaml deleted file mode 100644 index 8fdc9b9c7..000000000 --- a/content/districts/sova-transit/dialogue/the-terminal/courier.yaml +++ /dev/null @@ -1 +0,0 @@ -# Dialogue: courier at The Terminal diff --git a/content/districts/sova-transit/dialogue/the-terminal/dock-worker.yaml b/content/districts/sova-transit/dialogue/the-terminal/dock-worker.yaml deleted file mode 100644 index 66a6d81fe..000000000 --- a/content/districts/sova-transit/dialogue/the-terminal/dock-worker.yaml +++ /dev/null @@ -1 +0,0 @@ -# Dialogue: dock-worker at The Terminal diff --git a/content/districts/sova-transit/dialogue/the-terminal/new-hire.yaml b/content/districts/sova-transit/dialogue/the-terminal/new-hire.yaml deleted file mode 100644 index 4390a85c5..000000000 --- a/content/districts/sova-transit/dialogue/the-terminal/new-hire.yaml +++ /dev/null @@ -1 +0,0 @@ -# Dialogue: new-hire at The Terminal diff --git a/content/districts/sova-transit/dialogue/the-terminal/scheduler.yaml b/content/districts/sova-transit/dialogue/the-terminal/scheduler.yaml deleted file mode 100644 index 54dd25883..000000000 --- a/content/districts/sova-transit/dialogue/the-terminal/scheduler.yaml +++ /dev/null @@ -1 +0,0 @@ -# Dialogue: scheduler at The Terminal diff --git a/content/districts/sova-transit/dialogue/the-terminal/shift-supervisor.yaml b/content/districts/sova-transit/dialogue/the-terminal/shift-supervisor.yaml deleted file mode 100644 index 1247ffcdd..000000000 --- a/content/districts/sova-transit/dialogue/the-terminal/shift-supervisor.yaml +++ /dev/null @@ -1 +0,0 @@ -# Dialogue: shift-supervisor at The Terminal diff --git a/content/districts/sova-transit/monologue/detective/general.yaml b/content/districts/sova-transit/monologue/detective/general.yaml deleted file mode 100644 index a1330ca50..000000000 --- a/content/districts/sova-transit/monologue/detective/general.yaml +++ /dev/null @@ -1 +0,0 @@ -# Monologue: detective at general diff --git a/content/districts/sova-transit/monologue/detective/maintenance-corridors.yaml b/content/districts/sova-transit/monologue/detective/maintenance-corridors.yaml deleted file mode 100644 index ce27cb434..000000000 --- a/content/districts/sova-transit/monologue/detective/maintenance-corridors.yaml +++ /dev/null @@ -1 +0,0 @@ -# Monologue: detective at maintenance-corridors diff --git a/content/districts/sova-transit/monologue/detective/the-last-shift.yaml b/content/districts/sova-transit/monologue/detective/the-last-shift.yaml deleted file mode 100644 index 2f422b2e6..000000000 --- a/content/districts/sova-transit/monologue/detective/the-last-shift.yaml +++ /dev/null @@ -1 +0,0 @@ -# Monologue: detective at the-last-shift diff --git a/content/districts/sova-transit/monologue/detective/the-terminal.yaml b/content/districts/sova-transit/monologue/detective/the-terminal.yaml deleted file mode 100644 index afbc4c886..000000000 --- a/content/districts/sova-transit/monologue/detective/the-terminal.yaml +++ /dev/null @@ -1 +0,0 @@ -# Monologue: detective at the-terminal diff --git a/content/districts/sova-transit/monologue/smuggler/general.yaml b/content/districts/sova-transit/monologue/smuggler/general.yaml deleted file mode 100644 index 786bbd0aa..000000000 --- a/content/districts/sova-transit/monologue/smuggler/general.yaml +++ /dev/null @@ -1 +0,0 @@ -# Monologue: smuggler at general diff --git a/content/districts/sova-transit/monologue/smuggler/maintenance-corridors.yaml b/content/districts/sova-transit/monologue/smuggler/maintenance-corridors.yaml deleted file mode 100644 index 5ee5f5e34..000000000 --- a/content/districts/sova-transit/monologue/smuggler/maintenance-corridors.yaml +++ /dev/null @@ -1 +0,0 @@ -# Monologue: smuggler at maintenance-corridors diff --git a/content/districts/sova-transit/monologue/smuggler/the-last-shift.yaml b/content/districts/sova-transit/monologue/smuggler/the-last-shift.yaml deleted file mode 100644 index ce327e9fc..000000000 --- a/content/districts/sova-transit/monologue/smuggler/the-last-shift.yaml +++ /dev/null @@ -1 +0,0 @@ -# Monologue: smuggler at the-last-shift diff --git a/content/districts/sova-transit/monologue/smuggler/the-terminal.yaml b/content/districts/sova-transit/monologue/smuggler/the-terminal.yaml deleted file mode 100644 index 68e377e93..000000000 --- a/content/districts/sova-transit/monologue/smuggler/the-terminal.yaml +++ /dev/null @@ -1 +0,0 @@ -# Monologue: smuggler at the-terminal diff --git a/content/global/regions/krenn.yaml b/content/global/regions/krenn.yaml deleted file mode 100644 index 689895b1a..000000000 --- a/content/global/regions/krenn.yaml +++ /dev/null @@ -1 +0,0 @@ -# Krenn System — regional metadata (D-036)