diff --git a/Docs/Vault/00_Home/Home.md b/Docs/Vault/00_Home/Home.md index ea41f9a99..4dc2f594b 100644 --- a/Docs/Vault/00_Home/Home.md +++ b/Docs/Vault/00_Home/Home.md @@ -2,7 +2,7 @@ tags: - moc - home -updated: 2026-06-06 +updated: 2026-06-08 permalink: gamevault/00-home/home --- @@ -15,8 +15,8 @@ Multiplayer game on **Unity DOTS** (Entities) + **Netcode for Entities** (server - **Vision** → [[Pillars]] — design pillars & locked decisions · [[Identity]] — the fiction (sci-fi frontier colony) - **Game Design** → [[Systems_Index]] — per-system design docs - **Roadmap** → [[Milestones]] · [[Backlog]] -- **Sessions** → `07_Sessions/2026/` — dated work logs (latest: [[2026-06-06_Cleanup_Alignment]]) -- **Decisions** → `07_Sessions/_Decisions/` — decision records DR-001 … DR-021 · [[DR-001_Netcode_Test_Harness]] · latest [[DR-021_HUD_UITK_BuildPalette]] +- **Sessions** → `07_Sessions/2026/` — dated work logs (latest: [[2026-06-08_Equipment_Slots_Phase1]] · [[2026-06-08_Inventory_Equipment_Progression_Phase0]] · [[2026-06-08_World_Collision_HUD_Scaling]]) +- **Decisions** → `07_Sessions/_Decisions/` — decision records DR-001 … DR-027 · [[DR-001_Netcode_Test_Harness]] · latest [[DR-027_Equipment_Slots_Phase1]] - **Meta** → [[Documentation_Protocol]] · [[Tags]] - **Templates** → [[Session_Log_Template]] · [[Decision_Record_Template]] diff --git a/Docs/Vault/02_Game_Design/Data_Driven_Abilities.md b/Docs/Vault/02_Game_Design/Data_Driven_Abilities.md index e3064e9a6..bd4b38a0d 100644 --- a/Docs/Vault/02_Game_Design/Data_Driven_Abilities.md +++ b/Docs/Vault/02_Game_Design/Data_Driven_Abilities.md @@ -5,7 +5,7 @@ tags: - data-driven - m3 status: built -updated: 2026-05-31 +updated: 2026-06-08 permalink: gamevault/02-game-design/data-driven-abilities --- @@ -55,11 +55,9 @@ Move M2's hard-baked values onto the data model: `AbilityStats` + `Projectile`(D ## Open questions (defer to build) -- Modifier replication: ghost buffer of active modifiers vs. replicate a compact upgrade/loadout state and re-derive modifiers locally (less bandwidth). -- Recompute trigger: dirty-on-change vs every-tick (perf vs simplicity). -- How many/which sample abilities; whether to include a basic upgrade source (pickup/level) to exercise modifiers, or stub modifiers via the debug hook. -- UI/icon/description pipeline (managed lookup keyed by id). -- Tag/element taxonomy (kept minimal until needed). +- *Resolved at build (see [[DR-004_M3_DataDriven_Abilities_Modifiers]]): ghost-buffer modifier replication; recompute **every predicted tick** (not dirty-flag — rollback-correctness); sample abilities + a real pickup grant + a debug-injection source all shipped.* +- **Still open** — UI/icon/description pipeline (managed lookup keyed by `ItemId`/`AbilityId`, off the blob); see [[Backlog]]. +- **Still open** — Tag/element taxonomy (kept minimal until needed). ## Related -[[DR-003_M2_Combat_Netcode_Architecture]] (the stats this refactors) · [[Systems_Index]] · [[Pillars]] (server-authoritative + deterministic). +[[DR-003_M2_Combat_Netcode_Architecture]] (the stats this refactors) · [[DR-004_M3_DataDriven_Abilities_Modifiers]] (build-time decisions) · [[DR-026_Inventory_Equipment_Progression_Foundation]] + [[DR-027_Equipment_Slots_Phase1]] (the inventory/equipment layer reuses this modifier stack + the `AbilityRef` swap) · [[Systems_Index]] · [[Pillars]] (server-authoritative + deterministic). diff --git a/Docs/Vault/02_Game_Design/Systems_Index.md b/Docs/Vault/02_Game_Design/Systems_Index.md index 743067b55..cd1f05017 100644 --- a/Docs/Vault/02_Game_Design/Systems_Index.md +++ b/Docs/Vault/02_Game_Design/Systems_Index.md @@ -2,7 +2,7 @@ tags: - design - index -updated: 2026-06-06 +updated: 2026-06-08 permalink: gamevault/02-game-design/systems-index --- @@ -44,7 +44,7 @@ One design doc per gameplay system, linked here. Each should state: purpose, com ### Post-M8 — World-space cohesion pass (clearing + buildable Wall/Pylon + Blightfield dressing) · [[2026-06-04_World_Space_Cohesion_Pass]] -- **Components** (`ProjectM.Simulation`): `BlightClutter` (ownerless-interpolated ghost — `[GhostField]` Remaining+Variant, server-only ScrapResourceId/ScrapPerHit; RegionTag{Expedition} **sibling of `ResourceNode`**) + `ClutterFieldSpawner` (optional baked singleton); `StructureType.Wall=5`/`Pylon=6` (byte consts; 2–4 stay reserved for M7). +- **Components** (`ProjectM.Simulation`): `BlightClutter` (ownerless-interpolated ghost — `[GhostField]` Remaining+Variant, server-only ScrapResourceId/ScrapPerHit; RegionTag{Expedition} **sibling of `ResourceNode`**) + `ClutterFieldSpawner` (optional baked singleton); `StructureType.Wall=5`/`Pylon=6` (byte consts; 2–4 are now in use by the M7 production machines — Harvester/Conveyor/Fabricator). - **Systems:** `ResourceHarvestSystem` **unified** to sweep nodes AND clutter in one best-target loop (required — two separate sweeps would double-destroy an overlapping projectile at ECB playback; `math.max(1,(int)yield)` guards the immortal-sink); `ExpeditionFieldSystem` scatters/clears clutter beside the node field (distinct seed); `BuildPlaceSystem` **unchanged** (already type-generic) — new generic `StructureAuthoring{byte Kind}` + two additive `StructureCatalog` rows + `BuildSendSystem` V/N keys. Client: `WorldFeedbackSystem` (observe-only `PresentationSystemGroup` — chip/shatter juice, proximity-gated so region-transit stays silent) + live-tunable `WorldFeelConfig`. - **Netcode/world shape:** clutter = ownerless interpolated, region-scoped via GhostRelevancy (like nodes); Wall/Pylon = ownerless interpolated structure ghosts (`PlacedStructure.Type` byte-additive → **no re-bake**); Wall carries a `PhysicsCollider` (CC-blocking), Pylon cosmetic. Visual: `M_Aether_Wild`/`M_Aether_Ordered` palette materials + a classic-URP Blightfield rock basin in `Game.unity` (relief via props, **no terrain**). Status: **built + validated** (EditMode **142/142**; in-editor Play introspected via execute_code; 4-lens adversarial review → 4 findings fixed). Decisions: [[DR-018_World_Space_Cohesion_Pass]] (builds on the M6 region split / build pipeline + M8 persistent base — those systems are documented in their DRs). @@ -59,6 +59,14 @@ One design doc per gameplay system, linked here. Each should state: purpose, com - **Client (presentation/UI):** `HudSystem` rewritten on **UI Toolkit** (client `PresentationSystemGroup`, observe-only) — a runtime UIDocument (shared `RuntimePanelSettings`, sortingOrder 50 behind the pause overlay; root `pickingMode=Ignore`) in the Aether-cyan `MenuUi`/`HudUi` palette: health+cooldown bars, HUSKS, phase/cycle/countdown + resources + location + goal, DOWNED overlay, and a **build-palette bar** lazy-built from the client `StructureCatalog` (cost + affordability + selection highlight). `BuildPaletteState` (client-local), `BuildPreviewMath` (pure validity, unit-tested), `BuildSendSystem` (cursor→cell ground **ghost** green/red, left-click place, right-click/Esc cancel, [/]/R rotate; self-contained guards), `PlayerInputGatherSystem` (fire suppressed in build mode), `PauseMenuController.Open` (pause guard). `CombatFeedbackSystem` damage numbers re-skinned to the Aether/Blight palette. - **Netcode shape:** none new — UI observes replicated state (ledger/cycle/goal/player ghost) + the client-baked catalog; placement reuses the M7 `BuildPlaceRequest` RPC (server-authoritative). Status: **built + runtime-validated** (UITK render + palette + selection + ground ghost + placement; EditMode **194/194**). Decisions: [[DR-021_HUD_UITK_BuildPalette]] (builds on [[DR-019_Frontend_Menu_Settings_Saves_Build]] UITK frontend + [[DR-020_M7_Automation_Production_Chains]] structures). +### Items · Inventory · Equipment — Phase 0 (backbone) + Phase 1 (slots) · [[2026-06-08_Inventory_Equipment_Progression_Phase0]] · [[2026-06-08_Equipment_Slots_Phase1]] + +- **Components** (`ProjectM.Simulation/Items`): `ItemDatabase` (singleton `BlobAssetReference`; `ItemDefBlob{ushort ItemId; byte Category; byte Tier; int StackMax; FixedString64Bytes Name; byte EquipSlot; byte GrantedAbilityId; 4× INLINE ItemModSpec}` — ID-keyed `TryGetItem`; **inline mods, NOT a nested BlobArray** since `TryGetItem` returns by value; zero-code content adds); `InventorySlot` (`[GhostField]` buffer, `OwnerSendType.All` — per-player bag) + pure `InventoryMath` (deposit/withdraw/stack-cap/`CanDeposit`); `EquipmentSlot` (`[GhostField]` buffer, **index = slot** — Weapon=0/Armor=1/Trinket=2/Tool=3) + `EquipSlotId`; `DefaultAbility` (baked, non-replicated, unarmed fallback); `InventoryDepositRequest`/`EquipRequest`/`UnequipRequest` (`IRpcCommand`s). Equip stat-mods tagged `Tuning.EquipSourceIdBase+slot`. +- **Systems:** server (`ProjectM.Server/Economy`, plain `SimulationSystemGroup`, NOT predicted) — `ResourceHarvestSystem` rerouted to deposit harvest into the owner's bag (owner via optional `ComponentLookup`; remainder/un-owned → global ledger); `InventoryDepositSystem` (bag → ledger via the `G` RPC); `EquipSystem` (event-driven equip/unequip: move item bag↔slot ATOMICALLY — no item loss; weapon→`AbilityRef.Id`, gear→`StatModifier`s stripped target-agnostically via `RemoveBySourceId`; `DefaultAbility` on weapon-unequip). Client: `InventoryDepositSendSystem` (`G`) / `EquipSendSystem` (keys 1-9 / U + build-safe static hooks); `HudSystem` inventory + equipment panels (observe-only, click-to-equip). Authoring: `ItemDefinition` SO + `ItemDatabaseAuthoring` baker. +- **Netcode shape:** `InventorySlot`/`EquipmentSlot`/`StatModifier` = `[GhostField]` `OwnerSendType.All` buffers on the owner-predicted player → replicate to the owner; the **server is the sole writer** (event-driven, plain group → no rollback double-apply). Equip effects fold through the predicted `StatRecomputeSystem` + the already-replicated `AbilityRef`, so the swap is prediction-correct with no client equip-prediction. Catalog = baked config (identical both worlds, NOT replicated). Session-only (no save persistence yet — Phase 3). Status: **built + Play-validated** (236/236 EditMode). Decisions: [[DR-026_Inventory_Equipment_Progression_Foundation]] (Phase 0), [[DR-027_Equipment_Slots_Phase1]] (Phase 1). Forward roadmap (Phase 2 tool-gated harvesting → Phase 4) in [[Backlog]]. + +> **Systems documented in their DRs/session logs but not yet given a full section here:** aim controls ([[DR-012_Aim_Controls_Cursor_Gamepad]]), persistent base + player-driven pacing ([[DR-017_Persistent_Base_Player_Driven_Pacing]]), frontend menu/settings/saves ([[DR-019_Frontend_Menu_Settings_Saves_Build]]), animation pipeline ([[DR-022_Animation_Pipeline_Rukhanka_Synty]] / [[DR-023_Enemy_Animation_MonsterMash]]), HUD Synty skin ([[DR-024_HUD_Synty_Skin_Theme]]), world environment + collision ([[DR-025_World_Environment_Redo_Natural_Frontier]] / [[2026-06-08_World_Collision_HUD_Scaling]]). + ## Conventions DOTS/ECS conventions live in repo `CLAUDE.md` and the `dots-dev` skill's `dots-conventions.md`. Don't duplicate volatile API details here — link to context7-derived notes instead. \ No newline at end of file diff --git a/Docs/Vault/06_Roadmap/Backlog.md b/Docs/Vault/06_Roadmap/Backlog.md index 34eb17c2b..4ef377c03 100644 --- a/Docs/Vault/06_Roadmap/Backlog.md +++ b/Docs/Vault/06_Roadmap/Backlog.md @@ -2,110 +2,66 @@ tags: - roadmap - backlog -updated: 2026-06-06 +updated: 2026-06-08 permalink: gamevault/06-roadmap/backlog --- # Backlog -Unordered pool of candidate work. Promote to a [[Milestones|milestone]] when committed. +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). -> **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). +## NEXT — Inventory · Equipment · Progression (roadmap [[DR-026_Inventory_Equipment_Progression_Foundation]] / [[DR-027_Equipment_Slots_Phase1]]) -> **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). +Phases 0 (inventory backbone) + 1 (equipment slots) shipped 2026-06-08. Remaining phases, in order: -> **2026-06-05 Game infrastructure** ([[2026-06-05_Game_Infrastructure_Menu_Settings_Saves]], [[DR-019_Frontend_Menu_Settings_Saves_Build]]) — delivered + runtime-validated (EditMode 142→**152**): a **UI Toolkit main menu** (Single/Host/Join+IP/Continue/Settings/Quit) on the **Netcode frontend pattern** (on-demand `Create*World`, subscene streams into them, frame-boundary `DisposeAllWorlds` teardown, MenuWorld recreated on return); **Graphics + Audio settings** that drive the engine (`SettingsService` JSON at `persistentDataPath`; `GameVolume` Master/Music/Sfx buses); a **saves foundation** (versioned single-slot JSON, **born-correct** goal/ledger load at director spawn, autosave on Siege→Calm + quit-to-menu); editor `ProjectM/Build/Windows Player` + Boot-Into-Menu toggle; build order MainMenu(0)/Game(1). Editor instant-play + MPPM loop unchanged by default. +- [ ] **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). -> **2026-06-05 M7 — Automation** ([[2026-06-05_M7_Automation]], [[DR-020_M7_Automation_Production_Chains]]) — delivered + runtime-validated (EditMode 152→**190**): the full **Harvester → Conveyor → Fabricator** self-running chain (server-only, deterministic), auto-gathering EXISTING resources (default 2 Ore → 1 Aether) into the global ledger; **SaveData v2** structure persistence (quit autosave → Continue restore, charge-free, born-correct, chain resumes); deterministic conveyor (`ConveyorMath.ResolveMoves`, shuffle-invariant); single gated catch-up (`ProductionMath`); one-shot `BaseRestoreSystem`; `RuntimePlacedTag` source-of-truth; 3 machine prefabs duplicated from `Turret.prefab` + catalog rows. +## Combat / enemies -> **2026-06-06 Cleanup & alignment** ([[2026-06-06_Cleanup_Alignment]]) — repo hygiene before more dev (no gameplay change): deleted crash-recovery scenes (`_Recovery/`) + a stray empty `Assets/Resources.meta`; removed the legacy IMGUI `ConnectionUI` (3 scenes + script + 4 stale comments); DRY'd the duplicated UITK `Round`/`Border` helpers into `MenuUi` (canonical) + small HUD/build-input tidy (husk-count cache, table-driven build hotkeys); re-aligned `CLAUDE.md` (scene split, on-demand frontend, M7 Automation, disk persistence, UITK HUD, new build-gotchas) + the vault roadmap to the three 2026-06-05 sessions. EditMode green, console clean; landed as grouped commits. +- [ ] **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. -### 2026-06-06 Cleanup follow-ups -- [ ] **Optional further code-tidy** (low value; deliberately skipped this pass to limit churn on freshly-validated systems — none affect behavior): `SettingsService` migrate-then-clamp ordering; `ConveyorTransportSystem`'s 6 parallel snapshot arrays → one struct array; `WorldFeedbackSystem.TintForResource` if-chain → byte→Color lookup; `PlayerInputGatherSystem` device-active dedup. [[2026-06-06_Cleanup_Alignment]]. +## Automation (M7 follow-ups) -### 2026-06-05 M7 Automation follow-ups -- [ ] **Throughput visuals** (item-on-belt): server-only machine buffers don't reach the client (clients see only `PlacedStructure.Type`); add ONE small replicated byte if live belt visuals are wanted. -- [x] **Build-palette HUD + ghost preview** — done 2026-06-05: UITK build-palette bar (6 buildables + cost + affordability + selection) + click-to-place with a green/red ground ghost, conveyor rotate, fire-suppress. Conveyor-facing arrow/icons still open. [[DR-021_HUD_UITK_BuildPalette]], [[2026-06-05_HUD_Rework_UITK_BuildPalette]]. -- [ ] **Relevancy ceiling** — `RegionRelevancySystem`'s O(structures×connections)/tick scan becomes load-bearing at higher conveyor counts (DR-014 ceiling note); batch it when counts grow. -- [ ] **Recipe depth** — multi-input fabricator recipes; fabricator→conveyor output chaining (additive: give the fabricator a `MachineOutput`); per-machine distinct meshes (machines reuse the Turret mesh as a placeholder). -- [ ] **Operator live play-through** of the chain + a real 2-build LAN run under latency (single-client validated this pass). +- [ ] **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). -### 2026-06-05 Game-infrastructure follow-ups -- [x] **Build the standalone** — the first player build hit a pre-existing URP blocker (`UniversalRenderPipelineGlobalSettings` `m_AssetVersion=11` > package `k_LastVersion=10`, from the reverted 6.6 alpha; URP migrates forward-only so its build preprocessor rejected it — blocked builds, not editor Play). Fixed (reset the stamp to 10); `ProjectM/Build/Windows Player` now produces a complete Mono Win64 standalone (`Builds/Windows/`, both scenes + baked subscene). See [[2026-06-05_Game_Infrastructure_Menu_Settings_Saves]]. -- [ ] **Operator-run validation**: launch `Builds/Windows/ProjectM.exe` → confirm it boots the menu → Single/Host/Join play; a real **2-build LAN Host↔Join**; MPPM co-op regression in default-editor mode. -- [ ] **Controls settings + key rebinding** (Input System rebinding UI) — deliberately out of the Graphics/Audio scope this pass. -- [ ] **Full base-state saves** (placed structures / threat / storage) — the `SaveData` schema is versioned so this is additive (no migration of the ledger/goal slice). +## 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 this pass. -- [x] **Remove the legacy IMGUI `ConnectionUI`** — done 2026-06-06 (cleanup pass): the `NetConnectionUI` GameObject removed from `Game.unity` / `DevSandbox.unity` / `SampleScene.unity`, `ConnectionUI.cs` deleted, and the 4 stale doc-comments repointed to the UITK `MainMenuController` / `WorldLauncher`. The UITK frontend menu now owns Host/Join+IP everywhere. [[2026-06-06_Cleanup_Alignment]]. -- [ ] **Volume-slider theming**: sliders render via the default runtime theme; if a real build shows them unstyled, swap to +/- cycle rows (the enum settings already use cycle rows). -- [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]]. -- [x] Decide **production replication** (predicted vs server-only) before M7 (automation) — resolved 2026-06-05: **server-only** (production runs in the plain server `SimulationSystemGroup` `[UpdateAfter(PredictedSimulationSystemGroup)]`; results replicate via the existing global ledger + `PlacedStructure` ghosts, never predicted; per-machine I/O buffers stay server-only). Delivered as **M7** ([[DR-020_M7_Automation_Production_Chains]], [[2026-06-05_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()`. [[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. +- [ ] **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. -## 2026-06-03 Visual & Controls Polish follow-ups +## Physics / character controller (M5b) -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]]). +- [ ] **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. -- [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. +## World / visuals -## 2026-06-04 World-space cohesion follow-ups +- [ ] **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). -Surfaced by [[DR-018_World_Space_Cohesion_Pass]] (the balanced-slice scope deliberately left these for later). +## Cleanup (low value, deliberately deferred) -- [ ] **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). -- [x] **Build-palette HUD + ghost-preview** — done 2026-06-05 (UITK palette + click-to-place ground ghost). [[DR-021_HUD_UITK_BuildPalette]]. -- [ ] **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**. \ No newline at end of file +- [ ] **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]]. diff --git a/Docs/Vault/06_Roadmap/Milestones.md b/Docs/Vault/06_Roadmap/Milestones.md index 73552a32c..461134459 100644 --- a/Docs/Vault/06_Roadmap/Milestones.md +++ b/Docs/Vault/06_Roadmap/Milestones.md @@ -2,7 +2,7 @@ tags: - roadmap - milestones -updated: 2026-06-06 +updated: 2026-06-08 permalink: gamevault/06-roadmap/milestones --- @@ -26,5 +26,11 @@ permalink: gamevault/06-roadmap/milestones | **M7 — Automation** | Self-running tick-based production chains (deterministic offline catch-up) | ✅ Done 2026-06-05 — **full Harvester → Conveyor → Fabricator chain, server-only + deterministic, auto-gathering EXISTING resources (default 2 Ore → 1 Aether) into the global ledger so setup compounds; persistence folded in (SaveData v2).** Runtime-validated on 6.4.7 (real netcode worlds): catalog bakes the 3 machine ghost prefabs; a placed live chain runs end-to-end (Ore cost withdrawn; Harvester→Conveyor→Fabricator→ledger), **server Aether == client Aether** (replicated); quit autosaved v2 (3 structures + epoch-independent REMAINING-tick cooldowns), Continue restored all 3 charge-free at the exact cells with born-correct ledger and the chain **resumed producing**. Deterministic conveyor (snapshot→stable-sort→at-most-one-claim→stall, shuffle-invariant); single gated catch-up path (`CyclesDue` lower-bound 0, input-limited, period-0-guarded); one-shot `BaseRestoreSystem`; `RuntimePlacedTag` single-source-of-truth. EditMode **190/190**. Resolves "production replication = **server-only**". — [[DR-020_M7_Automation_Production_Chains]], [[2026-06-05_M7_Automation]] | | **— 2026-06-05 HUD rework (UITK + build palette) —** | Convert the in-game HUD to UI Toolkit (consistent with the menu / pause / settings) + a full build-palette HUD: click-to-place with a green/red ground-ghost, conveyor rotate, fire-suppress; combat juice re-skinned to the Aether palette. | ✅ Done 2026-06-05 — runtime-validated (real netcode session): UITK HUD renders all panels; palette shows 6 buildables + costs; selection highlights + a live ground ghost; placement via the build RPC works. EditMode **190→194**. — [[DR-021_HUD_UITK_BuildPalette]], [[2026-06-05_HUD_Rework_UITK_BuildPalette]] | | **— 2026-06-06 Cleanup & alignment —** | Repo hygiene before more dev: delete dead assets (`_Recovery/`, stray `Resources.meta`), remove the legacy IMGUI `ConnectionUI` (scenes + script + stale comments), DRY the UITK `Round`/`Border` helpers + small HUD/build refactors, and align `CLAUDE.md` + the vault to the scene split / Automation / Saves / UITK surfaces. | ✅ Done 2026-06-06 — EditMode green, console clean; grouped commits. — [[2026-06-06_Cleanup_Alignment]] | +| **— 2026-06-06 Animation pipeline (Rukhanka)** | Entities-native skeletal animation: Synty Polygon characters rigged + driven by client-derived params (animation NOT replicated → derived from replicated state). | ✅ Done 2026-06-06 — Rukhanka 2.9 local pkg; `PlayerAnimationDriveSystem` reads replicated state → `AnimatorParametersAspect`; `AnimatedLitShader` deformation; `ServerStripAnimationSystem` disables Rukhanka on the server. [[DR-022_Animation_Pipeline_Rukhanka_Synty]], [[2026-06-06_Animation_Pipeline_Slice1]] | +| **— 2026-06-06 Enemy animation + Synty content** | Animate the Husks by reusing the player pipeline + inventory the Synty packs for enemy/world picks. | ✅ Done 2026-06-06 — `EnemyAnimationDriveSystem` (remote-path velocity from `LocalTransform` delta); 3 animated enemy prefabs wired via `EnemyRigTools` (GUID-preserving). [[DR-023_Enemy_Animation_MonsterMash]], [[2026-06-06_Enemy_Animation_Synty_Inventory]] | +| **— 2026-06-07 HUD Synty visual pass** | Skin the UITK HUD with the Synty sci-fi-soldier kit via a build-safe theme. | ✅ Done 2026-06-07 — curated `HudTheme` ScriptableObject (serialized refs, null-safe flat fallback); per-resource cost icons on the build palette. [[DR-024_HUD_Synty_Skin_Theme]], [[2026-06-07_HUD_Synty_Visual_Pass]] | +| **— 2026-06-08 World environment redo** | Replace the sci-fi-colony dressing with off-world natural-frontier Synty biomes (cosmetic). | ✅ Done 2026-06-08 — `BaseBiome`(Meadow_Forest)@origin + `ExpeditionBiome`(Arid_Desert)@+1000 classic-URP cosmetics; global procedural skybox; per-region fog/ambient cross-fade (`WorldAtmosphereSystem`). [[DR-025_World_Environment_Redo_Natural_Frontier]], [[2026-06-08_World_Environment_Redo]] | +| **— 2026-06-08 World collision + HUD scaling** | Restore world collision (lost when DR-025 made the world cosmetic) + fix HUD scaling in Play. | ✅ Done 2026-06-08 — subscene `Environment`-layer boundary ring + landmark colliders (`WorldCollisionConfig`; player blocked via the layer matrix; enemy `CollisionWorld.SphereCast`); HUD ConstantPhysicalSize→ScaleWithScreenSize. [[2026-06-08_World_Collision_HUD_Scaling]] | +| **— 2026-06-08 Inventory · Equipment (Phase 0 + 1)** | Expand combat + harvesting into per-player inventory + equipment slots that grant abilities/effects, built on the existing data-driven spine (ItemDatabase catalog, StatModifier stack, AbilityRef swap). | ✅ Done 2026-06-08 — **Phase 0**: per-player replicated `InventorySlot` buffer + ID-keyed `ItemDatabase` blob catalog + harvest reroute to the personal bag + `G` deposit-to-ledger RPC + read-only HUD panel. **Phase 1**: `EquipmentSlot` (Weapon/Armor/Trinket/Tool), weapon→`AbilityRef.Id` ability swap, gear→`StatModifier` mods (per-slot sentinels), event-driven server `EquipSystem`, click-to-equip HUD. Architecture pre-validated by 5-/4-lens adversarial review; 236/236 EditMode; Play-validated host+client. **Next: Phase 2 tool-gated harvesting** (see [[Backlog]]). [[DR-026_Inventory_Equipment_Progression_Foundation]], [[DR-027_Equipment_Slots_Phase1]] | Promote items from [[Backlog]] here when committed. \ No newline at end of file diff --git a/Docs/Vault/07_Sessions/_Decisions/DR-026_Inventory_Equipment_Progression_Foundation.md b/Docs/Vault/07_Sessions/_Decisions/DR-026_Inventory_Equipment_Progression_Foundation.md index d0d5d70a1..a3762c121 100644 --- a/Docs/Vault/07_Sessions/_Decisions/DR-026_Inventory_Equipment_Progression_Foundation.md +++ b/Docs/Vault/07_Sessions/_Decisions/DR-026_Inventory_Equipment_Progression_Foundation.md @@ -57,11 +57,13 @@ which this DR's decisions incorporate. ### Phased roadmap (each phase = its own approved slice) -- **Phase 0 — backbone (THIS session):** `ItemDatabase` catalog + per-player replicated `InventorySlot` buffer + - harvest reroute to personal inventory + deposit-to-base RPC + read-only HUD inventory panel. -- **Phase 1 — equipment + effects:** `EquipmentSlot` buffer (Weapon/Tool/Armor/Trinket); `EquipmentEffectSystem` - syncs catalog modifiers into the `StatModifier` stack + sets `AbilityRef.Id` from the equipped weapon; equip RPC. -- **Phase 2 — tool-gated harvesting:** `RequiredToolType`/`RequiredToolTier` baked on `ResourceNode`; harvest gates + +- **Phase 0 — backbone — ✅ DONE 2026-06-08:** `ItemDatabase` catalog + per-player replicated `InventorySlot` buffer + + harvest reroute to personal inventory + deposit-to-base RPC + read-only HUD inventory panel. (This DR.) +- **Phase 1 — equipment + effects — ✅ DONE 2026-06-08, see [[DR-027_Equipment_Slots_Phase1]]:** `EquipmentSlot` buffer + (Weapon/Armor/Trinket/Tool) + sets `AbilityRef.Id` from the equipped weapon; gear stat mods + equip/unequip RPCs. + **SUPERSEDED in detail by DR-027:** the accepted Phase 1 applies catalog modifiers via an **event-driven** `EquipSystem` + (apply-once per equip, persists across respawn), NOT the per-tick `EquipmentEffectSystem` "sync" sketched here. +- **Phase 2 — tool-gated harvesting (NEXT):** `RequiredToolType`/`RequiredToolTier` baked on `ResourceNode`; harvest gates + scales yield by the owner's equipped tool tier. - **Phase 3 — progression / crafting:** gear-tier content; extend the Fabricator to craft *items* into inventory; equip-tier gates; per-player inventory persistence (additive `SaveData` v3).