Map Updates
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
tags:
|
||||
- design
|
||||
- index
|
||||
updated: 2026-05-29
|
||||
updated: 2026-06-04
|
||||
permalink: gamevault/02-game-design/systems-index
|
||||
---
|
||||
|
||||
@@ -42,6 +42,12 @@ One design doc per gameplay system, linked here. Each should state: purpose, com
|
||||
- **Systems:** `EnemyAISystem` (server-only, **plain `SimulationSystemGroup`**, `[UpdateAfter(PredictedSimulationSystemGroup)]` — the interpolated Husk ghost seeks the nearest living player, deals contact `DamageEvent`) + the `WaveSystem` threat director (escalating waves of Husk variants Grunt/Swarmer/Brute — replaced the flat sustain; see [[2026-06-02_GameFeel_Deepening]]); `HealthApplyDamageSystem` +`EnemyTag` death; `PlayerDeathStateSystem` (both worlds, predicted — derives `Dead` from `Health<=0`, gates movement/aim/fire via `.WithDisabled<Dead>()`); `PlayerRespawnSystem` (server-only — schedule + refill + reposition). Client presentation (managed, `PresentationSystemGroup`): `CombatFeedbackSystem` (damage numbers / VFX / procedural SFX / camera shake by edge-detecting replicated Health) + `HudSystem` (code-built uGUI health / cooldown / threat / DOWNED) + `PrototypeCameraRig.AddShake`.
|
||||
- **Netcode shape:** Husk = **ownerless interpolated** server-driven ghost (stock `LocalTransform` replication; `Health` `[GhostField]`); `Dead` = **local derived** enableable (NOT replicated — pure function of replicated Health); juice/HUD **observe** replicated state only (client world, never the sim). Identity: [[Identity]] (sci-fi frontier colony). Status: **built + runtime-validated** (Husks spawn(6)/replicate/chase/strike; death→respawn loop; HUD; emissive dark-sci-fi look); EditMode **74/74**. Decisions: [[DR-009_GameFeel_Identity_FirstBlood]].
|
||||
|
||||
### 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).
|
||||
- **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).
|
||||
|
||||
## 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.
|
||||
@@ -2,7 +2,7 @@
|
||||
tags:
|
||||
- roadmap
|
||||
- backlog
|
||||
updated: 2026-06-03
|
||||
updated: 2026-06-04
|
||||
permalink: gamevault/06-roadmap/backlog
|
||||
---
|
||||
|
||||
@@ -12,6 +12,8 @@ Unordered pool of candidate work. Promote to a [[Milestones|milestone]] when com
|
||||
|
||||
> **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.
|
||||
@@ -35,7 +37,7 @@ Unordered pool of candidate work. Promote to a [[Milestones|milestone]] when com
|
||||
- [ ] **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.
|
||||
- [ ] **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.
|
||||
@@ -68,7 +70,17 @@ Surfaced by the art/Synty/aim sessions ([[DR-010_Art_Import_URP_Conversion_Visua
|
||||
- [ ] **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).
|
||||
- [ ] **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.
|
||||
- [ ] **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**.
|
||||
@@ -0,0 +1,63 @@
|
||||
---
|
||||
date: 2026-06-04
|
||||
type: session
|
||||
tags:
|
||||
- session
|
||||
- world-architecture
|
||||
- economy
|
||||
- building
|
||||
- presentation
|
||||
- art
|
||||
- post-m8
|
||||
permalink: gamevault/07-sessions/2026/2026-06-04-world-space-cohesion-pass
|
||||
---
|
||||
|
||||
# Session 2026-06-04 — World-space cohesion pass
|
||||
|
||||
> Driven by `/dots-dev` (Feature track) under ultracode. Third log dated 2026-06-04 (after M8 + the Polish backlog pass).
|
||||
|
||||
## Goal
|
||||
|
||||
Make the flat-feeling world feel like **a more cohesive world** without editing the floor/terrain: non-flat feel
|
||||
via props, **build out a base** (more placeable structures), and **destructible resource gathering + clearing out
|
||||
areas**. Operator picked: balanced vertical slice · all-Synty recoloured Blight · clearing = juice + minor scrap ·
|
||||
buildables = Walls + structural variety.
|
||||
|
||||
## Done
|
||||
|
||||
- **Clearing mechanic (net-new):** `BlightClutter` ownerless-interpolated ghost (RegionTag{Expedition}, [GhostField]
|
||||
Remaining+Variant) + `ClutterFieldSpawner`. **Unified `ResourceHarvestSystem`** to sweep nodes + clutter in one
|
||||
best-target loop (the double-destroy fix). `ExpeditionFieldSystem` scatters/clears clutter alongside the node field
|
||||
(distinct seed). Client smash juice = new observe-only `WorldFeedbackSystem` + live-tunable `WorldFeelConfig`
|
||||
(chip on `Remaining` decrease, shatter + camera punch on despawn, proximity-gated so region-transit stays silent).
|
||||
- **Build out the base:** `StructureType.Wall=5`/`Pylon=6` (2–4 reserved for M7), generic `StructureAuthoring`, two
|
||||
additive `StructureCatalog` rows, V/N build keys + editor hooks. `Wall.prefab` blocks the player (BoxCollider →
|
||||
PhysicsCollider); `Pylon.prefab` cosmetic. `BuildPlaceSystem` untouched (already type-generic).
|
||||
- **Visual cohesion:** `M_Aether_Wild`(orange)/`M_Aether_Ordered`(cyan) HDR-emissive materials; the 3 new ghosts
|
||||
recoloured into the palette; the barren +1000 Blightfield became a 21-piece Synty rock/debris basin + 3 orange
|
||||
wild-lights (classic-URP cosmetics in `Game.unity`, no subscene re-bake; relief via props, no terrain).
|
||||
- **Validation:** EditMode **142/142** (5 harvest tests incl. overlap/fractional/same-tick-cleared). In-editor Play
|
||||
(server+client) introspected via `execute_code`: baking, ghost registration, buildables (Ore 50→44, R1 collider),
|
||||
clutter scatter (14+8 @ x≈1000), **0 errors**. A 4-lens adversarial-review Workflow (23 raised → 4 confirmed) caught
|
||||
an immortal-shot-sink (sub-1.0 `ScrapPerHit` truncates to 0) + a same-tick-cleared passthrough — both fixed +
|
||||
regression-tested before sign-off.
|
||||
|
||||
## Decisions
|
||||
|
||||
- [[DR-018_World_Space_Cohesion_Pass]] — clutter as a node-sibling on a unified sweep; byte-additive Wall/Pylon;
|
||||
classic-URP Blightfield dressing; Aether-palette recolour. Builds on [[DR-013_M6_Aether_Cycle_Region_Split]] /
|
||||
[[DR-014_M6_Build_Structures_Automation_Foundation]] / [[DR-015_The_Awakening_Engine_Fiction_Adoption]].
|
||||
|
||||
## Open / deferred
|
||||
|
||||
- Base-side cohesion accents (cyan lights / perimeter relief / re-enabled tiled ground) — deferred to avoid clashing
|
||||
with the tuned SSAO/ACES look.
|
||||
- Clearing as a spatial mechanic (gating / reveal nodes); build-palette HUD + ghost-preview; per-`Variant` clutter
|
||||
meshes — all additive follow-ups.
|
||||
- Eyeball the cohesion + Wall-blocks-player reads in a **focused** editor (mechanisms verified by value headless).
|
||||
|
||||
## Next
|
||||
|
||||
- A focused-editor play-through to tune the Blightfield basin density/lighting + the clutter/wall feel, then either
|
||||
the base-side cohesion accents or fold clearing into a spatial mechanic — or proceed to M7 automation (the reserved
|
||||
structure slots + tick fields are still the additive hook).
|
||||
@@ -0,0 +1,133 @@
|
||||
---
|
||||
id: DR-018
|
||||
title: World-space cohesion pass — destructible Blight clutter (clearing), buildable Wall/Pylon, Aether-palette Blightfield dressing
|
||||
status: accepted
|
||||
date: 2026-06-04
|
||||
tags:
|
||||
- decision
|
||||
- netcode
|
||||
- world-architecture
|
||||
- economy
|
||||
- building
|
||||
- presentation
|
||||
- art
|
||||
- post-m8
|
||||
permalink: gamevault/07-sessions/decisions/dr-018-world-space-cohesion-pass
|
||||
---
|
||||
|
||||
# DR-018 — World-space cohesion pass
|
||||
|
||||
## Context
|
||||
|
||||
The operator asked for a **world-space pass** so the world "feels like a more cohesive world" instead of flat:
|
||||
non-flat ground/foliage **without editing the terrain** (props on top only), **placing buildings / building out a
|
||||
base**, and **destructible resource gathering + clearing out areas**. Recon (read-only swarm) found this is mostly a
|
||||
**cohesion layer over the mature M8 foundation**, not greenfield: destructible `ResourceNode` harvesting already
|
||||
existed ([[DR-013_M6_Aether_Cycle_Region_Split]]); the full grid-placement build pipeline existed but shipped only the
|
||||
Turret ([[DR-014_M6_Build_Structures_Automation_Foundation]]); the world was a flat quad with ~60 clustered Synty
|
||||
city props at the base and **only 4 lone pillars** at the +1000 Blightfield. The fiction ([[DR-015_The_Awakening_Engine_Fiction_Adoption]])
|
||||
sets the duality: **cyan-ordered base sanctuary ↔ orange-red wild Blightfield**, Aether read by colour.
|
||||
|
||||
Four scope forks were resolved with the operator up front (intake `AskUserQuestion`): **balanced vertical slice**
|
||||
(touch all three, foundation now / expand later) · **all-Synty recoloured** Blight (URP-native; not the HDRP
|
||||
BefourStudios path) · **clearing = juice + minor scrap** (no hard gating) · **buildables = Walls + structural variety**
|
||||
(cosmetic / player-blocking, NOT Husk-pathing-defensive). Hard constraints honoured: region offset (1000,0,0) +
|
||||
GhostRelevancy, frozen 32×32 grid / save schema, byte ids (never enums) in Burst/RPC, static decor as collider-stripped
|
||||
classic-URP cosmetics, Aether palette, predicted-loop server authority, **no terrain edit**.
|
||||
|
||||
## Decision
|
||||
|
||||
1. **Clearing = `BlightClutter`, a `ResourceNode` SIBLING harvested by a UNIFIED sweep.** New ownerless interpolated
|
||||
ghost `BlightClutter { [GhostField] int Remaining; [GhostField] byte Variant; byte ScrapResourceId; float ScrapPerHit }`
|
||||
(RegionTag{Expedition}, prefab duplicated from `ResourceNode.prefab` so the GhostAuthoring comes free). It deposits a
|
||||
small Biomass "scrap" trickle and despawns at ≤0. **`ResourceHarvestSystem` was UNIFIED** to sweep nodes AND clutter
|
||||
in ONE best-target loop — **a correctness requirement, not a convenience**: two separate sweep systems would each
|
||||
`ecb.DestroyEntity` a projectile that overlaps a node AND a clutter piece → the documented "double DestroyEntity
|
||||
throws at playback". `ExpeditionFieldSystem` scatters clutter from an OPTIONAL `ClutterFieldSpawner` singleton on the
|
||||
same per-player-presence epoch edge as the node field (distinct seed `epoch*2+1`, round-robin Variant) and clears it
|
||||
on the occupied→empty edge. Client smash juice = new **`WorldFeedbackSystem`** (observe-only managed `SystemBase` in
|
||||
`PresentationSystemGroup`, mirrors `CombatFeedbackSystem`): edge-detects `Remaining` for a chip burst, despawn for a
|
||||
shatter burst + camera punch, with a **proximity gate** (last-pos within ~40u of the local player) so the
|
||||
region-transit relevancy-drop storm at +1000 stays silent off-camera. Knobs in live-tunable `WorldFeelConfig`.
|
||||
|
||||
2. **Buildables = byte-additive `Wall`(5)/`Pylon`(6).** `StructureType.Wall=5, Pylon=6` (2–4 stay RESERVED for M7
|
||||
automation). A generic `StructureAuthoring{ byte Kind }` bakes only `PlacedStructure{Type=Kind}` (no `Turret`
|
||||
component → `TurretFireSystem` ignores it). `StructureCatalogAuthoring` grew two additive rows; `BuildSendSystem`
|
||||
grew dedicated **V=Wall / N=Pylon** keys + editor `PlaceWall`/`PlacePylon` hooks. **`BuildPlaceSystem` was NOT
|
||||
touched** — it already resolves any catalog `Type` and stamps `PlacedStructure` + `RegionTag{Base}` generically.
|
||||
`Wall.prefab` carries a static `BoxCollider` (baked → `PhysicsCollider` → the CC sweeps it → blocks the player);
|
||||
`Pylon.prefab` has none (cosmetic beacon). Because `PlacedStructure.Type` is already a `[GhostField] byte`, adding
|
||||
values 5/6 keeps the serializer identical → **no re-bake of existing ghosts**.
|
||||
|
||||
3. **Visual cohesion = Aether material pair + Blightfield basin (classic-URP cosmetics, no subscene re-bake).**
|
||||
`M_Aether_Wild` (HDR orange emissive) + `M_Aether_Ordered` (HDR cyan emissive) URP/Lit assets; the three new ghosts
|
||||
recoloured into the palette (Clutter→wild, Wall+Pylon→ordered). The barren +1000 Blightfield became a **21-piece
|
||||
Synty rock/asteroid/debris basin + 3 orange wild-Aether point lights** under a `BlightfieldDecor` root in `Game.unity`
|
||||
— deterministic ring/scatter at varied scale/height (the "non-flat" relief via props, **no terrain**), colliders
|
||||
stripped (inert to the DOTS PhysicsWorld anyway, per the blessed `SyntyWorld` classic-URP pattern). Bulk authoring via
|
||||
`execute_code` (PrefabUtility) for determinism + speed.
|
||||
|
||||
## Consequences
|
||||
|
||||
- **Validated.** EditMode **142/142** green (rewrote/added 5 `ResourceHarvestSystem` tests incl. node+clutter overlap,
|
||||
fractional-yield, and same-tick-cleared consumption; existing 134 unaffected). **In-editor Play (server+client over
|
||||
IPC), driven via `execute_code` world-introspection:** baking clean (catalog = Turret/Wall/Pylon with valid prefab
|
||||
refs + correct costs; `ClutterFieldSpawner` baked); buildables end-to-end (built Wall@(16,16)+Pylon@(18,16), Ore 50→44,
|
||||
Type GhostField replicated, Cell stays server-only=0 on client); **R1** confirmed (client Wall entity has
|
||||
`PhysicsCollider`, Pylon doesn't); clutter scatter end-to-end (14 clutter + 8 nodes spawned + replicated at x≈1000,
|
||||
round-robin variants); **R2** clear (the edited Bursted `ExpeditionFieldSystem` ran; **0 errors** all session, only the
|
||||
pre-existing unfocused-editor Server-Tick-Batching warnings). Decor verified by VALUE (21 renderers, 0 broken shaders,
|
||||
x∈[977,1020], correct HDR emission) — not just a screenshot.
|
||||
- **Adversarial review** (4-lens Workflow → verify) raised 23, confirmed 4 (3 were one root issue). **Fixed before
|
||||
sign-off:** an **immortal-shot-sink** — `int amount = (int)YieldPerHit` truncates a sub-1.0 per-hit value to 0, so the
|
||||
projectile is consumed, nothing deposits, and the target never depletes; reachable only because
|
||||
`BlightClutterAuthoring.ScrapPerHit` was `[Min(0f)]` (the node sibling is `[Min(1f)]`). Hardened with `[Min(1f)]` +
|
||||
`math.max(1, (int)…)` in the system. Plus a low **same-tick-cleared passthrough** — a 2nd projectile whose only target
|
||||
a sibling already cleared this tick now still consumes (an `overlappedCleared` branch) so "a hit always spends the
|
||||
shot." Both regression-tested. The 19 refuted were correct-by-design (the `ghostId==0` relevancy skip, Temp-ECB
|
||||
no-dispose matching sibling spawn systems, the proximity gate vs. atomic-teleport transit, observe-only audit).
|
||||
- **No new asmdefs.** New code under `…/Economy/` (`BlightClutter`, `ClutterFieldSpawner` + authorings), `…/Building/`
|
||||
(`StructureType.Wall/Pylon`, `StructureAuthoring`, catalog rows), `…/Client/Presentation/` (`WorldFeedbackSystem`,
|
||||
`WorldFeelConfig`), `…/Client/Building/` (BuildSendSystem keys). New assets: `BlightClutter`/`Wall`/`Pylon` prefabs,
|
||||
`M_Aether_Wild`/`M_Aether_Ordered` materials, `Gameplay.unity` (clutter spawner + catalog rows), `Game.unity`
|
||||
(BlightfieldDecor). Reuses the runtime-ghost recipe / region split / GhostRelevancy / swept-hit / RPC-build /
|
||||
StatModifier-free-economy patterns verbatim. Orthogonal to + additive over M8; does not touch the M7 automation slots.
|
||||
|
||||
## Open / deferred (defaulted, tunable)
|
||||
|
||||
- **Base-side cohesion**: this layer dressed the Blightfield (the barren gap); the cyan-ordered base still reads via the
|
||||
existing city props + the new cyan-recoloured Wall/Pylon. A deliberate base accent (cyan lights, perimeter relief,
|
||||
re-enabled tiled ground) was deferred to avoid clashing with the tuned SSAO/ACES look.
|
||||
- **Clearing as a spatial mechanic**: shipped as juice + scrap only (no gating); making cleared cells buildable or
|
||||
reveal hidden nodes (the "functional gating" fork) is a follow-up.
|
||||
- **More buildables / build-palette HUD**: dedicated V/N keys for now (matches the B/U idiom); a selectable build palette
|
||||
+ ghost-preview is polish.
|
||||
- **Clutter visual variety**: `Variant` is replicated + round-robined but the prefab is single-mesh; per-variant meshes
|
||||
are a follow-up (additive, no schema change).
|
||||
- **Focused-editor Play confirmed (2026-06-04, same day):** the Wall **stops the player CC dead at the collider face**
|
||||
(drove +X, X 2.50→**3.257**, server==client, no tunnel); the **Blightfield reads as an orange-wild rock basin** vs the
|
||||
cyan base (real player-view game-camera screenshots); the **clutter-clear loop works end-to-end** (BIO 0→6→10, clutter
|
||||
14→13 shatter replicated to the client); node harvest AETHER 0→30 (R2 clear on the re-edited system). Console clean.
|
||||
Remaining is only **feel-tuning** (basin density/lighting) + the base-side accents — not correctness.
|
||||
|
||||
## Build gotchas recorded this session
|
||||
|
||||
- **A unified sweep is REQUIRED, not optional, when two target types share one projectile pass** — separate sweep
|
||||
systems each `DestroyEntity` an overlapping projectile → double-destroy at ECB playback. One best-target loop over the
|
||||
combined set + a shared destroyed-bitset is the correct shape.
|
||||
- **Float per-hit yield truncated to an int that ALSO gates despawn is an immortal-sink footgun**: a sub-1.0 value →
|
||||
`(int)`=0 → no deposit AND no decrement, yet the projectile is still consumed. Guard with `[Min(1f)]` on the authoring
|
||||
AND `math.max(1, (int)…)` in the consumer (the node path was already `[Min(1f)]`; the new clutter path wasn't).
|
||||
- **Unfocused-editor Play validation is feasible via `execute_code` world-introspection** even when the Play transition
|
||||
stalls: identify worlds by `world.Name`, query/instantiate/mutate via the live `EntityManager`, drive client editor
|
||||
hooks (`BuildSendSystem.PlaceWall`) + deposit into the ledger to exercise end-to-end paths, and read errors-only from
|
||||
the console (the tick-batching warning spam is benign). Keep the session short (unfocused can dispose netcode worlds).
|
||||
- **Editing a Bursted ISystem's BODY (not its query set) is low R2 risk** — the stale-binary hazard is tied to query-set
|
||||
changes on an unfocused editor; a `math.max`/loop-reorder edit that leaves the SystemAPI query set unchanged is safe.
|
||||
- **`manage_prefabs modify_contents component_properties` sets a `byte` field fine** (verified Pylon.Kind=6) — the
|
||||
silent-drop gotcha is enum/Vector3, not byte. Still verify via `execute_code`.
|
||||
|
||||
Builds on + reuses [[DR-013_M6_Aether_Cycle_Region_Split]] (region split, GhostRelevancy, swept-hit, runtime-ghost),
|
||||
[[DR-014_M6_Build_Structures_Automation_Foundation]] (build pipeline, structure ghost, frozen grid/schema),
|
||||
[[DR-015_The_Awakening_Engine_Fiction_Adoption]] (Aether palette), and the client-presentation pattern from
|
||||
[[DR-009_GameFeel_Identity_FirstBlood]]. Serves the cohesive-world + persistent-base pillars in [[Pillars]].
|
||||
Reference in New Issue
Block a user