docs(docs): generator architecture workshop — 5 rounds, 14 D-records
Complete workshop output for ticket #562. Establishes the procedural generator pipeline architecture for the 300-world model: two-phase generation (DistrictSkeleton + ChunkData), three-layer model (generator/simulation/delta), spatial hierarchy, MobileChunk spec, guarantee tier system, heritage grammar overlay, and damage overlay. Participants: Gestalt, Tyre, Miri, Araminta, Nigel, Ozzie. Rounds 1-4 (design) + Round 5 (review/corrections). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,470 @@
|
||||
# Generator Architecture Workshop — Outcomes
|
||||
|
||||
**Workshop:** Generator Architecture (#562)
|
||||
**Rounds:** 1 through 4
|
||||
**Dates:** 2026-02-27
|
||||
**Participants:** Gestalt, Tyre, Miri, Araminta, Nigel, Ozzie
|
||||
**Compiled by:** Qatux
|
||||
|
||||
---
|
||||
|
||||
## Purpose
|
||||
|
||||
This document is the authoritative summary of the Generator Architecture workshop. It compiles all confirmed decisions, the canonical data structures, the D-record inventory, and the open questions remaining for sprint work.
|
||||
|
||||
The source documents are the four round notes files:
|
||||
- `docs/workshops/generator-architecture/round-1-notes.md`
|
||||
- `docs/workshops/generator-architecture/round-2-notes.md`
|
||||
- `docs/workshops/generator-architecture/round-3-notes.md`
|
||||
- `docs/workshops/generator-architecture/round-4-notes.md`
|
||||
|
||||
---
|
||||
|
||||
## Lead Decisions
|
||||
|
||||
These are decisions made or confirmed by the project lead (Jeroen) and are not subject to further team debate.
|
||||
|
||||
| # | Decision | Round confirmed |
|
||||
|---|----------|-----------------|
|
||||
| L-1 | The generator uses a **two-phase** architecture: Phase 1 (DistrictSkeleton, async background) and Phase 2 (ChunkData on-demand per chunk). | R2 |
|
||||
| L-2 | Both **Grid and Organic** layout modes exist. The lead mandated "some blocks grid, some organic chaos." | R3 |
|
||||
| L-3 | **WorldTier** wins over SignificanceTier as the field name on DistrictSkeleton. | R4 |
|
||||
| L-4 | **Entity-carried MobileChunk** is core architecture. Vessels are persistent world entities with a Docked state. | R4 |
|
||||
| L-5 | **DramaDensity** is runtime storyteller state. It does NOT appear on DistrictSkeleton. | R4 |
|
||||
| L-6 | **Heritage grammar overlay** is base game content, not DLC. | R4 |
|
||||
| L-7 | **XOR reseeding for in-playthrough events is prohibited.** `DamageOverlay` is the correct approach for all player-witnessed structural events. | R4 (unanimously confirmed) |
|
||||
|
||||
---
|
||||
|
||||
## Confirmed Architecture — Summary
|
||||
|
||||
### The Three-Layer Model
|
||||
|
||||
```
|
||||
GENERATOR STATE (immutable after Phase 1)
|
||||
├── Phase 1: DistrictSkeleton
|
||||
│ ├── district_id: DistrictId (identity)
|
||||
│ ├── seed: u64 (deterministic generation)
|
||||
│ ├── district_type: DistrictType (classification)
|
||||
│ ├── context: DistrictContext (world context)
|
||||
│ ├── world_tier: WorldTier (simulation fidelity budget)
|
||||
│ ├── complexity_tier: ComplexityTier (content budget)
|
||||
│ ├── layout_mode: DistrictLayoutMode (Grid | Organic)
|
||||
│ ├── setting: SettingType (terrain + environment type)
|
||||
│ ├── blocks: [[BlockSkeleton; 4]; 4] (4×4 block grid)
|
||||
│ ├── reservations: Vec<MultiBlockReservation>
|
||||
│ ├── corridors: Vec<CorridorSpine>
|
||||
│ ├── z_levels: u8
|
||||
│ ├── vertical_structure: VerticalStructure (source: multi-participant)
|
||||
│ ├── breach_only_zones: Vec<ZoneId> (source: multi-participant)
|
||||
│ ├── social_sites: Vec<SocialSitePlacement>
|
||||
│ ├── society_profile: SocietyProfileRef
|
||||
│ ├── zone_palette: Vec<ZoneDefinition>
|
||||
│ ├── boundaries: DistrictBoundaries
|
||||
│ ├── access_points: Vec<AccessPoint> (district entries/exits)
|
||||
│ ├── guarantee_audit: GuaranteeAuditResult
|
||||
│ └── derived_analysis: DerivedDistrictAnalysis (source: Miri/Gestalt; Phase 1 computed)
|
||||
└── Phase 2: PreparedDistrict (on-demand per chunk)
|
||||
├── SocialSitePlacement (triangles with Vec<TrianglePurpose>)
|
||||
├── NpcManifest (seeded from society_profile)
|
||||
├── ZonePalette assignments (base + heritage modifiers)
|
||||
└── ChunkMutations pending
|
||||
|
||||
SIMULATION STATE (runtime storyteller — NOT generator output)
|
||||
├── DistrictRuntimeState.drama_density: DramaDensity
|
||||
├── active_triangles: Vec<TriangleId>
|
||||
├── npc_pattern_weights: NpcPatternWeightSet
|
||||
└── assassination_difficulty on-demand computation
|
||||
|
||||
DELTA LAYER (post-generation)
|
||||
├── DamageOverlay (LocalOverlay for in-playthrough events)
|
||||
├── NpcRemoved / NpcStateChanged
|
||||
├── AccessTierChanged
|
||||
└── WorldStateDelta (composed from all active mutations)
|
||||
```
|
||||
|
||||
### Spatial Hierarchy (D-094)
|
||||
|
||||
| Unit | Sim tiles | Visual tiles | Real meters | Purpose |
|
||||
|------|-----------|--------------|-------------|---------|
|
||||
| Chunk | 64×64 | 32×32 | 32m | Streaming unit |
|
||||
| Block | 128×128 | 64×64 | 64m | Generator planning unit (4 chunks) |
|
||||
| District | 512×512 | 256×256 | 256m | Simulation unit (4×4 blocks) |
|
||||
|
||||
### Phase 1 Generator Pipeline
|
||||
|
||||
```
|
||||
Pre-Pipeline: system generation, WorldTier assignment, galaxy topology
|
||||
↓
|
||||
Phase 1: DistrictSkeleton
|
||||
Stage 1: Classification (WorldTier, ComplexityTier, SettingType)
|
||||
Stage 2: Block grid (DistrictLayoutMode, BlockSkeleton ×16)
|
||||
Stage 3: Reservation (skyscrapers, terminals, MultiBlockReservation)
|
||||
Stage 4: Social site + NPC (triangles, society profile, DerivedDistrictAnalysis)
|
||||
Stage 5: Guarantee audit (3-tier conditional check)
|
||||
↓
|
||||
Phase 2: ChunkData (on-demand per player approach)
|
||||
Heritage grammar applied at chunk fill time
|
||||
↓
|
||||
World State Layer: DamageOverlay + DeltaLayer overlay at render time
|
||||
```
|
||||
|
||||
### Layout Mode
|
||||
|
||||
```rust
|
||||
enum DistrictLayoutMode {
|
||||
Grid,
|
||||
Organic {
|
||||
placements: [[BlockPlacement; 4]; 4],
|
||||
},
|
||||
}
|
||||
struct BlockPlacement {
|
||||
offset: (i16, i16), // ±16 sim tiles per axis
|
||||
rotation_steps: u8, // 0–3 (15° increments; hard cap at 45°)
|
||||
street_width_factor: f32, // 0.75–2.0 relative to standard
|
||||
}
|
||||
```
|
||||
|
||||
Hard technical constraint: maximum rotation is ±45°. This is non-negotiable — beyond 45°, tile-based pathfinding produces unacceptable movement artifacts. Organic districts produce the visual impression of curved streets through angular jogs and irregular setbacks, not smooth curves.
|
||||
|
||||
### WorldTier and ComplexityTier
|
||||
|
||||
```rust
|
||||
enum WorldTier {
|
||||
Epicenter, // Hub system. Full simulation, high faction pressure.
|
||||
Regional, // Regional. 1–4 districts, partial full-budget.
|
||||
Backwater, // Small community. 1 district. Network-insignificant, NOT budget-capped.
|
||||
Passage, // Transit stop. Pass-through.
|
||||
Waypoint, // Not simulated until player approaches.
|
||||
}
|
||||
enum ComplexityTier {
|
||||
Full, // All spatial guarantees. Rich NPC population.
|
||||
Moderate, // Tier 1 + partial Tier 2 guarantees. Moderate NPCs.
|
||||
Minimal, // Tier 1 only. Sparse NPCs.
|
||||
Empty, // No social sites, no NPCs. Pure terrain.
|
||||
}
|
||||
```
|
||||
|
||||
WorldTier → ComplexityTier ceiling:
|
||||
|
||||
| WorldTier | ComplexityTier ceiling |
|
||||
|-----------|----------------------|
|
||||
| Epicenter | Full |
|
||||
| Regional | Full |
|
||||
| Backwater | Full (key insight: dense isolated community — network insignificance ≠ simulation budget cap) |
|
||||
| Passage | Moderate |
|
||||
| Waypoint | Minimal |
|
||||
|
||||
ComplexityTier → DramaDensity ceiling: Full → any intensity; Moderate → Active max; Minimal → Quiescent max; Empty → Zero only (no storyteller activation possible). A `ComplexityTier::Empty` district has no social fabric; the storyteller cannot activate drama there.
|
||||
|
||||
---
|
||||
|
||||
## The 14 D-Ready Items
|
||||
|
||||
These 14 items are confirmed D-records ready to be filed in `decisions/`. Each has been reviewed and signed off by all workshop participants.
|
||||
|
||||
### D-READY-1: DistrictLayoutMode — Grid and Organic Support
|
||||
|
||||
Both layout modes coexist. Grid = power imposed (Commission-planned). Organic = power negotiated (pioneer settlements, organic growth). Organic mode uses `BlockPlacement` offsets and rotations to produce non-rectilinear street space as negative space between shifted/rotated blocks. 45° rotation is a hard technical ceiling.
|
||||
|
||||
The proportion of Grid vs. Organic districts across a world must vary per seed to prevent predictable meta-level patterns.
|
||||
|
||||
### D-READY-2: Guarantee Tier System — Universal / Full-Only / Conditional
|
||||
|
||||
**Tier 1 — Universal (all inhabited):** Social Hub, Informal Zone, Encounter Corridor.
|
||||
**Tier 2 — Full-complexity:** Traffic Chokepoint, Institutional Space, Insider Space, Economic Node, Horizon View Corridor (coastal), BreachOnly Zone (≥1), Rooftop Discovery Zone (tall structures).
|
||||
**Tier 3 — Conditional:** A-1 Elevated Vantage, A-2 Egress Multiplicity, A-3 Temporal Opacity Window, A-4 Non-Institutional Route, Economic Asymmetry Signal, Power Gradient Visibility.
|
||||
|
||||
Audit runs all applicable checks. A Minimal farmstead gets ~3 checks. A Full-complexity coastal urban hub gets up to 13.
|
||||
|
||||
Archetype placement must vary in **angular position** (not just distance from center) across seeds. The guarantee audit should fail if archetype positions cluster predictably across a test batch of N seeds.
|
||||
|
||||
### D-READY-3: TrianglePurpose Enum
|
||||
|
||||
```rust
|
||||
enum TrianglePurpose {
|
||||
Investigation, Economic, Social, Political,
|
||||
Tactical, // target + protector + informant/witness
|
||||
Mundane,
|
||||
}
|
||||
```
|
||||
|
||||
Triangles carry `Vec<TrianglePurpose>`. Purpose tags are multi-playstyle accessibility features: they ensure the right drama is surfaced to the player whose lens is active. `Tactical` encodes the assassination contract in spatial form.
|
||||
|
||||
### D-READY-4: WallBackside / TileBehindState — Dual Classification
|
||||
|
||||
Both enums are canonical. They serve complementary roles:
|
||||
- `WallBackside` (Tyre): structural — what is physically behind this wall tile (AdjacentSpace / StructuralFill / ServiceVoid / ChunkBoundary / Exterior)
|
||||
- `TileBehindState` (Gestalt): gameplay — what kind of space this represents (StructuralFill / HiddenRoom / Interstitial)
|
||||
|
||||
Mapping: `WallBackside::ServiceVoid` → `TileBehindState::Interstitial`. `WallBackside::AdjacentSpace` → `TileBehindState::HiddenRoom` or `StructuralFill` depending on access tier.
|
||||
|
||||
Era-tagged infrastructure cavity contents with standardized color codes:
|
||||
- Era 1: power conduit only (`#c8b840`)
|
||||
- Era 2: power + water/coolant (`#4888c8`) + comm lines (`#b8b8b8`)
|
||||
- Era 3: full bundle (all types, denser)
|
||||
|
||||
Backside assignments within a template must have seed-driven variation — not fixed-template values.
|
||||
|
||||
### D-READY-5: Dynamic Modification via Overlay (Not Re-Generation)
|
||||
|
||||
Generator output is immutable. All post-generation modifications are applied via overlay.
|
||||
|
||||
**`DamageOverlay`:**
|
||||
```rust
|
||||
struct DamageOverlay {
|
||||
overlay_type: DamageOverlayType,
|
||||
epicenter: ChunkLocalPos,
|
||||
radius: f32,
|
||||
intensity: f32,
|
||||
scatter_seed: u64, // variation within damage zone only
|
||||
}
|
||||
enum DamageOverlayType { GasExplosion, Fire, Structural { collapse_direction }, Flooding }
|
||||
```
|
||||
|
||||
**`RegenerationStrategy`:**
|
||||
```rust
|
||||
enum RegenerationStrategy {
|
||||
LocalOverlay(DamageParameters), // in-playthrough — MANDATORY
|
||||
SoftReseed { seed_modifier: u64 }, // scenario-boundary only
|
||||
FullReseed, // era-level discontinuity only
|
||||
}
|
||||
```
|
||||
|
||||
Hard constraint: in-playthrough events are ALWAYS `LocalOverlay`. XOR reseeding for in-playthrough events is explicitly prohibited.
|
||||
|
||||
Trauma event → visual stage mapping:
|
||||
- PhysicalDestruction/ViolenceEvent → Stage 2 (Fresh Aftermath), decays to Stage 3
|
||||
- EconomicDisruption/PoliticalShock/MigrationShock → quarter fill modifier (not destruction stages)
|
||||
|
||||
Full destruction stage sequence:
|
||||
|
||||
| Stage | Name | Visual state |
|
||||
|-------|------|-------------|
|
||||
| 1 | Active | Event in progress; DamageOverlay rendering live |
|
||||
| 2 | Fresh Aftermath | Structure breached; scorch, rubble, debris tiles visible |
|
||||
| 3 | Stabilized | Debris cleared; structural state permanent |
|
||||
| 4 | Reconstruction | Scaffolding tiles, incomplete floor sections |
|
||||
| 5 | Healed Scar | Functional again; residual visual tells remain |
|
||||
|
||||
Destruction palette constraint: corruption-only. No new colors are introduced by destruction. Existing zone palette tiles are darkened, desaturated, or replaced with structural-damage variants from the same palette family. Single exception: `#c8d8f0` (open-sky tile) appears at 100% intensity when a roofed structure has its roof removed — the only color destruction may introduce. Implementers must not create a separate destruction color set.
|
||||
|
||||
Replayability: the modification history diverges per playthrough based on event decisions. Same-seed worlds share the same generator baseline; different event histories produce different delta layers. This is the replayability engine.
|
||||
|
||||
### D-READY-6: ZonePalette Modifier System
|
||||
|
||||
```rust
|
||||
struct ZonePalette {
|
||||
base: BasePalette,
|
||||
modifiers: Vec<PaletteModifier>,
|
||||
}
|
||||
```
|
||||
|
||||
8 base terrain types (T1 temperate farmland [warm organic, natural lighting] / T2 industrial farmland [cool grey-green, artificial lighting] / T3 wilderness / T4 grassland / T5 coastal water [deep near-black blue, animated specular; referenced by D-READY-7 horizon corridor guarantee] / T6 beach/coastal margin [warm dark tan] / T7 mountain/high terrain [dark blue-grey stone, snow at elevation] / T8 desert/arid). T1 and T2 are the two farmland types, explicitly distinct. If wetland terrain is required, it must be specified as a new T9 type — it is not a replacement for any of the 8 canonical types.
|
||||
|
||||
Modifier axes: A (heritage root → material character), B (economic tier → condition/density), C (era → material generation), plus faction overlay, climate, condition, season.
|
||||
|
||||
Palette modifiers should influence NPC appearance as well as environment appearance. People dress like they're from here.
|
||||
|
||||
### D-READY-7: Horizon View Corridor as Coastal Guarantee
|
||||
|
||||
A **negative-space** reservation: ≥8 visual tiles unobstructed view corridor from nearest public street to water's edge. No building, tree, or z=4 element may occupy this corridor. A low z=2 element (railing, bench, bollard) marks the waterfront point as a designed viewing location.
|
||||
|
||||
Tier 2 Conditional guarantee for coastal districts. Position within the district must vary per seed — the Wow Moment of seeing the horizon must be discovered, not expected.
|
||||
|
||||
### D-READY-8: Assassin Lens Spatial Guarantees (A-1 through A-4)
|
||||
|
||||
These are **derived properties of existing spatial configuration**, not assassin-tagged features. They add no generation cost; the audit validates existing output.
|
||||
|
||||
- **A-1 Elevated Vantage** (Tier 3, Full-complexity): ≥1 position with clear LOS cone to Traffic Chokepoint. Generator ensures overhead-clear zone in LOS corridor during block planning.
|
||||
- **A-2 Egress Multiplicity** (Tier 3, Full-complexity): ≥2 exit routes to adjacent districts.
|
||||
- **A-3 Temporal Opacity Window** (Tier 3, Full-complexity): ≥1 time window (day-phase) where Social Hub has reduced ambient NPC coverage.
|
||||
- **A-4 Non-Institutional Access Route** (mandatory Full-complexity): ≥1 route to any Insider zone that does not pass through high-security institutional spaces.
|
||||
|
||||
A-1/A-2/A-3 are Tier 3 Conditional (trigger on `complexity_tier == Full`). A-4 is mandatory Full-complexity for all playstyles.
|
||||
|
||||
### D-READY-9: Heritage Grammar Overlay for Non-Urban Palettes
|
||||
|
||||
Data-driven `HeritageGrammarOverlay` structs (10 per heritage root). Loaded once at generator startup. Applied at Phase 2 chunk fill time by weighted blending.
|
||||
|
||||
Blend rules:
|
||||
- Continuous fields (decorative_density, repair_visibility, etc.): weighted average
|
||||
- Categorical fields (boundary_character, open_space_character): dominant heritage weight wins
|
||||
- Object tag lists: union of preferred/accent tags; intersection-exclusion of excluded tags
|
||||
|
||||
Phase 1 exception: `gathering_probability` evaluated at block planning for quarter pre-assignment.
|
||||
|
||||
Authoring domain separation:
|
||||
- **Miri:** organizational principles, boundary character, spacing, social grammar (HeritageGrammarOverlay Rust struct / authored data)
|
||||
- **Araminta:** visual expression — object sets, arrangement algorithms, floor surface variants, overhead flora density and character, wall/structure material character, boundary material type, lighting temperature (TOML modifier files, one per heritage root)
|
||||
|
||||
Shared requirement: `ObjectTag` vocabulary must be co-maintained.
|
||||
|
||||
### D-READY-10: Non-Urban Informal Zone Typology
|
||||
|
||||
Informal zones are defined as spaces outside the community's social field — not defined by institutional absence but by the type of social permission governing them.
|
||||
|
||||
Three types:
|
||||
- `social_permission`: normal zone palette; gathering infrastructure present; cover is about convention, not geography
|
||||
- `physical_distance`: sparse objects, unmaintained floor; isolation is the visual
|
||||
- `utilitarian_cover`: functional work objects; space reads as work space; unofficial use is invisible to casual observation
|
||||
|
||||
Visual grammar per type in `docs/workshops/generator-architecture/araminta-round4.md`.
|
||||
|
||||
Heritage root correlation: Frost/Stone → `physical_distance`; Tide/Vine/Dust → `social_permission`; Iron/Salt → `utilitarian_cover`. Location within terrain is seeded independently. (Dust = maximum communal observation, only privacy available is negotiated; Iron = labor function covers presence. Both confirmed Miri Round 5.)
|
||||
|
||||
### D-READY-11: Vertical Scale Architecture
|
||||
|
||||
Four height tiers (S1–S4):
|
||||
- S1: 1–2 z-levels (surface + roof/mezzanine)
|
||||
- S2: 3–10 z-levels
|
||||
- S3: 11–30 z-levels
|
||||
- S4: 30+ z-levels
|
||||
|
||||
Shadow length is the primary height signal in top-down view (2–40 visual tiles).
|
||||
|
||||
Lazy z-level loading: `ZLevelLoadState: Loaded | Skeleton | Ungenerated`. Only current + adjacent z-levels filled by Phase 2.
|
||||
|
||||
**Rooftop Bar Clause:** Every tall structure (z_band_count ≥ 3) must assign a `RooftopConfig: Restricted | PublicWithHiddenLayer`. The discovery layer is mandatory in both cases. Heritage root **weights the probability** between the two configs — it does not determine the outcome. A minority of buildings of any heritage root must be configurable as the non-dominant type. A Frost building with a rooftop bar must be possible; full determination kills the discovery moment. (Correction confirmed by Ozzie + Araminta, Round 5.)
|
||||
|
||||
Z-band floor boundaries must have seed-variation within cultural ordering constraints. A corporate building has executive floors in the upper zone, but which exact floor begins is seeded.
|
||||
|
||||
Vertical access routes are playthrough-history dependent: same building, different routes available based on player relationship and event history.
|
||||
|
||||
### D-READY-12: Trauma Events as EraModification Subtypes
|
||||
|
||||
```rust
|
||||
enum ModificationType {
|
||||
TraumaEvent {
|
||||
subtype: TraumaEventSubtype,
|
||||
cultural_aftermath: HeritageRootResponse,
|
||||
}
|
||||
}
|
||||
enum TraumaEventSubtype {
|
||||
PhysicalDestruction, EconomicDisruption, PoliticalShock,
|
||||
ViolenceEvent, MigrationShock,
|
||||
}
|
||||
```
|
||||
|
||||
Trauma events that physically alter structures apply damage via `LocalOverlay`. The original_seed is preserved. Cultural aftermath decays toward baseline at heritage-root-dependent rates.
|
||||
|
||||
Physical destruction and cultural aftermath are separate tracks:
|
||||
- Structural damage: `StructuralChange` in ChunkMutations
|
||||
- Cultural response: NPC weight distribution shift in `DistrictRuntimeState.npc_pattern_weights`
|
||||
|
||||
Decay rate is seeded per-community with variation around heritage-root baseline (prevents perfect predictability from heritage root alone).
|
||||
|
||||
`trauma_visual_decay_rate: slow | medium | fast` per heritage root. Default: medium.
|
||||
|
||||
Design principle: **Trauma intensifies culture, it does not transform it.** A stressed community becomes a more concentrated version of itself — Frost communities close harder, Tide communities grief more publicly, Iron communities organize more collectively. Decay is toward the community's pre-trauma baseline, not toward a new equilibrium. Players who have learned a heritage root's trust model can predict community behavior in the aftermath.
|
||||
|
||||
### D-READY-13: MobileChunk Specification
|
||||
|
||||
Entity-carried interior space attached to a mobile world entity. Not a district. Uses the same chunk fill primitives in a simpler flat structure (no Phase 1/Phase 2 split; no block grid; no zone negotiation).
|
||||
|
||||
Key structs: `MobileChunk`, `MobileInterior`, `VesselClass`, `MobileMovementState` (Docked / InTransit / InterSystem / Idle), `TransitSocialModifier`, `MobileNpcSlot`, `NpcPersistence` (Crew / Passenger). Note: `Idle` = vessel parked at a location but not docked to infrastructure (anchored ship, grounded shuttle).
|
||||
|
||||
Vessels are **persistent world entities**. In `Docked` state: present at dock_position, visible from dock as sprite overlay, boarding via gangway tile → MobileAccessPoint activation. Interior cache keyed by entity_id persists across voyages for crew state.
|
||||
|
||||
**Departure schedules** are required as a generator output. The `Docked` struct must include `docked_since: SimTick` and `scheduled_departure: Option<SimTick>` — these fields were absent from Tyre's Round 4 canonical struct and must be added at implementation time. The generator must populate `scheduled_departure`. Vessels without departure schedules are an error state.
|
||||
|
||||
Replayability requirements R-V-1 through R-V-6 (see round-4-notes.md §5, D-READY-13 section).
|
||||
|
||||
Memory: ~0.5–4 KB metadata + up to 64 KB ChunkData per vessel. At 50 active entities: ~3 MB, paged by streaming model.
|
||||
|
||||
**Cultural grammar:** `TransitSocialModifier` with `TransitVariant` (BoundedLinear / BoundedMobile / InterSystem). Heritage-root behavior tables by vehicle type. Miri's canonical spec at `docs/workshops/generator-architecture/miri-round4.md`.
|
||||
|
||||
**Vessel visual grammar:** see `docs/workshops/generator-architecture/araminta-round4.md` §2. Five rules govern visual distinction of MobileChunk interiors from static zone spaces: (1) exterior hull uses vessel-identity material, not zone palette; (2) window tiles reveal exterior context (docked vs. in transit); (3) compression modifier tightens proportions throughout; (4) section transitions use vessel-identity threshold elements; (5) class stratification expressed through proportion, not palette change.
|
||||
|
||||
### D-READY-14: DamageOverlay / RegenerationStrategy
|
||||
|
||||
See D-READY-5 for full specification. Filed separately as a D-record because it establishes the general modification strategy rather than only the overlay mechanics.
|
||||
|
||||
The key distinction: this D-record establishes the **prohibition** of XOR reseeding for in-playthrough events and the **mandate** for `LocalOverlay`. All participants confirmed this unanimously in Round 4.
|
||||
|
||||
---
|
||||
|
||||
## NPC Model — The Ysabel Vorn Litmus Test
|
||||
|
||||
The 10-axis NPC model was validated against a concrete NPC exercise (Miri, Round 4). Ysabel Vorn covers **4.5 of 5 playstyle hooks** on a Backwater/Moderate farming settlement.
|
||||
|
||||
**The 10 axes:**
|
||||
1. Behavioral Pattern (social archetype: ANCHOR, REMNANT, WITNESS, etc.)
|
||||
2. Surface Motivation (publicly visible goal)
|
||||
3. Actual Motivation (what they actually want)
|
||||
4. Vulnerability/Secret
|
||||
5. Information Access (tiered knowledge inventory)
|
||||
6. Trust Architecture (heritage-based trust model + specific trust network)
|
||||
7. Routine Pattern (daily/weekly/seasonal schedule)
|
||||
8. Economic Position (control levers + hidden assets)
|
||||
9. Relationship Network (triangle memberships — active and latent)
|
||||
10. Tolerance Threshold (per-trigger tolerance levels)
|
||||
|
||||
**The gap (Axis 11, proposed):** `network_footprint: Option<NetworkFootprintTag>` for NPCs who are locally insignificant in appearance but carry network-significant information or are relevant to external actors. Default `None` for procedural NPCs. Set explicitly for authored scenario NPCs.
|
||||
|
||||
This axis is not yet in the confirmed model — it is raised as a Q-record for sprint work.
|
||||
|
||||
**Minimum NPC count for intra-seed replayability:** 3 (one functional triangle). One NPC = maximum seed-to-seed variation, zero intra-seed emergence. Three NPCs = triangles, shifting alliances, cascade effects. Even Minimal-complexity insignificant districts need 3 NPCs.
|
||||
|
||||
---
|
||||
|
||||
## Key Tensions and Resolutions
|
||||
|
||||
| Tension | Round | Resolution |
|
||||
|---------|-------|-----------|
|
||||
| Grid-only vs. organic streets | R1–R3 | Both. Grid = power imposed; Organic = power negotiated. Both modes coexist in the same world. |
|
||||
| SignificanceTier vs. WorldTier naming | R3–R4 | Lead: WorldTier. Canonical values: Epicenter/Regional/Backwater/Passage/Waypoint. |
|
||||
| MobileChunk (entity-carried) vs. instanced district (Nigel) | R3–R4 | Lead: entity-carried MobileChunk. Vessels are persistent world entities. |
|
||||
| DramaDensity on struct vs. runtime | R3–R4 | Lead: runtime only. DramaDensity lives in DistrictRuntimeState, not DistrictSkeleton. |
|
||||
| XOR reseeding vs. structured damage | R3–R4 | Unanimous: DamageOverlay. XOR prohibited for in-playthrough events. |
|
||||
| Assassination difficulty: computed-on-demand (Gestalt) vs. Phase 1 stored (Miri) | R4 | Minor tension. Recommended synthesis: stored cultural baseline (DerivedDistrictAnalysis on skeleton) + on-demand computation for player-facing assessment. See round-4-notes §2, OQ-R4-C. |
|
||||
|
||||
---
|
||||
|
||||
## Open Questions for Sprint Work
|
||||
|
||||
| Q-ID | Question | Priority | Owner |
|
||||
|------|----------|----------|-------|
|
||||
| Q-NNN-a | Axis 11 (Network Footprint) — authored field for network-significant NPCs in locally-insignificant positions | High | Miri |
|
||||
| Q-NNN-b | Departure schedule model — departure windows as generator output for docked vessels (Ozzie requirement). **Note R5:** D-READY-13 resolves this — `scheduled_departure: Option<SimTick>` in Docked state is mandatory generator output. Recommend closing before sprint planning. | High | Tyre + Miri |
|
||||
| Q-NNN-c | Mobile environment social arc — structural representation of journey timeline (Ozzie requirement) | Medium | Miri + Gestalt |
|
||||
| Q-NNN-d | DramaDensity enum naming — Round 4 struct uses Quiescent/Active/Intense (3) vs. Round 3's Zero/Low/Medium/High/Flashpoint (5). Resolve before D-record. | Low | Tyre + Gestalt |
|
||||
| Q-NNN-e | ObjectTag vocabulary co-maintenance — shared between Miri's HeritageGrammarOverlay and Araminta's asset categorization | Medium | Miri + Araminta |
|
||||
| Q-NNN-f | Assassination difficulty synthesis — formal spec combining DerivedDistrictAnalysis baseline (Phase 1) with on-demand runtime computation (player-facing display only; game logic uses Phase 1 value) | Medium | Gestalt + Miri |
|
||||
|
||||
---
|
||||
|
||||
## Implementation Targets (From Participant Estimates)
|
||||
|
||||
| Feature | Target version | Estimated effort |
|
||||
|---------|---------------|-----------------|
|
||||
| Phase 1 DistrictSkeleton (basic) | v0.3 | ~3 dev-days |
|
||||
| Phase 2 chunk fill with heritage grammar | v0.3 | ~4 dev-days |
|
||||
| MobileChunk (single-chunk vessels) | v0.3 | ~9.5 dev-days |
|
||||
| Vertical scale (z-bands, lazy loading) | v0.4 | ~7 dev-days |
|
||||
| DamageOverlay system | v0.4 | ~1.5 dev-days |
|
||||
| MobileChunk::Block (large ships) | v0.5 | Deferred |
|
||||
|
||||
---
|
||||
|
||||
## What This Generator Promises the Player
|
||||
|
||||
From Ozzie's synthesis across all four rounds:
|
||||
|
||||
> **The world is real and persistent.** Vessels exist when you're not on them. The crew you met last voyage is still there. The damage you caused is still there.
|
||||
>
|
||||
> **Every wall is a secret keeper.** WallBackside + BreachOnly means no tile is ever void. There's always something behind the wall.
|
||||
>
|
||||
> **Destruction has history.** DamageOverlay + trauma subtypes mean the aftermath of events is legible. You can arrive at a district and read what happened.
|
||||
>
|
||||
> **Height has meaning.** Vertical scale + view down from above. The building is itself a puzzle. Floor 30 has information floor 1 can't have, because floor 30 is harder to reach.
|
||||
>
|
||||
> **Every playstyle has guaranteed affordances.** The 3-tier guarantee system and the assassin lens guarantees mean the generator is making contracts it keeps.
|
||||
>
|
||||
> **The journey is content.** Mobile environments are social pressure cookers, not loading screens with chairs.
|
||||
>
|
||||
> **Insignificance is a lens, not a verdict.** A Minimal/Dormant district contains a complete small society. The playstyle is the starting assumption the world eventually corrects.
|
||||
|
||||
---
|
||||
|
||||
*Workshop closes. Fourteen D-records ready for filing. Six Q-records raised for sprint work. The generator pipeline is locked.*
|
||||
Reference in New Issue
Block a user