86 lines
17 KiB
Markdown
86 lines
17 KiB
Markdown
---
|
||
tags:
|
||
- roadmap
|
||
- backlog
|
||
updated: 2026-06-04
|
||
permalink: gamevault/06-roadmap/backlog
|
||
---
|
||
|
||
# Backlog
|
||
|
||
Unordered pool of candidate work. Promote to a [[Milestones|milestone]] when committed.
|
||
|
||
> **2026-06-04 Polish & backlog-clear pass** ([[2026-06-04_Polish_Backlog_Pass]], [[DR-016_Stage_G_Combat_Gameplay]]) — delivered + validated (EditMode 86→127): hygiene/reconcile; **+system tests for every M6 server system**; centralized `Tuning.cs` consts; replicated **wave number** on the HUD; procedural **ambient + combat juice** (camera punch / FOV hit-stop, kill-shot fanfare, respawn shimmer, reticle lock-on tether); **ghost-prop reskin** (Storage/Turret/Node distinct materials) + **SSAO/ACES post verified**; **timed/removable modifiers**, **enemy knockback**, **Husk attack telegraph**; and the **aim-drift fix** (movement-based camera look-ahead). Remaining from the selected Stage-G slice: ranged **Spitter**, **multi-prefab abilities**, + small fold-ins (storage proximity-gate, pickup auto-grant, standalone-debug RPC). Then Stages H (controls/UI) + I (multi-client harness + operator live runs).
|
||
|
||
> **2026-06-04 World-space cohesion pass** ([[2026-06-04_World_Space_Cohesion_Pass]], [[DR-018_World_Space_Cohesion_Pass]]) — delivered + validated (EditMode 127→**142**): **destructible "clearing"** (`BlightClutter` ghost smashed by the **unified** harvest sweep → Biomass scrap + smash juice, scattered/cleared with the expedition field); **build out the base** (additive `Wall`=5 / `Pylon`=6 buildables — Wall blocks the player, V/N keys); and a first **visual cohesion layer** (Aether cyan/orange material pair, the 3 new ghosts recoloured, the barren +1000 Blightfield turned into a 21-piece Synty rock/debris basin + orange wild-lights — relief via props, **no terrain**). In-editor Play introspected via execute_code; a 4-lens adversarial review (23→4) caught + fixed an immortal-shot-sink (fractional `ScrapPerHit` truncation). Base-side cohesion accents + clearing-as-gating deferred (see the 2026-06-04 follow-ups below).
|
||
|
||
- [x] Upgrade Unity 6.4 → 6.6 — done (now `6000.6.0a6`). Entities/Collections/Graphics → 6.5.0; **Netcode → 6.6.0 and Physics → 6.5.0 also renumbered into the editor line** (not independent 1.x as [[DR-001_Netcode_Test_Harness]] assumed). See [[2026-05-30_M1_Player_Slice]].
|
||
- [x] Define the core gameplay loop and the first predicted player ghost — delivered as M1 ([[2026-05-30_M1_Player_Slice]]).
|
||
- [x] **Re-validate the M1 play-tick on a stable Unity 6.x** — moot/subsumed 2026-06-04: M1–M6 are all runtime-validated on the stable **6.4.7** line (the 6.6 alpha netcode bug never affected 6.4.7). The original "blocked on 6.6 alpha" framing ([[DR-002_Unity66_Alpha_Netcode_Transport]]) no longer applies.
|
||
- [x] Replace template `SampleScene` with a dedicated bootstrap scene + gameplay subscene — **done 2026-06-04** ([[DR-017_Persistent_Base_Player_Driven_Pacing]]): dedicated **`Game.unity`** (duplicated from SampleScene to preserve the SubScene `_SceneAsset`/`_SceneGUID` Hash128 MCP would drop) is now `EditorBuildSettings` index 0; a minimal **`DevSandbox.unity`** carries the dev overlay. SampleScene retained as a reference (retire later).
|
||
- [x] Optional template cleanup: remove `com.unity.visualscripting`, `Assets/TutorialInfo/`, `Assets/Readme.asset` — **done 2026-06-03** (pre-M6 cleanup; see the "2026-06-03 Visual & Controls Polish" section below + [[2026-06-03_Pre_M6_Cleanup]]). Duplicate of the now-checked item there.
|
||
- [x] Decide **relay provider** before M4 — resolved: **Direct IP/LAN now, Unity Relay later** ([[DR-005_M4_Connection_Model_Direct_IP]], [[2026-06-01_M4_LAN_CoOp_And_Classification_Fix]]).
|
||
- [x] Decide home-base **grid 2D vs 3D** before M6 — resolved 2026-06-02: **planar single-level `int2` grid**, CellSize 1.0, 32×32 plot (full 3D/stacked deferred). Locked in `BaseGridMath` — [[DR-008_M5_HomeBase_BaseLayer_Storage]].
|
||
- [ ] Decide **production replication** (predicted vs server-only) before M7 (automation).
|
||
- [x] **M2 follow-up — Burst cache health** — confirmed clean 2026-06-03: warm focused play shows **no** "not a known Burst entry point" managed-fallback messages + fast (~3s) play-enter. The M2-era corruption is gone. [[2026-06-03_Pre_M6_Cleanup]] (orig [[2026-05-31_M2_Combat]] / [[DR-003_M2_Combat_Netcode_Architecture]]).
|
||
- [ ] **M2 follow-up — live interactive fire test** (focused Play Mode: press Space / LMB / RT → predicted projectile + dummy HP drop). The server combat loop + replication are validated; the input→`AbilityFireSystem`→predicted-spawn→classification path is only validated structurally.
|
||
- [x] **M2 follow-up — mouse-cursor aim for KBM** — done 2026-06-03: client-side camera ground-ray cursor aim rides the existing `PlayerInput.Aim` `[GhostField]` (no new netcode surface); device auto-switch (KBM/gamepad) replicated as a `byte`; strafe-while-aiming free. [[DR-012_Aim_Controls_Cursor_Gamepad]], [[2026-06-03_Aim_Controls_Cursor_Gamepad]].
|
||
- [x] **M2 follow-up — player death/respawn** — done in **M5.5**: derived `Dead` enableable gate (from replicated Health) + server `PlayerRespawnSystem` (full HP + reposition to base after a delay). [[DR-009_GameFeel_Identity_FirstBlood]]
|
||
- [ ] M2 polish — projectile/dummy visuals (primitive meshes/materials currently); optional predicted client-side auto-target if the soft server reconcile feels off.
|
||
- [ ] **M3 follow-up — UI/icon/description pipeline** for abilities (managed lookup keyed by `AbilityId`, off the blob). Deferred from M3 ([[2026-05-31_M3_Data_Driven_Abilities]]).
|
||
- [x] **M3 follow-up — timed / removable modifiers** — done 2026-06-04 ([[DR-016_Stage_G_Combat_Gameplay]]): a SEPARATE server-only `TimedModifier{SourceId,UntilTick}` buffer (keeps the replicated `StatModifier` layout byte-identical → no re-bake) + `TimedModifierExpirySystem` (expiry on `NetworkTick`) + `TimedModifierUtil.RemoveBySourceId` (clear-by-type). +4 EditMode tests.
|
||
- [ ] **M3 follow-up — multi-prefab abilities** (a per-ability *different* projectile ghost) needs `ProjectileClassificationSystem` generalized beyond the single shared prefab.
|
||
- [x] **M3 follow-up — standalone-server debug modifier path** via `IRpcCommand` — **done 2026-06-04** ([[DR-017_Persistent_Base_Player_Driven_Pacing]]): the dev-tools `DebugCommandRequest` RPC (unconditional wire type; `#if UNITY_EDITOR` send/receive) drives modifiers/resources/state over a real connection, superseding the in-editor-only static-poke `DebugModifierInjectionSystem`. (Still editor-gated; flip the systems' guard to `DEVELOPMENT_BUILD` to ship in a dev player build.)
|
||
- [x] **M3 follow-up — rate-limited turning** — done 2026-06-03 (pre-M6 cleanup): `PlayerAimSystem` now rotates `PlayerFacing` toward the aim target at `EffectiveCharacterStats.TurnRateRadiansPerSec` (authored 720°/s) instead of snapping; deterministic in the predicted loop (fixed-step `dt`, replays on rollback). [[2026-06-03_Pre_M6_Cleanup]].
|
||
- [ ] **M3 polish — pickup visuals** (primitive sphere/default material currently); pickup auto-grant feel (continuous overlap).
|
||
- [ ] **M5 follow-up — base/expedition subscene split + streaming (Option C)** — **superseded 2026-06-03 by [[DR-013_M6_Aether_Cycle_Region_Split]]** (coordinate-region + per-connection `GhostRelevancy` delivered the split without `SceneSystem` streaming). Kept only as a note for a future larger-world milestone where true async streaming is wanted; do NOT build streaming now. Original framing: the persistent-space split the locked world design ultimately needs (`SceneSystem.LoadSceneAsync`/`UnloadScene`, per-world load on the listen-server, enter-expedition/return-to-base transition). Deferred to its own world-architecture milestone — M6/M7 only need the anchor + grid, now done ([[DR-008_M5_HomeBase_BaseLayer_Storage]]). The physics-in-prediction + base-layer slices of M5 are done ([[DR-006_M5_Physics_In_Prediction]], [[DR-008_M5_HomeBase_BaseLayer_Storage]]).
|
||
- [ ] **M5 follow-up — shared-storage disk persistence** (host-only): runtime structures don't exist until M6, so nothing to save yet; add a thin per-record serialization slice (replayed through M6's placement path) after M6. `BaseAnchor`/`StorageEntry` are already flat/serialization-friendly.
|
||
- [ ] **M5 follow-up — storage interaction polish**: proximity gate the deposit/withdraw (the container carries `HitRadius`); real item/UI model beyond the fixed test item; multi-writer ordering beyond first-come server apply.
|
||
- [ ] **M5 follow-up — multi-client shared storage**: validate two clients see identical shared-storage buffer state (pairs with the deferred M5b multi-client interpolation + M4 two-build tests).
|
||
- [ ] **M5 follow-up — home-base visuals**: only an editor plot-bounds gizmo + a placeholder primitive container today; real ground/walls/structures arrive with M6. **Partly addressed 2026-06-04** ([[DR-018_World_Space_Cohesion_Pass]]): the +1000 Blightfield got a real rock/debris basin + wild-lights and the buildable Wall/Pylon read in-palette; the **base-side** cohesion accents (cyan lights / perimeter relief / tiled ground) remain open.
|
||
- [ ] ~~**M5 follow-up — same-tick movement**~~ — moot after M5b (the CC character runs in the predicted fixed-step group; M5's `PlayerMoveSystem` is deleted). See [[DR-007_M5b_Character_Controller_Package]].
|
||
- [ ] **M5b follow-up — multi-client CC interpolation validation**: live two-build / thin-client run to confirm remote-peer interpolation smoothness (predicted-only `CharacterInterpolation` variant is in; only single-client validated). Pairs with the deferred M4 real-LAN two-build test.
|
||
- [ ] **M5b follow-up — player-vs-player collision**: currently non-physical (`SimulateDynamicBody=false`); enable + handle masses if mutual push is wanted.
|
||
- [ ] **M5b follow-up — KinematicCharacterBody velocity ghost variant** (replicate RelativeVelocity/IsGrounded) if owner-prediction reconciliation looks jittery under latency.
|
||
- [ ] **M5b follow-up — gravity/verticality**: CC character is gravity-free + planar (no floor collider). Add gravity in the processor + a ground collider + reconsider `SnapToGround` if terrain/verticality is introduced.
|
||
- [ ] **M5b follow-up — CC package version**: 1.4.2 declares `entities/physics@1.3.x` (resolves via SemVer floor on our 6.4.0/1.4.6). Move to a CC build explicitly targeting Entities 6.x when published.
|
||
- [ ] **M5 follow-up — physics lag compensation** (`NetCodePhysicsConfig.EnableLagCompensation` + `PhysicsWorldHistorySingleton`) if/when physics-based hit detection replaces the swept-segment server check.
|
||
- [ ] **M5 follow-up — projectiles as physics bodies** (currently kinematic + swept hit); convert for projectile-vs-world collision.
|
||
- [ ] **M5 follow-up — hard rotation lock** (`PhysicsMass.InverseInertia=0`); `Rigidbody.FreezeRotation` is not honored by the DOTS baker, so rotation is held by per-tick angular-zero + aim write.
|
||
- [x] **Game identity defined** — sci-fi **frontier colony** fiction ([[Identity]]), layered over [[Pillars]] with no mechanical rework. Resolves the "mechanics without a fiction" gap. Delivered with M5.5 ([[DR-009_GameFeel_Identity_FirstBlood]]).
|
||
- [x] **M2 polish — projectile/dummy visuals** — addressed by the M5.5 emissive palette + URP post-processing (cyan crew, cyan projectiles, orange Husks, dark walls/ground). Real models/animation still deferred.
|
||
- [x] **M5.5 follow-up — auto-target on Husks** — done (deepening pass): `AbilityFireSystem` candidate query `.WithAny<TrainingDummyTag, EnemyTag>()`. [[2026-06-02_GameFeel_Deepening]]
|
||
- [x] **M5.5 follow-up — respawn safety** — done (deepening pass): replicated `RespawnInvuln` window (server-enforced damage immunity + HUD SHIELDED cue). [[2026-06-02_GameFeel_Deepening]]
|
||
- [x] **M5.5 follow-up — enemy variety + wave/threat director** — done (deepening pass): `WaveSystem` escalating waves (lull → spawn → clear → bigger) + 3 melee Husk variants (Grunt/Swarmer/Brute) round-robin from a baked pool. Ranged spitter + broodmaker/boss still open. [[2026-06-02_GameFeel_Deepening]]
|
||
- [ ] **Deepening follow-up — ranged Husk (Spitter)**: a server-spawned enemy-projectile subsystem for dodge depth (the next variety type; melee-only today).
|
||
- [ ] **Deepening follow-up — wave number on HUD**: needs a replicated game-state ghost (`WaveState` is server-only); the live "HUSKS N" count conveys threat for now.
|
||
- [ ] **Deepening follow-up — boss / per-wave composition weighting** (brutes later, swarms early) instead of flat round-robin; a "broodmaker" that spawns.
|
||
- [ ] **Deepening follow-up — server perf under wave load**: in-editor tick-batching (~1.25–1.75 ticks/frame) **investigated 2026-06-03** — Burst ruled out (confirmed healthy), so single-process multi-world cost (ServerWorld + ClientWorld + physics + Husk waves in one editor) is the likely factor; **validate in a real standalone build** remains open. [[2026-06-03_Pre_M6_Cleanup]].
|
||
- [ ] **M5.5 follow-up — real assets**: authored audio (replace procedural SFX), stylized hard-surface crew/structures + corrupted-biomech Husks (replace primitives), TextMeshPro HUD; add the URP **SSAO** renderer feature for more depth.
|
||
- [ ] **M5.5 follow-up — multi-client juice/HUD**: validate remote-player death VFX (interpolation-timeline `Health==0`) + per-client HUD under two clients (pairs with the deferred M4/M5b two-build tests).
|
||
- [ ] **M5.5 follow-up — difficulty balance**: Husks tuned for a real moving/shooting player (dmg 5, strike 48 ticks, speed 3, `MaxAlive` 6); revisit once movement/fire feel is tuned and enemy variety lands.
|
||
|
||
## 2026-06-03 Visual & Controls Polish follow-ups
|
||
|
||
Surfaced by the art/Synty/aim sessions ([[DR-010_Art_Import_URP_Conversion_Visual_Upgrade]], [[DR-011_Synty_World_VFX_Integration]], [[DR-012_Aim_Controls_Cursor_Gamepad]]).
|
||
|
||
- [x] **Cleanup — prune orphaned `Materials/Env/` materials** — done 2026-06-03 (pre-M6 cleanup): GUID-swept the retired BefourStudios decorative materials; zero-reference ones deleted, still-referenced kept. [[2026-06-03_Pre_M6_Cleanup]].
|
||
- [x] **Cleanup — remove Unity-template cruft** — done 2026-06-03 (pre-M6 cleanup): `com.unity.visualscripting` package, `Assets/TutorialInfo/`, `Assets/Readme.asset`. [[2026-06-03_Pre_M6_Cleanup]].
|
||
- [ ] **DR-010/011 follow-up — decor LOD → client-only/cosmetic subscene**: cosmetic prop LOD hierarchies currently bake into both worlds; move pure cosmetics off the server for tick budget.
|
||
- [ ] **DR-011 follow-up — character models / DOTS skeletal animation**: player + Husks remain primitives; swap for real rigged models when the character pack lands.
|
||
- [ ] **DR-011 follow-up — VFX-Graph hit/beam packs**: the GabrielAguiar VFX-Graph subset needs separate URP setup if wanted (Shuriken packs already wired).
|
||
- [ ] **DR-011 follow-up — ghost-prop Synty reskin**: Storage/UpgradePickup ghosts still use BefourStudios meshes; reskin to Synty-style or simple emissive.
|
||
- [ ] **DR-011 follow-up — mixed-theme danger zones**: BioHorror/Synty corrupted-zone art for high-threat areas (deferred from the scope gate). **Partly addressed 2026-06-04**: the Blightfield now reads orange-wild via **all-Synty recolour** (rock/debris basin + wild-lights + orange clutter/nodes) per the [[DR-018_World_Space_Cohesion_Pass]] art fork; the **BioHorror** organic-corruption accent set is still deferred.
|
||
- [ ] **DR-012 follow-up — auto-target tuning**: priority/feel refinement; optional controller soft-target reticle snap (V Rising/Diablo-style).
|
||
- [ ] **DR-012 follow-up — rebindable controls + multi-ability slots**.
|
||
- [ ] **Pre-M6 cleanup follow-up — higher material fidelity**: ORM channels don't map uniformly to URP; a per-channel repack or small ORM ShaderGraph + baked reflection probe would deepen the look.
|
||
|
||
## 2026-06-04 World-space cohesion follow-ups
|
||
|
||
Surfaced by [[DR-018_World_Space_Cohesion_Pass]] (the balanced-slice scope deliberately left these for later).
|
||
|
||
- [ ] **Base-side cohesion accents**: cyan ordered-Aether lights + perimeter relief + re-enabled tiled base ground (deferred this pass to avoid clashing with the tuned SSAO/ACES look — the Blightfield got the dressing budget).
|
||
- [ ] **Clearing as a spatial mechanic**: shipped as juice + scrap only; make cleared cells buildable / reveal hidden nodes (the "functional gating" fork from the intake gate).
|
||
- [ ] **Build-palette HUD + ghost-preview**: dedicated V/N keys for now; a selectable palette + placement preview is the UX follow-up.
|
||
- [ ] **Per-`Variant` clutter meshes**: `BlightClutter.Variant` is replicated + round-robined but the prefab is single-mesh; swap per-variant meshes (additive, no schema change).
|
||
- [x] **Focused-editor validation** (2026-06-04): confirmed in Play — Wall **stops the player CC at the collider face** (X 2.50→3.257, server==client); Blightfield **reads orange-wild rock basin** vs cyan base (real player-view shots); **clutter-clear loop** deposits Biomass + shatters + replicates (BIO 0→10, clutter 14→13); node harvest works (AETHER 0→30). Console clean. **Still open:** deep basin density/lighting **feel-tuning**. |