diff --git a/content/global/culture-krenn.ron b/content/global/culture-krenn.ron new file mode 100644 index 000000000..b6ba87c42 --- /dev/null +++ b/content/global/culture-krenn.ron @@ -0,0 +1,103 @@ +// Krenn Culture Profile +// +// Schema: server/src/npc/blueprint.rs :: CultureProfile +// Ticket: #610 (copy team) +// Validate: tooling/validate-ron content/global/culture-krenn.ron culture +// +// Sources: D-036 (Sova Transit District / Krenn System setting, amended post-workshop), +// D-121 (voice is culture-driven, job as modifier), +// D-128 (culture implicit in starting location). +// +// Krenn: ~180 years settled. Mid-Reach G3V system. Working-class pragmatic. +// Community-oriented, suspicious of distant authority. Competence earns respect. +// Showing up and doing the work matters more than rank or credentials. +// First-name-primary in social contexts — family names are institutional. + +( + id: "krenn", + name: "Krenn System Culture", + description: "Working-class pragmatic culture. ~180 years settled, mid-Reach G3V system. Community-oriented, suspicious of distant authority, values competence and reliability over credentials. Atmosphere: quotidian-with-undertow — comfortable enough to be complacent, tight enough that extra income is tempting.", + + naming: ( + style: "compact, consonant-heavy, first-name-primary in social contexts", + // Pool the generator draws from. More names = more variety across runs. + // Source: D-036 canonical examples + extended set following same phoneme rules. + // Rule: compact (1-2 syllables), consonant clusters welcome, hard endings preferred. + given_names: [ + // D-036 canonical set + "Kael", "Voss", "Lera", "Torek", "Drin", + "Maret", "Naia", "Sera", "Nils", "Pael", + "Tev", "Ren", "Sess", "Renn", "Olin", + "Tav", "Resha", "Harek", "Sabel", "Pell", + // Extended — same phoneme pattern + "Dav", "Tork", "Ness", "Pren", "Vel", + "Orin", "Mael", "Torra", "Sorek", "Sev", + "Bren", "Linn", "Vrek", "Darek", "Pess", + "Nell", "Kren", "Sorel", "Tavek", "Rask", + ], + family_names: [ + // D-036 canonical + extended + "Davan", "Sessik", "Korr", "Tamm", "Venn", + "Lintar", "Darvo", "Kosse", + // Extended + "Pellan", "Sorren", "Tessik", "Morek", "Brav", + "Ossel", "Rennick", "Harven", "Tollek", "Dass", + ], + // Krenn culture is first-name-primary. + // Family names exist but belong to institutional contexts: contracts, registrations, arrest records. + family_name_used_socially: false, + ), + + speech: ( + // Direct. Minimal pleasantries. Gets to the point — not because they're rude, + // but because time is real and everyone's short of it. + register: "direct, minimal pleasantries, gets to the point", + filler_words: [ + "look", + "right", + "yeah", + "so", + "listen", + "well", + ], + greetings: [ + "hey", + "morning", + "shift treating you alright?", + "all good?", + "what's the word?", + "all in one piece?", + ], + farewells: [ + "shift's calling", + "gotta move", + "catch you later", + "take it easy", + "see you around", + "stay out of trouble", + ], + // Krenn oaths are void-adjacent — space is real here, and hostile. + // They don't swear by gods or governments. They swear by what kills you. + exclamations: [ + "void take it", + "stars", + "blood and void", + "void's sake", + "damn all", + "cold vacuum", + ], + ), + + values: ( + description: "Pragmatic, community-oriented, suspicious of authority. Competence earns respect. Showing up and doing the work matters more than rank or credentials. Outsiders are tolerated but watched. Loyalty runs narrow and deep — to your crew, your shift, your street.", + // Traits more common in Krenn culture — generator biases toward these. + // Bold: Krenn people speak their mind. Honest: community trust is load-bearing. + // Curious: 180 years of problem-solving breeds intellectual appetite. + // Social: community-oriented culture; isolation is a warning sign. + favored_traits: [Bold, Honest, Curious, Social], + // Traits less common — generator biases away from these. + // Reclusive: red flag in a community that depends on showing up. + // Deceptive: betrayal of trust is the worst thing you can do here. + disfavored_traits: [Reclusive, Deceptive], + ), +) diff --git a/content/global/industrial-zone-spec.ron b/content/global/industrial-zone-spec.ron new file mode 100644 index 000000000..16a682d6a --- /dev/null +++ b/content/global/industrial-zone-spec.ron @@ -0,0 +1,124 @@ +// Zone Identity Spec — Industrial +// +// Schema: server/src/npc/blueprint.rs :: ZoneSpec +// Ticket: #609 (copy team) +// Validate: tooling/validate-ron content/global/industrial-zone-spec.ron zone +// +// Character: freight handling, manufacturing, maintenance. High throughput. +// Shift rhythms. Functional over comfortable. Nobody lingers — unless they're on break. +// +// Generator contrast target: industrial vs rural (Sprint 25 proof). +// If these produce NPCs that look the same, something is wrong. +// +// Heritage roots (D-104/D-105) overlay these base specs at generation time, +// modifying role weights, social site composition, and behavioral flavoring. + +( + zone_type: "industrial", + label: "Industrial Zone", + description: "Freight handling, manufacturing, and maintenance. High throughput, shift-based work rhythms, functional over comfortable. Faces are known by role and bay number more than name. The work doesn't stop between shifts — people do.", + + // 1-10. Industrial Krenn: steady credit flow, but it all goes somewhere. + economic_level: 7, + // 1-10. Dense. Multiple shifts overlap. Crowds at handover. + population_density: 6, + + roles: [ + ( + id: "dock_worker", + label: "Dock Worker", + // Most common. The zone runs on their backs. + weight: 5, + skill_focus: ["technical"], + combat_eligible: false, + typical_behaviors: [ + "guides a freight container into position with hand signals", + "checks a manifest against a handheld scanner, lips moving", + "waits at the loading bay apron with arms crossed, watching the clock", + "calls bay numbers to a colleague across the noise of the floor", + "hooks a cargo sling and steps clear before signaling the lift", + "stacks empty pallets against a wall with mechanical efficiency", + "wipes sweat from her face with a forearm and keeps moving", + "slumps into a break room chair and stares at nothing for a full minute before reaching for a drink", + ], + ), + ( + id: "technician", + label: "Systems Technician", + // Keeps the infrastructure running. Never enough of them. + weight: 4, + skill_focus: ["technical"], + combat_eligible: false, + typical_behaviors: [ + "runs a diagnostic routine on a floor console, eyes on the readout", + "traces a conduit run along the ceiling with a handheld light", + "swaps a panel module with practiced speed and no wasted motion", + "logs a fault code into a datapad before moving on", + "presses an ear to a vibrating duct and listens", + "argues quietly with a display that isn't giving the right numbers", + "queries a fault log through her insert without touching the terminal, eyes briefly unfocused", + "stretches both arms overhead in the break room doorway, blocking it without noticing", + ], + ), + ( + id: "foreman", + label: "Shift Foreman", + // Fewer of them. High visibility. Everyone knows where they are. + weight: 2, + skill_focus: ["observation", "persuasion"], + combat_eligible: false, + typical_behaviors: [ + "walks the floor with a datapad under one arm and says nothing", + "pulls a worker aside for a quiet word near the far wall", + "marks a line off a production board and moves to the next one", + "stands at the mezzanine rail watching throughput without expression", + "reviews shift handover notes and circles something with a stylus", + "speaks to a dock crew in a low voice — they listen without nodding", + "sits alone in the break room rubbing the back of her neck, datapad face-down on the table", + "laughs at something a technician says, then catches herself and goes quiet", + ], + ), + ( + id: "security", + label: "Facility Security", + // Present, watchful. Not looking for trouble — cataloguing it. + weight: 2, + skill_focus: ["combat", "observation"], + combat_eligible: true, + typical_behaviors: [ + "sweeps the access corridor on a timed circuit, same path each time", + "waves a regular through the checkpoint on sight — scans the one behind them out of procedure", + "leans at the restricted bay entrance, arms folded — been watching this corridor since the shift started", + "notes something in a shift log without reacting to it outwardly", + "watches a handover between crews from across the loading floor", + ], + ), + ], + + social_sites: [ + ( + site_type: "break_room", + label: "Worker Break Room", + // Between shifts. Decompression. People stop performing for a moment. + roles: ["dock_worker", "technician", "foreman"], + min_npcs: 2, + max_npcs: 5, + ), + ( + site_type: "maintenance_bay", + label: "Maintenance Bay", + // Active work site. Technicians and dock workers cross paths here. + roles: ["technician", "dock_worker"], + min_npcs: 2, + max_npcs: 4, + ), + ( + site_type: "loading_platform", + label: "Loading Platform", + // The operational center. Busy, loud, coordinated. + roles: ["dock_worker", "foreman", "security"], + min_npcs: 3, + max_npcs: 8, + ), + ], +) diff --git a/content/global/rural-zone-spec.ron b/content/global/rural-zone-spec.ron new file mode 100644 index 000000000..d9c9c0471 --- /dev/null +++ b/content/global/rural-zone-spec.ron @@ -0,0 +1,119 @@ +// Zone Identity Spec — Rural +// +// Schema: server/src/npc/blueprint.rs :: ZoneSpec +// Ticket: #609 (copy team) +// Validate: tooling/validate-ron content/global/rural-zone-spec.ron zone +// +// Character: scattered homesteads and small workshops. Unhurried. Community-bound. +// Low throughput, high familiarity. Everyone knows who belongs here. +// +// Generator contrast target: rural vs industrial (Sprint 25 proof). +// If these produce NPCs that look the same, something is wrong. +// +// Heritage roots (D-104/D-105) overlay these base specs at generation time, +// modifying role weights, social site composition, and behavioral flavoring. + +( + zone_type: "rural", + label: "Rural Settlement", + description: "Scattered homesteads, small workshops, and communal gathering points. Low population density, strong community bonds, subsistence-plus economy. Work is seasonal and visible — everyone knows what everyone else is doing.", + + // 1-10. Rural Krenn: self-sufficient, low cash flow, barter supplements credits. + economic_level: 3, + // 1-10. Sparse. Faces are familiar. Strangers stand out. + population_density: 2, + + roles: [ + ( + id: "farmer", + label: "Farmer", + // Most common. The settlement runs on food production. + weight: 5, + skill_focus: ["technical"], + combat_eligible: false, + typical_behaviors: [ + "tends rows of low-growing crops with a long-handled hoe", + "lifts a crate of produce onto a flatbed with practiced ease", + "checks the section's light cycle timer before deciding whether to water", + "patches a cracked irrigation pipe with strips of bonding tape", + "calls across a field to a neighbor without looking up from work", + "hauls produce to the market stall before the morning exchange opens", + "checks seedling trays in a low prefab greenhouse", + ], + ), + ( + id: "mechanic", + label: "Settlement Mechanic", + // One or two per settlement. Everyone knows who to call. + weight: 3, + skill_focus: ["technical"], + combat_eligible: false, + typical_behaviors: [ + "pulls a drive unit from a tiller and examines the worn housing", + "wipes grease on the thigh of her coveralls between jobs", + "explains a repair in clipped shorthand without looking up", + "lines up salvaged parts on a workbench and assesses them", + "welds a seam on a cracked water tank with slow, careful strokes", + "borrows a tool from a neighbor and returns it without being asked", + ], + ), + ( + id: "trader", + label: "Itinerant Trader", + // Passes through. Outsider-familiar — not local, not stranger. + weight: 2, + skill_focus: ["persuasion", "observation"], + combat_eligible: false, + typical_behaviors: [ + "squares goods on a fold-out portable display with deliberate care", + "leans back on a stool and watches the foot traffic", + "flicks credit chits across the counter with one thumb, barely glancing down", + "holds eye contact through a long pause, waiting for the price to land", + "watches a regular browse the same shelf as last time and says nothing", + "packs unsold goods with no visible frustration", + ], + ), + ( + id: "militia", + label: "Settlement Militia", + // Rare. Part-time. Knows everyone, trusted because of it. + weight: 1, + skill_focus: ["combat", "observation"], + combat_eligible: true, + typical_behaviors: [ + "walks the fence line at a measured, unhurried pace", + "leans on the gate post with rifle slung, watching the road", + "waves a familiar face through without checking credentials", + "sits in the shade of the gatehouse with a local newsline", + "stops to talk with a passing farmer, eyes still scanning the perimeter", + ], + ), + ], + + social_sites: [ + ( + site_type: "tavern", + label: "Local Tavern", + // The Last Shift equivalent for rural Krenn: functional, familiar, slow. + roles: ["farmer", "mechanic", "trader", "militia"], + min_npcs: 3, + max_npcs: 6, + ), + ( + site_type: "workshop", + label: "Community Workshop", + // Shared space. People fix things together. + roles: ["mechanic", "farmer"], + min_npcs: 2, + max_npcs: 4, + ), + ( + site_type: "market_stall", + label: "Settlement Market", + // Weekly or daily trading post. Commerce and gossip combined. + roles: ["trader", "farmer"], + min_npcs: 1, + max_npcs: 3, + ), + ], +)