Scheduled NPC Dialog & Gossip
Player conversations with NPCs are deterministic. Authored dialogue packs and personality stay in YAML. A batch LLM job refreshes Postgres overlays a few times per game day so speech stays current with town gossip and design changes — without live per-turn token cost.
Model
| Layer | Storage | Who edits |
|---|---|---|
| Identity (personality, backstory, rails) | assets/npcs/*.yaml |
Designers / content-admin NPCs |
| Static lines (sleep, closed, quests) | assets/dialogue/*.yaml |
Designers / Dialogue tab |
| Dynamic lines + knowledge | Postgres npc_dialog_overlay |
Regen job + Gossip tab |
| Town digest | Postgres world_gossip_digest |
Regen job |
| Gossip bus | Postgres world_event_inbox |
Designers, future sim hooks |
Cadence
npc_dialog_refresh in server-settings:
- morning — day plan, shop mood
- midday — market / lunch buzz
- evening — pub gossip (night enter also maps to evening when listed)
Region sim enqueues on phase enter; region worker runs OpenRouter offline and upserts overlays. No content publish.
Talk path
- Static / engine / quest line ids
- Overlay topic-tag match (trust-gated)
- Overlay greet / chitchat rotation
- Pack turn rotation
Live OpenRouter chat on NpcTalkSay when npc_live_chat policy allows; otherwise deterministic packs + overlays.
Admin
Content-admin Gossip tab: digests, events, overlay edit, force regen. Requires control-plane auth.