{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "dialogue-pool.schema.json", "title": "Dialogue Line Pool", "description": "Tagged dialogue lines scoped by location + role (D-028, D-035).", "type": "object", "required": ["location", "role", "lines"], "additionalProperties": false, "properties": { "location": { "type": "string", "pattern": "^[a-z][a-z0-9-]*$", "description": "Location slug this dialogue pool belongs to" }, "role": { "type": "string", "pattern": "^[a-z][a-z0-9-]*$", "description": "Template role slug (e.g. dock-worker, bar-owner)" }, "lines": { "type": "array", "items": { "$ref": "#/$defs/dialogue_line" }, "minItems": 1 } }, "$defs": { "dialogue_line": { "type": "object", "required": ["id", "text", "role", "access", "trust", "situation"], "additionalProperties": false, "properties": { "id": { "type": "string", "pattern": "^[a-z][a-z0-9-]*_d_[0-9]{3}$", "description": "Stable line ID: {npc-slug}_d_{###} (e.g. kael-davan_d_001). NPC-scoped per D-035 Sprint 15 amendment — each NPC has an independent sequence starting at _001." }, "text": { "type": "string", "minLength": 1 }, "role": { "type": "string", "pattern": "^[a-z][a-z0-9-]*$", "description": "Template role this line belongs to" }, "access": { "type": "array", "items": { "type": "string", "enum": ["public", "insider", "authority", "peer", "hostile"] }, "minItems": 1, "uniqueItems": true, "description": "Access tiers this line is available at (multi-tier eligibility)" }, "trust": { "type": "string", "enum": ["surface", "real", "secret"], "description": "Minimum trust level required" }, "situation": { "type": "array", "items": { "type": "string", "enum": [ "arrival", "shift_start", "shift_end", "shift_transition", "bar_evening", "night_shift", "investigation", "confrontation", "social", "alone", "emergency", "routine", "observation", "greeting" ] }, "minItems": 1, "uniqueItems": true, "description": "Situation contexts when this line can fire (D-035: list). greeting added Sprint 8 for PC dialogue pools" }, "topic": { "type": "array", "items": { "type": "string", "enum": [ "colleague", "routine", "cargo", "money", "trust", "danger", "institution", "personal", "investigation" ] }, "uniqueItems": true, "description": "Topic tags for selection weighting (D-035: list)" }, "mood": { "type": "array", "items": { "type": "string", "enum": [ "anxious", "frustrated", "content", "suspicious", "warm", "hostile", "relieved", "focused" ] }, "uniqueItems": true, "description": "Mood tags for selection weighting (D-035: list). 8 v0.1 values, renamed Sprint 14 to match voice guide vocabulary. Neutral = untagged." }, "tags": { "type": "array", "items": { "type": "string" }, "description": "Freeform tags for additional filtering" }, "knowledge_grant": { "type": "object", "description": "Knowledge the player gains from hearing this line", "required": ["fact_id", "confidence"], "additionalProperties": false, "properties": { "fact_id": { "type": "string" }, "confidence": { "type": "string", "enum": ["suspects", "knows_of", "knows_details", "direct"] } } }, "dual_lens": { "type": "object", "description": "Authoring-only: per-character resonance notes (NOT consumed by engine)", "additionalProperties": false, "properties": { "smuggler": { "type": "string" }, "detective": { "type": "string" } } }, "notes": { "type": "string", "description": "Authoring-only: freeform author notes (NOT consumed by engine)" } } } } }