Files
settled-reach/server/content/npc-conversations/overheard.ron
T
jpmschweitzer 06d9abbc63 Merge remote-tracking branch 'origin/copy'
# Conflicts:
#	content/npc-conversations/overheard.yaml
#	server/content/global/zone-types/administrative_civil.ron
#	server/content/global/zone-types/administrative_judicial.ron
#	server/content/global/zone-types/archaeological_site.ron
#	server/content/global/zone-types/commercial_market.ron
#	server/content/global/zone-types/commercial_transit.ron
#	server/content/global/zone-types/detention_facility.ron
#	server/content/global/zone-types/diplomatic_elite.ron
#	server/content/global/zone-types/entertainment_hospitality.ron
#	server/content/global/zone-types/entertainment_venue.ron
#	server/content/global/zone-types/extraction_platform.ron
#	server/content/global/zone-types/extraction_space.ron
#	server/content/global/zone-types/extraction_surface.ron
#	server/content/global/zone-types/industrial_manufacturing.ron
#	server/content/global/zone-types/industrial_processing.ron
#	server/content/global/zone-types/medical_facility.ron
#	server/content/global/zone-types/military_garrison.ron
#	server/content/global/zone-types/port_fishing.ron
#	server/content/global/zone-types/port_maritime.ron
#	server/content/global/zone-types/port_space.ron
#	server/content/global/zone-types/port_surface.ron
#	server/content/global/zone-types/research_station.ron
#	server/content/global/zone-types/residential_dispersed.ron
#	server/content/global/zone-types/residential_station.ron
#	server/content/global/zone-types/residential_surface.ron
#	server/content/global/zone-types/rural_aquaculture.ron
#	server/content/global/zone-types/rural_orbital.ron
#	server/content/global/zone-types/rural_pastoral.ron
#	server/content/global/zone-types/security_checkpoint.ron
#	server/content/global/zone-types/wilderness_frontier.ron
#	server/content/npc-conversations/overheard.ron
#	server/content/npc-conversations/overheard.yaml
#	server/content/npc-conversations/overheard.yaml.deprecated
#	tooling/validate-ron
2026-03-17 12:31:38 +01:00

296 lines
14 KiB
Plaintext

