Docs: redirect to co-op roguelite — Expedition spine + classes + persistent meta
Playtest of the single-arena slice (Scratch Notes 6152026) found it stale fast. Answer the post-END-2 Decision Gate as continue/expand: re-scope off the fixed June-30 demo to a co-op roguelite-ARPG — base = persistent buildable hub (never resets), the procedural Expedition region = the required combat spine, two classes (Warrior/Ranger), persistent meta (SaveData v6 later). Mission-as-Sortie model: fulfils locked pillar #4, preserves the never-a-run-reset pillar; reverses DR-031's expedition pause. Backed by an 8-agent design+feasibility pass (feasibility GREEN: server-spawns-ghosts removes seed replication). Slice doc archived/superseded. See DR-037. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
+92
@@ -0,0 +1,92 @@
|
||||
---
|
||||
id: DR-037
|
||||
title: Procedural Expedition Spine + Two Classes + Persistent Meta (Mission-as-Sortie redirect)
|
||||
status: accepted
|
||||
date: 2026-06-17
|
||||
tags:
|
||||
- decision
|
||||
- design
|
||||
- direction
|
||||
- combat
|
||||
- roguelite
|
||||
- expedition
|
||||
- classes
|
||||
- meta-progression
|
||||
- netcode
|
||||
permalink: gamevault/07-sessions/decisions/dr-037-procedural-expedition-spine-two-classes-persistent-meta
|
||||
---
|
||||
|
||||
# DR-037 — Procedural Expedition Spine + Two Classes + Persistent Meta (the post-playtest redirect)
|
||||
|
||||
> **A project-direction change, not a slice tweak.** Triggered by a real operator playtest of the shipped single-arena slice ([[Scratch Notes 6152026]], 2026-06-15). Re-scopes off the [[End_Of_Month_Game_Jam_Slice]] single-arena demo and commits Project M to a **co-op roguelite-ARPG**: a **procedural Expedition region as the required combat spine**, a **persistent meta-progression home base that never resets**, and **two classes** (Warrior melee / Ranger ranged) — with **combat readability fixed first**. **Reverses the [[DR-031_Base_Mining_Loop_Cohesion]] "focus on the base, pause the expedition" decision** deliberately, and **fulfils** the long-locked [[Pillars|pillar #4]] ("persistent buildable home base + **instanced/procedural expeditions**") that the slice had paused. Research-backed by an 8-agent design+feasibility pass (this session). Supersedes the slice as the operative target; the slice doc is kept as an optional showcase/fallback.
|
||||
|
||||
## Context
|
||||
|
||||
The slice [[End_Of_Month_Game_Jam_Slice]] ("Awakening Engine Last Stand") deliberately compressed Project M to **one compact arena** — mine → build → defend the Core through escalating Husk sieges → win/lose in 5–8 min — and **cut the Expedition region** (the [[DR-013_M6_Aether_Cycle_Region_Split|Blightfield at base+(1000,0,0)]]) to focus the loop ([[DR-031_Base_Mining_Loop_Cohesion]]). Path A's spine shipped 14/14 ([[DR-036_END2_Final_Siege_Win_Lose]]).
|
||||
|
||||
The operator then **played it** and logged [[Scratch Notes 6152026]] (2026-06-15). The core finding: **"any and all combat happens in the home base. Feels very stale very fast."** This is the *predicted cost* of the single-arena scoping — the slice doc's own "Future Work → Expedition Reintroduction" anticipated it. The notes propose four things, evaluated below; the operator chose the most ambitious coherent reading: **re-scope the deadline and build the bigger, pillar-true game** (the reference the operator named is **Shape of Dreams** — a 2025 co-op action-roguelite — *"that core game loop but modified to have a meta progression home base."*).
|
||||
|
||||
## Operator decisions (present-the-forks ritual, 2026-06-17)
|
||||
|
||||
Locked via [[present-forks-dont-auto-decide|the fork-locking ritual]] after the research pass:
|
||||
|
||||
1. **Sequencing = re-scope / move the deadline.** The June-30 single-arena demo is **no longer the operative target** (kept as an optional showcase/fallback, not deleted). Build the full direction. **Directive: stop estimating time / deadline-framing — "you just build, I handle deadlines."** (Engineering discipline — netcode design-reviews before heavy slices, fun-gates, server==client validation — stays; that is correctness, not scheduling.)
|
||||
2. **Primary attack = two classes.** **Warrior (melee anchor)** + **Ranger (ranged anchor, manually aimed — not auto-fire)**, for co-op contrast. (Rejected: a ranged *auto-attack* primary, which the research showed collapses the action-ARPG into a passive stat-stack and violates the skill>stat-check pillar.)
|
||||
3. **Expedition shape = required spine + persistent meta.** Expeditions become a **required progression step** (not an optional sidecar), with a **meta-progression layer that persists across sessions** (SaveData v6). The base remains the persistent hub.
|
||||
4. **Do-now combat-readability/HUD wins = all four**, including the Charger committed-lunge tell (accepting the enemy-ghost re-bake).
|
||||
|
||||
## Decision
|
||||
|
||||
**Redirect Project M to a co-op roguelite-ARPG on the "Mission-as-Sortie" model** (Deep Rock Galactic / Cult of the Lamb / The Riftbreaker), which is the **only** model that satisfies the locked pillars:
|
||||
|
||||
- **The base is the persistent buildable HUB — it never resets, it only grows.** (Locked [[Identity#Open / deferred|pillar #5]]: "persistent anchor, death = respawn, *never a roguelike run-reset*" — **PRESERVED**.)
|
||||
- **The Expedition region is the procedural combat SPINE** — a re-seeded run venue reached via region transit, where the bulk of the fight now happens. (Locked pillar #4: "instanced/procedural expeditions" — **FULFILLED**.)
|
||||
- **A "run" is a re-seeded Expedition REGION inside the SAME persistent netcode world** — *not* a new World, *not* a base reset. The server spawns all procedural content as ordinary runtime ghosts; clients receive them via snapshots and **never run the generator** → **the seed never needs replicating** (the hardest distributed-determinism problem disappears).
|
||||
- **Run-acquired combat buffs are run-scoped** (expire, via the existing `TimedModifier`); **deposited loot + a meta-currency fund PERMANENT base/meta growth** (SaveData v6). The two channels stay crisply distinct so nothing reads as a roguelike reset.
|
||||
|
||||
### Per-note evaluation (research-backed)
|
||||
|
||||
| # | Scratch note | Verdict | Disposition |
|
||||
|---|---|---|---|
|
||||
| 3 | Enemy health bars + clearer "about-to-hit" tell | **Do it now.** Industry std = *on-damage-sticky bars w/ fade* (NOT always-on) + low-HP override; telegraph = per-enemy windup ramp + longer windups + multi-sensory cue | **Slice 1** (mostly client-only; `Health.Current` already replicated, `Health.Max` baked client-side, `CombatFeedbackSystem` already pools per-entity GOs) |
|
||||
| 4 | Hide buildables behind a toggled "build mode" | **Do it now.** Mirrors every roguelite's minimalist run-phase HUD | **Slice 1** (pure client-local: a `_buildModeOpen` bool gates `_paletteRow`; combat input already suppressed while the palette is active) |
|
||||
| 2 | Classes, 4 attacks, run meta-buffs; melee vs ranged | **Strong direction.** Class identity = the *primary-attack archetype*, not ability count (Hades/RoR2/DRG/Gunfire). The meta-buff mechanism **already exists** (`StatModifier`+`StatRecomputeSystem`+`TimedModifier`); `AbilityRef.Id` = the class anchor; archetype stubs (Cone/Hitscan/Aoe) are wired-but-empty; 2 ability ids free | **Slice 2** (Warrior + Ranger) |
|
||||
| 1 | Procedural zones / Shape-of-Dreams loop + meta home base | **GREEN-feasible, pillar-safe.** ~70% of the chassis already exists (`ExpeditionFieldSystem` is a working epoch-seeded proc-gen seeder today) | **Slice 3** (expedition spine) + **Slice 4** (persistent meta) |
|
||||
|
||||
### The build program (gated slices; netcode-heavy ones run the adversarial design-review FIRST per [[validate-netcode-design-before-coding]])
|
||||
|
||||
- **Slice 1 — Combat Readability & HUD Declutter** (mostly client-side; the do-now wins):
|
||||
- **Enemy health bars** — world-space pooled bars in `CombatFeedbackSystem`, shown on the `Health.Current` decrease edge, ~3 s fade, **always-visible under 25 % HP**; cap the pool / nearest-N (horde clutter guard); **zero new replication**.
|
||||
- **Telegraph fix** — replace the hard-coded `22f` ramp denominator in `CombatFeedbackSystem.UpdateEnemyDanger()` with the **per-enemy windup duration** (read baked `EnemyStats`, safe client-side); raise `GruntWindupTicks`/`ChargerWindupTicks` (≥ interp-delay + ~250 ms reaction); add a **windup scale-pulse** (multi-sensory, on the already-detected `AttackWindup` 0→nonzero edge).
|
||||
- **Build-mode toggle** — a client-local `_buildModeOpen` bool; gate `_paletteRow.style.display` on it (was always-Flex on base); a Tab/gamepad bind + a "Build [Tab]" discovery chip; gate the `B/V/N/H/F/C` hotkeys on it.
|
||||
- **Charger committed-lunge tell** — a replicated lunge cue (a `[GhostEnabledBit]`/byte on the Charger; **one enemy-ghost re-bake**) + a persistent directional indicator in `CombatFeedbackSystem` (today the cue *vanishes* at lunge commit when `AttackWindup→0` — the exact opposite of correct timing).
|
||||
- **Slice 2 — Two Classes (Warrior / Ranger)** *(review-gated)*: route `MeleeComboSystem` damage through `EffectiveAbilityStats.Damage` (the single highest-impact edit — makes meta-buffs reach the melee verb; add `StatTarget.MeleeDamage` as a **byte**, Burst-ICE-safe); class anchor via `AbilityRef.Id` + a real `CharacterId` set; wire the **Cone** archetype (Warrior secondary) and keep the Ranger projectile; a second ability cooldown; a class-select UX; class-conditioned starting `StatModifier` seed. Avoid new `PlayerInput` buttons (player-ghost re-bake) — repurpose the Fire slot per-class.
|
||||
- **Slice 3 — Expedition Combat Spine** *(review-gated)*: reactivate `ExpeditionFieldSystem` → an **authored-arena pool** (Hades/Dead-Cells *pool-sampling*, **not** WFC/terrain-gen) sampled no-repeat by `ExpeditionEpoch`; a `ZoneEnemySpawnSystem` (`RegionTag{Expedition}`, reusing `WaveSystem` ring math); the **`EnemyAISystem` region-filter fix** (today its nearest-player query is global → expedition enemies would path to invisible base players); the **`ThreatDirector` phase-gate** (don't double-arm a retaliation siege on a mid-siege return); a **zone-clear reward** hook on `ExpeditionGateSystem` Base-bound transit (run-scoped `TimedModifier` + ledger deposit); a **replicated zone-theme byte** on the GLOBAL `CycleDirector` ghost (never region-tagged); wire the **required-spine loop** (sortie → clear → return → escalated siege). Manage `RegionRelevancySystem`'s O(ghosts×connections)/tick cost — cap expedition ghost count, keep cosmetic props **non-ghost**; amortise mass spawns across ticks.
|
||||
- **Slice 4 — Persistent Meta-Progression** *(review-gated + save-migration care)*: **SaveData v6** (additive; `MinLoadableVersion` unchanged → old saves 0-default) for a meta-currency, unlocked classes, and a persistent run/epoch counter; a between-runs growth surface at the base; **persist the seed, regenerate the layout** (the server reproduces the zone from the saved epoch — keep the generator a pure function of `(epoch, depth)` with stable ordering, never seeded off `ServerTick` or query-iteration order).
|
||||
|
||||
## Reconciliation with the locked pillars (why this is NOT a pivot away from the vision)
|
||||
|
||||
- **Pillar #4 ("persistent buildable home base + instanced/procedural expeditions") — FULFILLED.** This was always locked; the slice merely paused the expedition half.
|
||||
- **Pillar #5 ("never a roguelike run-reset") — PRESERVED.** Mission-as-Sortie never resets the base/gear/server state; only run-scoped buffs and the zone layout reset. Commercial proof: Ghost Ship built a **separate game** (DRG: Rogue Core) to add run-resets because the co-op base audience rejects them — Project M aligns with original-DRG, not Rogue Core.
|
||||
- **Combat = primary verb ([[DR-028_Combat_Primary_Verb_Depth_First]]) — REINFORCED.** The expedition is *more* combat, not a detour from it; classes deepen the verb.
|
||||
- **[[DR-031_Base_Mining_Loop_Cohesion]] — REVERSED, deliberately + logged.** DR-031 paused the expedition for slice focus; the playtest proved that focus is what made combat stale. The expedition is reactivated as the combat spine.
|
||||
|
||||
## Research backing (8-agent design + feasibility pass, this session — durable record)
|
||||
|
||||
- **Feasibility = GREEN** (DOTS/Netcode architect, context7-verified against Entities 6.5 / Netcode-for-Entities + ECS samples). Decisive fact: **server-spawns-ghosts ⇒ no seed replication, no cross-client determinism problem.** `ExpeditionFieldSystem` already does epoch-seeded deterministic scatter (`Unity.Mathematics.Random` seeded by `ExpeditionEpoch`, NOT tick/wall-clock) + `ecb.Instantiate` + `RegionTag{Expedition}` + relevancy-hide + teardown — a working proc-gen seeder *today*. Runtime ghosts (not prespawned-subscene ghosts) are the correct tool for procedural gameplay content (prespawn sync needs matching subscene-hash + ghost-id range + baseline hash — which procedural layouts can't satisfy). `SceneSystem.LoadSceneAsync` + `SceneLoadFlags.NewInstance` exists for ghostless cosmetic chunks but is the harder path; prefer runtime ghosts for gameplay + client-only decor off a replicated theme byte.
|
||||
- **Reconciliation model = Mission-as-Sortie** (hub-meta agent: DRG / Cult of the Lamb / Riftbreaker / Remnant 2 / Hades). Stale-arena root cause synthesised: the environment + enemy roster + objective are all fixed AND there's no visible session-to-session growth — Project M currently solves **none** of the three anti-fatigue levers (procedural venue variety / visible persistent growth / thematic zone variety). **Encounter variety > structural variety > cosmetic variety** (cosmetic-only fails within 2–3 runs).
|
||||
- **Shape of Dreams** (the named reference): co-op action-roguelite, 1–4p, 4 Memory slots + an Identity Memory (= the class anchor) + per-skill Essence augments, run-reset with **no persistent hub** — the operator's "modified to have a meta-progression home base" is exactly the delta Project M's base supplies. Steal: curated-room shuffle (not terrain gen), Identity-Memory-as-class-anchor, Essence-augments ≙ `StatModifier`, individual co-op loot. Avoid: the no-hub pure-run-reset; deep "arcane" constellation grind.
|
||||
- **Class kits**: 2–4 active abilities is the readable sweet spot; **melee-primary is the more skill-expressive first class**; augments layered additive→behavioral→transformative; co-op synergy via *complementary* range bands (melee Warrior + kiting Ranger) — directly motivates the two-class choice.
|
||||
- **Combat readability**: on-damage-sticky bars + fade + low-HP override (always-on clutters hordes); telegraph must ramp 0→1 ending *at* impact (the `22f` constant plateaus early for long windups); multi-sensory (shape+color+audio+scale) per Xbox XAG 103; world-space **Canvas** (not UITK world panels — Unity 6 sorting bugs vs the sortingOrder-50 HUD).
|
||||
- **Proc-gen content**: authored-arena **pool sampling** (Hades/Dead Cells/Gungeon), ~12–20 arenas/biome, no-repeat per run; **WFC is overkill**; the zone-clear *reward* hook is non-negotiable.
|
||||
|
||||
*(Full agent output + ~80 cited sources captured in the session transcript; key sources: Shape of Dreams Steam/reviews, DRG wiki + dev blogs, Hades/RoR2/Gunfire wikis, Cult of the Lamb / Remnant 2 / Riftbreaker design articles, Xbox XAG 103, gamedeveloper.com telegraphing + M.E.R.C. proc-gen, Dead Cells / Enter the Gungeon generation breakdowns, context7 Entities 6.5 / Netcode + ECS-samples.)*
|
||||
|
||||
## Consequences
|
||||
|
||||
- **The project's identity sharpens** from "single-arena base-defense demo" to "co-op roguelite-ARPG with a persistent buildable base" — the strongest version of the locked pillars, validated by the operator's own playtest.
|
||||
- **Low-risk first win**: Slice 1 (readability + declutter) materially improves the *current* build immediately, mostly client-side, no design review needed (except the small Charger re-bake).
|
||||
- **The heavy lifts reuse, not rebuild**: region split, runtime ghost-spawners, the `StatModifier`/`TimedModifier` meta-buff pipeline, the additive SaveData contract, the on-demand world lifecycle, and `ExpeditionFieldSystem` are all reused.
|
||||
- **Netcode correctness items flagged** (to be confirmed in each slice's design review): `EnemyAISystem` region-filter; `ThreatDirector` mid-siege return gate; `RegionRelevancySystem` per-tick cost + cosmetic-props-must-be-non-ghost; mass-spawn sync-point amortisation; new `StatTarget` bytes must stay byte-compared (Burst ICE); avoid new `PlayerInput` events (re-bake); persist-seed-regenerate-layout determinism.
|
||||
- **The slice is archived, not deleted** — [[End_Of_Month_Game_Jam_Slice]] gains a SUPERSEDED banner and remains a fallback/showcase; [[Path_to_Fun]] and [[Backlog]] are re-pointed at this direction; [[Pillars]] records the expedition-spine + 2-class + persistent-meta commitments; [[DR-035_End_Of_Month_Slice_Adoption]]'s "ship the minimum" Decision-Gate answer is **superseded** by this "continue/expand" answer.
|
||||
- **Open per-slice forks** (to lock at each slice's review): expedition depth (one zone/sortie vs sequential zones+boss); single shared expedition region vs per-party instances (shared recommended); zone-clear reward shape; class-select moment (menu vs at-base); meta-currency unlock surface. **Validation culture unchanged**: every slice ends with a falsifiable fun-gate, not a test count.
|
||||
Reference in New Issue
Block a user