diff --git a/CHANGELOG.md b/CHANGELOG.md index 9ea4982fa..05c15286c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ Format based on [Keep a Changelog](https://keepachangelog.com/). ## [Unreleased] ### Added +- 29 zone-type behavior templates completing the full library of 31 zone types per D-142. 2,210 culture-neutral behavior primitives across rural, industrial, port, extraction, commercial, administrative, research, medical, military, security, entertainment, residential, detention, archaeological, wilderness, and diplomatic zones +- Generator-compatible overheard conversation RON format replacing the deprecated named-NPC YAML. 16 sample conversations parameterized by role pair and zone type with knowledge_payload for investigative value +- Cross-culture name pool collision checking in validate-ron (`--check-name-collisions` mode) + - Drifter's Guide to the Reach — 100% coverage (301/301 systems). 262 new GTTR entries across all 5 regions plus updated regional index pages with hop-grouped tables - GJ 6711 / Abzu workshop — 6 rounds, 24 documents: initial briefs (4 agents), cross-pollination syntheses, sealed envelope (observation is load-bearing), stress test challenges against existing canon, final syntheses with Abzu naming, mechanics design (watch investment counter, six player verbs, bleed tile states, Adams & Ford entry filing), carry-out proposals (unresolved — reward design TBD) - Star map topology and real-coordinate SVG visualizations diff --git a/decisions/content.md b/decisions/content.md index 4f55809ee..62fde9b21 100644 --- a/decisions/content.md +++ b/decisions/content.md @@ -569,4 +569,19 @@ How narrative, NPCs, and world content are created: content tiers, NPC generatio --- -*44 decisions. Last updated: 2026-03-17 (D-147 aesthetic taste trait)* +--- + +### Content Pattern Note: Generator-compatible overheard conversation format (ticket #664) +- **Date:** 2026-03-17 +- **Status:** Content pattern noted — pending formal D-record (check with Qatux before claiming ID) +- **Pattern:** `content/npc-conversations/overheard.ron` introduces a new content type: a pool of NPC-to-NPC overheard conversations parameterized by `role_pair` and `zone_types` (matching zone-type template role IDs from D-142). No named NPC references. Culture-neutral text that accepts culture modifier at assembly time. Replaces `overheard.yaml.deprecated` (v0.1 hand-authored pool with named NPCs, superseded by D-122). +- **Format fields:** `id`, `zone_types[]`, `role_pair(a, b)`, `register` (Work|Social|Gossip), `relationship_context` (Colleague|Acquaintance|Friend|Superior|Subordinate), `topic`, `lines[(speaker:A|B, text)]`, `knowledge_payload (Option)` +- **Occlusion authoring rules:** D-078 rules apply unchanged — front-load key info, short declarative sentences, no pronoun-first openers, each turn self-contained. +- **Runtime resolution:** Generator selects conversations where two nearby NPCs match `role_pair` and `zone_types`. Knowledge payload is exposed to player inference layer (partial occlusion reduces but cannot eliminate inference value of a fully-heard payload). +- **Schema location:** `server/src/npc/overheard.rs :: OverheardPool` — TBD pending #663 struct changes. +- **Raised by:** Paula (Sprint 27, ticket #664) +- **Decision needed:** Whether to formalize this as D-NNN or treat as sub-pattern of D-142. Recommend D-record since it introduces the `knowledge_payload` field as a new ambient information delivery mechanism distinct from existing dialogue architecture (D-028). + +--- + +*44 decisions. Last updated: 2026-03-17 (D-147 aesthetic taste trait; content pattern note for overheard.ron format added)* diff --git a/docs/sprints/sprint-27/zone-type-review.md b/docs/sprints/sprint-27/zone-type-review.md new file mode 100644 index 000000000..617acfb1d --- /dev/null +++ b/docs/sprints/sprint-27/zone-type-review.md @@ -0,0 +1,136 @@ +# Zone-Type Template Consistency Review +**Sprint 27 · Ticket #662 · Task #6** +**Reviewed by:** Mellanie +**Files reviewed:** 31 (29 new + 2 canonical references) + +--- + +## Summary + +All 31 zone-type templates pass the core authoring criteria. Two issues +were found and resolved: one stale header comment, one cosmetic +inconsistency affecting 5 files. + +**Status: PASS — all issues resolved** + +--- + +## Check Results + +### 1. RON schema structure +**PASS — all 31 files** + +Every file validates against the `ZoneTypeTemplate` schema. All required +fields present: `id`, `subtype`, `label`, `description`, `economic_level`, +`population_density`, `roles`, `social_site_types`. Role entries all have +`id`, `label`, `skill_focus`, `combat_eligible`, `behavior_primitives`. +Primitive tuples all have `action`, `context`, `modifier_hint`. + +### 2. Culture-neutrality +**PASS — all 31 files** + +No cultural attitudes, speech patterns, naming conventions, or social +assumptions encoded in any action text. All primitives describe physical +behavior and professional practice only. The layer composes cleanly — no +primitive will read as contradicted by a culture modifier. + +### 3. modifier_hint coverage +**PASS — all 31 files** + +2383 total primitives across all files. Every primitive has +`modifier_hint: Some(...)`. Zero with `None`. All 7 categories represented +across the set: `work_pace`, `physical_manner`, `social_signal`, +`task_completion`, `environmental_scan`, `offduty_posture`, `authority_response`. + +### 4. Context tag coverage +**PASS — all 31 files** + +All files have OnShift primitives and Social/OffDuty primitives. 18 of 31 +files use the `OffDuty` context tag for break/rest behavior alongside +`Social` for interaction primitives (matching the canonical references). +13 of 31 files use `Social` only, folding both posture and interaction under +one tag. Both are schema-valid. The OffDuty/Social split is richer where +the zone character warrants it (security-heavy, institutional, or isolated +settings) and the Social-only approach works where the distinction carries +less meaning. No file is missing off-shift coverage. + +### 5. social_site_types coverage +**PASS — all 31 files** + +All files declare ≥ 2 social site types. `detention_facility.ron` declares 4 +(`guard_post`, `exercise_yard`, `medical_bay`, `administrative_office`), which +is compliant — the schema has no upper bound. + +### 6. Role count +**PASS — all 31 files** + +All files declare exactly 4 roles. Role labels are appropriate to zone +character and non-overlapping within each file. + +### 7. Standalone readability +**PASS — all 31 files** + +All action text reads as specific, concrete, and informative without a +culture modifier appended. No primitive requires cultural context to be +legible. The behavior is the information. + +### 8. Grammar constraint +**PASS — all 31 files** + +All action text accepts trailing prepositional phrases and coordinating +conjunctions cleanly. No action ends in a word that would create a +grammatical collision with modifier additions (e.g., actions ending in +prepositions, incomplete phrases, or conjunction stubs). + +--- + +## Issues + +### Issue 1 — Stale header comment in `residential_station.ron` ⚠️ Fix required +**File:** `content/global/zone-types/residential_station.ron` +**Line:** 19 + +The header comment reads: +``` +// Roles: resident, maintenance_tech, block_admin, child (no combat, low authority) +``` + +The actual implementation has four roles: `resident`, `maintenance_tech`, +`block_admin`, **`security`**. The `child` role was not implemented. + +**Fix:** Update header comment to: +``` +// Roles: resident, maintenance_tech, block_admin, security +``` + +### Issue 2 — Missing explanatory comment before `social_site_types` in 5 files (cosmetic) +**Files affected:** +- `content/global/zone-types/entertainment_hospitality.ron` +- `content/global/zone-types/entertainment_venue.ron` +- `content/global/zone-types/residential_station.ron` +- `content/global/zone-types/residential_surface.ron` +- `content/global/zone-types/residential_dispersed.ron` + +All other 26 files include the explanatory comment before the +`social_site_types` field: +```ron + // Valid social site types for this zone type. + // Location specs declare which appear, with their own label, min_npcs, max_npcs. + social_site_types: [ +``` + +The 5 affected files go straight to `social_site_types: [` without the comment. +The field itself is correct in all cases — this is a documentation consistency +gap only. + +**Fix:** Add the two-line comment block before `social_site_types:` in each +affected file. + +--- + +## No action required + +- `detention_facility.ron` declaring 4 social site types: within spec, no upper bound +- OffDuty/Social context variation: intentional, both valid per D-142 +- `diplomatic_elite.ron` using `OffDuty` for ambassador and aide social primitives + while protocol officer and security use `Social`: appropriate zone-level distinction diff --git a/server/content/global/zone-types/administrative_civil.ron b/server/content/global/zone-types/administrative_civil.ron new file mode 100644 index 000000000..de9e27f59 --- /dev/null +++ b/server/content/global/zone-types/administrative_civil.ron @@ -0,0 +1,157 @@ +// Administrative Civil Zone-Type Template +// +// Schema: server/src/npc/blueprint.rs :: ZoneTypeTemplate +// Ticket: #662 (copy team) +// Validate: tooling/validate-ron content/global/zone-types/administrative_civil.ron zone_type +// +// Sources: D-142 (zone-type template architecture). +// +// Zone character: municipal offices, permit counters, public registries, civic bureaus. +// Routine formality. The queue moves at the speed of the form. Everyone knows their +// counter and their caseload. Work is measured in decisions per hour. +// +// Primitives are CULTURE-NEUTRAL. Culture modifiers (culture-*.ron files) append +// cultural flavor at assembly time. Do not encode cultural attitudes in action text. +// +// Roles: clerk, administrator, inspector, security +// Social site types: break_room, waiting_area, records_hall + +( + id: "administrative_civil", + subtype: None, + label: "Administrative Civil Zone", + description: "Municipal offices, permit counters, public registries. Routine formality. Work is measured in decisions per hour. The queue moves at the speed of the form.", + + // Default economic/density profile. Location specs override. + economic_level: 5, + population_density: 5, + + roles: [ + ( + id: "clerk", + label: "Civil Clerk", + skill_focus: ["technical", "persuasion"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "pulls the next form from the intake tray and reads the first line before looking up", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "stamps a document and slides it back across the counter without eye contact", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "scrolls a queue display with two fingers, pausing at a flagged entry", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "asks for a secondary ID without explaining why it's needed", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "types into a terminal with short, clipped keystrokes", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "crosses a line off a printed form and initials the margin in small letters", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "checks a reference list on a side screen before answering a question", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "places a completed file in the outbound tray and reaches for the next before the previous has settled", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "reads a flagged application a second time, eyes moving back to the top", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "attaches a reference number to a document and reads it back aloud to confirm", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "directs a visitor to a second window with a brief pointing gesture", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "closes a session window without explanation and opens a new one", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "glances at the queue board before returning to the open file in front of her", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "straightens the forms on the counter before calling the next number", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "defers to a supervisor on a form with a question field left empty", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "acknowledges a correction from a colleague with a short nod and fixes the entry", context: OnShift, modifier_hint: Some("authority_response") ), + // Social / off-duty + ( action: "sits in the break room with a drink held in both hands, shoulders down", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "trades short complaints about the queue with a colleague at the next table", context: Social, modifier_hint: Some("social_signal") ), + ( action: "refills her cup from the urn and stands at the counter rather than going back to a chair", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "checks the shift board on her way out of the break room", context: Social, modifier_hint: Some("environmental_scan") ), + ( action: "listens to a story without contributing, turning her cup in slow circles", context: Social, modifier_hint: Some("offduty_posture") ), + ], + ), + ( + id: "administrator", + label: "Civil Administrator", + skill_focus: ["persuasion", "observation"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "reviews a subordinate's decision without sitting down at the terminal", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "walks the office floor once per hour, pausing briefly at each station", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "drafts a policy note on a datapad, deleting and rewriting the first sentence twice", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "holds a brief corridor conversation with a department head, back to the wall", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "signs a batch of authorizations without reading each one fully", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "calls a clerk over to clarify a flagged application before signing", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "sits at a corner desk facing the room and leaves the chair beside her empty", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "reviews a complaint record with one hand resting flat on the desk", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "takes a call standing at the window, speaking at half the volume she'd use at her desk", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "marks up a report with a stylus, underlining without noting what she underlined", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "thanks a visitor with a precise nod that ends the meeting", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "reviews a queue backlog report and makes no visible reaction", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "delegates a decision to the senior clerk with a single written line", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "moves a stack of files from one side of the desk to the other without opening them", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "reads an appeal record to its end before forming a visible opinion", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "returns a corrected form to a clerk with the error circled and no explanation", context: OnShift, modifier_hint: Some("authority_response") ), + // Social + ( action: "takes lunch at the end of the second shift rush, never the peak", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "speaks to the break room at large rather than one person at a time", context: Social, modifier_hint: Some("social_signal") ), + ( action: "stays at the break room table for one cup, then goes back", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "acknowledges a junior colleague's anecdote with a brief smile and returns to her drink", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ( + id: "inspector", + label: "Civil Inspector", + skill_focus: ["observation", "technical"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "photographs a site condition on a handheld before writing the citation", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "reads a facility's posted compliance record before speaking to anyone", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "measures a structural clearance with a folding rule and reads it twice", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "notes a discrepancy in the filing date without flagging it immediately", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "traces a permit history back two renewal cycles on a handheld", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "asks an occupant to confirm a detail she already knows the answer to", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "walks a space from corner to corner before writing anything down", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "opens a junction panel without asking permission, then closes it again", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "records a dimension, erases it, and re-measures from the opposite wall", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "reads the posted contact number for facility management without calling it", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "adds a marginal note to an inspection record that does not become part of the summary", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "pauses in a doorway long enough to take in the whole room before entering", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "gives a compliance result in a flat statement without elaborating on the consequences", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "schedules a follow-up inspection before leaving the site", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "accepts a question from facility staff and answers it briefly without inviting more", context: OnShift, modifier_hint: Some("social_signal") ), + // Social + ( action: "eats lunch at a different table each time with a datapad open beside her tray", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "answers a colleague's question with a question before giving the actual answer", context: Social, modifier_hint: Some("social_signal") ), + ( action: "sits with her back to the wall in the break room and reads the exit signs out of habit", context: Social, modifier_hint: Some("environmental_scan") ), + ( action: "listens to break room conversation without contributing and refills her cup when she does", context: Social, modifier_hint: Some("offduty_posture") ), + ], + ), + ( + id: "security", + label: "Civic Building Security", + skill_focus: ["combat", "observation"], + combat_eligible: true, + behavior_primitives: [ + // OnShift + ( action: "stands at the lobby entrance with hands clasped in front, watching the queue", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "checks a visitor's entry credential against the day list without a word", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "walks the corridor between the waiting area and the counter once per rotation", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "positions herself where both the entrance and the service counter are visible", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "watches a visitor who has stayed in the waiting area past their queue number", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "directs a visitor to empty their pockets before the scanner with a short gesture", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "runs a wand over a visitor who set off the scanner and waves them through", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "logs the time of a shift handover with the outgoing officer at the entrance", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "steps to the side of the lobby to take a radio call, keeping the entrance in sight", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "acknowledges the administrator on rounds with a nod and keeps her position", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "clears a disturbance at the counter by stepping forward and saying one sentence", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "checks the restricted corridor door handle at the top and bottom of every hour", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "holds up a hand to pause a visitor entering mid-announcement and waves them through after", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "signs the shift log without looking away from the entrance", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "stays on post through the shift change until the relief officer is in position", context: OnShift, modifier_hint: Some("authority_response") ), + // OffDuty + ( action: "sits off to one side in the break room, still in kit, drink in hand", context: OffDuty, modifier_hint: Some("offduty_posture") ), + ( action: "talks with the outgoing shift over the break room table for two minutes then leaves", context: Social, modifier_hint: Some("social_signal") ), + ( action: "refills her coffee and takes the chair facing the break room door", context: OffDuty, modifier_hint: Some("offduty_posture") ), + ], + ), + ], + + // Valid social site types for this zone type. + // Location specs declare which appear, with their own label, min_npcs, max_npcs. + social_site_types: [ + ( site_type: "break_room", eligible_roles: ["clerk", "administrator", "inspector", "security"] ), + ( site_type: "waiting_area", eligible_roles: ["clerk", "security"] ), + ( site_type: "records_hall", eligible_roles: ["clerk", "administrator", "inspector"] ), + ], +) diff --git a/server/content/global/zone-types/administrative_judicial.ron b/server/content/global/zone-types/administrative_judicial.ron new file mode 100644 index 000000000..ae64e0b45 --- /dev/null +++ b/server/content/global/zone-types/administrative_judicial.ron @@ -0,0 +1,156 @@ +// Administrative Judicial Zone-Type Template +// +// Schema: server/src/npc/blueprint.rs :: ZoneTypeTemplate +// Ticket: #662 (copy team) +// Validate: tooling/validate-ron content/global/zone-types/administrative_judicial.ron zone_type +// +// Sources: D-142 (zone-type template architecture). +// +// Zone character: courts, hearing chambers, advocate offices, registry, holding corridors. +// Formality is structural — enforced by the architecture, the dress, and the record. +// Everyone is performing for documentation. Precision of language matters here. +// +// Primitives are CULTURE-NEUTRAL. Culture modifiers (culture-*.ron files) append +// cultural flavor at assembly time. Do not encode cultural attitudes in action text. +// +// Roles: advocate, clerk, adjudicator, bailiff +// Social site types: corridor, clerk_office, assembly_chamber + +( + id: "administrative_judicial", + subtype: None, + label: "Administrative Judicial Zone", + description: "Courts, hearing chambers, advocate offices, public registry. Formality is structural and enforced. Everyone performs for the record. Precision of language is both norm and expectation.", + + // Default economic/density profile. Location specs override. + economic_level: 6, + population_density: 4, + + roles: [ + ( + id: "advocate", + label: "Legal Advocate", + skill_focus: ["persuasion", "observation"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "reviews a case brief on a datapad, lips moving silently on the key passages", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "makes a correction to a prepared statement in a tight margin", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "rehearses an argument under her breath while waiting for the chamber doors to open", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "listens to opposing counsel without reacting, pen motionless on the notepad", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "asks a question that presupposes its own answer and waits for the record to catch up", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "checks a citation on a side terminal before reading it into the record", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "collects her papers from the table in a particular order after a hearing ends", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "sits with a straight back and both feet flat under the advocate's table", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "marks a line in a brief with a stylus before the opposing statement is finished", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "hands a document to the clerk for entry into the record without pausing her argument", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "waits for the adjudicator's signal before continuing after an interruption", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "asks for a recess in a flat, procedural tone without showing why she needs it", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "reads back a clause to the record at the speed of transcription", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "makes a brief note on a separate card that does not go into the formal record", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "acknowledges the decision without changing expression and writes the case number on a new page", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "reviews an outcome summary in the corridor before speaking to her client", context: OnShift, modifier_hint: Some("environmental_scan") ), + // Social + ( action: "takes a seat in the building's corridor with a coffee and reads from a personal device", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "nods to an opposing advocate passing in the corridor without stopping to speak", context: Social, modifier_hint: Some("social_signal") ), + ( action: "shares a table in the clerk's common area without initiating conversation", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "answers a colleague's procedural question with two sentences and goes back to reading", context: Social, modifier_hint: Some("social_signal") ), + ( action: "stacks her folders in the break area with the labels facing the wall", context: Social, modifier_hint: Some("offduty_posture") ), + ], + ), + ( + id: "clerk", + label: "Court Clerk", + skill_focus: ["technical"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "transcribes proceedings in real time, eyes on the screen and nowhere else", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "calls the case number in a carrying voice at the chamber entrance", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "stamps a document and affixes it to the case record before the ink is dry", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "logs the time of the session opening to the second", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "hands an exhibit to counsel across the clerk's bench with two hands", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "retrieves a prior filing from the archive terminal and confirms the date aloud", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "checks the session schedule against the chamber calendar before opening the doors", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "marks the record closed at session end and moves the file to the outbound archive stack", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "responds to an advocate's procedural inquiry with a citation and nothing more", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "reads back a disputed entry from the transcript at the adjudicator's direction", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "corrects a transcription error before the session continues, flagging it in the record", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "arranges the exhibit numbers on the bench in ascending order before the hearing opens", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "logs an adjournment time and the reason as dictated by the adjudicator", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "distributes copies of a ruling to both parties at the chamber exit without comment", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "keeps her position at the transcription terminal through the full session without shifting in her chair", context: OnShift, modifier_hint: Some("physical_manner") ), + // Social + ( action: "eats at the clerk's office table with the current session's notes face-down beside her tray", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "passes the coffee urn to the next person without being asked", context: Social, modifier_hint: Some("social_signal") ), + ( action: "answers a procedural question from a junior clerk with the exact rule number and says nothing else", context: Social, modifier_hint: Some("social_signal") ), + ( action: "sits through the break with a neutral expression and no reading material", context: Social, modifier_hint: Some("offduty_posture") ), + ], + ), + ( + id: "adjudicator", + label: "Adjudicator", + skill_focus: ["observation", "persuasion"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "enters the chamber from the side door and takes position before the session is formally opened", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "reads a petition quietly at the bench while the parties take their positions", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "interrupts an overlong argument with a flat request to proceed to the point", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "makes a written note on the bench file without indicating what prompted it", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "asks a clarifying question that neither party was expecting", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "rereads a submitted document before giving a ruling on its admissibility", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "takes a deliberation recess of exactly the length she said it would be", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "delivers a ruling in a precise, uninterruptible sentence", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "looks at the party who has not spoken yet before asking the next question", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "closes her bench notes before speaking so neither side can read her conclusions from her posture", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "directs a clarification question to the clerk when the record is ambiguous", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "holds the chamber in silence for a long moment before reading a decision", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "removes her bench folder from the chamber herself at session close", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "acknowledges a point of procedure from the clerk before continuing", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "reviews the session log on a side terminal before signing the record", context: OnShift, modifier_hint: Some("task_completion") ), + // Social + ( action: "takes coffee at her chamber desk with the door ajar, reading a prior case file", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "nods to passing staff in the corridor and says nothing", context: Social, modifier_hint: Some("social_signal") ), + ( action: "eats at the staff table at an off-peak hour and leaves before the second wave arrives", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "answers a factual question from a junior colleague precisely and does not expand on it", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ( + id: "bailiff", + label: "Court Bailiff", + skill_focus: ["combat", "observation"], + combat_eligible: true, + behavior_primitives: [ + // OnShift + ( action: "stands at the chamber entrance with both hands visible, back to the wall", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "announces the adjudicator's entry in a carrying voice at the correct moment", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "directs parties to their positions with a short gesture before the session opens", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "observes the chamber from a fixed position through the full session", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "escorts a party from the chamber at session close without making it adversarial", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "checks the side door is secured before the adjudicator enters", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "watches the public gallery from the aisle position throughout proceedings", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "responds to a disturbance in the gallery by stepping forward once, no further until needed", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "holds the chamber doors closed until the adjudicator signals readiness", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "acknowledges the adjudicator's instruction with a nod and carries it out without elaboration", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "sweeps the chamber once at session close before allowing re-entry", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "logs the session open and close times in the duty record outside the chamber", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "keeps her position during a recess, moving only to secure the emptied chamber", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "directs a late arrival to the public gallery seating with a single pointed look", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "stays visible at the chamber entrance through the full proceedings without moving to conversation", context: OnShift, modifier_hint: Some("environmental_scan") ), + // OffDuty + ( action: "sits in the corridor outside the break room in full kit, eating without a table", context: OffDuty, modifier_hint: Some("offduty_posture") ), + ( action: "makes brief conversation with the incoming shift at handover then leaves", context: Social, modifier_hint: Some("social_signal") ), + ( action: "drinks coffee at the end of the break room table nearest the door", context: OffDuty, modifier_hint: Some("offduty_posture") ), + ], + ), + ], + + // Valid social site types for this zone type. + // Location specs declare which appear, with their own label, min_npcs, max_npcs. + social_site_types: [ + ( site_type: "corridor", eligible_roles: ["advocate", "clerk", "bailiff"] ), + ( site_type: "clerk_office", eligible_roles: ["clerk", "advocate", "adjudicator"] ), + ( site_type: "assembly_chamber", eligible_roles: ["advocate", "clerk", "adjudicator", "bailiff"] ), + ], +) diff --git a/server/content/global/zone-types/archaeological_site.ron b/server/content/global/zone-types/archaeological_site.ron new file mode 100644 index 000000000..4f19f5f9a --- /dev/null +++ b/server/content/global/zone-types/archaeological_site.ron @@ -0,0 +1,161 @@ +// Archaeological Site Zone-Type Template +// +// Schema: server/src/npc/blueprint.rs :: ZoneTypeTemplate +// Ticket: #662 (copy team) +// Validate: tooling/validate-ron content/global/zone-types/archaeological_site.ron zone_type +// +// Sources: D-142 (zone-type template architecture). +// +// Zone character: methodical excavation site, outdoor or semi-exposed. +// Work moves slowly — damage is permanent, care is the primary discipline. +// Teams are small and specialist. Hierarchy is soft but expertise is respected. +// Base camp is the social anchor; the dig face is where the real work happens. +// +// D-142 POI tier 1: designated zone type for gatebuilder ruin sites and +// alien-infrastructure excavations. Future authors should consider this +// dual use when extending roles or primitives. +// +// Primitives are CULTURE-NEUTRAL. Culture modifiers (culture-*.ron files) append +// cultural flavor at assembly time. Do not encode cultural attitudes in action text. +// +// Roles: archaeologist, field_technician, site_security, logistics_coordinator +// Social site types: field_camp, dig_tent, equipment_depot + +( + id: "archaeological_site", + subtype: None, + label: "Archaeological Site", + description: "Methodical excavation site. Work moves slowly because damage is permanent. Teams are small and specialist. Hierarchy is soft but expertise defines authority. Base camp is the social hub; the dig face is where the real work happens.", + + // Default economic/density profile. Location specs override. + economic_level: 3, + population_density: 2, + + roles: [ + ( + id: "archaeologist", + label: "Archaeologist", + skill_focus: ["observation", "technical"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "kneels at the dig face and brushes soil from a partially exposed surface with short strokes", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "measures the depth of a find with a folding rule and calls the number to a colleague", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "photographs an in-situ artifact from three angles before touching it", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "sketches a grid section on a site plan with a pencil stub", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "reads a soil layer change by running a finger along the profile wall", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "lifts a fragile object with both hands, cupped beneath the base", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "dictates field notes into a recorder while keeping eyes on the trench", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "calls a halt on a section when the layer below looks different", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "labels a sample bag with a site code and grid square before sealing it", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "crouches at the edge of a trench and studies the section profile without moving", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "reviews a field map against the ground and paces a distance to confirm it", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "points out a discoloration in the soil to a field technician and asks for a second opinion", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "uses a dental pick to clear debris from around a small find", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "consults a printed reference on a battered card against what she's seeing in the trench", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "stands back from the section and looks at it from a different angle", context: OnShift, modifier_hint: Some("environmental_scan") ), + // Social + ( action: "sketches something on a camp table napkin to explain a stratigraphic point", context: Social, modifier_hint: Some("social_signal") ), + ( action: "nurses a drink at the camp table, still thinking about the trench", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "talks through the day's finds with a colleague over a meal, voice animated", context: Social, modifier_hint: Some("social_signal") ), + ( action: "sits at the edge of a camp conversation and lets it run before joining in", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "disagrees with a colleague's interpretation quietly, in a way that invites response", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ( + id: "field_technician", + label: "Field Technician", + skill_focus: ["technical"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "runs a ground scanner over a mapped section and notes where the signal changes", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "packs sample bags into a numbered case in the order they were pulled", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "calibrates a remote sensing instrument against a survey marker", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "shovels excavated spoil into a sieve frame and shakes it in short bursts", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "photographs a trench section at the end of a dig day before the light goes", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "charges a battery bank at the equipment depot and rotates the order of the cells", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "logs equipment calibration data on a field tablet by tapping through a form", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "drives a survey stake into the ground with a mallet and checks the alignment", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "carries a water container to the dig tent and refills the small jug beside the equipment", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "reads a scan result off a portable display and hands the unit to the archaeologist", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "tapes a cracked equipment housing and marks it for replacement in the depot log", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "pulls a tarp over a section of the dig face ahead of an incoming weather change", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "lines up sample bags on a processing table and assigns each a holding number", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "checks the generator fuel level before the afternoon work session begins", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "stands at the edge of a freshly opened section and photographs the full width before anyone enters it", context: OnShift, modifier_hint: Some("physical_manner") ), + // Social + ( action: "sits at the camp table with a field tablet, reviewing data during the meal break", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "describes a piece of equipment failure to a colleague with hand gestures", context: Social, modifier_hint: Some("social_signal") ), + ( action: "passes a drink to the archaeologist without interrupting the conversation already in progress", context: Social, modifier_hint: Some("social_signal") ), + ( action: "eats quickly at the camp table and returns to equipment maintenance before others finish", context: Social, modifier_hint: Some("work_pace") ), + ( action: "asks the logistics coordinator for a resupply item and writes it on a paper list", context: Social, modifier_hint: Some("task_completion") ), + ], + ), + ( + id: "site_security", + label: "Site Security", + skill_focus: ["combat", "observation"], + combat_eligible: true, + behavior_primitives: [ + // OnShift + ( action: "walks the site perimeter at irregular intervals, varying the route", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "checks a motion alert from an overnight sensor log before the first work team arrives", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "stands at the site access track and asks an arriving vehicle for its clearance", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "photographs vehicle registrations at the site gate without explaining why", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "positions himself at the high point of the site perimeter where the ground falls away on two sides", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "follows a set of fresh footprints in the outer perimeter back to a gap in the fence line", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "checks the lock on the equipment depot before beginning the morning sweep", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "files a patrol report into a site log terminal at the end of each circuit", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "watches a visitor badge against the access list before letting them through the fence", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "radios the base camp with a position check at the midpoint of an outer patrol", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "scans the area outside the perimeter through a handheld scope", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "patches a section of perimeter fencing where a post has shifted", context: OnShift, modifier_hint: Some("task_completion") ), + // Social + ( action: "eats at the camp table on the outer edge, back to the nearest wall", context: Social, modifier_hint: Some("environmental_scan") ), + ( action: "answers questions from the dig team in short, accurate sentences", context: Social, modifier_hint: Some("social_signal") ), + ( action: "sits with the team at camp but lets the conversation move past him", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "accepts a drink from the cook without making it into an exchange", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "tells the logistics coordinator about the fence gap before it goes in the official log", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ( + id: "logistics_coordinator", + label: "Logistics Coordinator", + skill_focus: ["persuasion", "technical"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "checks the supply manifest against the depot shelves and marks three items low", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "loads a transport container in the order items will be needed at the field site", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "coordinates a resupply vehicle arrival with a field camp on a radio handset", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "routes a field equipment request through the supply chain and marks the expected arrival date", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "stacks sealed sample cases in the transport pallet in the correct climate-stable orientation", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "prepares a vehicle for a supply run, checking fuel, tires, and load distribution", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "briefs the incoming resupply driver on the track condition between the depot and the site", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "tracks a delayed shipment through a supplier contact and relays the new ETA to the team lead", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "photographs equipment damage for insurance records before moving it to a storage area", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "stores perishable supplies in priority order in the camp coolbox", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "prints a daily consumables report and pins it to the supply board in the cook tent", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "clears a muddy vehicle track by hand to keep the supply route passable", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "walks a new team member through the field camp layout and supply procedures", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "takes a stock inventory in the depot at the end of the day and cross-checks the log", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "reassigns a vehicle when the original driver is called to the dig face", context: OnShift, modifier_hint: Some("authority_response") ), + // Social + ( action: "runs the camp kitchen as a secondary duty, producing food without ceremony", context: Social, modifier_hint: Some("work_pace") ), + ( action: "keeps track of who hasn't eaten and puts a plate aside without announcing it", context: Social, modifier_hint: Some("social_signal") ), + ( action: "sits at the end of the camp table with a supply list on a tablet and a drink nearby", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "tells the team lead about a supply shortfall at the camp table before it becomes a crisis", context: Social, modifier_hint: Some("social_signal") ), + ( action: "refills the communal water containers without being asked", context: Social, modifier_hint: Some("offduty_posture") ), + ], + ), + ], + + // Valid social site types for this zone type. + // Location specs declare which appear, with their own label, min_npcs, max_npcs. + social_site_types: [ + ( site_type: "field_camp", eligible_roles: ["archaeologist", "field_technician", "site_security", "logistics_coordinator"] ), + ( site_type: "dig_tent", eligible_roles: ["archaeologist", "field_technician"] ), + ( site_type: "equipment_depot", eligible_roles: ["logistics_coordinator", "field_technician", "site_security"] ), + ], +) diff --git a/server/content/global/zone-types/commercial_market.ron b/server/content/global/zone-types/commercial_market.ron new file mode 100644 index 000000000..f1d58437e --- /dev/null +++ b/server/content/global/zone-types/commercial_market.ron @@ -0,0 +1,153 @@ +// Commercial Market Zone-Type Template +// +// Schema: server/src/npc/blueprint.rs :: ZoneTypeTemplate +// Ticket: #662 (copy team) +// Validate: tooling/validate-ron content/global/zone-types/commercial_market.ron zone_type +// +// Sources: D-142 (zone-type template architecture). +// +// Zone character: retail and trade market, open or covered, goods exchange. +// Foot traffic, browsing, negotiation, display. Volume over depth — many transactions, each brief. +// Public-facing work: appearance and performance are part of the job. +// +// Primitives are CULTURE-NEUTRAL. Culture modifiers (culture-*.ron files) append +// cultural flavor at assembly time. Do not encode cultural attitudes in action text. +// +// Roles: vendor, buyer, market_official, security_warden +// Social site types: market_floor, vendor_backstall, public_seating + +( + id: "commercial_market", + subtype: None, + label: "Commercial Market Zone", + description: "Retail and trade market, open or covered, goods exchange. Foot traffic, browsing, negotiation, display. Volume over depth — many transactions, each brief. Public-facing work: appearance and performance are part of the job.", + + // Default economic/density profile. Location specs override. + economic_level: 5, + population_density: 7, + + roles: [ + ( + id: "vendor", + label: "Market Vendor", + skill_focus: ["persuasion", "observation"], + combat_eligible: false, + // weight omitted — location specs declare role_weights + behavior_primitives: [ + // OnShift + ( action: "squares goods on the display surface, front-facing each item", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "watches a browser work through the display from the far end without moving toward them", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "sets a price card against the front of a display item and steps back to check the angle", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "wraps a sold item in protective material and hands it over in one clean motion", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "restocks a thinning section of the display from the box under the stall table", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "makes change from a drawer without counting it twice", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "fields a haggle by pausing one beat before answering", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "holds a sample item toward a potential customer at the right distance for inspection", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "scans the adjacent stalls without turning the body, just the eyes", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "marks down a slow item on the board with a stylus and checks whether anyone notices", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "packs the display down at close in a specific order to fit everything in the two carry boxes", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "acknowledges a market official's walkthrough without breaking a transaction", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "lays two goods side by side so a customer can compare without prompting", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "takes a cash deposit on a reserved item and writes the receipt by hand", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "pulls a display item before it's fully sold to protect the freshest stock for visible position", context: OnShift, modifier_hint: Some("work_pace") ), + // Social / public seating + ( action: "sits at the public seating area between transactions and watches the market floor traffic", context: Social, modifier_hint: Some("environmental_scan") ), + ( action: "buys a drink from the nearest vendor and stands beside the stall while drinking it", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "trades notes on market traffic with the adjacent vendor during a slow period", context: Social, modifier_hint: Some("social_signal") ), + ( action: "eats a meal at the public tables with her back to her own stall", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "nods at a returning customer from across the floor before they reach the stall", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ( + id: "buyer", + label: "Commercial Buyer", + skill_focus: ["observation", "persuasion"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "works through a section of the market in order, not doubling back", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "checks a sample item against a spec list on a small handheld before committing", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "asks a price on a secondary item while showing interest in the primary one", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "takes a vendor's sample, examines both sides, and hands it back without comment", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "walks away from a price three times before buying at the fourth pass", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "fills an order list from the market systematically, checking items as she goes", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "spots a grade difference in two identical-looking lots and separates them before pricing", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "counts the goods on a bulk purchase before accepting the vendor's figure", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "asks the vendor one specific question about provenance before making a decision", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "makes a low offer without apologizing for it", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "records a purchase on a personal datapad before moving to the next stall", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "returns to a stall she passed earlier and buys the item she hesitated on", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "requests a bulk discount at a volume that earns it", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "flags a pricing dispute to the market official rather than arguing with the vendor directly", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "checks the day's end pricing against her order list before leaving the market floor", context: OnShift, modifier_hint: Some("task_completion") ), + // Social + ( action: "takes a seat at the public tables and reviews her purchase notes over a drink", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "talks pricing with another buyer at the public tables without revealing her own position", context: Social, modifier_hint: Some("social_signal") ), + ( action: "rests at the public seating halfway through a buying round and watches the floor", context: Social, modifier_hint: Some("environmental_scan") ), + ( action: "accepts a vendor's offer of a sample snack at the stall and eats it without committing to anything", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ( + id: "market_official", + label: "Market Official", + skill_focus: ["observation", "persuasion"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "walks the market floor at an unhurried pace that covers every section twice per hour", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "checks a vendor's stall assignment against the floor plan on a datapad", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "mediates a price dispute by citing the market's standard terms from memory", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "posts a notice of a stall opening on the assignment board without commentary", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "photographs a stall that's encroaching on the neighboring allocation", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "collects the day's stall fees on a marked route and issues receipts from a book", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "logs a complaint in the market record and gives the complainant a reference number", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "redirects foot traffic around a congestion point with brief, directed instructions", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "checks weights and measures equipment at a stall on a rolling inspection schedule", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "handles an informal grievance between adjacent vendors in a low voice near the stall", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "flags a prohibited goods complaint to the security warden without escalating it herself", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "reads the close-of-market announcements at the same time every day", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "signs the day's trading log and posts it at the floor entry on her way out", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "gives a new vendor a brief orientation to the floor rules before their first trading day", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "reports a recurring dispute pattern to the floor supervisor without naming the parties", context: OnShift, modifier_hint: Some("authority_response") ), + // Social + ( action: "takes a break at the public tables and doesn't conduct business during it", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "buys something from a vendor on the floor during her break, same as any buyer", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "accepts a cup of something from a vendor she's known for three seasons without making it awkward", context: Social, modifier_hint: Some("social_signal") ), + ( action: "eats a meal at the public tables at close of market, watching the vendors pack down", context: Social, modifier_hint: Some("environmental_scan") ), + ], + ), + ( + id: "security_warden", + label: "Market Security Warden", + skill_focus: ["combat", "observation"], + combat_eligible: true, + behavior_primitives: [ + // OnShift + ( action: "stands at the floor entry point and watches the traffic at market open", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "walks a section of the market floor and notes the vendor and buyer density", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "moves toward a disturbance at a walking pace, not running", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "positions herself where two sightlines cross on the market floor", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "checks a bag at the entry on the basis of a tip without making it obvious", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "responds to the market official's call without asking for details first", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "removes a disruptive person from the market floor with minimal contact", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "logs an incident at the end of the hour, not in the moment", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "watches a vendor interaction from a distance until it resolves or doesn't", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "scans faces at the floor entrance for a moment before stepping aside", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "passes market intelligence to the official at the end of the floor round, nothing formal", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "steps into a dispute position and says nothing until both parties stop talking", context: OnShift, modifier_hint: Some("authority_response") ), + // Social + ( action: "takes a seat with the public at close and faces the entry out of habit", context: Social, modifier_hint: Some("environmental_scan") ), + ( action: "accepts a vendor's end-of-day offcut without making it a transaction", context: Social, modifier_hint: Some("social_signal") ), + ( action: "talks to a vendor she knows by name and lets it be brief enough to stay professional", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ], + + // Valid social site types for this zone type. + // Location specs declare which appear, with their own label, min_npcs, max_npcs. + social_site_types: [ + ( site_type: "market_floor", eligible_roles: ["vendor", "buyer", "market_official", "security_warden"] ), + ( site_type: "vendor_backstall", eligible_roles: ["vendor", "market_official"] ), + ( site_type: "public_seating", eligible_roles: ["vendor", "buyer", "market_official", "security_warden"] ), + ], +) diff --git a/server/content/global/zone-types/commercial_transit.ron b/server/content/global/zone-types/commercial_transit.ron new file mode 100644 index 000000000..a2153beef --- /dev/null +++ b/server/content/global/zone-types/commercial_transit.ron @@ -0,0 +1,152 @@ +// Commercial Transit Zone-Type Template +// +// Schema: server/src/npc/blueprint.rs :: ZoneTypeTemplate +// Ticket: #662 (copy team) +// Validate: tooling/validate-ron content/global/zone-types/commercial_transit.ron zone_type +// +// Sources: D-142 (zone-type template architecture). +// +// Zone character: transit hub commercial district — shops, services, food, lodging near transport. +// High foot traffic, short stays, transient population mixed with local workers. +// Everyone is either waiting, moving through, or working the people who are. +// +// Primitives are CULTURE-NEUTRAL. Culture modifiers (culture-*.ron files) append +// cultural flavor at assembly time. Do not encode cultural attitudes in action text. +// +// Roles: service_worker, concourse_trader, hub_security, transit_official +// Social site types: transit_lounge, commercial_concourse, service_counter + +( + id: "commercial_transit", + subtype: None, + label: "Commercial Transit Zone", + description: "Transit hub commercial district — shops, services, food, lodging near transport nodes. High foot traffic, short stays, transient population mixed with local workers. Everyone is either waiting, moving through, or working the people who are.", + + // Default economic/density profile. Location specs override. + economic_level: 6, + population_density: 8, + + roles: [ + ( + id: "service_worker", + label: "Transit Service Worker", + skill_focus: ["persuasion"], + combat_eligible: false, + // weight omitted — location specs declare role_weights + behavior_primitives: [ + // OnShift + ( action: "wipes down a service counter between transactions with a practiced circular motion", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "fills an order without looking up from the counter surface", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "calls the next person forward while still completing the current order", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "restocks the front shelf from a box pulled from behind the counter without leaving her position", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "recognizes a repeat customer without commenting on it", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "answers a question about the facility layout with a pointed gesture, no words", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "handles a payment dispute with a flat, factual account of what the display said", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "sweeps debris from the service area floor during a lull without stopping to assess it", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "spots a queue building and adjusts her pace by a small increment without announcing it", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "redirects a complaint to the hub supervisor without losing her position at the counter", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "checks the stock level under the counter by touch before turning to the customer", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "hands change with the receipt between two fingers, cover item with the same hand", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "tells a customer the wait time in the closest round number without checking a clock", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "prepares the next order while the current customer is still deciding", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "cleans and resets the counter at shift end in a sequence that covers everything", context: OnShift, modifier_hint: Some("task_completion") ), + // Social / transit lounge + ( action: "takes a seat in the lounge on break and faces the concourse out of habit", context: Social, modifier_hint: Some("environmental_scan") ), + ( action: "eats a meal sitting sideways in a transit lounge chair, watching the departures board", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "talks with a colleague from a neighboring counter on break, standing near the back wall", context: Social, modifier_hint: Some("social_signal") ), + ( action: "buys something from the adjacent vendor on her break and eats it standing", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "swaps shift notes with the incoming worker in two sentences, no overlap", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ( + id: "concourse_trader", + label: "Concourse Trader", + skill_focus: ["persuasion", "observation"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "stations herself at the edge of the concourse traffic flow with a narrow but visible display", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "tracks the pace of foot traffic and adjusts her pitch timing to match", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "reads a potential customer's direction of travel before stepping into their path", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "keeps a display item in hand rather than behind the counter when traffic is high", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "names a price in a one-beat window and doesn't elaborate unless the customer stops", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "packs the display fast when the transit official does a circuit", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "reads the departure board over a customer's shoulder and adjusts the pitch for available time", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "makes change from a belt pouch without taking her eyes off the concourse", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "counts her inventory during a lull without setting it out where it could be swept", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "shifts position on the concourse when the foot traffic pattern changes", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "closes a sale by stopping talking before the customer changes their mind", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "wraps goods in under three seconds", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "watches a transit official's circuit to map the gap in coverage", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "keeps one item in reserve to show a customer who balked at the first", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "folds the display and steps away from the concourse when a security warden approaches", context: OnShift, modifier_hint: Some("authority_response") ), + // Social + ( action: "takes a seat in the transit lounge on break with the display bag under her feet", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "eats quickly and watches the concourse during the meal", context: Social, modifier_hint: Some("environmental_scan") ), + ( action: "talks trade with a stationary vendor in the lounge on both their breaks", context: Social, modifier_hint: Some("social_signal") ), + ( action: "buys something from a food vendor and eats it back on her feet near the concourse", context: Social, modifier_hint: Some("offduty_posture") ), + ], + ), + ( + id: "hub_security", + label: "Hub Security Officer", + skill_focus: ["combat", "observation"], + combat_eligible: true, + behavior_primitives: [ + // OnShift + ( action: "stands at the transit entry point and watches the incoming flow without engaging it", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "walks the concourse on a circuit that varies slightly each time", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "holds a position at the junction of two concourse arteries for thirty seconds before moving", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "acknowledges a trader's presence without taking action on it", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "responds to a disturbance at a measured pace and reads the situation before acting", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "checks a bag at the transit gate after a procedural trigger, not a judgment call", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "logs a contact report at the end of the shift for anything that warranted attention", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "keeps a section of the concourse clear during a crowd peak without making an announcement", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "escalates a suspicious item to the hub supervisor rather than handling it alone", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "stands where both the service counter and the concourse entry are in view", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "routes an agitated passenger to the transit official before it becomes a security matter", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "runs the same check routine regardless of who is watching", context: OnShift, modifier_hint: Some("authority_response") ), + // Social + ( action: "takes a break in the transit lounge and faces the concourse entry", context: Social, modifier_hint: Some("environmental_scan") ), + ( action: "buys a drink from the service counter on break and stays near the concourse", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "exchanges a word with the service worker she passes six times a shift", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ( + id: "transit_official", + label: "Transit Hub Official", + skill_focus: ["observation", "persuasion"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "checks the day's transit schedule against the departure board and marks any gaps", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "walks the concourse and checks that commercial operations are within their allocated areas", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "updates the departure board from a hub terminal on a confirmed schedule change", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "handles a passenger complaint about a service counter delay at the counter itself", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "issues a concourse operating permit to a new trader after checking the paperwork", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "coordinates a crowd flow redirect with the security officer using a hand signal", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "reads an inbound manifest at the arrivals point and marks the processed loads", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "gives a passenger directions in the fewest words that guarantee they'll find the place", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "stands the unauthorized trader down by citing the concourse terms, not by arguing", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "posts an announcement to the concourse board and waits to see if it changes the traffic", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "files the end-of-day trading log and transit manifest together before leaving the hub", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "briefs the security officer at shift handover in three sentences or fewer", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "checks a commercial vendor's permit paperwork without making a production of it", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "handles a delay announcement to a crowded concourse in a flat, informational tone", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "walks the full concourse once at opening and once at close as a bookend routine", context: OnShift, modifier_hint: Some("environmental_scan") ), + // Social + ( action: "takes a break at the transit lounge and reads the outbound schedule on the board overhead", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "nods to a regular trader on break without it being an official acknowledgment", context: Social, modifier_hint: Some("social_signal") ), + ( action: "eats at the service counter on break, same as any other customer", context: Social, modifier_hint: Some("offduty_posture") ), + ], + ), + ], + + // Valid social site types for this zone type. + // Location specs declare which appear, with their own label, min_npcs, max_npcs. + social_site_types: [ + ( site_type: "transit_lounge", eligible_roles: ["service_worker", "concourse_trader", "hub_security", "transit_official"] ), + ( site_type: "commercial_concourse", eligible_roles: ["concourse_trader", "service_worker", "hub_security", "transit_official"] ), + ( site_type: "service_counter", eligible_roles: ["service_worker", "transit_official"] ), + ], +) diff --git a/server/content/global/zone-types/detention_facility.ron b/server/content/global/zone-types/detention_facility.ron new file mode 100644 index 000000000..20fd69d60 --- /dev/null +++ b/server/content/global/zone-types/detention_facility.ron @@ -0,0 +1,157 @@ +// Detention Facility Zone-Type Template +// +// Schema: server/src/npc/blueprint.rs :: ZoneTypeTemplate +// Ticket: #662 (copy team) +// Validate: tooling/validate-ron content/global/zone-types/detention_facility.ron zone_type +// +// Sources: D-142 (zone-type template architecture). +// +// Zone character: closed institutional space with controlled access and documented routines. +// Power flows through credentials, keys, and shift schedules. Every action is logged. +// The physical environment is legible — everyone knows who holds authority and who doesn't. +// +// Primitives are CULTURE-NEUTRAL. Culture modifiers (culture-*.ron files) append +// cultural flavor at assembly time. Do not encode cultural attitudes in action text. +// +// Roles: guard, administrator, prisoner, medic +// Social site types: guard_post, administrative_office, medical_bay, exercise_yard + +( + id: "detention_facility", + subtype: None, + label: "Detention Facility", + description: "Closed institutional space. Controlled access, documented routines, managed population. Power flows through credentials and keys. Every movement is logged, every deviation noticed.", + + // Default economic/density profile. Location specs override. + economic_level: 4, + population_density: 7, + + roles: [ + ( + id: "guard", + label: "Facility Guard", + skill_focus: ["combat", "observation"], + combat_eligible: true, + behavior_primitives: [ + // OnShift + ( action: "walks the corridor at a measured pace, keys clipped to the belt", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "checks the cell door lock with a tug before moving to the next", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "leans at the corridor junction and watches the length of both hallways", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "logs a prisoner movement into a handheld terminal without looking up from the screen", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "exchanges a clipped phrase with the outgoing shift guard at the checkpoint", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "pats down an inmate at the exercise yard entrance without breaking the rhythm of the line", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "positions herself at the far wall of the exercise yard with both exits in view", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "scans a credential card and holds eye contact with the bearer while the reader processes", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "checks the count on a cell block and marks the tally before moving off", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "raises a hand to slow a prisoner's approach without speaking", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "reads the incident log at shift start and re-reads one entry", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "reports a discrepancy in the headcount to a senior officer without editorializing", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "nods to a prisoner she recognizes and continues the corridor sweep", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "stands at the exercise yard entrance with arms folded, watching the yard without focusing on anyone", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "follows up a written incident report with a verbal note to the shift supervisor", context: OnShift, modifier_hint: Some("authority_response") ), + // OffDuty + ( action: "sits in the guard post common area with both hands around a cup, not talking", context: OffDuty, modifier_hint: Some("offduty_posture") ), + ( action: "works through a meal in the staff canteen without looking at anything in particular", context: OffDuty, modifier_hint: Some("offduty_posture") ), + ( action: "trades quiet words with a colleague at the end of the table, voice not carrying", context: Social, modifier_hint: Some("social_signal") ), + ( action: "unclips her keyring and sets it on the table with a deliberate sound", context: OffDuty, modifier_hint: Some("offduty_posture") ), + ( action: "listens to the others talking around the table without joining in", context: Social, modifier_hint: Some("offduty_posture") ), + ], + ), + ( + id: "administrator", + label: "Facility Administrator", + skill_focus: ["persuasion", "observation"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "reviews a case file and adds a flag before forwarding it up the chain", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "stands at a filing terminal running intake paperwork for an arriving prisoner", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "conducts an interview with a detainee across a bolted-down table", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "circles a discrepancy in a form with a red stylus and sets it aside", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "pulls a prisoner's record from a terminal and reads it before authorizing a transfer", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "takes a call from the legal office at her desk and writes down one number", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "walks a row of cells for a welfare check, stopping briefly at each door window", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "explains a processing step to a new intake without slowing down the queue", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "routes a complaint form to the correct department and notes the timestamp", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "answers a superior's directive by confirming the action, not the reasoning", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "presses a prisoner's thumb to a reader and waits for the confirmation tone", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "photographs an injury on intake paperwork before the prisoner is moved to a cell", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "meets with a legal representative at the secure visiting desk", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "looks across the office at the board of open cases before settling on the next task", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "initials a release form without re-reading the terms", context: OnShift, modifier_hint: Some("task_completion") ), + // OffDuty + ( action: "eats at her desk with a closed case file in front of her as a placemat", context: OffDuty, modifier_hint: Some("offduty_posture") ), + ( action: "stretches her neck and checks the door before leaning back in her chair", context: OffDuty, modifier_hint: Some("offduty_posture") ), + ( action: "asks a colleague a short question in the corridor and doesn't wait for more than one sentence", context: Social, modifier_hint: Some("social_signal") ), + ( action: "pours two cups from the common urn and leaves one at a colleague's desk without knocking", context: Social, modifier_hint: Some("social_signal") ), + ( action: "stands at the window of the admin block looking at the exercise yard for a long moment", context: OffDuty, modifier_hint: Some("environmental_scan") ), + ], + ), + ( + id: "prisoner", + label: "Prisoner", + skill_focus: ["observation"], + combat_eligible: false, + behavior_primitives: [ + // OnShift — work detail or mandated activity + ( action: "mops a corridor section in long, overlapping strokes", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "stacks trays in the canteen at the end of a meal period", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "walks the exercise yard perimeter at a slow pace", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "waits at the cell door for the lock to cycle at the end of count", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "sits at a work table assembling small components from a bin", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "glances toward the guard station before speaking to the person beside her", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "moves to the back of the yard when a guard's circuit brings them close", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "hands a finished tray of components to the line supervisor and waits for the count", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "keeps her hands on the table surface during an inspection of the work area", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "answers a guard's question briefly and returns to the task", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "stands against the cell wall during count, arms at her sides", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "stops at the canteen counter and waits for her tray to be filled", context: OnShift, modifier_hint: Some("work_pace") ), + // Social + ( action: "talks low with a neighbor at the yard bench, not looking at them directly", context: Social, modifier_hint: Some("social_signal") ), + ( action: "passes a small item under the canteen table in a closed fist", context: Social, modifier_hint: Some("physical_manner") ), + ( action: "plays cards with three others at the canteen corner table", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "sits at the edge of a group conversation without committing to it", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "trades a few words with a known face at the yard water point", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ( + id: "medic", + label: "Facility Medic", + skill_focus: ["technical", "observation"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "takes a prisoner's pulse at the wrist with two fingers and watches the clock on the wall", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "documents an injury on an intake form and marks the date and cell number", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "draws a blood sample and labels the tube before setting it in the rack", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "asks a patient a direct question and writes down the answer word for word", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "lays out a tray of instruments in order before beginning the examination", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "reads a patient's chart at the cell door before entering", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "checks a wound dressing by pressing the edges gently and watching the patient's face", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "logs a medication dispensation and has the patient sign the form", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "asks the guard to step outside the curtain before beginning an examination", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "holds a light to the patient's eye and counts before switching to the other", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "writes a fitness-for-work assessment without discussing it with the patient", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "flags a patient's case for specialist review and files the referral", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "checks the medical supply stock against the dispense log once a week", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "explains a treatment to a patient in plain terms without simplifying it further than needed", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "cleans the examination surface between patients without rushing it", context: OnShift, modifier_hint: Some("work_pace") ), + // OffDuty + ( action: "sits in the medical bay office reviewing the week's case log between rounds", context: OffDuty, modifier_hint: Some("offduty_posture") ), + ( action: "washes her hands at the basin a second time after removing gloves", context: OffDuty, modifier_hint: Some("physical_manner") ), + ( action: "talks to a guard colleague in the corridor in a low voice, neither of them stopping fully", context: Social, modifier_hint: Some("social_signal") ), + ( action: "eats a meal in the staff room with a patient file closed beside the tray", context: OffDuty, modifier_hint: Some("offduty_posture") ), + ( action: "answers a question from a guard about a prisoner's status with a single sentence", context: Social, modifier_hint: Some("authority_response") ), + ], + ), + ], + + // Valid social site types for this zone type. + // Location specs declare which appear, with their own label, min_npcs, max_npcs. + social_site_types: [ + ( site_type: "guard_post", eligible_roles: ["guard", "administrator"] ), + ( site_type: "exercise_yard", eligible_roles: ["prisoner", "guard"] ), + ( site_type: "medical_bay", eligible_roles: ["medic", "prisoner", "guard"] ), + ( site_type: "administrative_office", eligible_roles: ["administrator", "medic"] ), + ], +) diff --git a/server/content/global/zone-types/diplomatic_elite.ron b/server/content/global/zone-types/diplomatic_elite.ron new file mode 100644 index 000000000..bb2cddc87 --- /dev/null +++ b/server/content/global/zone-types/diplomatic_elite.ron @@ -0,0 +1,157 @@ +// Diplomatic Elite Zone-Type Template +// +// Schema: server/src/npc/blueprint.rs :: ZoneTypeTemplate +// Ticket: #662 (copy team) +// Validate: tooling/validate-ron content/global/zone-types/diplomatic_elite.ron zone_type +// +// Sources: D-142 (zone-type template architecture). +// +// Zone character: formal, high-stakes social and political space. +// Language is precise. Dress and posture are performance. Every action is potentially +// observed. Hierarchy is implicit — stated rank matters less than handled status. +// The real work happens in conversations nobody writes down. +// +// Primitives are CULTURE-NEUTRAL. Culture modifiers (culture-*.ron files) append +// cultural flavor at assembly time. Do not encode cultural attitudes in action text. +// +// Roles: diplomat, aide, security_detail, protocol_officer +// Social site types: reception_hall, private_office, secured_lounge + +( + id: "diplomatic_elite", + subtype: None, + label: "Diplomatic Elite Zone", + description: "Formal, high-stakes social and political space. Language is precise. Dress and posture are performance. The real work happens in conversations nobody writes down.", + + // Default economic/density profile. Location specs override. + economic_level: 9, + population_density: 3, + + roles: [ + ( + id: "diplomat", + label: "Diplomat", + skill_focus: ["persuasion", "observation"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "stands near the edge of a reception group and listens before speaking", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "offers a handshake that commits fully and ends first", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "positions herself where two arriving delegations will both see her at the same moment", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "answers a pointed question with a sentence that neither confirms nor invites the next step", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "reads a position paper from a counterpart's delegation at the briefing table before responding", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "defers to a senior delegate with a gesture that looks like courtesy", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "listens to a counterpart's full statement before her expression changes at all", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "crosses the room to greet a new arrival before the new arrival can cross to her", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "makes a note on a small card and slips it into a jacket pocket without looking at it again", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "maintains eye contact through a long pause in a bilateral meeting", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "guides a conversation toward a prepared position without appearing to guide it at all", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "references a counterpart's earlier statement in a way that shows it was heard completely", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "reads the room by watching who stands near whom and who does not", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "accepts an unexpected proposal by thanking the party for raising it and referring to process", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "briefs a colleague in a corridor in under thirty seconds before they enter the next room", context: OnShift, modifier_hint: Some("work_pace") ), + // Social + ( action: "holds a glass during the reception without drinking from it in the first half hour", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "draws a counterpart into a side conversation near the window, away from the main group", context: Social, modifier_hint: Some("social_signal") ), + ( action: "laughs at something at the right moment, long enough to be genuine and not long enough to require comment", context: Social, modifier_hint: Some("social_signal") ), + ( action: "acknowledges a junior official from another delegation by name and asks one specific question", context: Social, modifier_hint: Some("social_signal") ), + ( action: "excuses herself from a group at a natural pause and moves toward the next one", context: Social, modifier_hint: Some("work_pace") ), + ], + ), + ( + id: "aide", + label: "Diplomatic Aide", + skill_focus: ["observation", "persuasion"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "passes a briefing document to the senior delegate at the moment before it is needed", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "checks a seating arrangement against the protocol list and moves two cards three centimeters", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "stands two paces behind and to the left of the lead diplomat during a formal greeting", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "takes detailed notes without looking at the notepad", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "fields a message from an incoming delegation and drafts a response for the diplomat's approval", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "confirms a schedule change by updating two people before the diplomat is told about it", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "carries a request from one delegation to another without editorializing the content", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "answers a procedural question from a junior delegation member directly and briefly", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "prepares a summary brief from a two-hour session into a single typed page", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "routes a document to the correct authority without asking the diplomat which one", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "clears a scheduling conflict by proposing a third option neither party had mentioned", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "makes a note of something said informally in the corridor and adds it to the session file", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "keeps a bilateral session on schedule without saying the word schedule", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "watches the interpreter for signs of uncertainty during a difficult exchange", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "positions a document within reach of the lead diplomat before the relevant topic begins", context: OnShift, modifier_hint: Some("physical_manner") ), + // Social + ( action: "stands near the service table at the reception and handles introductions for those arriving late", context: Social, modifier_hint: Some("work_pace") ), + ( action: "speaks to the counterpart aides in a register that is relaxed but never unguarded", context: Social, modifier_hint: Some("social_signal") ), + ( action: "eats at a reception without appearing to eat, setting a plate down each time something requires both hands", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "gives a counterpart aide a straight answer about a logistical question as a small act of good faith", context: Social, modifier_hint: Some("social_signal") ), + ( action: "identifies which reception conversations are being listened to from elsewhere in the room", context: Social, modifier_hint: Some("environmental_scan") ), + ], + ), + ( + id: "security_detail", + label: "Security Detail", + skill_focus: ["combat", "observation"], + combat_eligible: true, + behavior_primitives: [ + // OnShift + ( action: "takes a position at the room entrance where arrivals can be seen before they enter the space", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "stands at the principal's shoulder during an introduction, present but not visible", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "clears the route from the private office to the departure point before the principal moves", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "scans a new room from the door before the principal crosses the threshold", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "communicates a change of position to her partner with a look rather than a word", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "checks a credential badge by reading it from arm's length before standing aside", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "redirects an approaching contact toward the aide rather than the principal", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "rotates her position in the room over the course of a long reception without it appearing deliberate", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "reviews a venue floor plan against what she can see from the principal's seat", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "stands closer when the group around the principal tightens", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "evaluates a late arrival to the reception by watching their hands before their face", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "keeps an ear to the principal's conversation without appearing to listen", context: OnShift, modifier_hint: Some("social_signal") ), + // Social + ( action: "stands at the perimeter of the secured lounge while others sit", context: Social, modifier_hint: Some("environmental_scan") ), + ( action: "accepts a drink when offered but does not open it", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "makes two-word acknowledgments to small talk without expanding on either word", context: Social, modifier_hint: Some("social_signal") ), + ( action: "notes which guests at the reception are accompanied by their own detail", context: Social, modifier_hint: Some("environmental_scan") ), + ( action: "positions herself near the exit of the secured lounge during the principal's informal conversation", context: Social, modifier_hint: Some("physical_manner") ), + ], + ), + ( + id: "protocol_officer", + label: "Protocol Officer", + skill_focus: ["persuasion", "observation"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "sets a reception seating chart by rank, then adjusts three seats for interpersonal history", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "greets an arriving delegation at the building entrance with the correct form of address", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "corrects a room configuration two hours before a session by moving three chairs and repositioning the flags", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "briefs a junior aide on precedence order before the morning session begins", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "catches a form of address that would have caused offense and routes around it silently", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "confirms a delegation's special requirements for a session and implements three of them before being asked", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "reviews a session agenda for procedural problems and flags one item for revision", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "manages a schedule conflict between two delegations by moving the smaller inconvenience to the host party", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "scans the room layout before a session opens and positions a water service where both delegations can reach it", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "walks a first-time attendee through the formal greeting sequence before they step into the room", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "flags a procedural error in a draft communiqué to the aide without sending it up the chain first", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "adjusts the table configuration at a reception so the two principals will meet at a natural midpoint", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "reads a session transcript to check that all parties were addressed correctly", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "moves quietly around a reception event re-filling water services without diverting attention from the conversation", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "introduces two parties who should know each other in a way that allows both to take credit for the introduction", context: OnShift, modifier_hint: Some("social_signal") ), + // Social + ( action: "stands at the edge of a reception group and monitors the pace of the event", context: Social, modifier_hint: Some("environmental_scan") ), + ( action: "makes an introduction across the reception room with the correct precedence without making it formal", context: Social, modifier_hint: Some("social_signal") ), + ( action: "accepts a remark from a senior delegate with a nod and files it for later", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "moves between groups at the reception in a pattern that covers every cluster at least once", context: Social, modifier_hint: Some("work_pace") ), + ( action: "handles an awkward pause in a three-way conversation by introducing a procedural topic", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ], + + // Valid social site types for this zone type. + // Location specs declare which appear, with their own label, min_npcs, max_npcs. + social_site_types: [ + ( site_type: "reception_hall", eligible_roles: ["diplomat", "aide", "security_detail", "protocol_officer"] ), + ( site_type: "private_office", eligible_roles: ["diplomat", "aide", "protocol_officer"] ), + ( site_type: "secured_lounge", eligible_roles: ["diplomat", "aide", "security_detail"] ), + ], +) diff --git a/server/content/global/zone-types/entertainment_hospitality.ron b/server/content/global/zone-types/entertainment_hospitality.ron new file mode 100644 index 000000000..8cefad3c7 --- /dev/null +++ b/server/content/global/zone-types/entertainment_hospitality.ron @@ -0,0 +1,155 @@ +// Entertainment Hospitality Zone-Type Template +// +// Schema: server/src/npc/blueprint.rs :: ZoneTypeTemplate +// Ticket: #662 (copy team) +// Validate: tooling/validate-ron content/global/zone-types/entertainment_hospitality.ron zone_type +// +// Sources: D-142 (zone-type template architecture). +// +// Zone character: lodging, dining, hosted leisure — hotels, inns, resort blocks, transit +// accommodations. Staff and guests in visible proximity. Work rhythm is guest-driven and +// cyclical: check-in peaks, meal service windows, the long quiet of off-hours. +// The space looks effortless because the effort is invisible. +// +// Primitives are CULTURE-NEUTRAL. Culture modifiers (culture-*.ron files) append +// cultural flavor at assembly time. Do not encode cultural attitudes in action text. +// +// Roles: hospitality_staff, kitchen_worker, concierge, security +// Social site types: lobby_bar, staff_canteen, service_corridor + +( + id: "entertainment_hospitality", + subtype: None, + label: "Entertainment Hospitality Zone", + description: "Lodging, dining, hosted leisure. Staff and guests occupy the same space on different terms. Work is guest-driven and cyclical. The space looks effortless because the effort is invisible.", + + // Default economic/density profile. Location specs override. + economic_level: 6, + population_density: 5, + + roles: [ + ( + id: "hospitality_staff", + label: "Hospitality Staff", + skill_focus: ["persuasion", "observation"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "straightens a folded towel on a rack so all the edges align", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "wheels a linen cart down the corridor, stopping at each numbered door", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "replaces a used amenity kit on the bedside shelf and sets it at a precise angle", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "strips a bed in four pulls and has it bundled before leaving the room", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "checks a room assignment against the service tablet before entering", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "moves a knocked-over chair back to its marked position on the floor", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "greets a guest passing in the corridor with a brief nod and keeps moving", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "clears a room service tray from the corridor floor without slowing down", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "tests the climate setting in a room before the next guest arrives", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "leaves the service cart outside the door and works from memory inside the room", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "logs a completed room on the service tablet and moves to the next", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "steps back from a made bed and tilts her head to check the corners before signing off", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "responds to a complaint with a nod and a soft, non-committal phrase", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "holds a service door open for a colleague with a loaded cart without breaking stride", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "watches a guest's behavior from across the lobby without appearing to watch", context: OnShift, modifier_hint: Some("environmental_scan") ), + // Social / off-duty + ( action: "peels off her service jacket the moment she reaches the staff canteen", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "sits in the canteen with a meal and doesn't speak for several minutes", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "complains about a guest to a colleague in shorthand that only staff understand", context: Social, modifier_hint: Some("social_signal") ), + ( action: "accepts a canteen seat from a colleague and sits without thanking them", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "trades a shift with someone in the canteen by writing a number on a napkin", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ( + id: "kitchen_worker", + label: "Kitchen Worker", + skill_focus: ["technical"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "plates a meal with a quarter-turn at the end to set the garnish side toward the pass", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "wipes a counter surface with a cloth in one long sweep before setting down a prep board", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "calls an order number across the kitchen at volume without looking up", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "checks a ticket against the assembled dish and sends it to the pass", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "fills a prep container to a marked line and snaps the lid down", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "turns a burner down two notches and checks the pan without lifting the lid", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "slides dirty prep trays into the wash rack in one practiced motion", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "reads a temperature display and records the number on the wall log", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "works a prep station without looking at the knife — eyes on the produce", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "stages six plates on the pass rail and steps back when the server takes the first", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "runs cold water over a burned wrist for three seconds, then goes back to the stove", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "tastes a sauce from the back of a spoon and adds nothing, or reaches for a shaker", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "holds an order ticket up to read it in the kitchen light, then pins it back to the rail", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "works around a colleague without touching them or breaking their rhythm", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "flags a supply shortage to the shift lead without interrupting the service window", context: OnShift, modifier_hint: Some("authority_response") ), + // Social / off-duty + ( action: "eats standing at the pass in a five-minute window between service rushes", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "washes her hands in the staff basin and stays there a moment, just standing", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "tells a brief story in the canteen that the people at the next table also laugh at", context: Social, modifier_hint: Some("social_signal") ), + ( action: "shares a dish from the prep overage with the canteen table without announcing it", context: Social, modifier_hint: Some("social_signal") ), + ( action: "sits sideways in the canteen chair, back against the wall, still in her kitchen apron", context: Social, modifier_hint: Some("offduty_posture") ), + ], + ), + ( + id: "concierge", + label: "Concierge", + skill_focus: ["persuasion", "observation"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "straightens a display card on the lobby desk before a guest reaches the counter", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "answers a query with two sentences and a clear gesture toward the destination", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "looks up from a terminal when the lobby door opens and returns to the screen when it closes", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "updates an arrival note on the property manifest and keys a room assignment", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "directs a guest to the service lift with a phrase that sounds like a personal recommendation", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "handles a complaint at the desk by listening for the full statement before answering", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "fields two simultaneous requests and acknowledges the second with a raised finger before the first is resolved", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "closes a room record on the terminal and files the physical key card without hesitating on either", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "scans the lobby from behind the desk, cataloguing who is waiting", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "notes a guest's name on the first interaction and uses it without making it obvious", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "steps from behind the desk to point directions in person when the lobby is busy", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "passes a note to a colleague at the desk without breaking eye contact with the guest", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "responds to a difficult inquiry with a calm restatement of what is actually possible", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "accepts a tip without looking at it and sets it below the counter line", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "holds the service posture until the guest's back is fully turned", context: OnShift, modifier_hint: Some("work_pace") ), + // Social / off-duty + ( action: "lets the desk persona go the moment she walks into the lobby bar on her own time", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "orders something she'd never recommend to a guest and eats it without apology", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "recognizes a regular guest at the lobby bar on her night off and debates whether to say hello", context: Social, modifier_hint: Some("environmental_scan") ), + ( action: "tells a colleague at the staff table something she'd never say in front of a guest", context: Social, modifier_hint: Some("social_signal") ), + ( action: "sits at the back of the lobby bar with her badge turned inward", context: Social, modifier_hint: Some("offduty_posture") ), + ], + ), + ( + id: "security", + label: "Facility Security", + skill_focus: ["combat", "observation"], + combat_eligible: true, + behavior_primitives: [ + // OnShift + ( action: "walks the lobby floor on a loose circuit without making the pattern obvious", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "stands near the entrance at peak check-in, visible but not in the way", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "watches an argument at the front desk without moving closer yet", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "checks a service access door to confirm it's secured before moving on", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "makes eye contact with a person who has been in the lobby too long without checking in", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "addresses a disturbance quietly enough that other guests don't turn around", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "takes a position near the service corridor during a delivery — procedure, not suspicion", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "clears a passage to the lobby lift without explaining why", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "exchanges a brief word with the concierge while scanning the lobby behind their shoulder", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "logs the end of the circuit on a handheld before starting the next one", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "keeps the lobby bar in line of sight while talking to the entrance desk", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "holds the service lift for a loaded cart, watching the corridor in both directions while waiting", context: OnShift, modifier_hint: Some("physical_manner") ), + // OffDuty + ( action: "sits in a corner of the lobby bar off-shift and watches the room without thinking about it", context: OffDuty, modifier_hint: Some("offduty_posture") ), + ( action: "drinks slowly and doesn't talk much at the staff table", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "acknowledges a colleague who sits down with a half-nod and no conversation", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ], + + // Valid social site types for this zone type. + // Location specs declare which appear, with their own label, min_npcs, max_npcs. + social_site_types: [ + ( site_type: "lobby_bar", eligible_roles: ["concierge", "security", "hospitality_staff"] ), + ( site_type: "staff_canteen", eligible_roles: ["hospitality_staff", "kitchen_worker", "security", "concierge"] ), + ( site_type: "service_corridor", eligible_roles: ["hospitality_staff", "kitchen_worker"] ), + ], +) diff --git a/server/content/global/zone-types/entertainment_venue.ron b/server/content/global/zone-types/entertainment_venue.ron new file mode 100644 index 000000000..1933fa0a3 --- /dev/null +++ b/server/content/global/zone-types/entertainment_venue.ron @@ -0,0 +1,156 @@ +// Entertainment Venue Zone-Type Template +// +// Schema: server/src/npc/blueprint.rs :: ZoneTypeTemplate +// Ticket: #662 (copy team) +// Validate: tooling/validate-ron content/global/zone-types/entertainment_venue.ron zone_type +// +// Sources: D-142 (zone-type template architecture). +// +// Zone character: performance spaces, live entertainment, spectator venues — theaters, +// arenas, clubs, viewing galleries. Cyclical tension between preparation, performance, +// and the aftermath. Audience-facing roles and backstage roles exist in the same building +// but in entirely different rhythms. The work is invisible before showtime and +// irrelevant after it. +// +// Primitives are CULTURE-NEUTRAL. Culture modifiers (culture-*.ron files) append +// cultural flavor at assembly time. Do not encode cultural attitudes in action text. +// +// Roles: performer, stage_crew, venue_staff, security +// Social site types: backstage_area, patron_bar, crew_lounge + +( + id: "entertainment_venue", + subtype: None, + label: "Entertainment Venue Zone", + description: "Performance spaces, spectator venues, live entertainment. Preparation, performance, and aftermath in a single building. Audience-facing and backstage roles exist in entirely different rhythms.", + + // Default economic/density profile. Location specs override. + economic_level: 5, + population_density: 7, + + roles: [ + ( + id: "performer", + label: "Performer", + skill_focus: ["persuasion", "observation"], + combat_eligible: false, + behavior_primitives: [ + // OnShift — pre-show / show + ( action: "marks blocking positions on the stage floor with a taped toe before the house opens", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "runs a line from the wings, barely audible, lips moving without sound", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "adjusts an earpiece with two fingers before stepping into the light check", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "stands at the wings edge watching the house fill without making herself visible", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "accepts a note from the director without responding to it immediately", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "stretches against a backstage wall, heel on a crate, working a tight muscle", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "checks her costume hem in a standing mirror and presses it flat with one hand", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "holds a conversation with a crew member and doesn't hear most of it", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "drinks water in small regular sips in the half-hour before the show", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "walks the stage perimeter before the house opens, touching the set pieces lightly", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "takes a position marker and holds it without acknowledgment from the crew", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "runs through a technical transition alone backstage at half-speed", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "looks at a set of cue notes once and folds them into a pocket without reading them again", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "stills completely when a stage manager calls places over the headset", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "holds the performance state until she clears the stage, then releases it visibly", context: OnShift, modifier_hint: Some("physical_manner") ), + // Social / off-duty + ( action: "sits at the crew lounge table after a show with her feet up and doesn't perform anything", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "accepts a drink from a colleague without breaking the conversation she's already in", context: Social, modifier_hint: Some("social_signal") ), + ( action: "tells a story from a previous show at the crew lounge table, voice lower than on stage", context: Social, modifier_hint: Some("social_signal") ), + ( action: "peels off stage makeup at the dressing bench and ignores the mirror when she's done", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "sits with the crew rather than the other performers after the show", context: Social, modifier_hint: Some("offduty_posture") ), + ], + ), + ( + id: "stage_crew", + label: "Stage Crew", + skill_focus: ["technical"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "checks the rigging points on a fly bar by pulling each one in sequence", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "tapes a cable run along the stage deck so the join sits flush", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "marks a piece of scenery with a glow strip and crosses it off the pre-show list", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "coils a cable over the elbow and under the hand in a figure eight without looking at it", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "confirms a cue position with the desk operator by radio before moving the piece", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "waits in the dark of the wing for a cue that doesn't come on time, doesn't move", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "shifts a set piece three centimeters to match the tape mark and steps back to check", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "climbs a fly ladder with tools on the belt, both hands on the rungs", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "flags a loose footing to the deck manager on a quiet headset channel", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "scans the stage floor for tripping hazards after the reset, walking the full grid", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "feeds a hoist line through a block and lets the drum take the weight without rushing it", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "watches a performer rehearse a cross and mentally adjusts the scenery path", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "applies glow tape to a step edge and tests the visibility from both sides", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "hands a performer a prop at exactly the right moment without acknowledging each other", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "moves a heavy piece alone when a second hand would make it easier, doesn't ask", context: OnShift, modifier_hint: Some("work_pace") ), + // Social / off-duty + ( action: "drops onto a backstage equipment case and eats a meal without finding a better seat", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "gives a post-show account of a cue that went wrong with technical precision and no drama", context: Social, modifier_hint: Some("social_signal") ), + ( action: "fixes something in the crew lounge that was already broken before her shift", context: Social, modifier_hint: Some("social_signal") ), + ( action: "sits through post-show noise at the crew lounge with her headset still around her neck", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "leaves the crew lounge before the crowd thins — early call tomorrow", context: Social, modifier_hint: Some("offduty_posture") ), + ], + ), + ( + id: "venue_staff", + label: "Venue Staff", + skill_focus: ["persuasion", "observation"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "guides a patron to a seat and returns to the aisle before the next pair arrives", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "checks a ticket with a handheld scanner and holds the beam until it reads", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "positions himself at an aisle intersection so both sides of the section are visible", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "redirects a patron to the correct entrance level without making them feel wrong", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "tops up a bar order without being flagged — reads the level of the glass from across the counter", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "manages a queue at the door by moving through it and speaking quietly", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "fields a complaint about a seat view and checks the assignment terminal before responding", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "clears an aisle of standing patrons before the second act without announcing it", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "sets out row stanchions with the numbered cards facing the entrance", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "clears a spilled drink from an aisle in three moves without pausing the section", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "watches the main house from a rear position, visible to any patron who looks back", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "keeps the bar queue moving by anticipating the next order from two customers back", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "answers a patron's question with facts and no opinion", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "logs an incident on a tablet in the service corridor before reporting it up", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "steps out of a patron's frame when they raise a handheld to record something", context: OnShift, modifier_hint: Some("physical_manner") ), + // Social / off-duty + ( action: "drops into a crew lounge chair after closing and doesn't move for several minutes", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "tallies tips on a napkin before splitting them at the crew lounge table", context: Social, modifier_hint: Some("social_signal") ), + ( action: "describes a difficult patron to a colleague using gestures and shorthand", context: Social, modifier_hint: Some("social_signal") ), + ( action: "finishes a drink at the patron bar after hours and watches the crew clear up", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "argues about the show with a colleague who disagrees and neither of them stops smiling", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ( + id: "security", + label: "Venue Security", + skill_focus: ["combat", "observation"], + combat_eligible: true, + behavior_primitives: [ + // OnShift + ( action: "takes a position at the main entrance and watches the crowd approach without focusing on any one person", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "moves through the main house during a show at a pace that reads as purposeful, not alarmed", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "places herself between a disagreement and the audience before it escalates to touch", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "checks the restricted area seals before the house opens", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "keeps the backstage access corridor clear during load-in with a presence rather than instructions", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "locates an exit route through a full house from her current position before she needs it", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "follows a person of interest through the concourse at two bodies of distance", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "logs a behavior note on a personal handheld and resumes scanning without looking at the screen again", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "clears a corridor for a performer transit without making it look like a sweep", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "makes eye contact with a colleague on the far side of the house — one nod, no words", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "repositions from door detail to floor sweep when the show starts and the entrance slows", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "stands at the rear of the house during the performance, visible to staff, invisible to audience", context: OnShift, modifier_hint: Some("environmental_scan") ), + // OffDuty + ( action: "sits with her back to the crew lounge wall, facing the door", context: OffDuty, modifier_hint: Some("offduty_posture") ), + ( action: "gives a brief account of the evening to a relief officer without editorializing", context: Social, modifier_hint: Some("authority_response") ), + ( action: "drinks with the crew lounge group but doesn't tell stories from the shift", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ], + + // Valid social site types for this zone type. + // Location specs declare which appear, with their own label, min_npcs, max_npcs. + social_site_types: [ + ( site_type: "backstage_area", eligible_roles: ["performer", "stage_crew", "security"] ), + ( site_type: "patron_bar", eligible_roles: ["venue_staff", "security"] ), + ( site_type: "crew_lounge", eligible_roles: ["stage_crew", "performer", "venue_staff", "security"] ), + ], +) diff --git a/server/content/global/zone-types/extraction_platform.ron b/server/content/global/zone-types/extraction_platform.ron new file mode 100644 index 000000000..6ffa92779 --- /dev/null +++ b/server/content/global/zone-types/extraction_platform.ron @@ -0,0 +1,157 @@ +// Extraction Platform Zone-Type Template +// +// Schema: server/src/npc/blueprint.rs :: ZoneTypeTemplate +// Ticket: #662 (copy team) +// Validate: tooling/validate-ron content/global/zone-types/extraction_platform.ron zone_type +// +// Sources: D-142 (zone-type template architecture). +// +// Zone character: fixed industrial platform — atmospheric, oceanic, or subsurface. +// Isolated structure, constant ambient noise and vibration, tight corridors. +// Crew rotations measured in weeks. Off-shift time is compressed and structured. +// Platform has its own rhythms: the machinery never stops, only the people do. +// +// Primitives are CULTURE-NEUTRAL. Culture modifiers (culture-*.ron files) append +// cultural flavor at assembly time. Do not encode cultural attitudes in action text. +// +// Roles: rig_hand, platform_tech, medic, platform_manager +// Social site types: crew_mess, rec_bay, equipment_staging + +( + id: "extraction_platform", + subtype: None, + label: "Extraction Platform Zone", + description: "Fixed industrial extraction platform — atmospheric, oceanic, or subsurface. Isolated structure, constant ambient noise and vibration, tight corridors. Crew rotations measured in weeks. The machinery never stops, only the people do.", + + // Default economic/density profile. Location specs override. + economic_level: 7, + population_density: 4, + + roles: [ + ( + id: "rig_hand", + label: "Rig Hand", + skill_focus: ["technical"], + combat_eligible: false, + // weight omitted — location specs declare role_weights + behavior_primitives: [ + // OnShift + ( action: "pulls a drill stem section from the rack and guides it to the rig floor with hand signals", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "breaks a pipe connection at the floor joint with a long wrench and two hands", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "checks the weight indicator on the draw works console before starting the pull", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "cleans the rig floor between stands of pipe, broom moving in short strokes around the rotary", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "handles the spinning chain with both hands and steps clear before it releases", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "sets a pipe slips into the rotary by feel when the driller calls the weight off", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "positions a new drill collar in the mousehole and holds it steady for the elevator", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "watches the driller's hand for the signal before moving on the rig floor", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "resets the rig floor equipment after a stand change before the next one starts", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "calls out a floor hazard when a hose position changes during a busy run", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "counts the stands going into the hole from the pipe tally board", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "braces herself during a platform vibration event and lets the driller read the instruments", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "stacks the dope bucket and tongs in order after a connection and wipes down the thread", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "acknowledges the toolpusher's direction with a nod and moves immediately", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "takes the rougher side of a two-person lift without pointing out it's the rougher side", context: OnShift, modifier_hint: Some("physical_manner") ), + // OffDuty / crew mess + ( action: "sits at the nearest empty seat in the mess and doesn't move closer to the window", context: OffDuty, modifier_hint: Some("offduty_posture") ), + ( action: "eats a full meal without leaving anything, even when it isn't good", context: OffDuty, modifier_hint: Some("offduty_posture") ), + ( action: "trades bunk rotation preferences with a crewmate over the meal trays", context: Social, modifier_hint: Some("social_signal") ), + ( action: "sits next to the same crewmate at every meal without it ever being agreed upon", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "listens to a story from a senior hand and doesn't look at the time", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ( + id: "platform_tech", + label: "Platform Technician", + skill_focus: ["technical"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "pulls a maintenance ticket from the board and reads the fault history before touching the unit", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "isolates a pump unit at the local breaker before opening the casing", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "checks the pipe work on a heat exchanger by hand, running both palms along the flanges", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "threads a new seal onto a shaft housing and seats it square before torquing", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "clamps a pressure transducer lead to a test port and waits for the reading to settle", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "logs the repair with the maintenance terminal in the corridor outside the unit room", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "carries parts in a sealed kit bag — nothing loose in pockets near rotating equipment", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "runs a functional test on a repaired unit before restoring power at the main breaker", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "checks the blowout preventer control panel readings before every shift in her section", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "escalates a pressure-system anomaly to the platform manager without waiting for confirmation", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "does a walkthrough of the mechanical deck and makes notes rather than calls", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "replaces a sensor unit in the dark section of the pump room by feel and flashlight", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "marks a part as condemned before stowing it in the returns bin", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "confirms the isolation tag is still on the valve before starting work a second time", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "restores power only after the rig hand confirms the floor is clear over the radio", context: OnShift, modifier_hint: Some("social_signal") ), + // Social + ( action: "takes a seat in the rec bay and reads something on a personal device", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "explains a system fault to a rig hand in the mess, unprompted and unhurried", context: Social, modifier_hint: Some("social_signal") ), + ( action: "sits away from the noise in the rec bay, does not explain why", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "answers a question about platform systems in more detail than the asker was expecting", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ( + id: "medic", + label: "Platform Medic", + skill_focus: ["observation"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "logs the morning sick bay report before the shift briefing", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "checks the crash trolley equipment against the manifest at the start of each shift", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "walks the work deck at mid-shift looking for signs of heat stress or fatigue", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "restocks the field kit from the sick bay stores before the end of each shift", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "cleans and dresses a laceration without making the rig hand stop what she was saying", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "records the treatment, not the worker's opinion of the injury, in the log", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "pulls a worker from rotation based on a symptom pattern before the worker asks to stop", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "runs the emergency drill alongside the crew, taking notes rather than leading it", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "checks medication stock and flagging restocking needs to the platform manager two weeks out", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "sits in on a toolbox talk and doesn't say anything unless there's a health question", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "keeps the sick bay door open during normal hours as a standing invitation", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "writes an evacuation medical brief for the medevac coordinator after each rotation", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "treats a shift headache and sends the person back to work without logging it unless they ask", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "does a brief assessment of a new arrival before they go to their first shift", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "monitors a recovering worker's return to full duty over three shifts before clearing them", context: OnShift, modifier_hint: Some("environmental_scan") ), + // Social + ( action: "eats in the mess with the crew and makes it easy to be approached", context: Social, modifier_hint: Some("social_signal") ), + ( action: "listens to a complaint in the mess that isn't medical and says nothing diagnostic", context: Social, modifier_hint: Some("social_signal") ), + ( action: "sits at the far end of the rec bay with a book and leaves the near end for louder conversations", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "tells the same calm story about a false alarm evacuation whenever the platform shakes", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ( + id: "platform_manager", + label: "Platform Manager", + skill_focus: ["observation", "persuasion"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "reviews the overnight operations log in the control room before speaking to anyone", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "walks every active deck of the platform once before mid-shift", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "takes the corporate call in her office and keeps the door closed for it", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "signs the daily production report and files it to the company on time", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "makes a stop-work call on a pressure anomaly before the toolpusher finishes explaining it", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "arbitrates a crew dispute by reviewing the work schedule, not by taking sides", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "runs a formal debrief after any injury event, crew present, on record", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "reads the medic's rotation report before signing off crew fitness certificates", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "approves a non-scheduled maintenance window by checking the well-control status first", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "sits in on an emergency drill once per rotation without announcing it in advance", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "handles a supply vessel handover herself when the logistics officer is unavailable", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "gives the crew an honest production update at the end of the week, not a corporate summary", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "writes her own investigation report on an incident rather than adopting the company template", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "checks the weather and supply forecast before approving a discretionary crew excursion", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "eats in the crew mess once per shift rotation, not in her office", context: OnShift, modifier_hint: Some("social_signal") ), + // OffDuty + ( action: "sits in the rec bay on off-hours with a cup and doesn't bring work to the table", context: OffDuty, modifier_hint: Some("offduty_posture") ), + ( action: "plays a long card game with whichever crew are awake at the end of the night shift", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "gives a straight answer at the mess table and moves on from it", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ], + + // Valid social site types for this zone type. + // Location specs declare which appear, with their own label, min_npcs, max_npcs. + social_site_types: [ + ( site_type: "crew_mess", eligible_roles: ["rig_hand", "platform_tech", "medic", "platform_manager"] ), + ( site_type: "rec_bay", eligible_roles: ["rig_hand", "platform_tech", "medic"] ), + ( site_type: "equipment_staging", eligible_roles: ["rig_hand", "platform_tech", "platform_manager"] ), + ], +) diff --git a/server/content/global/zone-types/extraction_space.ron b/server/content/global/zone-types/extraction_space.ron new file mode 100644 index 000000000..3d8cbf325 --- /dev/null +++ b/server/content/global/zone-types/extraction_space.ron @@ -0,0 +1,157 @@ +// Extraction Space Zone-Type Template +// +// Schema: server/src/npc/blueprint.rs :: ZoneTypeTemplate +// Ticket: #662 (copy team) +// Validate: tooling/validate-ron content/global/zone-types/extraction_space.ron zone_type +// +// Sources: D-142 (zone-type template architecture). +// +// Zone character: orbital or deep-space mining, zero-g or micro-g work, enclosed environment. +// Tethered movement, suit protocols, resource scarcity as background reality. +// Crew rotation is long — people know each other well, and know each other's limits. +// +// Primitives are CULTURE-NEUTRAL. Culture modifiers (culture-*.ron files) append +// cultural flavor at assembly time. Do not encode cultural attitudes in action text. +// +// Roles: miner, drill_operator, ore_processor, station_chief +// Social site types: crew_quarters_common, equipment_lock, mess_bay + +( + id: "extraction_space", + subtype: None, + label: "Space Extraction Zone", + description: "Orbital or deep-space mining, enclosed environment, long crew rotations. Tethered movement, suit protocols, resource scarcity as background reality. Crew know each other well — and know each other's limits.", + + // Default economic/density profile. Location specs override. + economic_level: 6, + population_density: 3, + + roles: [ + ( + id: "miner", + label: "Extraction Miner", + skill_focus: ["technical"], + combat_eligible: false, + // weight omitted — location specs declare role_weights + behavior_primitives: [ + // OnShift + ( action: "clips a safety tether to the anchor point before moving off the platform", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "works a rock face with a coring tool, resetting the angle by feel", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "transfers a sample core into a sealed tube and stows it in the hip pack", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "braces a boot against the face and leans back to change the drill angle", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "checks the suit pressure gauge on the inner wrist display without stopping work", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "loads a payload cannister and seals the hatch with both hands", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "watches the ore flow rate in the line above her and adjusts the feeder gate", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "comms the drill operator before moving behind the platform sweep arc", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "brushes loose grit off the face sensor housing before it drifts into the drill path", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "waits for a vibration cycle to pass before placing the coring tool", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "checks the tether tension before each move between anchor points", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "flags a soft section in the face to the drill operator over comms", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "holds position on the face during a microseismic alert, does not move until it clears", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "guides a full ore sled back to the lock hand-over-hand along the run line", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "re-checks the suit seal at the wrist joint before going EVA", context: OnShift, modifier_hint: Some("task_completion") ), + // OffDuty / crew common + ( action: "pulls herself into a seat in the common room and clips the lap restraint out of habit", context: OffDuty, modifier_hint: Some("offduty_posture") ), + ( action: "eats slowly from a pouch, one hand on the table edge", context: OffDuty, modifier_hint: Some("offduty_posture") ), + ( action: "stares at the porthole during a rest break, not really looking at anything", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "plays a card game with a crewmate using a magnetic deck", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "answers a crewmate's question and asks one back immediately", context: Social, modifier_hint: Some("social_signal") ), + ( action: "listens to the crew chief's debrief without interrupting", context: Social, modifier_hint: Some("authority_response") ), + ], + ), + ( + id: "drill_operator", + label: "Drill Operator", + skill_focus: ["technical"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "runs the drill traverse to the start position and locks the arm before powering up", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "reads the face density readout and adjusts the bit RPM at the console", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "monitors the vibration display during a deep bore and eases the feed rate when a spike appears", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "parks the drill arm and calls the face clear before any EVA crew moves forward", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "retracts the bit after a stuck cycle rather than pushing past the torque limit", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "rotates the bit head to a fresh section after a wear reading flags", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "logs the bore depth and direction at the end of each drill cycle", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "checks camera feeds on the platform before moving the arm", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "runs a systems check at the start of each shift with the console lights confirming green", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "talks the face crew through a positioning move over comms, directional only", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "patches the drill arm control logs to the station chief's console without being asked", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "holds a bore in progress when a face crew member's comms go quiet", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "cleans the camera lens port on the arm housing after every shift", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "sits at the console with both forearms on the desk, eyes on the face display", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "reduces feed rate through a vein boundary and picks it back up on the other side", context: OnShift, modifier_hint: Some("work_pace") ), + // OffDuty + ( action: "sits in the common room with his hands in his lap, not reaching for anything", context: OffDuty, modifier_hint: Some("offduty_posture") ), + ( action: "watches a replay of the day's bore data on a small personal screen", context: OffDuty, modifier_hint: Some("offduty_posture") ), + ( action: "argues about drill settings with a crewmate who wasn't there", context: Social, modifier_hint: Some("social_signal") ), + ( action: "trades off-shift hours for an early wake to get a bore window before the shift change", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ( + id: "ore_processor", + label: "Ore Processor", + skill_focus: ["technical"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "feeds a core sample into the analyzer and records the grade output on a datapad", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "runs the separator sequence, watching the output split at the far end of the line", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "clears a blockage in the feed line with a long clearing rod, working from the safe end", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "grades a batch of ore by eye before running the spectrometer scan", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "seals a processed material container and affixes a grade and weight label", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "logs the batch tonnage and grade against the station's run target", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "rebalances the feed hopper when one side is pulling more than the other", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "checks the dust filter status at the collection unit before starting the next cycle", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "pulls a grade sample from the line at the midpoint of each batch for the station log", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "calls the miner team when the incoming ore grade doesn't match the face survey", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "adjusts the centrifuge settings for a different ore type between batches", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "cleans the separator screen at the end of each grade run", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "stacks sealed containers in the storage bay in grade order", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "runs a zero-point calibration on the analyzer before the first sample of each shift", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "notes an off-spec batch result in the log and flags it before the station chief reviews", context: OnShift, modifier_hint: Some("authority_response") ), + // Social + ( action: "sits in the mess bay and picks over the day's grade data on a handheld", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "trades a meal pack for a better rest rotation slot", context: Social, modifier_hint: Some("social_signal") ), + ( action: "explains a batch result to anyone at the table who'll listen", context: Social, modifier_hint: Some("social_signal") ), + ( action: "sits beside the station chief at mess without it being an accident", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ( + id: "station_chief", + label: "Extraction Station Chief", + skill_focus: ["observation", "persuasion"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "reviews the previous cycle's grade log before authorizing the next bore position", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "consults the resource model on the main console and marks a new target zone", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "holds a pre-shift briefing in the equipment lock — short, operational, mandatory", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "makes the call to halt drilling when the face survey diverges from the model", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "tracks the run-rate against the extraction contract on a wall display", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "walks the processing section and checks the log entries without announcing herself", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "takes the inbound comms from the buyer's rep and relays only the yield numbers", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "reassigns a miner from a spent section to a new face without waiting for the full debrief", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "signs the outbound shipment manifest and copies it to the crew log", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "sits with the drill operator for the first hour of a new face to read the formation response", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "flags a maintenance issue in the cycle report rather than pulling the tech mid-shift", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "conducts a post-incident review at the table in the common room, not the console room", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "handles a crew grievance at the end of a shift, not in the middle of one", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "marks the day's target as met or unmet in the log with a single figure, no comment", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "eats in the mess bay with the crew rather than separately", context: OnShift, modifier_hint: Some("social_signal") ), + // OffDuty + ( action: "sits in the common room on her off-shift and doesn't bring a datapad", context: OffDuty, modifier_hint: Some("offduty_posture") ), + ( action: "plays a slow round-table game with two off-rotation crew members", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "answers a question from a junior crew member in the common room at full length", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ], + + // Valid social site types for this zone type. + // Location specs declare which appear, with their own label, min_npcs, max_npcs. + social_site_types: [ + ( site_type: "crew_quarters_common", eligible_roles: ["miner", "drill_operator", "ore_processor", "station_chief"] ), + ( site_type: "equipment_lock", eligible_roles: ["miner", "drill_operator", "station_chief"] ), + ( site_type: "mess_bay", eligible_roles: ["miner", "drill_operator", "ore_processor", "station_chief"] ), + ], +) diff --git a/server/content/global/zone-types/extraction_surface.ron b/server/content/global/zone-types/extraction_surface.ron new file mode 100644 index 000000000..90ba9e483 --- /dev/null +++ b/server/content/global/zone-types/extraction_surface.ron @@ -0,0 +1,156 @@ +// Extraction Surface Zone-Type Template +// +// Schema: server/src/npc/blueprint.rs :: ZoneTypeTemplate +// Ticket: #662 (copy team) +// Validate: tooling/validate-ron content/global/zone-types/extraction_surface.ron zone_type +// +// Sources: D-142 (zone-type template architecture). +// +// Zone character: planetary surface mining, open-cut or subsurface, heavy equipment. +// Dust, noise, irregular terrain. Long shifts, physical work, weather-exposed. +// Workers commute from a settlement or sleep on-site in temporary accommodation. +// +// Primitives are CULTURE-NEUTRAL. Culture modifiers (culture-*.ron files) append +// cultural flavor at assembly time. Do not encode cultural attitudes in action text. +// +// Roles: surface_miner, equipment_operator, site_surveyor, camp_supervisor +// Social site types: site_canteen, equipment_yard, survey_post + +( + id: "extraction_surface", + subtype: None, + label: "Surface Extraction Zone", + description: "Planetary surface mining, open-cut or subsurface, heavy equipment. Dust, noise, irregular terrain. Long shifts, physical work, weather-exposed. Workers sleep on-site or commute from nearby settlement.", + + // Default economic/density profile. Location specs override. + economic_level: 5, + population_density: 4, + + roles: [ + ( + id: "surface_miner", + label: "Surface Miner", + skill_focus: ["technical"], + combat_eligible: false, + // weight omitted — location specs declare role_weights + behavior_primitives: [ + // OnShift + ( action: "works the rock face with a hand drill, pulling the bit clear between each bite", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "loads broken ore into a wheeled hopper with a long-handled scoop", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "wipes dust off her face shield with the back of a glove", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "braces a knee against the face and drives a wedge with a hammer", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "watches a crack propagate across the face before setting the next wedge", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "hauls a loaded drag bag to the collection point at the end of the run", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "marks a soft section in the face with a spray can before moving the crew", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "checks the grade of a loose piece against the site chart before tossing it in the hopper", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "calls a blast warning over the site radio and waits for the all-clear before drilling", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "sits on an upturned drum and eats while watching the equipment operator pass", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "bangs the dust off her boots on the site entry mat before entering the canteen", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "re-sharpens a drill bit at the sharpening post before going back to the face", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "drinks from a site water drum with a ladle, replacing the cover after", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "clears a jammed scoop by lifting the load with both hands and freeing it with a boot", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "stands back when the equipment operator reverses the loader near the face", context: OnShift, modifier_hint: Some("environmental_scan") ), + // OffDuty / site canteen + ( action: "drops her drill bag inside the canteen door and doesn't pick it up again until morning", context: OffDuty, modifier_hint: Some("offduty_posture") ), + ( action: "eats without talking through the first half of the meal", context: OffDuty, modifier_hint: Some("offduty_posture") ), + ( action: "talks about tomorrow's face plan like it's something to look forward to", context: Social, modifier_hint: Some("social_signal") ), + ( action: "passes the salt before anyone asks for it", context: Social, modifier_hint: Some("social_signal") ), + ( action: "sits with the new hire on their first canteen night", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ( + id: "equipment_operator", + label: "Heavy Equipment Operator", + skill_focus: ["technical"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "runs a walkaround inspection of the loader before starting the engine", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "loads the bucket to capacity and carries it level to the ore pile", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "backs the machine toward the face edge and watches the rear camera display", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "brings the machine to a full stop when a miner crosses the swing arc", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "idles the engine at the pile while signaling the haul vehicle to position", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "reports a hydraulic warning light to the supervisor before continuing the cycle", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "parks the machine facing downhill at the end of each cycle as a habit", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "grades a rough track through the spoil pile to keep the haul route clear", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "checks the bucket teeth for wear at mid-shift and flags a replacement before the next load", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "lowers the bucket to the ground and kills the engine before anyone approaches the machine", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "talks a haul driver into the load position over the site radio in short, directional calls", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "works the same route on the site for the whole shift, adjusting for spoil growth", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "uses the blade to stabilize a slope section before letting foot crew back near the face", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "cleans the cab at the end of a shift — windows, gauges, floor", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "flags a ground condition change to the surveyor before moving to the new section", context: OnShift, modifier_hint: Some("authority_response") ), + // Social + ( action: "takes the end of the canteen table where she can see the equipment yard through the window", context: Social, modifier_hint: Some("environmental_scan") ), + ( action: "argues about machine settings with anyone who'll engage", context: Social, modifier_hint: Some("social_signal") ), + ( action: "sits with a cup and says nothing for a long time, watching the site wind down", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "tells the same story about a machine failure she survived before she worked here", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ( + id: "site_surveyor", + label: "Site Surveyor", + skill_focus: ["observation", "technical"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "sets up a survey instrument on a tripod and reads the angles from three reference points", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "walks a face section marking positions for the next blast pattern", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "records face measurements on a field datapad and cross-references them to the site plan", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "checks the ore seam trend against the original model and marks the deviation on the plan", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "photographs a face section from two positions and labels both images with the date and grid ref", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "flags a geotechnical concern to the supervisor in writing before the crew returns to the area", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "updates the site grade map at the end of each shift with that day's face data", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "crouches at a face exposure and examines the rock texture with a hand lens", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "marks a blast-hole position in the face with a spray can based on her instrument readings", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "holds a crew back from a face section until her stability assessment is completed", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "talks through a seam change with the supervisor using the plan board as reference", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "takes a rock chip sample from the face and bags it with a grid label", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "checks her instrument position against a known benchmark before trusting the reading", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "re-walks a section that the equipment changed overnight before updating the plan", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "marks a zone as exhausted on the site plan and files the closure notes", context: OnShift, modifier_hint: Some("task_completion") ), + // Social + ( action: "explains a geological feature to the crew at the canteen with a sketch on a napkin", context: Social, modifier_hint: Some("social_signal") ), + ( action: "eats alone at the survey post reviewing the day's face data", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "answers a miner's question about tomorrow's face position accurately but briefly", context: Social, modifier_hint: Some("social_signal") ), + ( action: "puts the field datapad away when she sits down for a meal — doesn't always manage it", context: Social, modifier_hint: Some("offduty_posture") ), + ], + ), + ( + id: "camp_supervisor", + label: "Site Camp Supervisor", + skill_focus: ["observation", "persuasion"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "walks the site perimeter at dawn before the shift begins", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "runs the shift briefing at the canteen before anyone goes to the face", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "checks the equipment yard for overnight issues before signing the shift log", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "resolves a dispute between the equipment operator and face crew by reading the site plan aloud", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "sends a daily yield report to the company rep without editorializing", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "makes a production call based on the surveyor's data without second-guessing the geology", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "writes the weekly face plan and posts it on the canteen board before Saturday morning", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "arbitrates a rest-rotation dispute by checking the hours log, not by memory", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "pulls a crew off a face section on the surveyor's recommendation, no debate", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "handles the company inspector's visit herself, start to finish", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "eats in the canteen with the crew and listens more than she talks", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "signs off on a non-standard work request only after checking the safety officer's notes", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "writes a fair incident report even when the incident makes the site look bad", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "walks a new hire through the site layout on their first morning before assigning them a crew", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "holds a post-blast inspection herself before clearing the face for re-entry", context: OnShift, modifier_hint: Some("environmental_scan") ), + // OffDuty + ( action: "sits outside the canteen in the evening and watches the site settle", context: OffDuty, modifier_hint: Some("offduty_posture") ), + ( action: "plays a slow card game with whoever's around in the canteen after dinner", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "gives an honest answer to a hard question from the crew at the canteen table", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ], + + // Valid social site types for this zone type. + // Location specs declare which appear, with their own label, min_npcs, max_npcs. + social_site_types: [ + ( site_type: "site_canteen", eligible_roles: ["surface_miner", "equipment_operator", "site_surveyor", "camp_supervisor"] ), + ( site_type: "equipment_yard", eligible_roles: ["equipment_operator", "camp_supervisor"] ), + ( site_type: "survey_post", eligible_roles: ["site_surveyor", "camp_supervisor"] ), + ], +) diff --git a/server/content/global/zone-types/industrial_manufacturing.ron b/server/content/global/zone-types/industrial_manufacturing.ron new file mode 100644 index 000000000..bbea63d59 --- /dev/null +++ b/server/content/global/zone-types/industrial_manufacturing.ron @@ -0,0 +1,161 @@ +// Industrial Manufacturing Zone-Type Template +// +// Schema: server/src/npc/blueprint.rs :: ZoneTypeTemplate +// Ticket: #662 (copy team) +// Validate: tooling/validate-ron content/global/zone-types/industrial_manufacturing.ron zone_type +// +// Sources: D-142 (zone-type template architecture). +// +// Zone character: production lines, assembly work, shift-rotation factory floor. +// Noise, heat, repetition. Workers move between stations with practiced economy. +// The floor has a rhythm — being off that rhythm is visible. +// +// Primitives are CULTURE-NEUTRAL. Culture modifiers (culture-*.ron files) append +// cultural flavor at assembly time. Do not encode cultural attitudes in action text. +// +// Roles: assembler, line_supervisor, quality_inspector, maintenance_tech +// Social site types: break_room, floor_canteen, tool_crib + +( + id: "industrial_manufacturing", + subtype: None, + label: "Industrial Manufacturing Zone", + description: "Production lines, assembly work, shift-rotation factory floor. Noise, heat, repetition. Workers move between stations with practiced economy. The floor has a rhythm — being off that rhythm is visible.", + + // Default economic/density profile. Location specs override. + economic_level: 6, + population_density: 7, + + roles: [ + ( + id: "assembler", + label: "Assembly Worker", + skill_focus: ["technical"], + combat_eligible: false, + // weight omitted — location specs declare role_weights + behavior_primitives: [ + // OnShift + ( action: "fits a component into a housing and seats it with two fingers of pressure before reaching for the fastener", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "pulls the next unit off the line and sets it in front of herself before the last one clears", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "pauses an assembly to read the spec placard mounted above the station", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "nudges a misaligned part with the heel of one palm and re-seats it", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "counts the finished units in the tray at the end of a station run", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "reaches for a torque driver without looking and applies the fastener by feel", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "sets a unit aside in the reject tray and picks up the next one without breaking pace", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "rotates her wrists between units, opening and closing her hands twice", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "checks the conveyor timing by watching the gap between units", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "calls down the line when a component feeder jams", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "adjusts the height of her stool between units without stopping", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "peels a protective strip from a component and drops it in the bin at the foot of the station", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "holds a finished unit up to the station light and rotates it once before placing it in the tray", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "passes a jammed unit to the inspector rather than forcing it", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "straightens up when the supervisor crosses the floor", context: OnShift, modifier_hint: Some("authority_response") ), + // OffDuty / break room + ( action: "drops into a break room chair and rolls her neck before reaching for a drink", context: OffDuty, modifier_hint: Some("offduty_posture") ), + ( action: "eats without looking at the food, eyes on the far wall", context: OffDuty, modifier_hint: Some("offduty_posture") ), + ( action: "flexes her hands open on the table and looks at them for a moment", context: OffDuty, modifier_hint: Some("offduty_posture") ), + ( action: "leans on an elbow and listens to the next table without joining", context: OffDuty, modifier_hint: Some("social_signal") ), + ( action: "passes a meal packet across the table when someone's short", context: OffDuty, modifier_hint: Some("social_signal") ), + ( action: "talks about the line timing like it's a personal grievance", context: Social, modifier_hint: Some("social_signal") ), + ( action: "sits in the same seat she always sits in and doesn't notice when it matters", context: Social, modifier_hint: Some("offduty_posture") ), + ], + ), + ( + id: "line_supervisor", + label: "Line Supervisor", + skill_focus: ["observation", "persuasion"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "walks the length of the line, datapad face-up, marking nothing", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "stops behind an assembler and watches two full cycles before moving on", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "takes a unit from the reject tray and examines it at the light before handing it back", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "redirects a floor worker with a gesture rather than a word", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "pulls the shift log and circles a throughput number with a stylus", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "speaks to the line in a flat voice that carries over the floor noise", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "stands at the midpoint of the line where she can see both ends", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "catches a station mistake before it reaches the next worker and corrects it without comment", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "resets a jammed feeder by hand rather than waiting for maintenance", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "marks the end-of-shift tally and posts it before the relief crew arrives", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "lets a new worker struggle for two more seconds before offering the correction", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "holds a brief, standing-only crew address at shift start, sixty seconds maximum", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "handles an inspector's question in full view of the floor without lowering her voice", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "walks a production shortfall back to a feeder issue and documents it before the meeting", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "clears the line briefly to let maintenance past and restarts it herself", context: OnShift, modifier_hint: Some("task_completion") ), + // OffDuty + ( action: "takes a corner table in the canteen so she can watch the door", context: OffDuty, modifier_hint: Some("environmental_scan") ), + ( action: "finishes a meal quickly and stays at the table with an empty tray and a cup", context: OffDuty, modifier_hint: Some("offduty_posture") ), + ( action: "listens more than she talks at the canteen table", context: Social, modifier_hint: Some("social_signal") ), + ( action: "buys a drink for the table and doesn't make it a point", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ( + id: "quality_inspector", + label: "Quality Inspector", + skill_focus: ["observation", "technical"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "picks a unit from the tray at random and turns it over under the station light", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "runs a calibrated gauge over a joint and reads the number twice", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "marks a defect on the unit's casing with a red tag and sets it in the reject tray", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "photographs a defect before writing it up", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "works down the inspection checklist in order, no skips", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "holds a unit at an angle to look down the seam for a hairline fault", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "notes a batch number on the reject log without commenting on the quantity", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "pulls a second unit to confirm before writing up a pattern fault", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "applies a test load to a component joint and watches for give", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "runs a sample lot through the measurement station and records the spread", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "flags a line issue to the supervisor in writing rather than verbally", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "signs off on a full batch with a stylus and the date", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "traces the seam of an assembly with two fingers, feeling for a ridge or gap", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "re-inspects a cleared unit when something in the batch is off", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "keeps notes by hand in a pocket notebook, not on the shared log", context: OnShift, modifier_hint: Some("task_completion") ), + // Social + ( action: "sits in the canteen with her inspection kit still on her belt", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "picks apart the canteen food with methodical bites, not noticing she's doing it", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "gives a short, accurate answer to a casual question and lets the silence sit", context: Social, modifier_hint: Some("social_signal") ), + ( action: "spots something wrong at another table but says nothing about it", context: Social, modifier_hint: Some("environmental_scan") ), + ( action: "answers a work question in the canteen the same way she would on the floor", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ( + id: "maintenance_tech", + label: "Maintenance Technician", + skill_focus: ["technical"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "pulls a panel off a line station and props it against the machine frame", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "listens to a motor housing with two fingers on the casing", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "replaces a feeder belt in the time between line cycles", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "runs a diagnostics routine on a station controller while the line is paused", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "traces a fault back to a worn cam follower and marks it for next-shift replacement", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "carries a parts tray in the crook of one arm, selecting pieces without looking", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "calls the line operator before switching power to a station", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "lubes a bearing track with a small applicator, wipes the excess on a rag", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "checks a guard bracket alignment with a straightedge and adjusts two bolts", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "tests a sensor output at the terminal before reinstalling the panel cover", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "clips a faulty relay sample into a small bag for the parts log", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "works on a machine while the line runs two stations over, keeping clear of the moving parts", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "gives the line operator a thumbs-up when the station is clear to restart", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "logs the repair with start and end time on the maintenance terminal", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "stands the panel back and fastens it from the bottom up, same order every time", context: OnShift, modifier_hint: Some("physical_manner") ), + // OffDuty + ( action: "peels off her gloves finger by finger and drops them in the bin at the door", context: OffDuty, modifier_hint: Some("offduty_posture") ), + ( action: "sits in the break room with her toolkit on the floor under the chair", context: OffDuty, modifier_hint: Some("offduty_posture") ), + ( action: "describes a problem to the table and diagrams it with a finger on the surface", context: Social, modifier_hint: Some("social_signal") ), + ( action: "accepts a cup of something and holds it without drinking for a while", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "answers a maintenance question in the break room in two sentences", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ], + + // Valid social site types for this zone type. + // Location specs declare which appear, with their own label, min_npcs, max_npcs. + social_site_types: [ + ( site_type: "break_room", eligible_roles: ["assembler", "maintenance_tech", "quality_inspector", "line_supervisor"] ), + ( site_type: "floor_canteen", eligible_roles: ["assembler", "line_supervisor", "quality_inspector"] ), + ( site_type: "tool_crib", eligible_roles: ["maintenance_tech", "assembler"] ), + ], +) diff --git a/server/content/global/zone-types/industrial_processing.ron b/server/content/global/zone-types/industrial_processing.ron new file mode 100644 index 000000000..68df734f6 --- /dev/null +++ b/server/content/global/zone-types/industrial_processing.ron @@ -0,0 +1,157 @@ +// Industrial Processing Zone-Type Template +// +// Schema: server/src/npc/blueprint.rs :: ZoneTypeTemplate +// Ticket: #662 (copy team) +// Validate: tooling/validate-ron content/global/zone-types/industrial_processing.ron zone_type +// +// Sources: D-142 (zone-type template architecture). +// +// Zone character: raw material conversion, chemical or mineral processing, hazardous environment. +// High heat or pressure, strict protocols, regulated gear. Workers move carefully, not quickly. +// Mistakes here don't stay local. +// +// Primitives are CULTURE-NEUTRAL. Culture modifiers (culture-*.ron files) append +// cultural flavor at assembly time. Do not encode cultural attitudes in action text. +// +// Roles: process_operator, plant_technician, safety_officer, shift_lead +// Social site types: sealed_break_room, decontamination_bay, control_room + +( + id: "industrial_processing", + subtype: None, + label: "Industrial Processing Zone", + description: "Raw material conversion, chemical or mineral processing, hazardous-environment work. High heat or pressure, strict protocols, regulated gear. Workers move carefully, not quickly. Mistakes here don't stay local.", + + // Default economic/density profile. Location specs override. + economic_level: 7, + population_density: 5, + + roles: [ + ( + id: "process_operator", + label: "Process Operator", + skill_focus: ["technical"], + combat_eligible: false, + // weight omitted — location specs declare role_weights + behavior_primitives: [ + // OnShift + ( action: "reads a flow rate off a wall gauge and marks the log sheet on the clipboard beneath it", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "adjusts a valve by a quarter-turn and waits for the pressure gauge to respond", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "checks the level in a feed tank through the sight glass at the base of the unit", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "pulls on a second glove before opening an inspection port", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "walks the process line from feed end to output, reading each gauge in sequence", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "records a temperature reading from a wall panel on the shift log", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "calls the control room with a readings anomaly before touching anything", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "tightens a flange fitting and marks the bolt heads with a paint pen afterward", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "clears an airlock to let a sample cart through without leaving the line unattended", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "steps back from the unit briefly during a pressure spike and watches it settle", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "takes a process sample from the draw valve into a sealed container and labels it immediately", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "resets an alarm on the panel after confirming the source before silencing it", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "opens a bypass line slowly, watching the downstream gauge catch up", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "checks the emergency shutoff handle hasn't been blocked before starting the run", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "re-reads a procedure card on the board before doing a startup sequence she's done a hundred times", context: OnShift, modifier_hint: Some("authority_response") ), + // OffDuty / sealed break room + ( action: "sits in the break room still in her outer protective layer, not ready to be off yet", context: OffDuty, modifier_hint: Some("offduty_posture") ), + ( action: "drinks from a sealed cup, the only kind available in this section of the facility", context: OffDuty, modifier_hint: Some("offduty_posture") ), + ( action: "talks in short sentences, still listening for the alarms on the far side of the door", context: Social, modifier_hint: Some("social_signal") ), + ( action: "sits close to the vent in the break room", context: Social, modifier_hint: Some("environmental_scan") ), + ( action: "trades shift notes with the incoming operator before officially clocking off", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ( + id: "plant_technician", + label: "Plant Technician", + skill_focus: ["technical"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "traces a pipe run from the valve back to the pump, checking each joint by hand", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "clamps a heat sensor lead to a pipe body and reads the display", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "drains a section of line into a sealed drum before starting work on the fitting", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "replaces a pump seal using a procedure sheet clamped to the unit frame above her work space", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "photographs the pipe joint from two angles before and after the repair", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "pressure-tests the repaired section before signing the tag", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "marks the repair with an identifying tag that includes the date and her tech number", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "checks that the isolation valve is locked out before picking up any tools", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "carries tools in a sealed bag in this section — drops nothing on the floor", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "reads the hazard placard at the unit entry before entering", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "signals the operator to restore flow before removing her lockout tag", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "works inside a tight access space with only one hand, the other braced outside", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "flushes a section of line after the repair and samples the output before handing it back", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "exchanges a worn component for a new one from the sealed parts kit", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "writes up the repair log in the control room entry system before leaving the area", context: OnShift, modifier_hint: Some("task_completion") ), + // OffDuty / decontamination bay + ( action: "runs through the decontamination cycle without skipping the final rinse step", context: OffDuty, modifier_hint: Some("offduty_posture") ), + ( action: "stows gear in order in her personal locker, outer layer last", context: OffDuty, modifier_hint: Some("offduty_posture") ), + ( action: "sits in the changing area a moment before moving to the break room", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "compares the shift's fault log with the previous day's over a cup in the break room", context: Social, modifier_hint: Some("social_signal") ), + ( action: "answers a question from a newer tech in the break room without making it a lecture", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ( + id: "safety_officer", + label: "Safety Officer", + skill_focus: ["observation", "persuasion"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "walks the line with a checklist, marking off each item in sequence", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "stops at a unit and checks that the emergency isolator handle is clear and accessible", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "observes an operator's routine without announcing she's watching", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "pulls a worker aside to correct a PPE issue quietly before logging it", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "opens and closes the emergency shutoff on a test unit to confirm it moves freely", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "reviews the incident log at the start of each shift before walking the line", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "photographs a near-miss site before anything is moved or cleaned", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "checks the posted evacuation route map for currency — the site changes, the maps don't always", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "signs off a permit-to-work form only after confirming isolations are in place", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "fields an operator's question about a borderline situation with a yes or no first, explanation after", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "notes a potential hazard in the log before raising it with the shift lead", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "checks the calibration date on a detector unit before accepting its readings", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "clears unnecessary personnel from a work zone before the tech starts", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "asks a worker to demonstrate the emergency procedure rather than just describe it", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "writes up the safety brief for the next shift while the current one is still running", context: OnShift, modifier_hint: Some("task_completion") ), + // Social + ( action: "sits at a table in the break room where she can see both exits", context: Social, modifier_hint: Some("environmental_scan") ), + ( action: "talks about non-work things in the break room with visible deliberate effort", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "catches a colleague's minor protocol slip in the break room and says nothing", context: Social, modifier_hint: Some("social_signal") ), + ( action: "answers a question about regulations with more context than the question required", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ( + id: "shift_lead", + label: "Processing Shift Lead", + skill_focus: ["observation", "persuasion"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "receives the shift handover standing at the control room panel, not sitting", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "reads the overnight fault log before speaking to anyone on the incoming shift", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "assigns section coverage for the shift from memory, confirmed on the roster board", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "takes the call from the plant manager herself and keeps the operators working", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "makes a call on an ambiguous reading based on shift history, documents the reasoning", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "walks to a problem unit herself rather than directing someone else for a first look", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "approves an unscheduled maintenance window after confirming the buffer stock is clear", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "keeps the safety officer's input in the room when production pressure rises", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "writes a clear handover note even when the shift ran clean — especially then", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "stands the shift down for a full toolbox talk after an incident, doesn't split it", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "pulls a process operator off a high-pressure task before she asks to be pulled", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "signs the shift completion log and hands it in before leaving the floor", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "checks in with the new tech on each pass through her section without making it obvious", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "handles an inspector's visit by walking them through herself, start to finish", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "gives a straight answer to a hard question from the floor and moves on", context: OnShift, modifier_hint: Some("social_signal") ), + // OffDuty + ( action: "sits in the break room with a cup and a closed datapad, not quite off", context: OffDuty, modifier_hint: Some("offduty_posture") ), + ( action: "trades a word with the departing shift lead at the door before going home", context: Social, modifier_hint: Some("social_signal") ), + ( action: "gives the break room table a brief, flat smile when someone makes a dark joke about the job", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ], + + // Valid social site types for this zone type. + // Location specs declare which appear, with their own label, min_npcs, max_npcs. + social_site_types: [ + ( site_type: "sealed_break_room", eligible_roles: ["process_operator", "plant_technician", "safety_officer", "shift_lead"] ), + ( site_type: "decontamination_bay", eligible_roles: ["process_operator", "plant_technician"] ), + ( site_type: "control_room", eligible_roles: ["shift_lead", "safety_officer", "process_operator"] ), + ], +) diff --git a/server/content/global/zone-types/medical_facility.ron b/server/content/global/zone-types/medical_facility.ron new file mode 100644 index 000000000..243d97f1a --- /dev/null +++ b/server/content/global/zone-types/medical_facility.ron @@ -0,0 +1,154 @@ +// Medical Facility Zone-Type Template +// +// Schema: server/src/npc/blueprint.rs :: ZoneTypeTemplate +// Ticket: #662 (copy team) +// Validate: tooling/validate-ron content/global/zone-types/medical_facility.ron zone_type +// +// Sources: D-142 (zone-type template architecture). +// +// Zone character: treatment bays, procedure rooms, waiting corridors, supply stations. +// The smell of antiseptic and recycled air. Everyone is either moving quickly or waiting +// very still. Urgency and routine coexist — a well-staffed facility looks calm. +// +// Primitives are CULTURE-NEUTRAL. Culture modifiers (culture-*.ron files) append +// cultural flavor at assembly time. Do not encode cultural attitudes in action text. +// +// Roles: medic, physician, administrator, security +// Social site types: staff_room, triage_bay, reception + +( + id: "medical_facility", + subtype: None, + label: "Medical Facility", + description: "Treatment bays, procedure rooms, supply corridors, waiting areas. Urgency and routine coexist in the same space. A well-staffed facility looks quiet from the outside.", + + // Default economic/density profile. Location specs override. + economic_level: 6, + population_density: 5, + + roles: [ + ( + id: "medic", + label: "Medical Technician", + skill_focus: ["technical", "observation"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "restocks the treatment bay supply tray before the next patient arrives", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "checks the vital monitor leads on a patient bed and repositions one that's drifting", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "draws a dosage into a hypo from a sealed vial and holds it level to check for air", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "wheels a supply cart between bays, stopping at each to check the stock level", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "changes a dressing with both gloved hands working from the outside in", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "reads a patient's intake record on a wall-mounted panel before entering the bay", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "notes a vital reading on a handheld without pausing to consider it", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "disposes of used materials in the correct waste bins without looking", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "answers a patient's question accurately and keeps moving", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "strips and remakes a vacant patient bed before the next admission paperwork arrives", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "runs a pre-procedure instrument check from a laminated checklist on the wall", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "calls out a patient status change to the bay physician without raising her voice", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "requests a supply transfer from central stores through the terminal, not by asking someone directly", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "washes her hands at the bay sink before and after each contact, by count", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "defers to the attending physician on a treatment question and records the instruction", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "restores the equipment to standard configuration after the attending physician leaves the bay", context: OnShift, modifier_hint: Some("task_completion") ), + // Social + ( action: "sits in the staff room with legs extended, both hands wrapped around a cup", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "trades a few words with a colleague over the break room counter, then goes quiet", context: Social, modifier_hint: Some("social_signal") ), + ( action: "eats quickly at the staff room table with half an eye on the bay door", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "refills a colleague's cup from the urn without interrupting the conversation", context: Social, modifier_hint: Some("social_signal") ), + ( action: "sits with her eyes closed for the last few minutes of the break, feet flat on the floor", context: Social, modifier_hint: Some("offduty_posture") ), + ], + ), + ( + id: "physician", + label: "Attending Physician", + skill_focus: ["observation", "technical"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "reviews the night intake log at the start of her shift, standing at the corridor terminal", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "conducts a bay round at a pace that leaves time to notice small changes", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "examines a patient's chart before making eye contact with the patient", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "gives an instruction to the medic in a flat, quiet voice that carries in the bay", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "palpates a site with two fingers, pausing at the point of reaction", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "updates a treatment record at the bay terminal while the patient is still in the room", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "requests an imaging run and notes the time on the chart before the results arrive", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "talks through a differential with a junior medic, asking questions rather than stating answers", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "holds a corridor consultation with another physician in a low voice at the junction", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "reads an imaging result for a full minute before making any note", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "hands back a chart with a single added line and moves to the next bay", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "stands at the patient's head during a procedure rather than beside the hands doing the work", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "corrects a treatment notation before it goes to the permanent record", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "signs a discharge order only after reviewing the follow-up instructions", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "accepts a question from an administrator without losing the examination thread", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "acknowledges a facility director's review visit with a brief summary and returns to rounds", context: OnShift, modifier_hint: Some("authority_response") ), + // Social + ( action: "takes lunch at the back of the staff room with a medical journal open beside the tray", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "listens to a junior medic's concern fully before responding", context: Social, modifier_hint: Some("social_signal") ), + ( action: "sits with her back straight even in the staff room break chair", context: Social, modifier_hint: Some("physical_manner") ), + ( action: "trades a dry observation about the intake volume with the charge desk staff", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ( + id: "administrator", + label: "Facility Administrator", + skill_focus: ["persuasion", "technical"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "reviews the bed capacity report before the morning staff meeting", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "updates the shift rota on the corridor display board, filling in two gaps", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "takes a supply complaint from a medic by note and adds it to the procurement log", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "approves a non-standard supply request with a handwritten counter-signature", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "walks the waiting area once per shift and counts the seated patients against the intake record", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "liaises with the supply depot on a stock shortfall via terminal message rather than direct call", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "updates the duty log with an accurate summary of a shift incident before the end of her rotation", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "receives an external inspection team at the reception desk and handles credentials without fuss", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "checks the maintenance report for the ventilation system before the day's first procedure list", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "allocates a bed in the overflow bay without consulting the physician, then informs rather than asks", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "responds to a patient complaint at the reception desk in a level tone until it resolves", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "marks a staff leave request approved or deferred without extended deliberation", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "reviews the day's discharge paperwork at the reception terminal for completeness", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "catches an error in the supply invoices by cross-checking two documents on the same desk", context: OnShift, modifier_hint: Some("task_completion") ), + // Social + ( action: "eats at the reception station desk with the patient queue view on the side panel", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "holds the staff room door open for the incoming shift and says nothing", context: Social, modifier_hint: Some("social_signal") ), + ( action: "sits in the staff room for exactly one cup and returns to the desk", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "answers a direct question about facility policy with the rule number before the explanation", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ( + id: "security", + label: "Facility Security", + skill_focus: ["combat", "observation"], + combat_eligible: true, + behavior_primitives: [ + // OnShift + ( action: "stands at the reception entrance with a clear line of sight to the waiting area and the triage door", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "checks a visitor's entry pass against the access log before letting them through", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "walks the corridor between the waiting area and treatment bays on a timed circuit", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "watches a patient who has stood up from the waiting area and not moved toward a bay", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "accompanies an agitated individual to the reception desk rather than blocking the route", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "logs a disturbance incident before any other action when the situation has resolved", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "positions herself at the restricted pharmacy corridor entrance during medication distribution windows", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "checks the treatment bay doors at the start of every rotation", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "steps to the side of the corridor to let the physician pass before the patient", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "acknowledges a staff member's ID badge on the way in with a brief nod, procedure is procedure", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "calls the supervisor before intervening in a staff dispute", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "checks the emergency exit bar from the inside of the corridor at shift start", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "keeps the waiting area in sight from the reception station corner, not from inside the waiting area", context: OnShift, modifier_hint: Some("environmental_scan") ), + // OffDuty + ( action: "sits in the staff room at the near table, still in kit, not eating yet", context: OffDuty, modifier_hint: Some("offduty_posture") ), + ( action: "drinks her coffee standing at the staff room counter and leaves before sitting becomes an option", context: OffDuty, modifier_hint: Some("offduty_posture") ), + ( action: "hands over to the incoming officer at the reception post and gives the summary in four sentences", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ], + + // Valid social site types for this zone type. + // Location specs declare which appear, with their own label, min_npcs, max_npcs. + social_site_types: [ + ( site_type: "staff_room", eligible_roles: ["medic", "physician", "administrator", "security"] ), + ( site_type: "triage_bay", eligible_roles: ["medic", "physician", "security"] ), + ( site_type: "reception", eligible_roles: ["administrator", "security", "medic"] ), + ], +) diff --git a/server/content/global/zone-types/military_garrison.ron b/server/content/global/zone-types/military_garrison.ron new file mode 100644 index 000000000..2556405df --- /dev/null +++ b/server/content/global/zone-types/military_garrison.ron @@ -0,0 +1,154 @@ +// Military Garrison Zone-Type Template +// +// Schema: server/src/npc/blueprint.rs :: ZoneTypeTemplate +// Ticket: #662 (copy team) +// Validate: tooling/validate-ron content/global/zone-types/military_garrison.ron zone_type +// +// Sources: D-142 (zone-type template architecture). +// +// Zone character: barracks blocks, drill yards, armory, command rooms, exercise corridors. +// Rank is visible at a glance — in bearing, in kit, in who gives way first. +// Routine is the point: the same circuit, the same report, the same formation. +// +// Primitives are CULTURE-NEUTRAL. Culture modifiers (culture-*.ron files) append +// cultural flavor at assembly time. Do not encode cultural attitudes in action text. +// +// Roles: soldier, nco, officer, support_tech +// Social site types: mess_hall, armory, common_room + +( + id: "military_garrison", + subtype: None, + label: "Military Garrison", + description: "Barracks, drill yards, armory, command facilities. Rank is visible at a glance. Routine is structural — the same circuit, the same report, the same formation, same time each day.", + + // Default economic/density profile. Location specs override. + economic_level: 6, + population_density: 7, + + roles: [ + ( + id: "soldier", + label: "Garrison Soldier", + skill_focus: ["combat", "technical"], + combat_eligible: true, + behavior_primitives: [ + // OnShift + ( action: "runs a circuit of the perimeter fence at a steady pace, weapons slung", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "field-strips a sidearm on the armory bench and reassembles it without a wasted motion", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "stands at post with feet at shoulder width, scanning the approach at regular intervals", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "completes a weapons cleaning cycle before the inspection card says it's due", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "hands a post log to the relieving soldier with a verbal summary and no editorializing", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "moves between positions at a trot rather than a walk when carrying a full kit", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "responds to the NCO's inspection with a straight back and eyes forward", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "counts paces on the perimeter circuit without checking the time", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "squares kit on the barrack bunk to regulation dimensions before the morning check", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "holds position at the gate until the relief is in place before stepping off", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "acknowledges a direct order with a short affirmative and moves to execute it", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "checks her magazine count against the armory receipt before signing off", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "scans a vehicle checkpoint from the near side before waving the driver out of the cab", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "reports a minor equipment fault to the NCO at the end of the exercise rather than mid-drill", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "re-ties a kit strap on the move between positions without breaking stride", context: OnShift, modifier_hint: Some("physical_manner") ), + // OffDuty + ( action: "drops onto a barrack bunk in full kit and stares at the ceiling, boots still on", context: OffDuty, modifier_hint: Some("offduty_posture") ), + ( action: "sits at the mess table with both hands around a mug, listening to the conversation at the next seat", context: OffDuty, modifier_hint: Some("offduty_posture") ), + ( action: "trades a short story at the mess table and goes quiet when the NCO walks through", context: Social, modifier_hint: Some("social_signal") ), + ( action: "plays a tile game in the common room with the same two people every evening", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "laughs at something loud enough to carry across the common room, then cuts it off", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ( + id: "nco", + label: "Non-Commissioned Officer", + skill_focus: ["combat", "observation"], + combat_eligible: true, + behavior_primitives: [ + // OnShift + ( action: "walks the post line checking position and kit without announcing the inspection", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "delivers a formation brief in short declarative sentences, no questions from the floor until it's done", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "marks the drill score on a handheld and calls out a single correction to the whole group", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "pulls a soldier aside for a correction and keeps his voice below the range of the nearest post", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "runs the same check-in procedure at shift change whether the officer is watching or not", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "reads the duty roster at shift start and reassigns one post without explanation", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "completes the armory sign-out log before returning to the floor", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "logs a minor incident in the duty record and flags it for officer review, not for action", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "receives a report from a junior soldier and asks one clarifying question before dismissing", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "stands behind the formation during drill rather than in front, watching for form breaks", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "corrects a posture issue by placing a hand on the soldier's shoulder rather than speaking", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "signs off on a weapons check that he ran himself, not delegated", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "defers a resource question to the officer through a written request rather than a corridor conversation", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "ends a brief by asking if there are questions and holding the silence until there aren't", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "counts the post strength at the start of each shift against the morning deployment list", context: OnShift, modifier_hint: Some("environmental_scan") ), + // OffDuty + ( action: "sits in the mess with the duty log closed on the table beside his tray", context: OffDuty, modifier_hint: Some("offduty_posture") ), + ( action: "moves to a different table when the common room fills up, choosing the corner", context: Social, modifier_hint: Some("environmental_scan") ), + ( action: "buys a round at the mess canteen and sits back without tracking who thanks him", context: Social, modifier_hint: Some("social_signal") ), + ( action: "listens to the common room conversation without contributing for long stretches", context: Social, modifier_hint: Some("offduty_posture") ), + ], + ), + ( + id: "officer", + label: "Garrison Officer", + skill_focus: ["observation", "persuasion"], + combat_eligible: true, + behavior_primitives: [ + // OnShift + ( action: "reviews the overnight incident report before entering the command room", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "conducts a floor walk without stopping at any one post long enough to make it an inspection", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "holds the NCO briefing standing, not seated, and keeps it under five minutes", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "signs a duty order and returns it without editorial comment", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "approves a resource requisition by marking the authorisation field and leaving it at the desk", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "receives a superior's communications through official channels before acknowledging receipt verbally", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "reads a disciplinary record in full before making a decision", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "walks the outer perimeter with the duty NCO once per shift, asking questions and listening", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "takes a call in the command room with the door closed and the window to the floor visible", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "makes a notation in the command log that captures the decision but not the deliberation", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "responds to an external authority's request for access with a formal written reply before the verbal acknowledgment", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "oversees a post inspection from the mezzanine without descending to the floor", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "handles a grievance from a junior NCO in her office, door shut, no follow-up scheduled", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "endorses the day's duty log at close of shift and files it without corrections", context: OnShift, modifier_hint: Some("task_completion") ), + // OffDuty + ( action: "eats in the officers' section of the mess at an off-peak time with a datapad at her elbow", context: OffDuty, modifier_hint: Some("offduty_posture") ), + ( action: "acknowledges junior personnel in the common room with a nod and does not linger", context: Social, modifier_hint: Some("social_signal") ), + ( action: "sits in the common room for one drink, spine straight, before returning to quarters", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "reads in the common room with a posture that discourages interruption without communicating hostility", context: Social, modifier_hint: Some("physical_manner") ), + ], + ), + ( + id: "support_tech", + label: "Garrison Support Technician", + skill_focus: ["technical"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "runs a weapons systems diagnostic in the armory and logs the result on the maintenance board", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "calibrates a targeting system with the scope covers on, working from the adjustment spec", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "inventories the armory supply cage against the stocklist before reporting the count to the NCO", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "signs out equipment to a soldier from the armory log and returns the release card before the shift ends", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "patches a comms relay fault in the command room relay stack from the maintenance terminal", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "delivers a maintenance status report to the duty officer in writing, not verbally", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "repairs a worn strap on a load-bearing harness before returning it to the equipment rack", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "cleans a precision lens in the armory with a dry brush before sealing the housing", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "updates the maintenance log after every equipment return, not at end of shift", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "routes a power cable through a conduit clip so it doesn't cross the foot traffic lane", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "checks the armory climate control reading before opening a sealed case", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "reports an equipment discrepancy to the NCO before resolving it independently", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "reseals an equipment case with the locking tabs in the correct order and confirms the lock is seated", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "works through a repair list in posted order, not by preference", context: OnShift, modifier_hint: Some("work_pace") ), + // Social + ( action: "eats at the mess with the duty log beside her tray and reads between bites", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "tells a story about a repair that took a week to trace at the mess table and keeps it short", context: Social, modifier_hint: Some("social_signal") ), + ( action: "sits in the common room with tools out on the table, picking at a small repair even off-duty", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "passes the rations to the nearest person without asking if they want them", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ], + + // Valid social site types for this zone type. + // Location specs declare which appear, with their own label, min_npcs, max_npcs. + social_site_types: [ + ( site_type: "mess_hall", eligible_roles: ["soldier", "nco", "officer", "support_tech"] ), + ( site_type: "armory", eligible_roles: ["soldier", "nco", "support_tech"] ), + ( site_type: "common_room", eligible_roles: ["soldier", "nco", "support_tech"] ), + ], +) diff --git a/server/content/global/zone-types/port_fishing.ron b/server/content/global/zone-types/port_fishing.ron new file mode 100644 index 000000000..d74315597 --- /dev/null +++ b/server/content/global/zone-types/port_fishing.ron @@ -0,0 +1,156 @@ +// Port Fishing Zone-Type Template +// +// Schema: server/src/npc/blueprint.rs :: ZoneTypeTemplate +// Ticket: #662 (copy team) +// Validate: tooling/validate-ron content/global/zone-types/port_fishing.ron zone_type +// +// Sources: D-142 (zone-type template architecture). +// +// Zone character: small commercial fishing port or landing dock. +// Catches, gear maintenance, processing, sale at the dock. +// Irregular hours governed by tides and weather. A tight community — +// everyone knows the boats and their keepers. +// +// Primitives are CULTURE-NEUTRAL. Culture modifiers (culture-*.ron files) append +// cultural flavor at assembly time. Do not encode cultural attitudes in action text. +// +// Roles: fisher, dock_processor, gear_rigger, port_buyer +// Social site types: fish_quay, gear_shed, waterfront_canteen + +( + id: "port_fishing", + subtype: None, + label: "Port — Fishing", + description: "Small commercial fishing port or landing dock. Catch-driven, tide-bound, gear-intensive. Community is small and durable — irregular hours and weather exposure create strong crew familiarity.", + + // Default economic/density profile. Location specs override. + economic_level: 3, + population_density: 3, + + roles: [ + ( + id: "fisher", + label: "Fisher", + skill_focus: ["technical", "observation"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "hauls a net over the stern rail hand over hand, knuckles white at the last drag", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "reads the water's surface color before deciding where to set the next drift", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "unloads the catch by bucket from the hold to the dock, bucket after bucket", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "clears a knotted section of net line using a wooden marlin spike", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "checks the vessel's fuel before departure without being reminded", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "calls a weather change to the other vessels on the water before turning for port", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "logs the catch weight and location on a paper card clipped to the wheelhouse wall", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "washes down the deck with a bucket and a short-handled mop between loads", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "watches a crewmate handle a new piece of gear and says nothing until it goes wrong", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "reports an unusually large haul to the dock buyer before unloading for a weight check", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "checks the bottom of the net for damage after every haul", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "coils a rope end in decreasing circles until it sits flat on the deck", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "reads wave spacing before deciding whether to run another set or head in", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "lifts a catch basket with the weight low and close to the body", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "marks an unfamiliar species separately before the rest of the catch goes to the buyer", context: OnShift, modifier_hint: Some("task_completion") ), + // Social + ( action: "sits at the canteen with still-damp work clothes and eats before removing her boots", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "buys the table a round and names no reason for it", context: Social, modifier_hint: Some("social_signal") ), + ( action: "swaps a haul detail with another fisher — both lean in to hear the coordinates", context: Social, modifier_hint: Some("social_signal") ), + ( action: "leans back in the canteen chair and goes quiet mid-conversation", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "tells a short story from the water that makes the table laugh and doesn't embellish it", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ( + id: "dock_processor", + label: "Dock Processor", + skill_focus: ["technical"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "works a processing table with short precise cuts, catch moving through without pause", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "grades a catch into three bins by species and size without slowing the line", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "hoses down the processing table between batches and squeegees toward the drain", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "stacks filled ice chests on a floor rack and labels each with the catch time", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "checks the ice level in a chest and calls for a top-up before continuing", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "flags a spoiled catch to the dock buyer without stopping her section", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "rinses her blade at the rinse rail every third fish, without being told to", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "rotates to the icing station at the end of a processing block without instruction", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "weighs a processed batch on the dock scale and calls the number to the recorder", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "catches the rhythm of the worker beside her and matches it inside two minutes", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "pulls on a fresh glove when the left one tears and keeps going", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "stacks empty ice chests in the return area at the end of the batch", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "passes a processed portion down the line with both hands", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "hoses down her station at end of shift before the lead checks it", context: OnShift, modifier_hint: Some("task_completion") ), + // Social + ( action: "arrives at the canteen already mid-conversation with whoever is next to her", context: Social, modifier_hint: Some("social_signal") ), + ( action: "sits with the group rather than alone even when she's tired", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "passes a dish across the table before her own portion reaches her", context: Social, modifier_hint: Some("social_signal") ), + ( action: "laughs at something early in the meal and is quiet later", context: Social, modifier_hint: Some("offduty_posture") ), + ], + ), + ( + id: "gear_rigger", + label: "Gear Rigger", + skill_focus: ["technical"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "hangs a net for inspection on the quay frame and works through it section by section", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "splices a broken line with bare hands, tucking the tail three times before pulling it tight", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "replaces a worn net float by threading the new one in without disturbing the adjacent mesh", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "checks every snap shackle on a set of gear before signing it back out to a vessel", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "sorts salvageable net from scrap on the gear shed floor, making two clear piles", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "reads the damage along a torn net section and estimates the repair time without asking", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "works a needle through a net panel in long even stitches, repairing a section twice her arm's length", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "logs a piece of gear as condemned and pulls it from the in-service rack", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "tests a repaired line by weighting it with a ballast block and watching the splice", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "oils a winch cable and runs it through her hand, feeling for rust pits", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "pulls the gear schedule for the next week and pre-stages what's due for maintenance", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "waves off a fisher who wants gear early, points to the schedule card on the shed wall", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "stacks coiled lines in the gear shed by vessel assignment, not by size", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "keeps the gear shed inventory current to the day, which is unusual for this kind of port", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "works through a repair without looking up when someone enters the gear shed", context: OnShift, modifier_hint: Some("work_pace") ), + // Social + ( action: "sits at the canteen table with brine-stiff hands wrapped around a hot cup", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "explains a net repair method to a younger processor using a knotted napkin corner", context: Social, modifier_hint: Some("social_signal") ), + ( action: "buys the next round when the conversation gets good enough to stay for", context: Social, modifier_hint: Some("social_signal") ), + ( action: "goes quiet when the talk turns to boats she hasn't rigged in a while", context: Social, modifier_hint: Some("offduty_posture") ), + ], + ), + ( + id: "port_buyer", + label: "Port Buyer", + skill_focus: ["persuasion", "observation"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "walks the unloading dock in the early morning and reads the catch before the boats finish docking", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "opens the morning price board and marks the rates with a stylus before the first vessel lands", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "weighs a sample from a haul on a certified scale and quotes from the number, not a visual", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "declines a catch by grade without explaining what grade it failed", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "writes a purchase receipt by hand and gives one copy to the fisher without ceremony", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "keeps the dock buyer's log current through every transaction, no gaps", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "calls a vessel's catch before it unloads based on how deep it's sitting in the water", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "confirms compliance with the catch limit register before accepting a full haul", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "negotiates a grade dispute by pulling the scale certificate and reading the number", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "walks the whole dock once before opening the price board each morning", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "holds a morning price steady when three captains argue it should be higher", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "files the week's catch records with the port authority before the deadline, not the day of", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "pays out in the sequence catches were weighed in, not by relationship", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "notes a vessel that's been landing undersized stock and pulls the record before the next landing", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "closes the buyer's ledger at end of market and locks it before going to the canteen", context: OnShift, modifier_hint: Some("task_completion") ), + // Social + ( action: "takes a table at the canteen that faces the quay door", context: Social, modifier_hint: Some("environmental_scan") ), + ( action: "buys coffee for the processor's table without attaching any business to it", context: Social, modifier_hint: Some("social_signal") ), + ( action: "listens to a price complaint from a fisher in the canteen and says very little back", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "eats slowly and doesn't look at the dock for the duration of the meal", context: Social, modifier_hint: Some("offduty_posture") ), + ], + ), + ], + + // Valid social site types for this zone type. + // Location specs declare which appear, with their own label, min_npcs, max_npcs. + social_site_types: [ + ( site_type: "fish_quay", eligible_roles: ["fisher", "dock_processor", "port_buyer", "gear_rigger"] ), + ( site_type: "gear_shed", eligible_roles: ["gear_rigger", "fisher"] ), + ( site_type: "waterfront_canteen", eligible_roles: ["fisher", "dock_processor", "gear_rigger", "port_buyer"] ), + ], +) diff --git a/server/content/global/zone-types/port_maritime.ron b/server/content/global/zone-types/port_maritime.ron new file mode 100644 index 000000000..dfc95823e --- /dev/null +++ b/server/content/global/zone-types/port_maritime.ron @@ -0,0 +1,155 @@ +// Port Maritime Zone-Type Template +// +// Schema: server/src/npc/blueprint.rs :: ZoneTypeTemplate +// Ticket: #662 (copy team) +// Validate: tooling/validate-ron content/global/zone-types/port_maritime.ron zone_type +// +// Sources: D-142 (zone-type template architecture). +// +// Zone character: ocean or large inland waterway port. Vessel moorings, cargo handling, +// chandlery and provisioning, customs clearance for maritime transit. +// Water, tides, and weather are constant variables. The work is physical and exposed. +// +// Primitives are CULTURE-NEUTRAL. Culture modifiers (culture-*.ron files) append +// cultural flavor at assembly time. Do not encode cultural attitudes in action text. +// +// Roles: dock_crew, harbour_master, chandler, maritime_security +// Social site types: quayside_canteen, harbormaster_office, chandlery_counter + +( + id: "port_maritime", + subtype: None, + label: "Port — Maritime", + description: "Ocean or large waterway port. Vessel moorings, bulk cargo handling, chandlery, maritime customs. Tides, weather, and the physical demands of exposed wet work define the operational texture.", + + // Default economic/density profile. Location specs override. + economic_level: 5, + population_density: 5, + + roles: [ + ( + id: "dock_crew", + label: "Dock Crew", + skill_focus: ["technical"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "catches a thrown mooring line and loops it twice around the bollard without looking at her hands", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "hauls a gangway plank into position against an arriving hull", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "hooks a cargo net sling under a bulk pallet and steps clear before signaling the crane", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "sweeps standing water off the dock surface with a long rubber squeegee", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "checks a manifest against the crate markings on the dock floor", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "tightens a spring line by hand before the vessel's engine fully cuts out", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "braces against the dock rail as a wake rocks the mooring", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "calls a hold signal up to the crane operator with a raised fist", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "stacks empty pallets under a waterproof tarp between loads", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "flags a damaged container seal to the chandler before logging it", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "checks the tide mark on the dock piling before estimating the load window", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "carries a crate on one shoulder along a wet dock, stepping around the cleats", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "stores tools in the dock locker and turns the key before going off-shift", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "watches the sky when a load is suspended and says something brief to the crane operator", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "ties off a loose end of netting that has come undone from a stacked load", context: OnShift, modifier_hint: Some("task_completion") ), + // Social + ( action: "sits at the quayside canteen still smelling of the dock, boots drying under the table", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "raises a cup to the crane operator across the canteen without saying anything", context: Social, modifier_hint: Some("social_signal") ), + ( action: "tells a short story from the morning's load and lets it land without pressing it", context: Social, modifier_hint: Some("social_signal") ), + ( action: "eats quickly, refills the cup, and stays put a while longer", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "slides change across the counter and tells the server to keep the rest", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ( + id: "harbour_master", + label: "Harbour Master", + skill_focus: ["observation", "persuasion"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "allocates berths from the harbour board and marks each in the morning window", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "reads the weather report before confirming the day's mooring schedule", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "walks the quay in the early hours, noting which vessels have arrived overnight", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "issues a formal mooring dispute decision in writing before it escalates", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "checks the harbour log for the last twenty-four hours before starting a shift brief", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "approves a departure window based on tide and weather, not the captain's request alone", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "receives a port authority inspector's arrival and hands over the logbook without pausing", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "files a vessel incident report within the shift it occurred", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "holds a delayed berth clearance without explanation until the fee is settled", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "talks to an incoming captain from the dock edge, not the office — gets a better read that way", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "confirms berthing fees against the port tariff sheet before quoting them", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "watches a vessel's docking approach from the harbormaster office window", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "resolves a quay access conflict between two vessels without raising his voice", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "updates the harbour board before the end of shift, every shift", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "notes a safety concern on the dock and addresses it before the next vessel docks", context: OnShift, modifier_hint: Some("work_pace") ), + // Social + ( action: "takes a meal at the quayside canteen where he can see the harbour entrance", context: Social, modifier_hint: Some("environmental_scan") ), + ( action: "accepts a compliment from a returning captain and moves the subject on quickly", context: Social, modifier_hint: Some("social_signal") ), + ( action: "sits at the canteen counter and talks to the staff rather than the tables", context: Social, modifier_hint: Some("social_signal") ), + ( action: "eats without reading anything, which is unusual for him", context: Social, modifier_hint: Some("offduty_posture") ), + ], + ), + ( + id: "chandler", + label: "Maritime Chandler", + skill_focus: ["persuasion", "technical"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "fills a provisions order from the chandlery store, item by item from a printed list", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "quotes fuel prices from the current tariff and does not negotiate from them", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "checks a rope spool's length against the order before cutting and sealing the end", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "inventories incoming chandlery stock against the delivery note before signing it", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "stacks provisions by departure order so the next outbound vessel loads from the front", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "reminds a captain which regulations govern the item she's declining to list", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "sources a substitute part from a secondary supplier when the primary is out of stock", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "marks a high-demand item as reserved before the next provisioning window opens", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "photographs a damaged incoming item before logging the return claim", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "confirms a delivery window with a client in writing before releasing the stock", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "advises a first-time provisioner on the standard outbound list without making it a service charge", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "reads a vessel's provisioning history before the captain arrives to reorder", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "seals a fuel connection log with a time stamp and a witness signature", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "closes the chandlery counter log before locking up for the night", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "carries a crate of provisions to the dock edge without asking who should be doing it", context: OnShift, modifier_hint: Some("physical_manner") ), + // Social + ( action: "sits at the chandlery counter with a mug after closing, tallying the day's orders", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "passes a recommendation to a captain's mate without charging for the advice", context: Social, modifier_hint: Some("social_signal") ), + ( action: "eats at the quayside canteen and talks about anything except chandlery", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "buys a drink for a crew member whose vessel he's provisioned three times this season", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ( + id: "maritime_security", + label: "Maritime Security", + skill_focus: ["observation", "combat"], + combat_eligible: true, + behavior_primitives: [ + // OnShift + ( action: "patrols the quay edge in a direction that keeps the water on one side at all times", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "checks a vessel's arrival documentation against the harbour log before allowing disembarkation", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "watches a loading operation from the dock gate, arms loose, nothing to indicate it's surveillance", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "logs a night patrol result with an exact time and a one-line status", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "boards a vessel at anchor for a routine check, two officers, in radio contact", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "stops a vehicle at the dock gate and checks the manifest before the bay number", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "reports a mooring irregularity to the harbour master before the end of shift", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "stands at the harbour mouth in heavy weather and watches the approach lane", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "checks the quay lights at the start of the night patrol and reports any failure", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "intercepts a vessel that hasn't checked in at the harbour office and does it calmly", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "stays at the perimeter during loading operations and does not assist with the cargo", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "runs the same patrol circuit at night as during the day and does not take shortcuts", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "verifies a crew member's berth pass before allowing access to the secure dock section", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "notes a vessel that arrived without a declaration and watches it before approaching", context: OnShift, modifier_hint: Some("environmental_scan") ), + // Social + ( action: "takes a break in the quayside canteen at the table nearest the dock entrance", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "nods to the incoming watch without stopping to chat — just the nod", context: Social, modifier_hint: Some("social_signal") ), + ( action: "accepts a hot drink from the canteen staff and drinks it standing at the counter", context: Social, modifier_hint: Some("social_signal") ), + ( action: "sits with both hands around a mug and watches the harbour through the window", context: Social, modifier_hint: Some("offduty_posture") ), + ], + ), + ], + + // Valid social site types for this zone type. + // Location specs declare which appear, with their own label, min_npcs, max_npcs. + social_site_types: [ + ( site_type: "quayside_canteen", eligible_roles: ["dock_crew", "harbour_master", "chandler", "maritime_security"] ), + ( site_type: "harbormaster_office", eligible_roles: ["harbour_master", "maritime_security", "chandler"] ), + ( site_type: "chandlery_counter", eligible_roles: ["chandler", "dock_crew", "harbour_master"] ), + ], +) diff --git a/server/content/global/zone-types/port_space.ron b/server/content/global/zone-types/port_space.ron new file mode 100644 index 000000000..d80ec57fc --- /dev/null +++ b/server/content/global/zone-types/port_space.ron @@ -0,0 +1,155 @@ +// Port Space Zone-Type Template +// +// Schema: server/src/npc/blueprint.rs :: ZoneTypeTemplate +// Ticket: #662 (copy team) +// Validate: tooling/validate-ron content/global/zone-types/port_space.ron zone_type +// +// Sources: D-142 (zone-type template architecture). +// +// Zone character: orbital station or deep-space port hub. High throughput, high rotation. +// Docking lanes, customs, cargo transfer, crew transit. Permanent staff embedded in +// a constant churn of arrivals and departures. Transience defines the social texture. +// +// Primitives are CULTURE-NEUTRAL. Culture modifiers (culture-*.ron files) append +// cultural flavor at assembly time. Do not encode cultural attitudes in action text. +// +// Roles: docking_handler, customs_officer, cargo_broker, port_security +// Social site types: transit_lounge, cargo_exchange, berth_service_bay + +( + id: "port_space", + subtype: None, + label: "Port — Space", + description: "Orbital or deep-space port hub. High-volume cargo transfer, customs, crew transit. Permanent staff exist within constant arrival-departure churn. Transience is the dominant social texture.", + + // Default economic/density profile. Location specs override. + economic_level: 7, + population_density: 7, + + roles: [ + ( + id: "docking_handler", + label: "Docking Handler", + skill_focus: ["technical"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "coordinates a ship's approach via talkback, one instruction at a time", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "clips a docking seal sensor to the collar ring and reads the indicator", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "waves a craft into berth alignment with two flat-palmed signals", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "confirms hard dock by cycling the airlock test sequence twice", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "marks a berth as occupied on the bay board before the ramp extends", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "runs a pre-departure checklist verbally with the departing crew", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "hooks a cargo umbilical onto the ship's port fitting and checks the flow indicator", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "stands clear of the blast deflectors while a ship spins its thrusters down", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "handles a bay emergency by directing foot traffic away from the apron", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "logs a late departure without escalating it unless it crosses the threshold", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "walks the bay perimeter between arrivals, checking the deck for loose equipment", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "clips a work tether to the deck rail before approaching the docked hull", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "clears a bay in the sequence the port authority assigned, not first-come-first-served", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "pulls a berth tool kit from the wall rack and returns it in the same order", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "calls the next berth handler over when a two-person connection requires it", context: OnShift, modifier_hint: Some("social_signal") ), + // Social + ( action: "sits in the transit lounge still in her bay vest, watching arrivals", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "nods at a colleague across the lounge without crossing the room", context: Social, modifier_hint: Some("social_signal") ), + ( action: "orders a meal at the counter and eats it standing, facing the door", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "drops into conversation with a crew transit worker for a few minutes", context: Social, modifier_hint: Some("social_signal") ), + ( action: "buys a drink for someone she'll never see again without marking the moment", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ( + id: "customs_officer", + label: "Customs Officer", + skill_focus: ["observation", "persuasion"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "reviews a cargo manifest against the docking record before the crew disembarks", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "opens a container at random, counts three items, and closes it", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "stands at the disembarkation lane and watches faces as they come through", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "asks a traveler the same question twice in different words and compares the answers", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "pulls a ship's transit log and reads backward from the last port of call", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "flags a cargo discrepancy and holds the shipment without explaining why to the crew", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "clears a routine inspection with a stamp and no further comment", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "photographs the cargo bay interior before the loading team enters", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "speaks to a ship's captain briefly and watches what she doesn't say", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "refers a case above her authority threshold within the shift, not the next day", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "writes an inspection summary that could be read by someone who wasn't there", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "keeps her body position neutral at all times during a traveler interview", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "lets a long silence run in an interview before asking the next question", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "runs a standard scan even on a ship she has cleared a hundred times", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "closes a case file and opens the next one without carrying the previous one over", context: OnShift, modifier_hint: Some("work_pace") ), + // Social + ( action: "takes her break in the transit lounge away from the inspection lanes", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "sits with colleagues and does not discuss open cases", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "asks a new docking handler how long they've been posted without making it an interview", context: Social, modifier_hint: Some("social_signal") ), + ( action: "offers a first-time-through traveler directions without being asked", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ( + id: "cargo_broker", + label: "Cargo Broker", + skill_focus: ["persuasion", "observation"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "reviews the available freight board and marks three bids before making the first call", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "stands at the cargo exchange floor with a handheld and tracks movement without reacting", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "names a price once and does not repeat it until the other party responds", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "pulls a ship's manifest and reads the last port of call before negotiating the outbound rate", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "confirms a contract in writing before the ship leaves the berth", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "walks the exchange floor once before starting the day's bids", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "routes a cargo hold that won't fill to a freight partner instead of sitting on it", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "reads a client's timeline twice before promising a delivery window", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "adjusts a bid after looking at the weather on the departure route", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "records every commission in the day log before end of shift", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "confirms a port authority fee before passing it on to the client", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "lets a difficult negotiation rest overnight and returns to it fresh", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "shakes a hand without pausing to think about it", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "logs a failed bid without explaining it to anyone who didn't ask", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "buys the first drink at the cargo exchange bar and talks about something else entirely", context: OnShift, modifier_hint: Some("social_signal") ), + // Social + ( action: "sits in the transit lounge at a table facing the exchange floor", context: Social, modifier_hint: Some("environmental_scan") ), + ( action: "buys a round without connecting it to any current deal", context: Social, modifier_hint: Some("social_signal") ), + ( action: "listens more than she speaks when she's off-rotation", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "shares a meal with a trader she declined to work with today", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ( + id: "port_security", + label: "Port Security", + skill_focus: ["observation", "combat"], + combat_eligible: true, + behavior_primitives: [ + // OnShift + ( action: "sweeps the berth access corridor on a timed circuit, varying the interval slightly each pass", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "checks credentials at the restricted bay entrance and returns them without comment", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "stands with her back to the wall at the transit lounge entrance where the exits are visible", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "escorts a flagged individual to the customs office without physical contact", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "runs the patrol route in full even when the port is quiet", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "logs a loitering note without approaching the individual yet", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "confirms a customs officer's hold with a copy to the bay supervisor", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "watches a handover between two crews from the corridor junction without moving closer", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "responds to a disturbance at walking pace until she can see the situation", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "acknowledges the port authority command check with a status report and nothing else", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "runs an ID scan on a returning crew member before waving her through", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "checks a secondary access point that wasn't in the brief, just to be sure", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "notes an unattended bag in the corridor and stands twenty meters back until it's resolved", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "keeps her voice flat when asking someone to stop", context: OnShift, modifier_hint: Some("social_signal") ), + // Social + ( action: "takes a break in the transit lounge facing the room", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "accepts a coffee from the canteen counter worker without making it a formal moment", context: Social, modifier_hint: Some("social_signal") ), + ( action: "nods to the incoming shift as she passes on the way out", context: Social, modifier_hint: Some("social_signal") ), + ( action: "sits in a corner of the lounge and says nothing for a while", context: Social, modifier_hint: Some("offduty_posture") ), + ], + ), + ], + + // Valid social site types for this zone type. + // Location specs declare which appear, with their own label, min_npcs, max_npcs. + social_site_types: [ + ( site_type: "transit_lounge", eligible_roles: ["docking_handler", "customs_officer", "cargo_broker", "port_security"] ), + ( site_type: "cargo_exchange", eligible_roles: ["cargo_broker", "customs_officer", "docking_handler"] ), + ( site_type: "berth_service_bay", eligible_roles: ["docking_handler", "port_security"] ), + ], +) diff --git a/server/content/global/zone-types/port_surface.ron b/server/content/global/zone-types/port_surface.ron new file mode 100644 index 000000000..53fb13414 --- /dev/null +++ b/server/content/global/zone-types/port_surface.ron @@ -0,0 +1,156 @@ +// Port Surface Zone-Type Template +// +// Schema: server/src/npc/blueprint.rs :: ZoneTypeTemplate +// Ticket: #662 (copy team) +// Validate: tooling/validate-ron content/global/zone-types/port_surface.ron zone_type +// +// Sources: D-142 (zone-type template architecture). +// +// Zone character: planetary or surface spaceport. Atmospheric conditions intrude. +// Lander pads, customs clearance, surface transport connections, fueling facilities. +// More infrastructure-dense than a space port — wider ground footprint, vehicle traffic, +// weather as an operational variable. +// +// Primitives are CULTURE-NEUTRAL. Culture modifiers (culture-*.ron files) append +// cultural flavor at assembly time. Do not encode cultural attitudes in action text. +// +// Roles: ground_handler, customs_agent, freight_dispatcher, terminal_security +// Social site types: terminal_lounge, freight_yard, crew_canteen + +( + id: "port_surface", + subtype: None, + label: "Port — Surface", + description: "Planetary spaceport or major surface transit hub. Lander pads, customs clearance, surface transport links. Weather is an operational variable. Infrastructure-dense, vehicle traffic constant.", + + // Default economic/density profile. Location specs override. + economic_level: 7, + population_density: 6, + + roles: [ + ( + id: "ground_handler", + label: "Ground Handler", + skill_focus: ["technical"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "guides a lander onto the pad using two illuminated wands, stepping back only when it touches", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "chocks a wheel strut and gives it a kick to confirm it's seated", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "connects a fuel umbilical to a lander's port side and watches the flow indicator climb", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "waves vehicle traffic around the active pad apron with a flat hand", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "reads the pad queue board and repositions a ground vehicle before the next arrival", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "pulls a cargo dolly out to the open pad in a headwind, leaning into it", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "reports a pad surface anomaly to the shift supervisor before continuing", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "deices a strut fitting with a spray applicator and checks the seal after", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "sets radio protocol on a ground handset before beginning an approach coordination", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "sweeps the pad clear of debris between landings using a motorized broom unit", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "holds the pad crew back until the engine thermals drop to safe levels", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "straps down loose cargo on the apron when wind rises unexpectedly", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "calls a weather hold to the control tower and logs the delay", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "pulls on a high-visibility vest over her jacket in one practiced motion", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "walks the pad edge before the next arrival, eyes down for foreign object debris", context: OnShift, modifier_hint: Some("environmental_scan") ), + // Social + ( action: "sits in the crew canteen with the vest still on, too tired to take it off", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "talks to the next table over rather than the person beside her", context: Social, modifier_hint: Some("social_signal") ), + ( action: "eats quickly and goes back for the day's second shift without lingering", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "passes a drink to a pad colleague and returns to her own tray", context: Social, modifier_hint: Some("social_signal") ), + ( action: "complains about the wind to no one in particular and then finishes her meal", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ( + id: "customs_agent", + label: "Surface Customs Agent", + skill_focus: ["observation", "persuasion"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "checks a traveler's transit documentation against a handheld registry", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "opens a luggage compartment and picks one item from the middle for inspection", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "scans a cargo container's exterior before authorizing the seal break", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "stands at the arrivals threshold and watches the flow before stepping forward", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "asks a traveler to step aside and does it without changing her voice", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "reviews a ship's planetary entry log before meeting the crew", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "stamps a clearance document and hands it back with no additional comment", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "flags a mismatched serial number and holds the cargo pending verification", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "asks the same declarable goods question three different ways across the interview", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "photographs a cargo hold for the official record before signing the clearance", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "escorts a flagged traveler to the secondary inspection room without explanation", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "reads body language at the arrivals line and notes two people she wants to watch", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "files the inspection record before the shift ends even if it means staying late", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "processes a routine arrival in under four minutes and moves to the next", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "keeps her face neutral while reviewing a cargo declaration that doesn't add up", context: OnShift, modifier_hint: Some("social_signal") ), + // Social + ( action: "takes lunch at the terminal lounge away from the inspection lanes", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "does not discuss active cases in the canteen, even obliquely", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "answers a traveler's question about where to find transport without checking if it's her job", context: Social, modifier_hint: Some("social_signal") ), + ( action: "accepts a coffee from a colleague and doesn't owe anything for it", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ( + id: "freight_dispatcher", + label: "Freight Dispatcher", + skill_focus: ["persuasion", "observation"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "allocates freight vehicles to pad assignments from a floor-plan board with magnetic markers", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "coordinates a delayed shipment between three parties via radio in under two minutes", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "reads a delivery manifest against the weight ticket before releasing a vehicle", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "reassigns a vehicle to cover an absent driver without asking for approval first", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "logs a late departure without editorializing in the incident note", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "stands at the dispatch window and watches the freight yard between radio calls", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "adjusts the load sequence when weather comes in ahead of schedule", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "confirms a pad number with the ground handler before releasing the freight vehicle", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "routes an oversize shipment through the freight yard without blocking the lanes", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "escalates a cargo hold conflict to port authority before it backs up the queue", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "marks a slot as filled before the vehicle reaches it so no one doubles up", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "calls a driver back on radio before they've committed to the wrong gate", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "keeps the freight board current through a busy window with no notation gaps", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "steps outside during a lull to walk the freight yard and check the actual state of things", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "closes the shift log before handing over to the next dispatcher", context: OnShift, modifier_hint: Some("task_completion") ), + // Social + ( action: "arrives at the canteen talking, sits down mid-sentence, and finishes the thought", context: Social, modifier_hint: Some("social_signal") ), + ( action: "reviews tomorrow's freight schedule over a meal without stopping the conversation", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "passes salt across the table before it's requested", context: Social, modifier_hint: Some("social_signal") ), + ( action: "eats at the canteen counter instead of a table when the board is busy", context: Social, modifier_hint: Some("offduty_posture") ), + ], + ), + ( + id: "terminal_security", + label: "Terminal Security", + skill_focus: ["observation", "combat"], + combat_eligible: true, + behavior_primitives: [ + // OnShift + ( action: "patrols the terminal concourse at a deliberate, unhurried pace", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "checks the restricted freight yard gate before starting the corridor round", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "watches a large group move through the terminal and notes who is not moving with the group", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "logs a perimeter anomaly and reports it up before acting on it unilaterally", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "runs a vehicle plate check at the freight gate without stopping the driver first", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "stands at the terminal exit in a position to watch the concourse and the exterior simultaneously", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "redirects a traveler who has entered the wrong access lane without raising a flag", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "responds to an alarm at the far end of the terminal at a run", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "acknowledges the shift commander's morning brief with a single nod", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "runs the post-incident paperwork before going off-shift", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "checks the terminal's crowd density at peak arrival windows and positions accordingly", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "notes a vehicle that has been in the freight yard longer than declared and watches it", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "holds a door for a passenger with loaded luggage while watching the corridor past them", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "completes the patrol route even during a quiet shift, no shortcuts", context: OnShift, modifier_hint: Some("work_pace") ), + // Social + ( action: "takes her break in the crew canteen well away from the public concourse", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "eats facing the door out of habit, not comment", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "exchanges a few words with the canteen staff every shift without exception", context: Social, modifier_hint: Some("social_signal") ), + ( action: "nods at the incoming shift and hands over the log without ceremony", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ], + + // Valid social site types for this zone type. + // Location specs declare which appear, with their own label, min_npcs, max_npcs. + social_site_types: [ + ( site_type: "terminal_lounge", eligible_roles: ["customs_agent", "terminal_security", "freight_dispatcher"] ), + ( site_type: "freight_yard", eligible_roles: ["ground_handler", "freight_dispatcher", "terminal_security"] ), + ( site_type: "crew_canteen", eligible_roles: ["ground_handler", "customs_agent", "freight_dispatcher", "terminal_security"] ), + ], +) diff --git a/server/content/global/zone-types/research_station.ron b/server/content/global/zone-types/research_station.ron new file mode 100644 index 000000000..7cc9980af --- /dev/null +++ b/server/content/global/zone-types/research_station.ron @@ -0,0 +1,156 @@ +// Research Station Zone-Type Template +// +// Schema: server/src/npc/blueprint.rs :: ZoneTypeTemplate +// Ticket: #662 (copy team) +// Validate: tooling/validate-ron content/global/zone-types/research_station.ron zone_type +// +// Sources: D-142 (zone-type template architecture). +// +// Zone character: laboratory blocks, clean rooms, data terminals, equipment bays, +// long corridors between working areas. Dry recycled air, low ambient noise, the +// particular silence of focused work punctuated by equipment cycles. Time measured +// in experimental runs, not shifts. +// +// Primitives are CULTURE-NEUTRAL. Culture modifiers (culture-*.ron files) append +// cultural flavor at assembly time. Do not encode cultural attitudes in action text. +// +// Roles: researcher, technician, security, support +// Social site types: lab_common_area, equipment_bay, canteen + +( + id: "research_station", + subtype: None, + label: "Research Station", + description: "Laboratories, clean rooms, data terminals, equipment bays. Dry air, low noise, focused work punctuated by equipment cycles. Time measured in experimental runs, not clock shifts.", + + // Default economic/density profile. Location specs override. + economic_level: 7, + population_density: 3, + + roles: [ + ( + id: "researcher", + label: "Station Researcher", + skill_focus: ["technical", "observation"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "reviews a run result on a bench terminal, scrolling back to the anomaly in the middle of the dataset", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "adjusts a specimen under a scope by feel, eyes never leaving the display", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "annotates a data plot with a stylus, adds a question mark and circles it", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "sets up the next test run while the current one is still processing", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "stands at the lab bench reading a printout with both hands gripping the edge of the surface", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "pulls a reference paper up on a side screen and reads the methodology section", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "talks through a data problem to herself under her breath, not looking for an answer from the room", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "runs the calibration sequence before the first trial of the day, skipping nothing", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "labels a sample vial with a permanent marker before setting it in the rack", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "photographs the experimental setup before changing any variable", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "catches a discrepancy in a colleague's dataset and flags it on a shared terminal without comment", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "checks the environmental log for the overnight period before opening the clean room", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "types up run notes at the end of the session before the data merges with the archive", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "stands in the lab doorway for a moment before entering, reading the status board", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "holds a sample flask to the light and tilts it once before deciding", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "answers a section director's question with data and no editorializing", context: OnShift, modifier_hint: Some("authority_response") ), + // Social + ( action: "takes coffee in the common area standing at the window, face turned toward the exterior view", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "shares a table in the canteen with a colleague and discusses results in shorthand", context: Social, modifier_hint: Some("social_signal") ), + ( action: "sits with a personal device in the common area, reads something unrelated to the work", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "answers a question from an unfamiliar colleague by asking what they already know first", context: Social, modifier_hint: Some("social_signal") ), + ( action: "nurses a drink in the canteen and stares at the middle distance long enough for someone to ask if she's alright", context: Social, modifier_hint: Some("offduty_posture") ), + ], + ), + ( + id: "technician", + label: "Laboratory Technician", + skill_focus: ["technical"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "runs a diagnostic on the equipment rack before the research team arrives", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "replaces a worn seal on a sample housing and logs the part number", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "patches a software fault in the data logger by referencing the error code in the manual", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "re-zeroes a pressure gauge and marks the log entry with the time", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "loads samples into the carousel in the numbered order from the intake sheet", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "checks the output queue for errors after each run cycle completes", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "restores the equipment bay to standard configuration at shift end", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "labels a repaired component with a tag before returning it to the bench stock", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "works under an equipment panel with a torch clipped to her collar, both hands busy", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "informs a researcher that a piece of equipment won't be ready until the next cycle, without apologizing", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "tightens a fitting by quarter-turns until it's right, not until it stops", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "checks a power draw reading against the spec on a datapad beside the equipment", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "signs off a maintenance run only after running the self-test sequence to completion", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "sweeps contaminants from the clean room floor with a static mop, one careful stroke at a time", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "escalates an equipment fault to the section lead and documents the escalation time", context: OnShift, modifier_hint: Some("authority_response") ), + // Social + ( action: "sits in the equipment bay on a parts crate during break, drinking something hot from a sealed mug", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "shows a colleague a shortcut on the control panel by pointing, not explaining", context: Social, modifier_hint: Some("social_signal") ), + ( action: "eats in the canteen and reads a printed manual with the spine cracked back", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "trades information about equipment behavior with a fellow technician over lunch", context: Social, modifier_hint: Some("social_signal") ), + ( action: "sits with her back to the canteen counter, watching the room while she eats", context: Social, modifier_hint: Some("environmental_scan") ), + ], + ), + ( + id: "security", + label: "Station Security", + skill_focus: ["combat", "observation"], + combat_eligible: true, + behavior_primitives: [ + // OnShift + ( action: "walks the perimeter corridor at measured intervals, stopping at each junction", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "checks access credentials against the daily clearance list without explanation", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "stands at the clean room airlock and checks ID before the decontamination cycle begins", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "sweeps a section of corridor from one end to the other before confirming it clear", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "logs an unusual access event before deciding whether to investigate", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "follows the shift-handover checklist point by point with the outgoing officer", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "positions herself at the main corridor junction where three branches are visible", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "checks the restricted lab door seal at the start and end of every rotation", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "acknowledges a researcher's access request with a nod and completes the log entry before they pass", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "holds a visitor's credentials for a full read before handing them back", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "reports an access anomaly to the security supervisor before acting on it independently", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "walks a slower circuit when the station is at reduced staffing and notes the time of each loop", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "keeps the equipment bay entrance visible during active maintenance windows", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "runs the same patrol sequence regardless of whether anyone is watching", context: OnShift, modifier_hint: Some("authority_response") ), + // OffDuty + ( action: "takes break in the staff common area away from the researchers' table", context: OffDuty, modifier_hint: Some("offduty_posture") ), + ( action: "sits facing the common area entrance during breaks, drink untouched for the first five minutes", context: OffDuty, modifier_hint: Some("environmental_scan") ), + ( action: "talks with the incoming shift in the corridor for two minutes, handover notes already written", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ( + id: "support", + label: "Station Support", + skill_focus: ["technical"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "delivers a supply crate to the equipment bay and marks the manifest before leaving", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "restocks consumables in the sample preparation area without disrupting the ongoing work", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "collects used sample containers for decontamination in the order of the log sheet", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "runs environmental checks on the station common areas on a posted schedule", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "unloads a supply delivery in the loading bay and cross-checks the packing list against the order", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "reports a low-stock item to the supply coordinator on a shared terminal rather than verbally", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "replaces the filtration unit in the clean air intake on the weekly cycle without prompting", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "clears a common area between sessions, working around any equipment left out", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "checks the catering station supplies before the main meal period and fills what's low", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "helps carry an oversized equipment case through a narrow corridor, backing in first", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "takes direction from a researcher on where a delivery should go and says nothing back", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "stows empty crates in the dedicated store room in a way that leaves the aisle clear", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "refills the common area water dispenser with both hands on the container, moving slowly to avoid spillage", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "checks the posted shift schedule on the way in and adjusts the route accordingly", context: OnShift, modifier_hint: Some("environmental_scan") ), + // Social + ( action: "sits at the far end of the canteen table during break and eats without looking up", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "refills another worker's cup from the urn and returns to her seat without comment", context: Social, modifier_hint: Some("social_signal") ), + ( action: "listens to the canteen conversation without contributing until directly addressed", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "trades a quiet word with the technician about the supply backlog before the next shift", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ], + + // Valid social site types for this zone type. + // Location specs declare which appear, with their own label, min_npcs, max_npcs. + social_site_types: [ + ( site_type: "lab_common_area", eligible_roles: ["researcher", "technician", "support"] ), + ( site_type: "equipment_bay", eligible_roles: ["technician", "researcher", "support"] ), + ( site_type: "canteen", eligible_roles: ["researcher", "technician", "security", "support"] ), + ], +) diff --git a/server/content/global/zone-types/residential_dispersed.ron b/server/content/global/zone-types/residential_dispersed.ron new file mode 100644 index 000000000..964154250 --- /dev/null +++ b/server/content/global/zone-types/residential_dispersed.ron @@ -0,0 +1,167 @@ +// Residential Dispersed Zone-Type Template +// +// Schema: server/src/npc/blueprint.rs :: ZoneTypeTemplate +// Ticket: #662 (copy team) +// Validate: tooling/validate-ron content/global/zone-types/residential_dispersed.ron zone_type +// +// Sources: D-142 (zone-type template architecture). +// +// Zone character: scattered low-density habitation — frontier settlements, isolated +// homesteads, remote research outposts with residential quarters, edge communities +// at the margins of developed space. Travel between neighbors is measured in +// kilometers or transit time, not steps. Community gatherings are infrequent and +// valued. People are self-reliant by necessity and selective about when they ask +// for help. +// +// Distinct from rural_agricultural: dispersed residential has fewer people and less +// economic activity. The work here may be anything — mining claim adjacent, research- +// adjacent, just living far from the center. The defining quality is space and +// low density, not occupation. +// +// Primitives are CULTURE-NEUTRAL. Culture modifiers (culture-*.ron files) append +// cultural flavor at assembly time. Do not encode cultural attitudes in action text. +// +// Roles: homesteader, supply_runner, frontier_medic, liaison +// Social site types: community_hall, supply_depot, transit_stop + +( + id: "residential_dispersed", + subtype: None, + label: "Residential Dispersed Zone", + description: "Scattered low-density habitation at the margins — frontier settlements, isolated homesteads, edge communities. Travel between neighbors is measured in time, not steps. Self-reliance by necessity.", + + // Default economic/density profile. Location specs override. + economic_level: 2, + population_density: 1, + + roles: [ + ( + id: "homesteader", + label: "Homesteader", + skill_focus: ["technical", "observation"], + combat_eligible: false, + behavior_primitives: [ + // OnShift — daily maintenance and self-reliance behaviors + ( action: "replaces a broken panel seal on the exterior wall with the last usable piece in the supply cache", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "runs a solar collection diagnostic from a terminal inside the hab while the output reads low", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "walks the perimeter of the property at irregular intervals, checking the fence sections", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "catalogues a supply inventory by hand and marks two items for the next runner request", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "fills a water storage tank from a catchment system and marks the level on the wall", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "repairs a cracked tool handle by wrapping it in wire before binding it in tape", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "stands outside the hab and scans the horizon in the direction of weather", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "ties down a loose section of roof panel before a weather system arrives", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "restacks a supply cache to get the oldest goods to the front", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "powers down a non-essential system to extend the energy reserve", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "checks a stretch of fencing by pulling the wire at each post to test the tension", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "eats a prepared meal while watching a distant signal light on the transit ridge", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "leaves a supply crate by the track where the runner will see it", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "flags a structural issue to the runner's message drop without urgency, just on record", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "sits at the external step in the early hours and watches the settlement's light cycle change", context: OnShift, modifier_hint: Some("environmental_scan") ), + // Social + ( action: "drives to the community hall for the monthly gathering and arrives without hurrying", context: Social, modifier_hint: Some("work_pace") ), + ( action: "sits with people she sees four times a year and picks up the conversation as though it wasn't interrupted", context: Social, modifier_hint: Some("social_signal") ), + ( action: "listens at the community hall table more than she speaks — the talking here counts for a month of quiet", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "brings something to the community table that she made herself and doesn't say which is hers", context: Social, modifier_hint: Some("social_signal") ), + ( action: "stays later than she planned at the community hall, hands still wrapped around a cooling cup", context: Social, modifier_hint: Some("offduty_posture") ), + ], + ), + ( + id: "supply_runner", + label: "Supply Runner", + skill_focus: ["technical", "persuasion"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "loads a supply vehicle to weight distribution guidelines, heavier items low and forward", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "checks a delivery manifest against the loaded cargo before leaving the depot", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "follows a track that isn't marked on any map but is the fastest way to three claims in the eastern range", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "flags a homestead supply drop as complete on a handheld log before moving to the next", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "checks a vehicle's fuel reserve against the return distance at the midpoint of the run", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "relays a message between two homesteaders who can't reach each other directly", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "collects an outgoing supply return and logs it for depot check-in", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "repairs a minor vehicle fault at the side of the track with tools from the cab storage", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "makes an unscheduled stop when a property looks different than last run", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "delivers goods without knocking when the homesteader has left the crate by the track", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "notes a changed approach track and marks it on the run map for the next week", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "spends longer at one stop than budgeted and adjusts the rest of the run accordingly", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "flags a missing check-in to the depot on a quiet channel before logging it formally", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "brings an extra item not on the manifest for a homesteader who mentioned needing it last month", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "waits out a weather window at a midpoint shelter rather than pushing through", context: OnShift, modifier_hint: Some("environmental_scan") ), + // Social + ( action: "sits at the supply depot table knowing things about people across the whole run that none of them know about each other", context: Social, modifier_hint: Some("environmental_scan") ), + ( action: "buys a round at the community hall and learns three things about the region's current state", context: Social, modifier_hint: Some("social_signal") ), + ( action: "tells a story from the run that makes the remote feel like territory rather than emptiness", context: Social, modifier_hint: Some("social_signal") ), + ( action: "listens to homesteader gossip without confirming or denying any of it", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "sits at the transit stop between runs and watches who arrives before speaking to anyone", context: Social, modifier_hint: Some("offduty_posture") ), + ], + ), + ( + id: "frontier_medic", + label: "Frontier Medic", + skill_focus: ["technical", "observation"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "runs a weekly medical check at the community hall, setting up and packing down alone", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "carries a field kit on every transit run, regardless of the purpose of the trip", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "logs a patient record on a encrypted handheld and stores it before leaving the property", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "explains a diagnosis in terms the patient can use, not the medical record shorthand", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "makes a supply call to the settlement node for a restocking item before the current stock runs out", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "works a field assessment by touch and available light when instruments aren't the right tool", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "notes a change in a patient's condition from last visit and asks a direct question about it", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "sits with someone through a difficult procedure rather than filling the time with explanation", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "checks a homestead's stored medication for expiry dates before leaving", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "escalates a case to the nearest settlement medical node via comms and follows up the same day", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "documents a field intervention in case it needs to be handed off to a different practitioner", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "makes a welfare check on a homesteader who missed the monthly community hall gathering", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "carries the medical kit into a hab without explaining why, just asks who needs to be looked at", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "answers a general health question at the community table without making it a consultation", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "drives the long route to a distant property when the weather makes the short one dangerous", context: OnShift, modifier_hint: Some("work_pace") ), + // Social + ( action: "sits at the community hall with a drink and doesn't talk about anyone's health unless asked", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "deflects a health question at the table with a short answer and a question back", context: Social, modifier_hint: Some("social_signal") ), + ( action: "stays late at the community hall, listening more than talking as the crowd thins", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "tells a story from the run that has nothing medical in it", context: Social, modifier_hint: Some("social_signal") ), + ( action: "accepts a meal pressed on her by a homesteader she helped last month and doesn't refuse it", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ( + id: "liaison", + label: "Settlement Liaison", + skill_focus: ["persuasion", "observation"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "drives the circuit of dispersed properties on a monthly schedule that everyone in the area knows", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "holds an informal meeting at the community hall without an agenda or time limit", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "relays a policy change from the regional authority in language that makes it useful rather than official", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "listens to a complaint from a homesteader for the full length of it before explaining what can be done", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "notes a disputed boundary between two properties and arranges a three-way meeting before escalating", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "files a welfare concern through official channels and follows up in person on the same run", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "accepts a gift of food or goods from a homesteader and records it in the visit log", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "pushes back on a regional directive that doesn't account for dispersed living conditions", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "knows which homesteader to ask about any given community fact, and asks before looking it up", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "writes a short field note after each property visit that goes into the regional file", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "mediates a two-way dispute by asking both parties questions until the third option becomes obvious", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "brings news from one end of the run to the other without editorializing it", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "arrives at a property unannounced when the visit log shows a long gap without incident", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "schedules the next monthly community hall gathering while still at the current one", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "reviews the run notes from the previous cycle before starting the next one", context: OnShift, modifier_hint: Some("task_completion") ), + // Social + ( action: "sits at the community hall table as both official presence and neighbor", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "hears something in the social hours that changes the angle of a property dispute she has been watching", context: Social, modifier_hint: Some("environmental_scan") ), + ( action: "lets the evening run long and doesn't look at the transit schedule", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "buys a round and listens to what the dispersed community says when the work talk stops", context: Social, modifier_hint: Some("social_signal") ), + ( action: "is the last one at the community hall table and drives home in the dark", context: Social, modifier_hint: Some("offduty_posture") ), + ], + ), + ], + + // Valid social site types for this zone type. + // Location specs declare which appear, with their own label, min_npcs, max_npcs. + social_site_types: [ + ( site_type: "community_hall", eligible_roles: ["homesteader", "supply_runner", "frontier_medic", "liaison"] ), + ( site_type: "supply_depot", eligible_roles: ["supply_runner", "liaison", "homesteader"] ), + ( site_type: "transit_stop", eligible_roles: ["supply_runner", "liaison", "frontier_medic"] ), + ], +) diff --git a/server/content/global/zone-types/residential_station.ron b/server/content/global/zone-types/residential_station.ron new file mode 100644 index 000000000..5010cabb3 --- /dev/null +++ b/server/content/global/zone-types/residential_station.ron @@ -0,0 +1,157 @@ +// Residential Station Zone-Type Template +// +// Schema: server/src/npc/blueprint.rs :: ZoneTypeTemplate +// Ticket: #662 (copy team) +// Validate: tooling/validate-ron content/global/zone-types/residential_station.ron zone_type +// +// Sources: D-142 (zone-type template architecture). +// +// Zone character: permanent orbital or deep-space residential blocks — hab rings, +// station residential decks, long-duration housing for workers and their families. +// Life is structured by shift rotations, shared resources, and physical constraint. +// The walls are always close. Everyone on the block knows each other's schedule. +// Social life happens in corridors, common areas, and the small courtyard spaces +// designed to give an illusion of distance. +// +// Primitives are CULTURE-NEUTRAL. Culture modifiers (culture-*.ron files) append +// cultural flavor at assembly time. Do not encode cultural attitudes in action text. +// +// Roles: resident, maintenance_tech, block_admin, security +// Social site types: common_room, service_corridor, block_canteen + +( + id: "residential_station", + subtype: None, + label: "Residential Station Zone", + description: "Permanent orbital or deep-space residential blocks. Life structured by shift rotations and shared resources. The walls are always close. Everyone knows everyone else's schedule.", + + // Default economic/density profile. Location specs override. + economic_level: 4, + population_density: 8, + + roles: [ + ( + id: "resident", + label: "Station Resident", + skill_focus: ["observation"], + combat_eligible: false, + behavior_primitives: [ + // OnShift — residents have shift lives external to the zone, these are off-shift/home behaviors + ( action: "stands in the corridor outside their unit waiting for the water heater cycle to finish", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "carries a grocery sack from the block's supply node to her unit without stopping to talk", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "props the unit door open while moving things in and out", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "checks the common room board for delivery notices and takes one slip", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "exchanges a brief word with a neighbor in the corridor without stopping fully", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "sits on a corridor bench reading something on a personal device while laundry cycles", context: OnShift, modifier_hint: Some("offduty_posture") ), + ( action: "leans against the corridor wall waiting for a lift that is one deck down", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "checks a posted maintenance schedule and reads the block admin's handwritten note on the margin", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "pushes a recycling bin to the end of the corridor and props it flush against the wall", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "stands at the block window looking at the structural bulk beyond the glass", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "walks the full corridor loop once before going back inside", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "holds the corridor door for a neighbor carrying something large", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "overhears a block dispute from behind a closed door and keeps walking", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "checks the unit's air circulation readout on a wall panel before going to sleep", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "sits on the floor of the supply corridor sorting through a delivery without standing up", context: OnShift, modifier_hint: Some("physical_manner") ), + // Social + ( action: "sits in the common room with a drink and doesn't speak until someone else starts", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "plays a shared game at the common room table with people she only half-knows", context: Social, modifier_hint: Some("social_signal") ), + ( action: "passes food from her own supply shelf to a neighbor with nothing said", context: Social, modifier_hint: Some("social_signal") ), + ( action: "listens to block gossip in the canteen without correcting the parts she knows are wrong", context: Social, modifier_hint: Some("social_signal") ), + ( action: "nurses a drink in the common room and stares at the closed block window", context: Social, modifier_hint: Some("offduty_posture") ), + ], + ), + ( + id: "maintenance_tech", + label: "Block Maintenance Technician", + skill_focus: ["technical"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "runs a pressure check on a section of the water line by opening the access panel and watching the gauge", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "replaces a failed lighting strip in a corridor ceiling without scaffolding, standing on a supply crate", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "logs a fault on the maintenance tablet and leaves a repair note stuck to the panel", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "traces a power anomaly through two junction boxes before finding the draw", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "seals a corridor conduit cover with tape when he doesn't have the right fastener", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "apologizes to a resident for the noise before opening a wall panel, not after", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "sweeps a fault path from the panel room to the unit without the resident knowing the cause", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "checks a repair he did three weeks ago without being asked to", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "carries a full toolkit to each job rather than going back to the panel room for parts", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "updates the block repair log at the end of the circuit, filling in all three status columns", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "crouches at a floor-level junction for a long time before straightening up and calling it done", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "explains the repair to a resident who didn't ask in terms that confirm it's fixed", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "flags a structural wear point to the block admin and adds it to the priority board", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "packs the toolkit exactly the way it came out, tools facing the same direction", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "stands at the block window for a moment between jobs, then moves on", context: OnShift, modifier_hint: Some("environmental_scan") ), + // Social + ( action: "sits in the common room still in his work clothes, not quite off shift yet", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "accepts a meal from a resident whose heating unit he fixed and eats it there", context: Social, modifier_hint: Some("social_signal") ), + ( action: "tells a long repair story at the canteen table that the other residents find funnier than he expected", context: Social, modifier_hint: Some("social_signal") ), + ( action: "nurses a drink in the common room and answers three quick maintenance questions from neighbors without getting up", context: Social, modifier_hint: Some("social_signal") ), + ( action: "sits in the common room off-shift and fixes a small personal item belonging to a neighbor without mentioning it", context: Social, modifier_hint: Some("offduty_posture") ), + ], + ), + ( + id: "block_admin", + label: "Block Administrator", + skill_focus: ["persuasion", "observation"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "posts a maintenance notice on the corridor board with a clear timeline and a contact slot", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "walks the corridor loop once per shift, visible to residents without stopping at any door", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "handles a noise complaint by listening to both parties before saying anything", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "updates the block allocation ledger and posts the change on the common board same day", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "responds to a resource request by checking the current block allocation before committing", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "escalates a structural issue to station management in the same shift it's reported", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "mediates a dispute about common room scheduling by drawing up a rotation chart", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "stays in the corridor during a maintenance window to answer questions without being asked to", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "scans the block allocation board for overdue flags and marks two in yellow", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "files a welfare check on a unit where no one has been seen in two days", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "explains a new station-wide policy to a confused resident in her own words, not the policy language", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "holds an allocation meeting in the common room and keeps it to twenty minutes", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "writes the week's maintenance schedule on the board in the same format every week", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "stands at the common room door during a tense block meeting without entering", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "forwards a station directive to the block noticeboards before the corridor shift changes", context: OnShift, modifier_hint: Some("work_pace") ), + // Social + ( action: "sits in the common room on her off shift like any other resident", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "deflects a block politics question at the canteen table with a short laugh", context: Social, modifier_hint: Some("social_signal") ), + ( action: "listens to a resident's complaint in the common room off-shift, in a personal capacity", context: Social, modifier_hint: Some("social_signal") ), + ( action: "eats in the canteen at a table with mixed residents and doesn't sit at the head of it", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "admits she doesn't know the answer to a station-level question and means it", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ( + id: "security", + label: "Block Security", + skill_focus: ["combat", "observation"], + combat_eligible: true, + behavior_primitives: [ + // OnShift + ( action: "walks the block corridor perimeter on a regular circuit, known to every resident", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "stops at the common room entrance and scans the space without going in", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "checks the service access hatch at the base of the block and marks the log", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "stands at the corridor intersection during shift change, familiar to all faces passing through", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "responds to a noise flag by appearing in the corridor without making it an incident", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "sits in the block security station with the door open during quiet hours", context: OnShift, modifier_hint: Some("offduty_posture") ), + ( action: "notes an unfamiliar face on the block and checks their access record before acting", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "keeps the access corridor clear during a supply delivery without explaining why", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "signs the shift log at handover and stays for two minutes to brief the next officer", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "knows every resident's face but checks arrivals from outside against the block manifest", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "doesn't intervene in an argument until someone's hands come up", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "acknowledges a resident greeting in the corridor without breaking the circuit walk", context: OnShift, modifier_hint: Some("social_signal") ), + // OffDuty + ( action: "sits in the common room off-shift in civilian clothes and is mostly ignored", context: OffDuty, modifier_hint: Some("offduty_posture") ), + ( action: "watches the corridor from the common room window without turning her head, even off-shift", context: Social, modifier_hint: Some("environmental_scan") ), + ( action: "accepts a drink from a block resident and doesn't talk about the job", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ], + + // Valid social site types for this zone type. + // Location specs declare which appear, with their own label, min_npcs, max_npcs. + social_site_types: [ + ( site_type: "common_room", eligible_roles: ["resident", "block_admin", "security", "maintenance_tech"] ), + ( site_type: "block_canteen", eligible_roles: ["resident", "maintenance_tech", "block_admin"] ), + ( site_type: "service_corridor", eligible_roles: ["maintenance_tech", "security"] ), + ], +) diff --git a/server/content/global/zone-types/residential_surface.ron b/server/content/global/zone-types/residential_surface.ron new file mode 100644 index 000000000..9ab213f78 --- /dev/null +++ b/server/content/global/zone-types/residential_surface.ron @@ -0,0 +1,157 @@ +// Residential Surface Zone-Type Template +// +// Schema: server/src/npc/blueprint.rs :: ZoneTypeTemplate +// Ticket: #662 (copy team) +// Validate: tooling/validate-ron content/global/zone-types/residential_surface.ron zone_type +// +// Sources: D-142 (zone-type template architecture). +// +// Zone character: planetary surface residential districts — suburbs, town blocks, city +// neighborhoods. Houses, streets, gardens, and the shared infrastructure of a +// ground-level community. Life is weather-aware and spatially open compared to station +// living. Social life extends outdoors. People have yards, paths, and visible windows. +// Community bonds are formed by proximity over time — the neighbor you nod to, +// the vendor you see every morning, the park bench where someone always sits. +// +// Primitives are CULTURE-NEUTRAL. Culture modifiers (culture-*.ron files) append +// cultural flavor at assembly time. Do not encode cultural attitudes in action text. +// +// Roles: resident, shopkeeper, municipal_worker, security +// Social site types: neighborhood_bar, street_market, public_square + +( + id: "residential_surface", + subtype: None, + label: "Residential Surface Zone", + description: "Planetary surface residential districts — suburbs, town blocks, city neighborhoods. Life is weather-aware and spatially open. Community bonds are formed by proximity over time.", + + // Default economic/density profile. Location specs override. + economic_level: 4, + population_density: 5, + + roles: [ + ( + id: "resident", + label: "Surface Resident", + skill_focus: ["observation"], + combat_eligible: false, + behavior_primitives: [ + // OnShift — daily life behaviors + ( action: "sweeps the path in front of the house with a long-handled broom, working the debris toward the gutter", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "props a gate open with a stone while carrying bags through, then closes it behind her", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "waters a window box of plants by tipping a jug slowly along the row", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "hangs laundry on a line, giving each item a single sharp shake before clipping it", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "leans on a fence post talking to a neighbor across the property line", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "carries groceries from the street market in two bags, balanced by weight", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "checks the weather before deciding whether to leave a window open", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "pulls a weed from the edge of the path and drops it into a yard waste bag", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "walks the same block loop each morning at the same pace", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "leaves a package on a neighbor's step and walks back without knocking", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "watches a street argument from a window and doesn't come outside", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "fixes a loose hinge on the gate with tools brought from inside", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "stands at the end of the street looking at weather coming from the west", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "gives directions to a stranger with a gesture toward the corner rather than pointing", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "parks a personal vehicle at the edge of the lot to leave the center space for neighbors", context: OnShift, modifier_hint: Some("social_signal") ), + // Social + ( action: "sits on a public square bench and watches the street without any hurry to leave", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "shares a table at the neighborhood bar with someone she's seen but never spoken to", context: Social, modifier_hint: Some("social_signal") ), + ( action: "accepts a drink from a neighbor at the bar and stays for one more than planned", context: Social, modifier_hint: Some("social_signal") ), + ( action: "talks to the bar's regular crowd about the neighborhood in the tone of people who've lived there a long time", context: Social, modifier_hint: Some("social_signal") ), + ( action: "leaves the square bench before dark and nods to the person who took the next seat over", context: Social, modifier_hint: Some("offduty_posture") ), + ], + ), + ( + id: "shopkeeper", + label: "Local Shopkeeper", + skill_focus: ["persuasion", "observation"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "sets out the day's goods on the street-facing shelf before the block wakes up", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "sweeps the shop entrance and props the door before the first customer", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "greets a regular by reaching for the usual order before they ask", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "restocks a shelf from a back crate, turning each item face-outward", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "adds a small item to an order without charging for it and doesn't comment", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "marks a running tab in a paper ledger with two columns: what is owed, what can wait", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "watches the street from behind the counter while handling routine transactions", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "gives an honest assessment of a product when asked if it's worth the price", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "holds a reserved item under the counter for a regular who is running late", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "negotiates a price in a low voice that the other customers can't hear", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "rotates the day-old stock to the front of the shelf before the fresh arrives", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "tallies the day's inventory on a strip of paper and marks the gaps", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "closes the shop front shutters at exactly the same time every evening", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "absorbs a supplier's price increase without passing all of it to the counter", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "notices a shoplifter and decides without moving whether to say something", context: OnShift, modifier_hint: Some("environmental_scan") ), + // Social + ( action: "sits at the neighborhood bar after close and talks to whoever is left", context: Social, modifier_hint: Some("social_signal") ), + ( action: "buys a round for a neighboring merchant and doesn't mention the recent price dispute", context: Social, modifier_hint: Some("social_signal") ), + ( action: "knows everyone at the bar and doesn't choose a seat before checking the room", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "closes her tab early and mentions tomorrow's opening like a small burden she carries cheerfully", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "agrees with a neighborhood grievance at the bar while saying nothing she'd repeat at the next meeting", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ( + id: "municipal_worker", + label: "Municipal Worker", + skill_focus: ["technical"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "marks a pothole on the street surface with orange spray paint and records the location", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "clears a blocked storm drain with a long tool, standing back when the water moves", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "parks a maintenance vehicle at the kerb and sets out cones before opening any panels", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "replaces a street lamp element from a raised platform vehicle", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "inspects a section of retaining wall by running a hand along the joint line", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "documents a site defect on a work order tablet before doing anything to it", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "waves pedestrians around a work zone with a loose authority", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "eats a meal on the bonnet of the maintenance vehicle during a break", context: OnShift, modifier_hint: Some("offduty_posture") ), + ( action: "fills a crack in the pavement with compound and trowels it smooth before closing the kit", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "updates the work order status from the vehicle cab before moving on to the next site", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "answers a resident's question about the work with accurate information and no reassurance", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "checks a section of public park irrigation by tracing the ground with a probe", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "notifies the district office of a defect that is outside her work order scope", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "drives the maintenance route at a pace the block residents recognize as familiar", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "flags a fault on a shared infrastructure component and marks it priority with a dated note", context: OnShift, modifier_hint: Some("task_completion") ), + // Social + ( action: "sits at the public square in uniform during a lunch break and nods to passing residents", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "accepts a greeting from a shopkeeper she's fixed the street drain for three times", context: Social, modifier_hint: Some("social_signal") ), + ( action: "drinks at the neighborhood bar in work clothes and doesn't explain the dirt", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "joins a table at the bar and lets the conversation be about anything else", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "gives an honest answer about the street repair timeline when the bar asks for it", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ( + id: "security", + label: "District Security", + skill_focus: ["combat", "observation"], + combat_eligible: true, + behavior_primitives: [ + // OnShift + ( action: "walks the residential block at a pace that reads as routine rather than patrol", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "knows most faces on the block and doesn't stop to check the ones she knows", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "stops at the square to talk to the shopkeeper who has been there since opening", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "responds to a report from a resident without making it a bigger event than it is", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "follows an unfamiliar vehicle with her eyes until it parks somewhere explainable", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "logs a routine check at the block's public access point and keeps walking", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "deals with a street dispute by standing between the parties first, speaking second", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "checks the public square at a regular time each day — everyone in the square knows this", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "notes a building with new faces outside it and doesn't change her pace", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "coordinates a response call from the street while the partner covers the other end", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "gives a new resident directions with the same brevity as a long-term one", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "files an incident report at the end of the block circuit from a mobile terminal", context: OnShift, modifier_hint: Some("task_completion") ), + // OffDuty + ( action: "drinks at the neighborhood bar in plain clothes and is recognized by half the room", context: OffDuty, modifier_hint: Some("offduty_posture") ), + ( action: "is asked about a street incident off-shift and gives a short honest answer, then changes the subject", context: Social, modifier_hint: Some("social_signal") ), + ( action: "sits at a public square bench on a day off and watches the block like he always does", context: Social, modifier_hint: Some("offduty_posture") ), + ], + ), + ], + + // Valid social site types for this zone type. + // Location specs declare which appear, with their own label, min_npcs, max_npcs. + social_site_types: [ + ( site_type: "neighborhood_bar", eligible_roles: ["resident", "shopkeeper", "municipal_worker", "security"] ), + ( site_type: "street_market", eligible_roles: ["shopkeeper", "resident", "municipal_worker"] ), + ( site_type: "public_square", eligible_roles: ["resident", "municipal_worker", "security"] ), + ], +) diff --git a/server/content/global/zone-types/rural_aquaculture.ron b/server/content/global/zone-types/rural_aquaculture.ron new file mode 100644 index 000000000..22f2c11b5 --- /dev/null +++ b/server/content/global/zone-types/rural_aquaculture.ron @@ -0,0 +1,157 @@ +// Rural Aquaculture Zone-Type Template +// +// Schema: server/src/npc/blueprint.rs :: ZoneTypeTemplate +// Ticket: #662 (copy team) +// Validate: tooling/validate-ron content/global/zone-types/rural_aquaculture.ron zone_type +// +// Sources: D-142 (zone-type template architecture). +// +// Zone character: fish farming, shellfish beds, tank cultivation. +// Work is wet, cold, and tied to water chemistry and growth cycles. +// Habitats may be coastal, river-adjacent, or fully enclosed tank systems. +// Community is small; the water sets the schedule. +// +// Primitives are CULTURE-NEUTRAL. Culture modifiers (culture-*.ron files) append +// cultural flavor at assembly time. Do not encode cultural attitudes in action text. +// +// Roles: aquaculturist, system_tech, processor, inspector +// Social site types: canteen, processing_floor, dock_shelter + +( + id: "rural_aquaculture", + subtype: None, + label: "Rural Aquaculture Zone", + description: "Fish farming, shellfish cultivation, tank-based aquatic production. Work is wet, cold, and tied to water chemistry. Growth cycles and water conditions set the schedule more than clocks do.", + + // Default economic/density profile. Location specs override. + economic_level: 3, + population_density: 2, + + roles: [ + ( + id: "aquaculturist", + label: "Aquaculturist", + skill_focus: ["technical", "observation"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "dips a test strip into a tank and holds it to the light to read the color", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "adjusts a flow valve a quarter-turn and watches the readout settle", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "nets a sample from a tank and counts the haul before releasing it", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "wades shin-deep to check a bed marker, pulls a handful of growth and examines it", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "clears biofouling from an intake screen with a brush and rinse spray", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "reads yesterday's temperature log before making today's adjustments", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "lifts a net corner and inspects the mesh for tears before dropping it back", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "charts a growth measurement on a wall sheet with a marker, adding today's entry", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "scoops feed pellets from a bin and distributes them along a tank's surface", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "calls to a colleague on the far pen before opening the sluice", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "holds a pen marker under the surface and times how quickly it corrects", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "steps back from the tank wall when an inspector arrives, hands behind her back", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "repairs a torn net panel with a splice needle, working in even stitches", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "pulls on waders in two practiced moves without sitting down", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "transfers juvenile stock between tanks using a bucket and a steady hand", context: OnShift, modifier_hint: Some("work_pace") ), + // Social + ( action: "sits in the canteen with wet sleeves rolled down, eating quickly", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "compares water readings with the system tech over a canteen table", context: Social, modifier_hint: Some("social_signal") ), + ( action: "fills a mug without asking and sets it in front of a colleague", context: Social, modifier_hint: Some("social_signal") ), + ( action: "leans back in a canteen chair and goes quiet for a while", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "argues mildly about a water chemistry call from earlier in the shift", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ( + id: "system_tech", + label: "Water Systems Technician", + skill_focus: ["technical"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "opens a pump housing and checks the impeller for wear before replacing it", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "traces a pipe run on a wall diagram and marks the section in question", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "logs a system fault code and sets the replacement priority without prompting", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "calibrates a water sensor by running two reference solutions through it", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "tests a backup aerator by switching it on and listening", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "replaces a UV lamp module in a filter housing, gloves on for the whole operation", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "pulls a filter cartridge and holds it up to see the loading before swapping it", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "reads a pressure gauge twice before deciding the line is acceptable", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "bleeds air from a circulation line by cracking a bleed valve until the hiss stops", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "walks the pipe runs once a shift to check for drips or fogging", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "explains a repair limitation to the zone manager without padding the explanation", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "seals a replaced component with a time-stamp label and a fault description", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "squats beside a pump base and listens to the bearing tone with eyes closed", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "doubles the routine inspection frequency when a tank system has been flagged", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "finishes the maintenance log entry before leaving the floor, even if it's late", context: OnShift, modifier_hint: Some("task_completion") ), + // Social + ( action: "arrives at the canteen trailing the smell of the filter room", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "sketches a pipe layout on a paper napkin to show where the problem is", context: Social, modifier_hint: Some("social_signal") ), + ( action: "sits with both hands around a hot drink and doesn't say much", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "answers a question about the system the same way off-shift as on it", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ( + id: "processor", + label: "Processing Worker", + skill_focus: ["technical"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "works the processing table with short, practiced cuts and no wasted motion", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "checks a batch weight against the manifest before passing it down the line", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "hoses down the work surface between batches and squeegees toward the drain", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "grades product into three bins by visual inspection, working without hesitation", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "stacks filled crates on the floor rack and marks each with a production label", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "adjusts the line speed with a glance at the supervisor's position", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "calls a quality flag on a batch and sets it aside without stopping her section", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "rotates to the next station at the end of a shift block without being told", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "rinses a tool under running water and returns it to the magnetic rack", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "pulls a crate through a plastic strip curtain with her hip, hands occupied", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "wipes her apron with a clean cloth and goes back to the table", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "counts a filled crate once and sends it; counts the next one twice", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "leans into the cold room for thirty seconds and comes out moving faster", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "catches the pace of the person beside her and matches it without speaking", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "puts a damaged sample in the reject bin and says nothing about it", context: OnShift, modifier_hint: Some("task_completion") ), + // Social + ( action: "sits in the canteen and peels off one glove at a time without hurrying", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "talks across the canteen table in a raised voice to beat the refrigeration noise", context: Social, modifier_hint: Some("social_signal") ), + ( action: "shares a portion of food from her own tray without being asked", context: Social, modifier_hint: Some("social_signal") ), + ( action: "sits at the far end of the canteen and stares at the wall for the first few minutes", context: Social, modifier_hint: Some("offduty_posture") ), + ], + ), + ( + id: "inspector", + label: "Aquaculture Inspector", + skill_focus: ["observation", "persuasion"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "photographs a water quality reading on a handheld before the log entry", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "walks the tank perimeter without stopping until the whole loop is complete", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "opens a crate and takes a random sample from the middle, not the top", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "reviews last month's log entries before this month's inspection begins", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "asks one short question and writes down the answer before asking another", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "notes a deviation without reacting to it in front of the site workers", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "stands in one corner and watches the processing floor for two full minutes", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "cross-references the batch manifest against the tank log before signing", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "issues a compliance note and asks for a signature on the acknowledgement copy", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "observes a process step twice before noting it as compliant", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "checks the inspector access log to see who has visited since the last audit", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "thanks the site supervisor at the end of the inspection and means it", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "keeps her report device face-down on the table during the entry interview", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "walks away from a discrepancy to think before asking the follow-up question", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "records an observation exactly as seen, without interpolation", context: OnShift, modifier_hint: Some("task_completion") ), + // Social + ( action: "eats in the canteen with site staff without raising work topics", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "accepts a drink from a site worker and does not make it a moment", context: Social, modifier_hint: Some("social_signal") ), + ( action: "sits alone at the dock shelter with a datapad and a mug before the day begins", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "listens to a canteen complaint about the regulations without defending them", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ], + + // Valid social site types for this zone type. + // Location specs declare which appear, with their own label, min_npcs, max_npcs. + social_site_types: [ + ( site_type: "canteen", eligible_roles: ["aquaculturist", "system_tech", "processor", "inspector"] ), + ( site_type: "processing_floor", eligible_roles: ["processor", "inspector", "aquaculturist"] ), + ( site_type: "dock_shelter", eligible_roles: ["aquaculturist", "inspector", "system_tech"] ), + ], +) diff --git a/server/content/global/zone-types/rural_orbital.ron b/server/content/global/zone-types/rural_orbital.ron new file mode 100644 index 000000000..d8b45abf5 --- /dev/null +++ b/server/content/global/zone-types/rural_orbital.ron @@ -0,0 +1,156 @@ +// Rural Orbital Zone-Type Template +// +// Schema: server/src/npc/blueprint.rs :: ZoneTypeTemplate +// Ticket: #662 (copy team) +// Validate: tooling/validate-ron content/global/zone-types/rural_orbital.ron zone_type +// +// Sources: D-142 (zone-type template architecture). +// +// Zone character: low-population orbital habitats, small platform settlements. +// Agriculture, basic manufacturing, or extraction in microgravity or low-grav conditions. +// Isolation shapes everything — resupply windows, system redundancy, tight crew interdependence. +// Everyone is critical infrastructure. +// +// Primitives are CULTURE-NEUTRAL. Culture modifiers (culture-*.ron files) append +// cultural flavor at assembly time. Do not encode cultural attitudes in action text. +// +// Roles: habitat_farmer, systems_maintainer, supply_coordinator, watch_officer +// Social site types: commons, maintenance_bay, observation_bay + +( + id: "rural_orbital", + subtype: None, + label: "Rural Orbital Zone", + description: "Small-population orbital habitat. Agriculture, basic production, or extraction in microgravity or low-grav. Isolation defines the social and technical reality — resupply windows, system redundancy, and tight crew interdependence.", + + // Default economic/density profile. Location specs override. + economic_level: 3, + population_density: 1, + + roles: [ + ( + id: "habitat_farmer", + label: "Habitat Farmer", + skill_focus: ["technical", "observation"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "tends a hydroponic tray, trimming overgrowth that would shade the lower row", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "pinches a root sample from a grow column and examines it under a hand lens", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "adjusts the nutrient flow on a grow rack using a small dial, watches the drip rate", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "harvests a tray by pulling the whole root mat and laying it flat on the work surface", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "marks a tray's progress on a grow chart tacked to the bulkhead", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "handles cargo nets and bungee straps in micro-grav without thinking about it", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "reads the light cycle panel and adjusts a single row's schedule by twenty minutes", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "pushes off gently from a rack to cross to the next section", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "reroutes a drip line around a blocked nozzle without stopping the flow", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "reports a nutrient deficiency sign to the systems tech verbally before logging it", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "bags a harvest batch and seals it with the date before transferring it to cold storage", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "scrubs a grow surface between crop cycles, working the same corner three times", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "checks a contamination flag on a tray and quarantines the section without drama", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "updates the station's food-days-remaining counter on the commons board", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "defers a grow cycle change to the station commander before implementing it", context: OnShift, modifier_hint: Some("authority_response") ), + // Social + ( action: "pulls herself through the commons hatch and catches the grip rail on the other side", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "anchors at the commons table and shares a portion of fresh produce — a small luxury", context: Social, modifier_hint: Some("social_signal") ), + ( action: "trades shift observations with whoever is off-rotation at the same time", context: Social, modifier_hint: Some("social_signal") ), + ( action: "sits in the observation bay with one hand on the rail and says nothing for a while", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "listens to a crewmate's problem without offering solutions", context: Social, modifier_hint: Some("offduty_posture") ), + ], + ), + ( + id: "systems_maintainer", + label: "Habitat Systems Maintainer", + skill_focus: ["technical"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "crawls through a maintenance tunnel with a light clipped to her collar", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "checks the air recycler's CO2 scrubber level and notes the hours remaining", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "torques a fitting inside a cramped access panel, working by feel in the final degrees", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "runs a full power cycle diagnostic from the maintenance terminal", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "listens to a pump bearing with an ear against the pipe insulation", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "reads a system alert before it clears itself from the board", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "replaces a worn O-ring from a spare parts bin labeled in her own hand", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "updates the parts inventory after every repair, no exceptions", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "escalates a structural stress reading to the watch officer without delay", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "patches a micro-leak with tape and schedules the weld for next cycle", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "works in zero-grav by anchoring a boot under a cable run and freeing both hands", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "closes a maintenance log entry with a time stamp and a parts count", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "tests a repaired circuit by cycling power three times in a row", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "briefs the habitat farmer on a water pressure change before she starts her next cycle", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "labels every part removed from a panel with tape before setting it aside", context: OnShift, modifier_hint: Some("task_completion") ), + // Social + ( action: "anchors at the commons table with a drink and a personal datapad", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "explains a system risk to a crewmate in plain terms over a meal", context: Social, modifier_hint: Some("social_signal") ), + ( action: "laughs at something in the commons and then goes quiet with it", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "passes the last portion of something without measuring what she's keeping", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ( + id: "supply_coordinator", + label: "Supply Coordinator", + skill_focus: ["persuasion", "observation"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "checks the resupply window schedule against current inventory and notes the gap", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "files a priority request to the transit authority for the next inbound run", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "inventories incoming cargo by hand against the manifest before signing off", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "negotiates a substitute part with a passing trader via comms, one item at a time", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "tracks three supply windows on a wall board with different-colored markers", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "marks a critical supply as below-threshold on the station status board", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "reviews the previous coordinator's notes and adds nothing that isn't necessary", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "secures incoming cargo against the next docking maneuver before logging it as received", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "routes a delivery conflict up to the watch officer the same day it's identified", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "responds to a supplier query within one message and keeps it short", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "maintains the parts-criticality list without being asked to update it", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "brief the crew on supply status at the commons table, no longer than it needs to be", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "scans incoming cargo for label discrepancies before the bay is cleared", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "cross-references two different supply databases before ordering a part that is available from one", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "puts a problem on the watch officer's list before going off-rotation", context: OnShift, modifier_hint: Some("authority_response") ), + // Social + ( action: "drifts through the commons at end-of-shift without stopping anywhere immediately", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "mentions a supply constraint at the commons table and then drops the subject", context: Social, modifier_hint: Some("social_signal") ), + ( action: "passes the ration pack to the person nearest before taking one for herself", context: Social, modifier_hint: Some("social_signal") ), + ( action: "sits in the observation bay and watches the approach lane for the next inbound window", context: Social, modifier_hint: Some("environmental_scan") ), + ], + ), + ( + id: "watch_officer", + label: "Station Watch Officer", + skill_focus: ["observation", "combat"], + combat_eligible: true, + behavior_primitives: [ + // OnShift + ( action: "runs a watch checklist from the bridge terminal, top to bottom, every shift", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "monitors the approach lane display and notes any transponder anomaly in the log", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "checks the airlock seal integrity readout before the start of each watch", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "acknowledges a crew report with a brief written reply rather than a verbal one", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "runs a fire suppression test and logs the response time to the hundredth of a second", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "keeps the crew status board current through the whole watch, no gaps", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "stands at the observation port and scans the docking apron between comms checks", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "deescalates a crew dispute quickly and logs the resolution without editorializing", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "runs an emergency drill without announcing it and notes who responds correctly", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "hands the watch to the next officer with a complete verbal brief, no shortcuts", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "acknowledges a transit authority hail and responds within the reply window", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "walks the main corridor once per watch cycle, makes no comment unless there is one to make", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "reviews the last forty-eight hours of log entries before authorizing a decision", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "keeps a problem to herself until she can bring it with a proposed solution", context: OnShift, modifier_hint: Some("task_completion") ), + // Social + ( action: "arrives at the commons at the end of watch and sits without rank for a while", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "contributes to a commons conversation without directing it", context: Social, modifier_hint: Some("social_signal") ), + ( action: "passes a drink to whoever is sitting closest without turning it into anything", context: Social, modifier_hint: Some("social_signal") ), + ( action: "sits in the observation bay alone and watches the dark between tasks", context: Social, modifier_hint: Some("offduty_posture") ), + ], + ), + ], + + // Valid social site types for this zone type. + // Location specs declare which appear, with their own label, min_npcs, max_npcs. + social_site_types: [ + ( site_type: "commons", eligible_roles: ["habitat_farmer", "systems_maintainer", "supply_coordinator", "watch_officer"] ), + ( site_type: "maintenance_bay", eligible_roles: ["systems_maintainer", "supply_coordinator"] ), + ( site_type: "observation_bay", eligible_roles: ["watch_officer", "habitat_farmer", "supply_coordinator"] ), + ], +) diff --git a/server/content/global/zone-types/rural_pastoral.ron b/server/content/global/zone-types/rural_pastoral.ron new file mode 100644 index 000000000..bb87c6e17 --- /dev/null +++ b/server/content/global/zone-types/rural_pastoral.ron @@ -0,0 +1,155 @@ +// Rural Pastoral Zone-Type Template +// +// Schema: server/src/npc/blueprint.rs :: ZoneTypeTemplate +// Ticket: #662 (copy team) +// Validate: tooling/validate-ron content/global/zone-types/rural_pastoral.ron zone_type +// +// Sources: D-142 (zone-type template architecture). +// +// Zone character: animal husbandry, open grazing land, seasonal movement. +// Work defined by the animals' schedules, not clocks. Smells, sounds, and weather +// intrude constantly. Community is small and faces are known. +// +// Primitives are CULTURE-NEUTRAL. Culture modifiers (culture-*.ron files) append +// cultural flavor at assembly time. Do not encode cultural attitudes in action text. +// +// Roles: herder, veterinarian, trader, warden +// Social site types: tavern, stock_pen, supply_post + +( + id: "rural_pastoral", + subtype: None, + label: "Rural Pastoral Zone", + description: "Animal husbandry, grazing land, seasonal movement cycles. Work follows the animals' rhythms, not clocks. Community is tight, faces known. Weather and biology dictate the schedule.", + + // Default economic/density profile. Location specs override. + economic_level: 2, + population_density: 2, + + roles: [ + ( + id: "herder", + label: "Herder", + skill_focus: ["technical", "observation"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "moves to the flank of the herd and eases a stray back toward the group", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "crouches beside a lame animal and runs a hand down the leg", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "counts heads from the rise of a low hill before moving on", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "leans on a gate post and watches the herd settle before closing it", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "pitches loose fodder from a cart into a feeding trough", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "patches a break in a wire fence with two twists and moves on without ceremony", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "reads the sky and turns the herd early ahead of oncoming weather", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "pulls a burr cluster from a hide with both thumbs", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "calls to another herder across the paddock in a carrying voice", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "marks the day's count in a pocket log with a stub of stylus", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "walks the perimeter of the night pen before sundown, checking the latches", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "stands motionless at the pen's edge while a nervous animal settles", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "waits for the herd warden to pass before opening the far gate", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "drags a feed sack the last few meters rather than lift it again", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "fills a trough from a hand pump, watching the level, stopping before overflow", context: OnShift, modifier_hint: Some("task_completion") ), + // Social / off-duty + ( action: "takes a seat at the tavern and lets the smell of the day come off slowly", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "describes the weight of a sick animal to the vet across a tavern table", context: Social, modifier_hint: Some("social_signal") ), + ( action: "buys a round for the table and signals for the same again before it arrives", context: Social, modifier_hint: Some("social_signal") ), + ( action: "sits with both forearms on the table and talks about the season without hurrying the story", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "accepts a drink from a neighbor and nods once, says nothing", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ( + id: "veterinarian", + label: "Pastoral Veterinarian", + skill_focus: ["technical"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "presses a stethoscope to an animal's flank and holds still", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "draws a measured dose from a small vial and sets the syringe aside", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "washes hands at a portable basin, back turned to the pen", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "kneels in the pen without minding the ground", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "reads a treatment log back to the beginning before adding an entry", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "holds an eyelid back with two fingers and examines the eye in natural light", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "explains the prognosis to the herder briefly and does not soften the numbers", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "unpacks her kit in order on a clean cloth before starting an exam", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "repackages supplies she didn't use and seals the kit before leaving the pen", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "marks a recovery pen marker and notes the date on it with a marker stylus", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "takes a second look at a recovering animal before moving to the next", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "files the week's treatment records before leaving for the evening", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "defers a quarantine call to the district authority and documents the referral", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "steps back when the herder needs to reposition the animal, then steps in again", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "disinfects her kit on a portable surface outside the pen, working methodically", context: OnShift, modifier_hint: Some("work_pace") ), + // Social + ( action: "sits at the supply post counter with a drink and a datapad open beside it", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "answers a question about a sick animal from across the tavern without making it a consultation", context: Social, modifier_hint: Some("social_signal") ), + ( action: "orders a meal and eats it in full before opening the work datapad", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "talks to a neighbor about something other than animals for a few minutes", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ( + id: "trader", + label: "Pastoral Trader", + skill_focus: ["persuasion", "observation"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "sets a sample of feed supplement on the supply post counter and steps back", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "weighs livestock on a portable scale and records the number without comment", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "negotiates the day's prices by walking the pen first and saying nothing for a while", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "pulls a ledger and traces a delivery history with one finger", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "packs unsold stock methodically at the end of market", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "exchanges a few words with a regular buyer before any transaction begins", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "quotes a price flat and waits without filling the silence", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "loads a transport crate and labels it on the outside with tape and a marker", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "checks market weights against her own scale before accepting the official figure", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "gives the warden a required copy of the manifest without being asked for it", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "holds a sample up to the light and says nothing while the buyer looks", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "notes the going rate on the back of a receipt and folds it into her bag", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "stacks empty transport crates at the pen rail and marks them for collection", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "walks the long way around the market to see what prices are being posted", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "counts a payment twice before pocketing it without making a scene of the count", context: OnShift, modifier_hint: Some("task_completion") ), + // Social + ( action: "nurses a drink at the supply post and watches who comes through the door", context: Social, modifier_hint: Some("environmental_scan") ), + ( action: "listens to a neighbor's complaint without offering a fix", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "brings the last round of the evening without announcing it", context: Social, modifier_hint: Some("social_signal") ), + ( action: "holds a conversation at the tavern that sounds casual but isn't entirely", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ( + id: "warden", + label: "Herd Warden", + skill_focus: ["observation", "combat"], + combat_eligible: true, + behavior_primitives: [ + // OnShift + ( action: "patrols the outer grazing boundary at an unhurried walk", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "checks a fence sensor unit and logs the reading on a handheld", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "scans the far side of the paddock from a low rise before descending", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "waves a passing vehicle through with two fingers and watches it until it clears the gate", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "files an incident note in the shift log without expounding on it", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "stops at the perimeter gate and checks the lock before the patrol continues", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "stands at the paddock edge in the dusk, just watching", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "clips the charge indicator on a perimeter deterrent unit and reads the number", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "acknowledges a district security check by handing over the log and standing aside", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "calls across to a herder to move the herd away from the outer wire", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "stands in the same position during an official inspection as during an ordinary shift", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "walks out to where a noise came from and finds nothing, walks back", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "takes a meal at the pen gate instead of returning to the shelter", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "marks the end of a patrol circuit on a printed route card", context: OnShift, modifier_hint: Some("task_completion") ), + // Social + ( action: "arrives at the tavern still in work clothes and stays that way all evening", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "buys one drink and makes it last a long time", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "contributes to a table conversation without leading it", context: Social, modifier_hint: Some("social_signal") ), + ( action: "nods at a neighboring warden from across the tavern, both knowing what the nod means", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ], + + // Valid social site types for this zone type. + // Location specs declare which appear, with their own label, min_npcs, max_npcs. + social_site_types: [ + ( site_type: "tavern", eligible_roles: ["herder", "veterinarian", "trader", "warden"] ), + ( site_type: "stock_pen", eligible_roles: ["herder", "veterinarian", "warden"] ), + ( site_type: "supply_post", eligible_roles: ["trader", "veterinarian", "herder"] ), + ], +) diff --git a/server/content/global/zone-types/security_checkpoint.ron b/server/content/global/zone-types/security_checkpoint.ron new file mode 100644 index 000000000..16e77f3a8 --- /dev/null +++ b/server/content/global/zone-types/security_checkpoint.ron @@ -0,0 +1,152 @@ +// Security Checkpoint Zone-Type Template +// +// Schema: server/src/npc/blueprint.rs :: ZoneTypeTemplate +// Ticket: #662 (copy team) +// Validate: tooling/validate-ron content/global/zone-types/security_checkpoint.ron zone_type +// +// Sources: D-142 (zone-type template architecture). +// +// Zone character: scanner arrays, narrow gate lanes, credential readers, inspection bays. +// Power concentrated in small space. Movement controlled by the officer's decision. +// The queue shapes the social dynamics — everyone is waiting for someone else's authority. +// +// Primitives are CULTURE-NEUTRAL. Culture modifiers (culture-*.ron files) append +// cultural flavor at assembly time. Do not encode cultural attitudes in action text. +// +// Roles: officer, inspector, supervisor, technician +// Social site types: checkpoint_station, break_room, inspection_bay + +( + id: "security_checkpoint", + subtype: None, + label: "Security Checkpoint", + description: "Scanner arrays, gate lanes, credential readers, inspection bays. Power concentrated in small space. Everything moves at the speed of the officer's decision. The queue shapes the social dynamics.", + + // Default economic/density profile. Location specs override. + economic_level: 5, + population_density: 5, + + roles: [ + ( + id: "officer", + label: "Checkpoint Officer", + skill_focus: ["observation", "combat"], + combat_eligible: true, + behavior_primitives: [ + // OnShift + ( action: "reads an ID credential front and back before returning it through the slot", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "holds up a hand to stop the queue while a passage detail resolves at the primary gate", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "scans the queue from the checkpoint booth without turning her head more than necessary", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "waves a regular through on recognition and scans the ID anyway for the log", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "asks a traveler to step aside and waits for them to comply before saying anything else", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "runs an ID number against the watch list before giving a verbal response", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "positions herself where the queue entrance and the inspection bay are both visible", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "logs each processed credential sequentially in the gate record without skipping", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "keeps the gate closed an extra moment while checking something on the booth terminal", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "directs a traveler to empty bag pockets onto the tray with a single pointing gesture", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "waves the cargo scanner over a sealed case and waits for the read to complete before clearing it", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "escalates a flagged ID to the supervisor before communicating the result to the traveler", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "conducts a shift handover at the gate rather than leaving the post before the relief is in position", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "watches the space behind a traveler during their credential check", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "responds to a complaint at the gate in a flat even tone until the queue clears", context: OnShift, modifier_hint: Some("authority_response") ), + // OffDuty + ( action: "takes break facing the checkpoint entry, drink in hand, still reading faces", context: OffDuty, modifier_hint: Some("environmental_scan") ), + ( action: "sits in the break room with the shift log closed in front of her, not eating", context: OffDuty, modifier_hint: Some("offduty_posture") ), + ( action: "passes the incoming officer a two-sentence verbal handover and goes", context: Social, modifier_hint: Some("social_signal") ), + ( action: "drinks coffee standing in the break room corridor rather than taking a chair", context: OffDuty, modifier_hint: Some("offduty_posture") ), + ], + ), + ( + id: "inspector", + label: "Cargo and Goods Inspector", + skill_focus: ["observation", "technical"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "opens a sealed cargo case along the inspection bench and reads the packing list before touching the contents", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "probes a container's layer depth with a portable scanner and reads the display at arm's length", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "photographs the inspection bench layout before and after a goods check", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "weighs a parcel against the declared manifest weight and notes the result without reacting", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "asks a goods carrier to confirm the origin declaration a second time", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "presses a gloved hand along the interior walls of an empty case before clearing it", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "scans a goods certification document against the database before stamping the copy", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "holds a small item to the inspection bay light and rotates it once before logging it", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "rechecks a scan result from the booth against the portable unit before making a disposition decision", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "takes a sample from a bulk cargo lot by protocol count rather than by visual judgment", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "flags a discrepancy between the declared and measured quantity for supervisor review before the carrier leaves", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "reassembles a checked cargo case in the same configuration it arrived and returns it to the carrier", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "notes a non-compliant label format in the record without holding the cargo on that basis alone", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "stands at the inspection bench with the carrier on the opposite side until the check is complete", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "completes the clearance record before returning goods to the carrier's control", context: OnShift, modifier_hint: Some("task_completion") ), + // Social + ( action: "sits at the back of the break room with a goods reference list on a datapad beside her coffee", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "tells a short story about a strange goods declaration over break and doesn't explain the outcome", context: Social, modifier_hint: Some("social_signal") ), + ( action: "eats in the inspection bay during a quiet period, sitting on the stool away from the bench", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "answers a colleague's procedural question by citing the reference code and closing the subject", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ( + id: "supervisor", + label: "Checkpoint Supervisor", + skill_focus: ["observation", "persuasion"], + combat_eligible: true, + behavior_primitives: [ + // OnShift + ( action: "walks the checkpoint gate line at the start of a shift and adjusts one queue barrier without explaining why", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "reviews the overnight gate log before the morning briefing", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "handles a flagged credential decision that the gate officer escalated, reading the record before speaking", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "stands at the supervisory desk where the full lane view is available, not in the lane itself", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "receives an external authority's inspection request through formal channels and processes it from the desk", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "holds a brief verbal debrief with the outgoing supervisor at shift change, two minutes maximum", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "approves an exception processing request in writing before the officer communicates the decision at the gate", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "reviews a backlog alert on the lane capacity board and redistributes officers to two gates", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "takes the cargo escalation call herself and reaches the inspection bay before the inspector has started", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "logs a personnel performance note after a shift incident, filed before the shift ends", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "answers an external inquiry about checkpoint policy with the rule citation and nothing further", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "walks the break room once per shift to confirm staffing is returning on schedule", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "reads the queue length board from her desk at each hourly mark and notes the number", context: OnShift, modifier_hint: Some("task_completion") ), + // OffDuty + ( action: "takes break at the supervisory desk with the gate lane visible through the side window", context: OffDuty, modifier_hint: Some("offduty_posture") ), + ( action: "sits at the break room table nearest the door and finishes in ten minutes", context: OffDuty, modifier_hint: Some("offduty_posture") ), + ( action: "briefs the incoming supervisor standing at the corridor junction rather than at a desk", context: Social, modifier_hint: Some("social_signal") ), + ( action: "answers a direct question from a colleague with a short answer and no additional context", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ( + id: "technician", + label: "Checkpoint Systems Technician", + skill_focus: ["technical"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "runs the daily scanner calibration on each lane before the gate opens", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "replaces a scanner head module and runs a test pass before returning the lane to service", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "checks the gate log for scanner error codes before starting the morning diagnostic cycle", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "routes a fault around a degraded subsystem by switching to the backup unit and noting the switch in the maintenance log", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "traces a wiring fault to its source by working backward from the reported symptom", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "updates the scanner firmware on a lane that is temporarily closed for routine service", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "confirms with the gate officer before taking a lane out of service for maintenance", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "labels every replaced component with a date tag before installing it", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "documents the fault resolution before closing the maintenance ticket", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "tests the gate motor cycle speed against the specification before signing off the repair", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "informs the supervisor when a repair will take longer than one lane-service window", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "sweeps the scanner housing exterior with a dry cloth after every internal access", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "reads the fault history on a lane terminal before opening the housing panel", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "returns a lane to full service and confirms throughput with the gate officer before leaving the post", context: OnShift, modifier_hint: Some("task_completion") ), + // Social + ( action: "eats at the break room counter rather than a table, reading a technical manual on a personal device", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "explains a repair problem to a gate officer using the visible scanner housing as a prop", context: Social, modifier_hint: Some("social_signal") ), + ( action: "sits in the break room with a parts tray on the table and picks at a small repair", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "trades short technical observations with the incoming technician at shift change", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ], + + // Valid social site types for this zone type. + // Location specs declare which appear, with their own label, min_npcs, max_npcs. + social_site_types: [ + ( site_type: "checkpoint_station", eligible_roles: ["officer", "supervisor", "technician"] ), + ( site_type: "break_room", eligible_roles: ["officer", "inspector", "supervisor", "technician"] ), + ( site_type: "inspection_bay", eligible_roles: ["inspector", "officer", "supervisor"] ), + ], +) diff --git a/server/content/global/zone-types/wilderness_frontier.ron b/server/content/global/zone-types/wilderness_frontier.ron new file mode 100644 index 000000000..2220ea0d4 --- /dev/null +++ b/server/content/global/zone-types/wilderness_frontier.ron @@ -0,0 +1,160 @@ +// Wilderness Frontier Zone-Type Template +// +// Schema: server/src/npc/blueprint.rs :: ZoneTypeTemplate +// Ticket: #662 (copy team) +// Validate: tooling/validate-ron content/global/zone-types/wilderness_frontier.ron zone_type +// +// Sources: D-142 (zone-type template architecture). +// +// Zone character: remote, low-infrastructure, weather-exposed terrain. +// Self-reliance is the baseline assumption. Hierarchy is loose — competence +// commands more respect than rank. Long periods of solitary work punctuated +// by base-camp resupply and brief human contact. +// +// Primitives are CULTURE-NEUTRAL. Culture modifiers (culture-*.ron files) append +// cultural flavor at assembly time. Do not encode cultural attitudes in action text. +// +// Roles: ranger, prospector, guide, medic +// Social site types: field_camp, supply_depot, outpost_shelter + +( + id: "wilderness_frontier", + subtype: None, + label: "Wilderness Frontier Zone", + description: "Remote, low-infrastructure terrain. Self-reliance is the baseline assumption. Hierarchy is loose — competence commands more respect than rank. Long solitary work periods punctuated by base-camp resupply.", + + // Default economic/density profile. Location specs override. + economic_level: 2, + population_density: 1, + + roles: [ + ( + id: "ranger", + label: "Frontier Ranger", + skill_focus: ["observation", "combat"], + combat_eligible: true, + behavior_primitives: [ + // OnShift + ( action: "reads a disturbance in the ground cover by crouching and running a hand across the surface", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "marks a waypoint on a terrain map and notes the timestamp beside it", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "scans the horizon from an elevated point without moving for a long moment", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "checks a sensor trail marker and notes which way the signal points", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "reads a weather front by watching the cloud line on the far ridge", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "follows a track through broken ground at a careful, unhurried pace", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "patches a perimeter alert wire that has been disturbed and resets the sensor", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "logs a sighting into a field record while the detail is still fresh", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "shelters behind a rock face out of the wind to read a handheld positioning unit", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "checks an area boundary marker and photographs it for the patrol record", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "assesses a debris scatter for what made it and how recently", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "crosses open ground in a long diagonal, keeping low ground on the downwind side", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "identifies an access track that wasn't on the last map revision and marks it", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "radios in a position report at the scheduled check-in window", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "reviews an unauthorized entry report with a sector supervisor and files the notation", context: OnShift, modifier_hint: Some("authority_response") ), + // Social + ( action: "sits near the camp fire with a drink held in both hands, elbows on knees", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "talks through a patrol observation with the camp medic without making it a debrief", context: Social, modifier_hint: Some("social_signal") ), + ( action: "eats at the camp table with a map folded to the section she worked today", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "gives a brief weather report to the camp without being asked", context: Social, modifier_hint: Some("social_signal") ), + ( action: "passes a personal item to a colleague who left it at the field site", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ( + id: "prospector", + label: "Frontier Prospector", + skill_focus: ["technical", "observation"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "drills a core sample from a rock face and ejects it into a labeled tube", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "reads a field spectrometer display and records the result in a field notebook", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "climbs to a vantage point to read the surface geology across a wider section", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "marks a grid survey pin with a ribbon and plots its position on a field map", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "compares two rock samples side by side and selects one for the collection bag", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "traces a mineral seam along a cliff face with one finger before breaking a sample from it", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "washes a pan of stream sediment in a slow circular motion", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "checks a drill bit for wear and decides whether it will last the afternoon", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "repacks a sampling kit before moving to the next grid square", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "studies a geological layer change in a cut bank and sketches the profile", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "runs a portable assay test on a sample and waits for the readout", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "carries a rock hammer and chisel to a promising outcrop at the survey boundary", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "seals a sample bag, writes the grid code on it, and places it in the numbered field case", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "stops at a stream crossing and reads the alluvial deposit before deciding to pan it", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "compares today's spectrometer results to last month's baseline and marks the variance", context: OnShift, modifier_hint: Some("task_completion") ), + // Social + ( action: "spreads a sample map on the depot table and talks through the day's grid with a colleague", context: Social, modifier_hint: Some("social_signal") ), + ( action: "sits at the camp perimeter at end of day with a drink and looks at the terrain", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "shows a sample to whoever is nearby, not explaining what it is yet", context: Social, modifier_hint: Some("social_signal") ), + ( action: "asks the ranger about access to the next grid sector before committing to it", context: Social, modifier_hint: Some("social_signal") ), + ( action: "eats the camp meal in full before bringing up anything about the survey", context: Social, modifier_hint: Some("offduty_posture") ), + ], + ), + ( + id: "guide", + label: "Frontier Guide", + skill_focus: ["observation", "persuasion"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "sets a camp site by reading the ground for drainage before pitching shelter", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "plots a route on a terrain map with two alternates and marks the hazards on each", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "ties a cargo load on a pack frame so the weight sits above the hips", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "paces the group to the top of a ridge and stops there for three minutes before descending", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "reads the sky and adjusts the day's route to reach shelter before the weather breaks", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "briefs a group on a route change without framing it as a problem", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "finds water by reading the vegetation change in a dry wash", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "sets a safe crossing point at a stream by checking the bank stability upstream", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "checks the condition of a group member's feet at a rest stop without being asked", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "marks the camp location on a group map and notes two landmarks for re-finding it", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "answers a client's question about the terrain with a direct factual answer", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "tests the load weight on a supply frame by lifting it once and adjusting the balance", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "watches the last group member through a tricky section before moving on", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "calls a rest at a defensible point rather than the scenic one", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "debrief the group on tomorrow's route at the evening camp without overpromising the conditions", context: OnShift, modifier_hint: Some("authority_response") ), + // Social + ( action: "tends the camp fire at the end of the day and keeps it at a useful size", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "answers questions around the fire with enough detail that the questioner is satisfied", context: Social, modifier_hint: Some("social_signal") ), + ( action: "sits with the group at camp in a place where she can see the approaches without making it obvious", context: Social, modifier_hint: Some("environmental_scan") ), + ( action: "handles camp logistics in the background so the group doesn't notice the logistics", context: Social, modifier_hint: Some("work_pace") ), + ( action: "acknowledges a group member's concern at the camp table and incorporates it into tomorrow's plan", context: Social, modifier_hint: Some("social_signal") ), + ], + ), + ( + id: "medic", + label: "Field Medic", + skill_focus: ["technical", "observation"], + combat_eligible: false, + behavior_primitives: [ + // OnShift + ( action: "checks each group member's water intake at the morning assessment before the day begins", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "assesses a blister by pressing around the edge before deciding whether to drain it", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "cleans a wound in two stages and waits between applications", context: OnShift, modifier_hint: Some("work_pace") ), + ( action: "inventories the field kit after each day and notes what was used and what needs replenishment", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "asks a patient to describe the pain in terms of when it started, not how bad it is", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "takes a pulse and respiratory rate before touching anything else", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "reads altitude and temperature before advising the guide on the day's pace", context: OnShift, modifier_hint: Some("environmental_scan") ), + ( action: "applies a splint by checking the limb's position before securing the first wrap", context: OnShift, modifier_hint: Some("physical_manner") ), + ( action: "decides to hold a patient at camp for another day without framing it as a problem", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "checks a treated wound at the end of the day without waking the patient", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "explains what she is about to do before doing it", context: OnShift, modifier_hint: Some("social_signal") ), + ( action: "tests a patient's coordination with a simple field check before clearing them for the next leg", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "packs the medical kit in extraction order, most urgent supplies at the top", context: OnShift, modifier_hint: Some("task_completion") ), + ( action: "radios a base contact about a patient's condition and waits for a response before moving", context: OnShift, modifier_hint: Some("authority_response") ), + ( action: "reads the available water quality at a new camp site before approving its use", context: OnShift, modifier_hint: Some("environmental_scan") ), + // Social + ( action: "sits at the camp fire but watches the group without appearing to", context: Social, modifier_hint: Some("environmental_scan") ), + ( action: "shares a meal without talking about anyone's condition", context: Social, modifier_hint: Some("offduty_posture") ), + ( action: "answers a worry from a group member at the camp table in a voice that doesn't carry to the rest", context: Social, modifier_hint: Some("social_signal") ), + ( action: "gives direct advice when asked and doesn't preface it with qualifications", context: Social, modifier_hint: Some("social_signal") ), + ( action: "produces a small item from a kit that someone needed but didn't ask for", context: Social, modifier_hint: Some("offduty_posture") ), + ], + ), + ], + + // Valid social site types for this zone type. + // Location specs declare which appear, with their own label, min_npcs, max_npcs. + social_site_types: [ + ( site_type: "field_camp", eligible_roles: ["ranger", "prospector", "guide", "medic"] ), + ( site_type: "supply_depot", eligible_roles: ["guide", "medic", "prospector"] ), + ( site_type: "outpost_shelter", eligible_roles: ["ranger", "guide", "medic"] ), + ], +) diff --git a/server/content/npc-conversations/overheard.ron b/server/content/npc-conversations/overheard.ron new file mode 100644 index 000000000..16242877c --- /dev/null +++ b/server/content/npc-conversations/overheard.ron @@ -0,0 +1,295 @@ +// 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."), + ), + + ], +) diff --git a/server/content/npc-conversations/overheard.yaml b/server/content/npc-conversations/overheard.yaml.deprecated similarity index 96% rename from server/content/npc-conversations/overheard.yaml rename to server/content/npc-conversations/overheard.yaml.deprecated index 8ecf22fc6..4de669bbd 100644 --- a/server/content/npc-conversations/overheard.yaml +++ b/server/content/npc-conversations/overheard.yaml.deprecated @@ -1,3 +1,26 @@ +# DEPRECATED — archived by ticket #664 (copy team, Sprint 27) +# +# This file is NOT served at runtime. It is preserved for authoring reference only. +# +# WHY DEPRECATED: Every entry in this file references named NPCs from the Sova Transit +# District vertical slice (Kael Davan, Sera Venn, Naia Tamm, Voss, Torek, Renn, Maret, +# Lera, Nils, Drin, Olin, etc.). Per D-122 (all NPCs generated, no hand-authored +# characters), all named character references in this file are invalid against the +# generated NPC population. The drama module system (ticket #158) that these entries +# were authored for was superseded before implementation. +# +# WHAT REPLACED IT: content/npc-conversations/overheard.ron +# Generator-compatible RON pool. Parameterized by role pair and zone type. +# No named NPC references. Culture-neutral text accepting culture modifier at assembly. +# +# WHAT IS STRUCTURALLY WORTH PRESERVING (applied in overheard.ron): +# - Overheard conversations as ambient information layer (D-078) +# - Register taxonomy: social / work / gossip +# - Occlusion-resilient authoring rules (D-078): front-load key info, short +# declarative sentences, no pronoun-first openers, each turn self-contained +# - knowledge_payload pattern for investigative inference +# +# Original file header below: # NPC-to-NPC Overheard Dialogue Pool # Ticket: #536 | Author: Mellanie | Sprint: 14 # Decision refs: D-078, D-018, D-071, D-035 diff --git a/tooling/validate-ron b/tooling/validate-ron index 0f309f3d2..fa00ea257 100755 --- a/tooling/validate-ron +++ b/tooling/validate-ron @@ -3,22 +3,124 @@ # # Usage: # tooling/validate-ron +# tooling/validate-ron --check-name-collisions # # Examples: # tooling/validate-ron server/content/global/zone-types/rural_agricultural.ron zone_type # tooling/validate-ron server/content/global/culture-van-maanens-star.example.ron culture # tooling/validate-ron server/content/global/zone-identity-spec.example.ron zone +# tooling/validate-ron --check-name-collisions server/content/global/ +# +# --check-name-collisions: +# Scans all culture-*.ron files in the given directory. Extracts naming.given_names +# and naming.family_names pools from each file. Reports any name that appears in more +# than one culture's pool. Exits 1 on collision; exits 0 if no collisions found. +# Output is machine-readable (one collision per line). set -euo pipefail +# --- Name collision mode -------------------------------------------------- +if [ "${1:-}" = "--check-name-collisions" ]; then + if [ $# -lt 2 ]; then + echo "Usage: tooling/validate-ron --check-name-collisions " + exit 1 + fi + SCAN_DIR="$2" + if [ ! -d "$SCAN_DIR" ]; then + echo "Error: directory not found: $SCAN_DIR" + exit 1 + fi + python3 - "$SCAN_DIR" <<'PYEOF' +import sys +import re +import os +import glob + +scan_dir = sys.argv[1] +pattern = os.path.join(scan_dir, "culture-*.ron") +files = sorted(glob.glob(pattern)) + +if not files: + print(f"No culture-*.ron files found in: {scan_dir}") + sys.exit(0) + +def extract_names_from_block(text, field): + """Extract quoted string list from a named RON array field.""" + # Match: field: [\n "name", "name", ...\n] + # Handles multi-line arrays with comments inside. + pat = re.compile( + r'\b' + re.escape(field) + r'\s*:\s*\[([^\]]*)\]', + re.DOTALL + ) + m = pat.search(text) + if not m: + return [] + block = m.group(1) + # Strip line comments before extracting quoted strings + block = re.sub(r'//[^\n]*', '', block) + return re.findall(r'"([^"]+)"', block) + +# culture_id -> set of names (given + family, tracked separately for reporting) +given_by_culture = {} +family_by_culture = {} + +for fpath in files: + with open(fpath, 'r', encoding='utf-8') as f: + text = f.read() + # Extract culture id from the id: "..." field + id_m = re.search(r'\bid\s*:\s*"([^"]+)"', text) + culture_id = id_m.group(1) if id_m else os.path.basename(fpath) + + given_by_culture[culture_id] = set(extract_names_from_block(text, 'given_names')) + family_by_culture[culture_id] = set(extract_names_from_block(text, 'family_names')) + +cultures = list(given_by_culture.keys()) +collisions_found = False + +# Check given_names collisions +all_given_names = {} # name -> list of cultures +for culture, names in given_by_culture.items(): + for name in names: + all_given_names.setdefault(name, []).append(culture) + +for name, cultures_with_name in sorted(all_given_names.items()): + if len(cultures_with_name) > 1: + collisions_found = True + print(f"COLLISION given_names: \"{name}\" in {', '.join(sorted(cultures_with_name))}") + +# Check family_names collisions +all_family_names = {} # name -> list of cultures +for culture, names in family_by_culture.items(): + for name in names: + all_family_names.setdefault(name, []).append(culture) + +for name, cultures_with_name in sorted(all_family_names.items()): + if len(cultures_with_name) > 1: + collisions_found = True + print(f"COLLISION family_names: \"{name}\" in {', '.join(sorted(cultures_with_name))}") + +if not collisions_found: + print(f"OK: no name collisions across {len(cultures)} culture(s): {', '.join(sorted(cultures))}") + sys.exit(0) +else: + sys.exit(1) +PYEOF + exit $? +fi +# --- End name collision mode ---------------------------------------------- + if [ $# -lt 2 ]; then echo "Usage: tooling/validate-ron " + echo " tooling/validate-ron --check-name-collisions " echo "" echo "Validates a RON file against the Rust struct schema." echo "Schema types:" echo " zone_type — ZoneTypeTemplate (D-142 zone-type template)" echo " zone — ZoneSpec (legacy zone identity spec)" echo " culture — CultureProfile (culture profile)" + echo "" + echo "Name collision check:" + echo " --check-name-collisions Scan culture-*.ron files for shared name pool entries" exit 1 fi