// Overheard Conversations Pool
//
// Schema: server/src/npc/overheard.rs :: OverheardPool (TBD — pending #663)
// Ticket: #664 (copy team, Sprint 27)
// Decision refs: D-078 (occlusion-resilient authoring), D-142 (zone-type architecture),
// D-122 (all NPCs generated), D-139 (behavior primitives model)
//
// FORMAT NOTE: This file introduces a new content pattern — generator-compatible overheard
// conversations parameterized by role pair and zone type. Pending D-record (see Q-WTF
// note at end of decisions/content.md). The format is authored independently of any
// specific NPC instance: role_pair draws from zone-type template role IDs; the generator
// resolves role → NPC at runtime.
//
// HOW THIS WORKS:
// At runtime, the generator finds two NPCs in proximity whose roles match `role_pair`
// and whose zone type matches an entry in `zone_types`. The conversation is assembled
// with per-word occlusion applied based on player distance, ambient noise level, and
// ListeningFocus stance (D-078). Culture modifier can be applied to the assembled text
// at the same layer as behavior primitive assembly.
//
// OCCLUSION-RESILIENT AUTHORING RULES (D-078 — apply to every line authored here):
// 1. Front-load key information — most important word in the first third of the line.
// 2. Short declarative sentences — one idea per turn.
// 3. No pronoun-first openers — first word has highest drop risk under occlusion.
// A dropped pronoun without antecedent is unresolvable. Use role nouns or subjects.
// 4. Each turn is self-contained — a player who hears only one side gets a complete thought.
//
// REGISTERS:
// Work — shift logistics, job gripes, operational notes
// Social — idle chat, personal news, relationship signals
// Gossip — third-party information with player-relevant knowledge payload
//
// RELATIONSHIP CONTEXT:
// Colleague — same-level co-workers
// Acquaintance — recognize each other, not close
// Friend — off-duty warmth, shared history signals
// Superior — one holds authority over the other (speaker_a is superior)
// Subordinate — one defers to the other (speaker_a is subordinate)
//
// KNOWLEDGE PAYLOAD:
// Describes what a player can infer from a fully-heard exchange, or the
// key fragment retained under partial occlusion. None if the exchange is
// social atmosphere with no investigative value.
//
// PRIMITIVES ARE CULTURE-NEUTRAL. No cultural attitudes in action or speech text.
(
conversations: [
// =====================================================================
// INDUSTRIAL FREIGHT
// =====================================================================
(
id: "ovh_ifr_001",
zone_types: ["industrial_freight"],
role_pair: (a: "dock_worker", b: "dock_worker"),
register: Work,
relationship_context: Colleague,
topic: "equipment_fault",
lines: [
( speaker: A, text: "Loading arm three is grinding again. Filed the report last week." ),
( speaker: B, text: "Maintenance says next cycle. Someone loses a hand before anything moves." ),
],
knowledge_payload: None,
),
(
id: "ovh_ifr_002",
zone_types: ["industrial_freight"],
role_pair: (a: "dock_worker", b: "dock_worker"),
register: Work,
relationship_context: Colleague,
topic: "manifest_discrepancy",
lines: [
( speaker: A, text: "Weight manifest came in four hundred kilos short again. Third time this month." ),
( speaker: B, text: "Four hundred kilos doesn't disappear from a calibration error. It goes somewhere." ),
],
knowledge_payload: Some("Recurring manifest weight discrepancy. Dock workers suspicious of the official explanation. Potential signal of systematic removal."),
),
(
id: "ovh_ifr_003",
zone_types: ["industrial_freight"],
role_pair: (a: "foreman", b: "dock_worker"),
register: Work,
relationship_context: Superior,
topic: "bay_assignment",
lines: [
( speaker: A, text: "Bay seven crew is two short tonight. Fill the gap from B-section." ),
( speaker: B, text: "Bay seven again. Low traffic, less oversight. Funny how that keeps happening." ),
],
knowledge_payload: Some("Bay seven has been given a reduced crew in a low-oversight slot. The subordinate speaker notes the pattern without directly accusing anyone."),
),
(
id: "ovh_ifr_004",
zone_types: ["industrial_freight"],
role_pair: (a: "technician", b: "technician"),
register: Work,
relationship_context: Colleague,
topic: "camera_anomaly",
lines: [
( speaker: A, text: "Junction camera at C-corridor was repositioned. Nobody filed a maintenance request." ),
( speaker: B, text: "Camera moved without logging is a compliance violation. Someone did it off-book." ),
],
knowledge_payload: Some("A surveillance camera was moved without documentation. Suggests deliberate manipulation of oversight coverage."),
),
(
id: "ovh_ifr_005",
zone_types: ["industrial_freight"],
role_pair: (a: "dock_worker", b: "dock_worker"),
register: Social,
relationship_context: Friend,
topic: "career_stasis",
lines: [
( speaker: A, text: "Transfer application went through. Third time. Got rejected again." ),
( speaker: B, text: "Some people just belong to a place whether they want to or not." ),
],
knowledge_payload: None,
),
// =====================================================================
// ENTERTAINMENT HOSPITALITY
// =====================================================================
(
id: "ovh_hos_001",
zone_types: ["entertainment_hospitality"],
role_pair: (a: "hospitality_staff", b: "hospitality_staff"),
register: Social,
relationship_context: Colleague,
topic: "guest_behavior",
lines: [
( speaker: A, text: "Room fourteen left every amenity in the bath untouched. For three nights." ),
( speaker: B, text: "Some guests want the illusion of service, not the thing itself." ),
],
knowledge_payload: None,
),
(
id: "ovh_hos_002",
zone_types: ["entertainment_hospitality"],
role_pair: (a: "concierge", b: "security"),
register: Work,
relationship_context: Superior,
topic: "guest_anomaly",
lines: [
( speaker: A, text: "Guest in room nine hasn't left the room since check-in. Thirty-six hours." ),
( speaker: B, text: "Tray service three times, no housekeeping, no movement. Worth a wellness check." ),
],
knowledge_payload: Some("A guest has been isolated in their room for an extended period. Security and front desk are beginning to flag this as unusual."),
),
(
id: "ovh_hos_003",
zone_types: ["entertainment_hospitality"],
role_pair: (a: "kitchen_worker", b: "kitchen_worker"),
register: Work,
relationship_context: Colleague,
topic: "supply_chain",
lines: [
( speaker: A, text: "Supplier changed the protein spec again. Third reformulation this cycle." ),
( speaker: B, text: "Changed means cheaper. Guests won't notice until they do, and then they'll blame us." ),
],
knowledge_payload: None,
),
(
id: "ovh_hos_004",
zone_types: ["entertainment_hospitality"],
role_pair: (a: "security", b: "security"),
register: Work,
relationship_context: Colleague,
topic: "access_pattern",
lines: [
( speaker: A, text: "Service corridor had three badge reads last night. All outside shift hours." ),
( speaker: B, text: "Off-hours service access should be logged with management. Check if it was." ),
],
knowledge_payload: Some("Service corridor is being accessed outside normal hours without clear authorization. Pattern may indicate unauthorized activity."),
),
// =====================================================================
// RESIDENTIAL STATION
// =====================================================================
(
id: "ovh_rst_001",
zone_types: ["residential_station"],
role_pair: (a: "resident", b: "resident"),
register: Social,
relationship_context: Acquaintance,
topic: "block_conditions",
lines: [
( speaker: A, text: "Air recycler on deck six has been cycling short again. Reported it twice." ),
( speaker: B, text: "Block admin is backed up. Three units filed the same fault this cycle." ),
],
knowledge_payload: None,
),
(
id: "ovh_rst_002",
zone_types: ["residential_station"],
role_pair: (a: "block_admin", b: "maintenance_tech"),
register: Work,
relationship_context: Superior,
topic: "welfare_concern",
lines: [
( speaker: A, text: "Unit forty-two hasn't answered welfare checks in four days. Filing it formal." ),
( speaker: B, text: "Saw lights on two nights ago. Someone's in there. Not answering is a choice." ),
],
knowledge_payload: Some("A residential unit occupant has been avoiding contact for days. Conflicting information: lights suggest presence, but no response to welfare checks."),
),
(
id: "ovh_rst_003",
zone_types: ["residential_station"],
role_pair: (a: "resident", b: "resident"),
register: Gossip,
relationship_context: Friend,
topic: "unexplained_income",
lines: [
( speaker: A, text: "New furniture in unit thirty. Nice furniture. Station dock pay doesn't cover that." ),
( speaker: B, text: "Extra shift somewhere, or extra something. Nobody asks too closely." ),
],
knowledge_payload: Some("A block resident has acquired unexplained goods above their apparent income level. Other residents have noticed and are deliberately not inquiring further."),
),
// =====================================================================
// RESIDENTIAL DISPERSED
// =====================================================================
(
id: "ovh_dis_001",
zone_types: ["residential_dispersed"],
role_pair: (a: "supply_runner", b: "homesteader"),
register: Work,
relationship_context: Acquaintance,
topic: "missing_resident",
lines: [
( speaker: A, text: "Eastern claim hasn't put out a supply crate in six weeks. Door closed on three runs." ),
( speaker: B, text: "Six weeks is a long time to be quiet out there. Someone should go properly." ),
],
knowledge_payload: Some("A dispersed homestead has been unresponsive for six weeks. Supply runner has made three passes without contact. Welfare concern escalating."),
),
(
id: "ovh_dis_002",
zone_types: ["residential_dispersed"],
role_pair: (a: "frontier_medic", b: "liaison"),
register: Gossip,
relationship_context: Colleague,
topic: "off_grid_activity",
lines: [
( speaker: A, text: "New structure went up on the ridge claim. Not on any filed homestead record." ),
( speaker: B, text: "Unfiled structure means someone doesn't want the location in the regional system." ),
],
knowledge_payload: Some("An unregistered structure has appeared in a dispersed residential area. Both speakers recognize the deliberate omission from regional records as significant."),
),
// =====================================================================
// RURAL AGRICULTURAL
// =====================================================================
(
id: "ovh_rag_001",
zone_types: ["rural_agricultural"],
role_pair: (a: "farmer", b: "trader"),
register: Work,
relationship_context: Acquaintance,
topic: "supply_shortage",
lines: [
( speaker: A, text: "Irrigation fittings haven't come through in two cycles. Runner said the supplier changed terms." ),
( speaker: B, text: "Supplier changed terms means the price went up or someone else got the contract." ),
],
knowledge_payload: None,
),
(
id: "ovh_rag_002",
zone_types: ["rural_agricultural"],
role_pair: (a: "militia", b: "militia"),
register: Social,
relationship_context: Colleague,
topic: "visitor_pattern",
lines: [
( speaker: A, text: "Same vehicle came through the gate three times this week. Different plates each time." ),
( speaker: B, text: "Different plates, same vehicle. That's not a coincidence, that's a method." ),
],
knowledge_payload: Some("A vehicle has visited the settlement three times in one week under different registration plates. Both militia members recognize this as suspicious rather than operational."),
),
],
)