d6d75b4706
Slice 2 complete: Warrior/Ranger, DRG-asymmetric, aim-directed cone, menu picker, class carrier via GoInGameRequest. Two VFX-polish items deferred (review-sanctioned). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
139 lines
24 KiB
Markdown
139 lines
24 KiB
Markdown
---
|
||
tags:
|
||
- roadmap
|
||
- backlog
|
||
- slice
|
||
updated: 2026-06-13
|
||
permalink: gamevault/06-roadmap/backlog
|
||
---
|
||
|
||
# Backlog
|
||
|
||
Open / candidate work only. **Done items live in [[Milestones]] + their DR / session log** (this file is intentionally
|
||
kept to the forward-looking pool — promote an item to [[Milestones|a milestone]] when committed, then drop it here).
|
||
Last decluttered 2026-06-08 (removed all shipped `[x]` items; their context is preserved in the linked records).
|
||
|
||
## NEXT — Co-op Roguelite Redirect (Procedural Expedition Spine + Two Classes + Persistent Meta) ★
|
||
|
||
**The operative target as of 2026-06-17 is [[DR-037_Procedural_Expedition_Spine_Two_Classes_Persistent_Meta]].** An operator playtest ([[Scratch Notes 6152026]]) found the single-arena slice **stale fast**; the operator answered the post-END-2 Decision Gate as **continue/expand** and re-scoped off the fixed June-30 deadline. New direction: a **co-op roguelite-ARPG** — base = persistent buildable **hub** (never resets), the procedural **Expedition region = the required combat spine**, **two classes** (Warrior melee / Ranger ranged), a **persistent meta layer** (SaveData v6), readability fixed first. **Mission-as-Sortie**, pillar-safe (fulfils pillar-#4, preserves the "never a run-reset" pillar). **No time estimates** (operator directive); every slice still ends with a falsifiable fun-gate + server==client validation; netcode-heavy slices run the adversarial design-review FIRST ([[validate-netcode-design-before-coding]]).
|
||
|
||
**Committed slices (sequence; ~70 % of the chassis already exists — reuse, don't rebuild):**
|
||
|
||
- **Slice 1 — Combat Readability & HUD Declutter** ✅ **BUILT + engineering-validated 2026-06-17 ([[DR-038_Slice1_Combat_Readability_HUD_Declutter]])** — on-damage-sticky **enemy health bars** (+fade, <25 %HP always-on) in `CombatFeedbackSystem` (`Health.Current` already replicated); **telegraph fix** (per-enemy baked `EnemyTelegraph` windup ramp replacing the hard-coded `22f` + windup 18→22 + a scale-pulse); **build-mode toggle** (client `BuildPaletteState.PaletteOpen` gates the palette + a "Tab/Y — BUILD" chip); **Charger committed-lunge tell** (`[GhostEnabledBit] IsLunging` derived once/tick — one Charger re-bake). 345/345 EditMode; Play-validated (handshake intact, bake correct, no runtime errors). **Open: operator visual fun-gate.**
|
||
- **Slice 2 — Two Classes (Warrior / Ranger)** ✅ **BUILT + validated 2026-06-18 ([[DR-039_Slice2_Two_Classes_Warrior_Ranger]])** — DRG-asymmetric (Warrior melee bruiser tankier/slower; Ranger ranged faster/squishier + co-op auto-assist hook); aim-directed Warrior cone (Cone archetype inline in `AbilityFireSystem`, server-only damage, same-tick); class carried on `GoInGameRequest.ClassId` (the per-world-`ConnectionConfig` blocker fixed) → `ClassTraits` seeds at spawn; character deltas via replicated `StatModifier` seeds on Default (no per-class blob); melee asymmetry folds in `MeleeComboSystem` (`StatTarget.MeleeDamage`/`MeleeRange`); menu class picker. 348/348 EditMode; Warrior Play-validated server==client (re-bake handshake intact). **Deferred polish:** cone client VFX + slash-arc reach. **Open: fun-gate (operator).**
|
||
- **Slice 3 — Expedition Combat Spine** *(review-gated)*: reactivate `ExpeditionFieldSystem` → **authored-arena pool** sampled by `ExpeditionEpoch` (pool-sampling, NOT WFC/terrain-gen); `ZoneEnemySpawnSystem` (`RegionTag{Expedition}`); the **`EnemyAISystem` region-filter fix**; the **`ThreatDirector` mid-siege-return gate**; a **zone-clear reward** on `ExpeditionGateSystem`; a **replicated zone-theme byte** on the global ghost; the required sortie→clear→return→escalated-siege loop. Manage `RegionRelevancySystem` per-tick cost (cap ghosts; cosmetic props non-ghost). Absorbs Path B MC-2 (enemy mix) intent.
|
||
- **Slice 4 — Persistent Meta-Progression** *(review-gated)*: **SaveData v6** (meta-currency, unlocked classes, persistent epoch); a between-runs growth surface at the hub; persist-the-seed-regenerate-the-layout (pure-function generator).
|
||
|
||
**Per-slice forks to lock at each review:** expedition depth (one zone vs sequential+boss); shared expedition region vs per-party instances (shared recommended); zone-clear reward shape; class-select moment (menu vs at-base); meta unlock surface.
|
||
|
||
**Already shipped & code-verified (do NOT rebuild — 13/14 slice systems):** movement, dash (MC-1, fun-gate PASSED 2026-06-10), melee combo (MC-4), ranged poke; base-local Ore mining (DR-031); Turret/Wall/Fabricator palette + UITK build HUD (DR-021); Ore→Fabricator→Charge→turret economy (EB-2 / DR-033); destructible structures (EB-1 / DR-032); soft-loss Engine Core integrity + overrun flash (END-1 / DR-034); SaveData v4 + frontend menu / Continue / build menu (DR-019). The audit: 9-agent grounded gap-analysis, 2026-06-13.
|
||
|
||
**END-2 (SL-3) is CODE-COMPLETE + validated (2026-06-13) — the Path-A blocker is CLEARED.** The goal meter now arms a visibly-larger final siege at `Charge>=Target` (=4) and latches a terminal **Victory** (survive it) / **Loss** (Core breached during it), with a HUD banner + run-halt. 342/342 EditMode green; Play-validated server==client + no ordering cycle; pre-coding + post-impl adversarial reviews. The **fun-gate** (does the climax land?) is the one open item → folds into SL-5. See [[DR-036_END2_Final_Siege_Win_Lose]] · [[2026-06-13_SL3_END2_Final_Siege_Win_Lose]]. **Charge cadence LOCKED 2026-06-13: siege-survived-only** (goal +1 per survived siege; "Both"/Aether-deposit deferred post-slice). See [[DR-035_End_Of_Month_Slice_Adoption#Locked fork — END-2 charge cadence (2026-06-13)]].
|
||
|
||
> **⚠️ SL-1…SL-7 below are SUPERSEDED (2026-06-17, [[DR-037_Procedural_Expedition_Spine_Two_Classes_Persistent_Meta]]) — kept as an archived reference.** The new committed work is Slices 1–4 above. SL-4's **visual cohesion** ("Aether Siege Outpost" palette + checklist) and SL-2's **loop-tuning** discipline still apply to the base hub and carry forward; SL-1's arena-cleanup and SL-3/END-2 (the final-siege win/lose, already shipped) remain in the build. The fixed June-30 packaging (SL-7) is dropped per the re-scope.
|
||
|
||
### SL-1 — Scope Lock & Arena Cleanup `Jun 13-15` · risk LOW
|
||
> **Largely DONE 2026-06-13** (with SL-4): ARPG camera locked to a research-grounded steeper telephoto (pitch 58 / dist 17 / FOV 44 so Core + arena read together); meadow noise removed (~390 cheer/village objects cut); the Ore annulus pulled into the arena (6–11.5 m, 12 nodes) + the Core staged as the hero. **Open:** the Pylon decision; final camera lock-in via the operator's playtest. See [[2026-06-13_SL1_SL4_Visual_Cohesion_Dark_Frontier]].
|
||
- **Goal:** one compact (<~20 m radius, single-camera) base-defense arena with the Core as the hero object; lock the slice doc as the frozen target; set ARPG camera framing.
|
||
- **Tasks:** confirm compact footprint + Core centered/dominant · hide/remove non-slice noise (expedition rift/warpgate/distracting props; keep perimeter dark & quiet) · tune `PrototypeCameraRig` (today Pitch 45° / Dist 13 / FOV 55 — verify player+enemies+2 structures+Core read in one view, dash trajectory visible) · verify Ore annulus (~10–12 nodes) spacing reads · **decide Pylon** (give the 4th palette entry a job + cyan accent, or cut it — slice names only Turret/Wall/Fabricator) · confirm Save/Continue (SaveData v4) is ready, no extra polish.
|
||
- **Fun-gate:** a new viewer IDs player/Ore/Turret/Husk/Core/ground in <1 s; arena reads as a "small industrial clearing," not a meadow; camera neither too close nor too wide.
|
||
- **Deps:** none.
|
||
|
||
### SL-2 — Loop Tuning `Jun 16-19` · risk MED (live knobs)
|
||
- **Goal:** dial the 5–8 min run — mine → build → fight → defend with readable pacing, no dead time, no constant pressure.
|
||
- **Tasks:** baseline a full run (mine ~2 min, build 2 Turret + 1 Wall + 1 Fabricator, survive 3 sieges) · tune Ore spawn rate + build costs (Turret 10 / Wall 4 / Fabricator 30 / Pylon 2 Ore) vs the 45 s (`ScheduleIntervalTicks=2700`) siege cadence · tune Fabricator recipe (1 Ore→3 Charge/30 t) + `TurretChargeCostPerShot` so the **felt spend** bites (turrets dry out without upkeep) · tune turret damage (Husk dies in ~8–12 shots) + wave growth (`SizeBase` + `ScheduleSizePerWave`) · validate Grunt/Charger mix (Chargers occasional, lunge telegraph readable) · kill Calm "AFK >90 s" dead-time · all via the live `TuningConfig` overlay (MC-0).
|
||
- **Fun-gate:** a fresh non-designer plays 5 min uncoached and reads mining as purposeful, building as a "prep" beat, waves as recognizable pressure, a siege death as "try again"; competent player finishes a run in 5–8 min.
|
||
- **Deps:** SL-1.
|
||
|
||
### SL-3 — END-2: Final Siege & Win/Lose (PATH-A BLOCKER) ✅ CODE-COMPLETE + validated 2026-06-13 (fun-gate → SL-5) · **review-gated** ★
|
||
> **Done 2026-06-13:** `RunPhase` (server-only) + `RunOutcome` (`[GhostField]`) on the CycleDirector ghost; new `GoalReachedSystem` arms the final siege (×live `FinalSiegeMultiplier`); `CyclePhaseSystem` latches Victory (final cleared) / Loss (Core breached) + halts the director; SaveData **v5** (a won/lost run loads finished, no re-arm); HUD terminal banner; `Target` 10→4. 342/342 EditMode green; Play-validated server==client + no ordering cycle. Spec/decisions [[DR-036_END2_Final_Siege_Win_Lose]] · session [[2026-06-13_SL3_END2_Final_Siege_Win_Lose]]. Open: operator fun-gate (climax feel) + SL-5's retry/quit-on-banner overlay + rich pre-final telegraph.
|
||
- **Goal:** the goal meter means something — at `GoalProgress.Charge >= Target` arm a visibly-larger **final siege**; surviving it latches a **Victory**, breaching the Core during it latches a **Loss**; both fire a clear HUD banner. Spec: [[Path_to_Fun#END-2 — The charge means something: the cap arms a final siege, win or lose]].
|
||
- **Charge cadence — LOCKED 2026-06-13: siege-survived-only** (goal +1 per survived siege, the existing single-writer; no Aether-deposit writer — "Both" deferred post-slice). [[DR-035_End_Of_Month_Slice_Adoption#Locked fork — END-2 charge cadence (2026-06-13)]].
|
||
- **Tasks:** add `RunPhase{byte Normal|FinalDefense}` + `RunOutcome{byte InProgress|Victory|Loss}` on the CycleDirector (server-only single-writer, **NOT `[GhostField]`** — avoid the ghost re-hash; derive client-side) · new server-only `GoalReachedSystem` `[UpdateAfter(CyclePhaseSystem)]`: on the `Charge>=Target` edge (guarded `RunPhase==Normal` → exactly-once) **clamp `Charge`**, arm the final siege via the existing `ThreatState.PendingSiegeSize` (×`FinalSiegeMultiplier`), set `FinalDefense` · in `CyclePhaseSystem` (keep it the **sole** `WaveState`/`Phase` writer — no second writer, DR-017 cycle hazard): final-`DefendCleared`→`Victory`, final-overrun→`Loss` · add live `FinalSiegeMultiplier` (~2–3×) to `TuningConfig` · client-only HUD victory/loss banner reusing END-1's `OverrunTick` edge-detect pattern · **run the adversarial design review BEFORE coding** (netcode/determinism/single-writer) per [[validate-netcode-design-before-coding]] · 4 EditMode tests (arms once, Victory edge, Loss edge, Charge clamp).
|
||
- **Fun-gate** (Path_to_Fun END-2): team sees the meter approach full + an Engine telegraph and **deliberately preps** (≥1 countable action); final siege `liveEnemyCount` peak ≥30 % over a normal siege; surviving fires a "we did it" banner read as game-end; final-overrun reads as "lost the final stand," distinct from a mid-run overrun.
|
||
- **Deps:** SL-1 (arena), SL-2 (tuned baseline). **No save-schema bump** (bytes derivable on load → SaveData stays v4).
|
||
|
||
### SL-4 — Visual Cohesion Pass `Jun 20-23` (parallel) · risk MED
|
||
> **Substantially DONE 2026-06-13** (research-grounded, screenshot-verified): the arena reads as a dark "Aether Siege Outpost" bullseye — dark teal-grey ground that recedes, cyan Core as the luminance peak, **amber** Ore ring, dark perimeter; ACES grade with gated bloom + cool-shadow/warm-highlight faction split + vignette; sun/ambient/fog darkened. **Faction palette COMPLETE 2026-06-13:** dark ground · cyan owned (Core bright + **structures** now cyan via `Mat_StructureOwned_Cyan`, muted below the Core) · amber Ore · orange Husks. Lighting **clarity-rebalanced** (`b10605a8c`) after the first pass over-darkened. **Remaining (polish + needs operator eyes):** orange-red Husk verification *during a siege*; the dark-when-unpowered structure dynamic (a small presentation system); 3 telegraphed spawn lanes + perimeter height-gate; minor (warm crate, Synty/Foliage grass shader). See [[2026-06-13_SL1_SL4_Visual_Cohesion_Dark_Frontier]] + the visual-direction research synthesis.
|
||
- **Goal:** "Aether Siege Outpost" read — dark/quiet ground, cyan owned vs orange-red hostile, Core as hero; pass the slice's Visual Cohesion Checklist (slice §203–216).
|
||
- **Tasks:** darken ground + neutral props (~40–50 %, recede them) · cyan emissive accents on player + all owned structures + Core (read at 13 m in motion) · orange-red on Husks + telegraphs · amber Ore legibility · 5–10 **dark** perimeter framing props (no sightline blockers, none brighter than Core) · post-FX: bloom only on Aether/Ore/attacks, reduce fog that washes silhouettes, subtle vignette, cool-shadow/warm-glow grade · re-test every asset import in Play (material-regression guard).
|
||
- **Fun-gate:** a blind watcher of a 5 s clip IDs Core="base defended", cyan="owned", orange="enemy", ground="background", arena="engineered space not meadow"; cyan/orange ≥2× brighter than ground.
|
||
- **Deps:** SL-1 (locked arena). Cut perimeter props first if it slips; keep darkening + emissive.
|
||
|
||
### SL-5 — Final Siege & Ending tuning `Jun 24-26` · risk MED
|
||
> **Code portion STARTED early 2026-06-13** (on the back of SL-3): the HUD **final-siege telegraph** (distinct "FINAL SIEGE INCOMING" / "HOLD THE ENGINE", derived from the replicated `Charge>=Target`) + the **retry/quit-on-banner overlay** (PLAY AGAIN = fresh Single run via `WorldLauncher.StartSession`; QUIT TO MENU = teardown; cursor kept visible via `AimReticleSystem`'s run-over exception) are SHIPPED + 342/342 green. **Remaining = tuning/playtest only:** `FinalSiegeMultiplier` values (2.0/2.5/3.0), the richer telegraph (Engine hum/sky shift), Victory/Loss banner feel, 3+ runs at 5–8 min, co-op desync check — and a Play **click-test** of the banner buttons. See [[2026-06-13_SL3_END2_Final_Siege_Win_Lose]].
|
||
- **Goal:** make the final siege feel climactic and the run a clear three-act (prep → conflict → climax/resolution); lock end-game messaging.
|
||
- **Tasks:** tune `FinalSiegeMultiplier` (test 2.0/2.5/3.0; final peak ≥30 % over normal) · add a final-siege **telegraph** (Engine hum/sky shift/HUD "FINAL SIEGE INCOMING", ≥3–5 s warning) · validate Victory banner only on final-`DefendCleared`, Loss banner distinct from mid-run overrun · autosave the victory/loss checkpoint + clean continue/retry/quit flow (no soft-lock) · clock 3+ runs at 5–8 min · co-op: both clients see the same outcome, no desync.
|
||
- **Fun-gate:** a new team unanimously reads the final siege as *different*, preps for it, and reads winning as winning (not "another siege cleared"); run duration 5–8 min ±1 across 3+ playthroughs.
|
||
- **Deps:** SL-3 (END-2), SL-4 (visual reads).
|
||
|
||
### SL-6 — Polish & Cut `Jun 27-29` · risk MED (scope-creep)
|
||
- **Goal:** play the whole run 5+× (solo + co-op), fix readability, cut confusing mechanics, tune feedback; screenshot-validate against the checklist.
|
||
- **Tasks:** 5+ full cycles, log confusing/dead/balance/clutter moments · HUD legibility at 1920×1080 (known vitals↔palette overlap — fix or accept) · combat feedback weight (hit freeze-frame/flash, turret-fire + Husk-death distinct, dash i-frame read) · structure-break + Core-breach feedback unmistakable · win/loss banner unmissable (play each 3×) · **enforce a code-freeze Jun 29 noon** (blockers + readability only after) · cut/defer anything unfinished (missing anims → placeholder vanish; responsive HUD → post-jam) · take 5–8 checklist screenshots · tag a stable backup.
|
||
- **Gate:** N/A (validation phase) — success = 5 clean playthroughs (no soft-lock/desync/progression-block), readable HUD, weighty feedback, unambiguous win/loss, screenshots match the checklist.
|
||
- **Deps:** SL-5.
|
||
|
||
### SL-7 — Package `Jun 30` · risk LOW–MED (build regressions)
|
||
- **Goal:** a reliable playable build (or reliable play path) for external viewing; no new systems, blockers-only fixes.
|
||
- **Tasks:** build the Windows player (`ProjectM/Build`), launch → menu → Single/Host/Join → full loop → quit → Continue · verify no magenta materials / missing sprites / missing audio at 1920×1080 (watch the URP global-settings `m_AssetVersion` build blocker — reset the stamp, don't regenerate) · optional LAN Host↔Join smoke · **content + code freeze Jun 29 noon / Jun 30 8 am** · capture 2–3 hero screenshots · write a hand-off note (what shipped / known-good / deferred / next steps) + **log the formal Decision Gate** (ship-and-stop vs. one Path B milestone) per [[Path_to_Fun#The Decision Gate (MANDATORY STOP after END-2)]].
|
||
- **Gate:** end-to-end playable, no crashes/soft-locks; a new player gets a clear win or loss in one 5–8 min run; shippable for a friend / itch demo.
|
||
- **Deps:** SL-6. Fallback: keep the editor-Play path as the demo if the standalone build regresses.
|
||
|
||
> **Path B stays provisional & unscheduled** (pick ONE after the post-slice Decision-Gate note — re-estimate first): MC-2 ranged+swarm+mix-director · MC-3 pure juice · MC-5 downed/revive · MC-6 multi-slot kit · EB-3 base repair · EB-4 tool-gated harvest · EB-5 craft combat power · END-5 1–4p scaling + NG+. *(END-3 Echo narrative + END-4 content-treadmill remain CUT.)* Path B forks stay open, locked via the present-the-forks ritual ([[DR-029_Path_A_Fork_Locks]] · [[present-forks-dont-auto-decide]]). The deferred backlog below is the post-slice menu, NOT slice work.
|
||
|
||
## PAUSED — Inventory · Equipment · Progression (roadmap [[DR-026_Inventory_Equipment_Progression_Foundation]] / [[DR-027_Equipment_Slots_Phase1]])
|
||
|
||
> Paused 2026-06-08 ([[DR-028_Combat_Primary_Verb_Depth_First]]): Phases 2–4 are more breadth on systems whose payoff is combat power — resume once the fight is fun. Phases 0–1 shipped and stand.
|
||
|
||
Phases 0 (inventory backbone) + 1 (equipment slots) shipped 2026-06-08. Remaining phases, in order:
|
||
|
||
- [ ] **Phase 2 — tool-gated harvesting** (NEXT): bake `RequiredToolType`/`RequiredToolTier` on `ResourceNode`/`BlightClutter`; `ResourceHarvestSystem` gates + scales yield by the owner's equipped Tool-slot tier (the Tool slot is already reserved + baked). The gear-tier progression loop. "Need a [tool]" HUD cue.
|
||
- [ ] **Phase 3 — crafting + per-player persistence**: extend the Fabricator to craft *items* into a player's inventory; equip-tier gates; additive `SaveData` v3 that restores inventory + equipment AND **replays equip** on load (effects are event-driven, so a buffer restore alone wouldn't re-add the StatModifiers).
|
||
- [ ] **Phase 4 — (optional) multi-slot spell loadout**: expand the single `AbilityRef` into primary + 2–3 hotkey ability slots (subsumes the old "multi-ability slots" item). Per-slot cooldowns/inputs.
|
||
- [ ] **Items/abilities UI pipeline** (was the deferred M3 item): icons + descriptions via a managed lookup keyed by `ItemId`/`AbilityId`, off the blob (the HUD inventory/equipment panels show names only today).
|
||
- [ ] **Multi-prefab ability variants** — *partly addressed by Phase 1* ([[DR-027_Equipment_Slots_Phase1]]): different weapons already swap the projectile prefab via `AbilityRef.Id` + the catalog. Only multiple cosmetic prefab variants *per single ability* remain (needs `ProjectileClassificationSystem` generalized beyond one shared prefab).
|
||
|
||
## Combat / enemies
|
||
|
||
- [ ] **Live interactive fire test** (focused Play: press fire → predicted projectile + dummy/Husk HP drop) — the server loop + replication are validated; the input→`AbilityFireSystem`→predict-spawn→classify path is only validated structurally.
|
||
- [ ] **Ranged Husk (Spitter)** — a server-spawned enemy-projectile subsystem for dodge depth (melee-only today).
|
||
- [ ] **Boss / per-wave composition weighting** (brutes later, swarms early) instead of flat round-robin; a "broodmaker" that spawns.
|
||
- [ ] **Server perf under wave load** — validate in a real standalone build (in-editor multi-world cost ruled out Burst; single-process ServerWorld+ClientWorld+physics+waves is the likely factor).
|
||
- [ ] **Projectile/pickup visuals** — primitive meshes/materials today; optional predicted client-side auto-target if the soft server reconcile feels off.
|
||
|
||
## Automation (M7 follow-ups)
|
||
|
||
- [ ] **Throughput visuals** (item-on-belt) — server-only machine buffers don't reach clients (they see only `PlacedStructure.Type`); add one small replicated byte if live belt visuals are wanted.
|
||
- [ ] **Relevancy ceiling** — `RegionRelevancySystem`'s O(structures×connections)/tick scan becomes load-bearing at high conveyor counts; batch it when counts grow.
|
||
- [ ] **Recipe depth** — multi-input fabricator recipes; fabricator→conveyor output chaining (give the fabricator a `MachineOutput`); per-machine distinct meshes (they reuse the Turret mesh as a placeholder).
|
||
|
||
## Frontend / infrastructure
|
||
|
||
- [ ] **Operator-run validation** — launch the Windows build → menu → Single/Host/Join; a real **2-build LAN Host↔Join**; MPPM co-op regression in default-editor mode.
|
||
- [ ] **Controls settings + key rebinding** (Input System rebinding UI) — out of the Graphics/Audio settings scope so far.
|
||
- [ ] **Full base-state saves** (placed structures done in M7; add threat/storage) — `SaveData` is versioned so this is additive.
|
||
- [ ] **Unity Relay** for remote (non-LAN) Host/Join — swap the endpoint source feeding `ConnectionConfig` (the frontend lifecycle is transport-agnostic).
|
||
- [ ] **Dedicated-server build** — the `RequestedPlayType==Server` auto-host branch is in but UNTESTED.
|
||
- [ ] **Volume-slider theming** — sliders render via the default runtime theme; swap to +/- cycle rows if a build shows them unstyled.
|
||
|
||
## Physics / character controller (M5b)
|
||
|
||
- [ ] **Multi-client CC interpolation validation** — live two-build/thin-client run to confirm remote-peer smoothness (predicted-only `CharacterInterpolation` variant is in; only single-client validated). Pairs with the M4 real-LAN two-build test.
|
||
- [ ] **Player-vs-player collision** — currently non-physical (`SimulateDynamicBody=false`); enable + handle masses if mutual push is wanted.
|
||
- [ ] **Gravity / verticality** — CC character is gravity-free + planar (no floor collider); add gravity + a ground collider + reconsider `SnapToGround` if terrain is introduced.
|
||
- [ ] **CC package version** — 1.4.2 declares `entities/physics@1.3.x` (resolves via SemVer floor); move to a CC build targeting Entities 6.x when published.
|
||
- [ ] **Physics-based hit detection** (lag compensation `NetCodePhysicsConfig` + `PhysicsWorldHistorySingleton`; projectiles as physics bodies; hard rotation lock via `PhysicsMass.InverseInertia=0`) — only if the swept-segment server check is replaced.
|
||
|
||
## World / visuals
|
||
|
||
- [ ] **Base-side cohesion accents** — cyan ordered-Aether lights + perimeter relief + tiled base ground (the Blightfield/biomes got the dressing budget; see [[DR-025_World_Environment_Redo_Natural_Frontier]]).
|
||
- [ ] **Clearing as a spatial mechanic** — cleared cells are juice + scrap only today; make them buildable / reveal hidden nodes (the "functional gating" fork).
|
||
- [ ] **Per-`Variant` clutter meshes** — `BlightClutter.Variant` is replicated + round-robined but the prefab is single-mesh (additive, no schema change).
|
||
- [ ] **Ghost-prop Synty reskin** — Storage / UpgradePickup ghosts still use placeholder meshes.
|
||
- [ ] **Decor LOD → cosmetic-only** — cosmetic prop LODs are world GameObjects; keep them off the server tick budget.
|
||
- [ ] **VFX-Graph hit/beam packs** + **BioHorror corrupted-zone accent set** (deferred art); **material fidelity** (ORM repack / small ShaderGraph + baked reflection probe).
|
||
|
||
## Cleanup (low value, deliberately deferred)
|
||
|
||
- [ ] **Optional code-tidy** (no behaviour change): `SettingsService` migrate-then-clamp ordering; `ConveyorTransportSystem`'s 6 parallel snapshot arrays → one struct array; `WorldFeedbackSystem.TintForResource` if-chain → lookup; `PlayerInputGatherSystem` device-active dedup. [[2026-06-06_Cleanup_Alignment]].
|