From 03083eb7354b229bf56984ea0af01ba961e962ea Mon Sep 17 00:00:00 2001 From: Luis Gonzalez Date: Sat, 11 Jul 2026 16:17:45 -0700 Subject: [PATCH] =?UTF-8?q?Docs:=20destructible-cover=20Build=20Spec=20+?= =?UTF-8?q?=20session=20log=20Part=20K=20=E2=80=94=20PHASE=201.5=20COMPLET?= =?UTF-8?q?E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CLAUDE.md: the enemy anti-stuck nudge is now cover-aware (budget 38.5 KB). Co-Authored-By: Claude Fable 5 --- CLAUDE.md | 2 +- .../Destructible_Cover_Build_Spec.md | 71 +++++++++++++++++++ .../06_Roadmap/Iteration_2026-07_CoopHades.md | 7 +- ...2026-07-09_B4d_Tail_Collision_Grounding.md | 28 ++++++-- 4 files changed, 100 insertions(+), 8 deletions(-) create mode 100644 Docs/Vault/03_Design/Destructible_Cover_Build_Spec.md diff --git a/CLAUDE.md b/CLAUDE.md index d1e679c2e..81e60085c 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -107,7 +107,7 @@ Long-form originals + the milestone each came from: `Docs/Vault/_Meta/CLAUDE_Bui - **A dark-lit screenshot MASKS material bugs — verify material *values*.** `shader.GetPropertyType(idx)`-guard before `GetColor`/`GetFloat`/`GetTexture` (`S_General`'s `_BaseColorMultiply` is a float → `GetColor` returns black). Gate emission on the `_Emissive` flag + a fixture name; keep converted env metallic low (0.1–0.2). - **VolumeProfile.Add persistence + the URP `m_AssetVersion` build blocker** → archive 2026-07-06 (+ native memory `urp-global-settings-version-blocks-build`). - **`LocalTransform.FromPosition()` resets Scale=1** — server spawners read the prefab's baked `LocalTransform`, override only Position (Scale is a `[GhostField]` → consistent-but-wrong). -- **Static decor → gameplay subscene** (EG renders only baked entities); **strip colliders from cosmetic props** + no `GhostAuthoring` on scenery (classic-URP colliders are inert to the DOTS PhysicsWorld). **World collision = subscene-only ★:** `Environment`-layer boundary ring + landmark colliders (player blocked via the layer matrix); enemies slide via a server `CollisionWorld.SphereCast` in `EnemyAISystem`. **★ enemy slide has NO pathfinding — a near-vertical wall normal or an embedded spawn FROZE Husks on cover rocks (soft-locks a room on one leftover); fixed 07-07 via `EnemyMoveUtil.Depenetrate` + tangent-slide + an `EnemyNavState` nudge backstop. Re-validate movers aren't frozen when adding Environment cover.** Boundary = `SM_Env_Rock_Cliff` rim. See [[2026-06-08_World_Collision_HUD_Scaling]]. +- **Static decor → gameplay subscene** (EG renders only baked entities); **strip colliders from cosmetic props** + no `GhostAuthoring` on scenery (classic-URP colliders are inert to the DOTS PhysicsWorld). **World collision = subscene-only ★:** `Environment`-layer boundary ring + landmark colliders (player blocked via the layer matrix); enemies slide via a server `CollisionWorld.SphereCast` in `EnemyAISystem`. **★ enemy slide has NO pathfinding — a near-vertical wall normal or an embedded spawn FROZE Husks on cover rocks (soft-locks a room on one leftover); fixed 07-07 via `EnemyMoveUtil.Depenetrate` + tangent-slide + an `EnemyNavState` nudge backstop. Re-validate movers aren't frozen when adding Environment cover. 07-10: the nudge is COVER-AWARE — a live destructible-cover ghost (`BlightClutter` carrier) SUPPRESSES the phase-through (breakable ⇒ no soft-lock); static wedges still nudge.** Boundary = `SM_Env_Rock_Cliff` rim. See [[2026-06-08_World_Collision_HUD_Scaling]]. - **A GA "projectile" prefab self-propels** — strip to particles before `Start` (`CombatFeedbackSystem.StripCosmetic`); verify *components*, not the name. ### Aim controls diff --git a/Docs/Vault/03_Design/Destructible_Cover_Build_Spec.md b/Docs/Vault/03_Design/Destructible_Cover_Build_Spec.md new file mode 100644 index 000000000..f4b228497 --- /dev/null +++ b/Docs/Vault/03_Design/Destructible_Cover_Build_Spec.md @@ -0,0 +1,71 @@ +--- +title: Destructible_Cover_Build_Spec +type: note +permalink: gamevault/03-design/destructible-cover-build-spec +--- + +# Destructible Cover — Build Spec (Phase 1.5 long-term #8, review-hardened, SHIPPED `bbf418e77`) + +Review: `wf_e14dd739-069` (3 lenses, 28 agents). The session limit killed 18 verifiers mid-run, but the 7 +completed verifications covered every DISTINCT load-bearing finding (both HIGHs + the boss/scatter/copy-paste/ +HitRadius/spawn-window MEDs); the dead verifiers were lens-duplicates of the same issues. **Deliberate call: +folded without a third verify pass**, with the unverified leftovers reasoned-closed below — recorded per +[[ask-before-deferring-during-implementation]]. + +## Core architecture: cover IS clutter with a collider + +`CoverRock.prefab` = a `BlightClutter` ghost (Variant **4**) whose root carries a baked **Environment-layer +BoxCollider**: the runtime-spawned ghost's collider joins `BuildPhysicsWorld` every tick → blocks the player +CC AND the enemy sweep (both filter on the env mask) while alive, and the gap opens the instant the entity +dies. Both hit paths break it for free (the clutter chassis); chip feedback/teardown/relevancy inherited. +Values: `Remaining=8` (8 hits to carve), `ScrapPerHit=0`, `HitRadius=1.2`, Model = `SM_Env_Rocks_Spikey_03` +@1.7 (the old cover visual; Read/Write already enabled). + +## The two HIGH folds + +1. **The 07-07 anti-stuck nudge deliberately phases enemies through cover rocks** (it exists to prevent room + soft-locks) — "cover blocks enemies" contradicted the shipped backstop. Fold: the nudge is **cover-aware** + (EnemyAISystem, the arm site): a 1.8 u SphereCast toward the target identifies the blocker; if it carries + `BlightClutter` (a LIVE, destructible ghost — no soft-lock possible) the phase is SUPPRESSED and the stuck + counter stays primed; static-geometry wedges nudge exactly as before. +2. **Yield==durability coupling** made tanky cover a 64-scrap/room faucet. Fold: deposit DECOUPLED from the + decrement at BOTH hit sites — `deposit = perHit > 0 ? max(1,(int)perHit) : 0` — zero means ZERO (cover), + any positive still credits ≥1 (the B1 immortal-sink regression test caught the first cut truncating 0.5→0; + the dual contract is now: fractional-positive floors to 1, exact-zero deposits nothing). + +## Confirmed-MED folds + +- `HitRadius=1.2` (visual core): the collider footprint would have made each rock a ~5 u shot-eating disc + (ResourceHarvest consumes any surviving projectile whose segment grazes HitRadius). +- **No cover in Boss rooms**: the boss moves only via SweptMove — NO depenetration backstop exists for it + (`EnemyAISystem`'s pass excludes BossState with a comment wrongly claiming BossAISystem owns it). +- Scatter keep-out ≥7 u from the room origin (player landing at origin+1.5·idx, portal at z−5), bounded + 8-attempt resample, piece dropped on failure. Count=3/room (`CoverFieldSpawner`, optional singleton). +- `Variant=4` set on the prefab and NEVER rerolled (the clutter block's 25% explosive reroll is a copy-paste + trap — the cover spawn block instantiates the prefab proto untouched). +- Old static layer REMOVED: 8 `WorldColliders_RoomCover` subscene colliders + the `RoomCover_Visuals` root in + Game.unity (double-collision + double-visual otherwise). ColliderFitTools' FitCover section is vestigial + (empty group → KEEP logs). + +## Reasoned-closed (verifiers lost to the session limit; dispositions) + +- *CC misprediction window on runtime-spawned blockers*: rocks spawn at room entry ≥7 u from the landing + point; the ghost replicates long before a player can cross 7 u — no practical mispredict window. +- *Depenetrate vertical-normal on hull tops*: unchanged behavior class vs the old static hulls; the fallback + chain (nudge) still exists for non-cover geometry. +- *Melee cone tests target CENTER*: rock center reachable at HitRadius 1.2 + cone range 2.6 — chippable + point-blank. +- *NodeFeedback shrink keys on Remaining*: cover shrinking as it is chipped reads as crumbling — kept. +- *Projectiles ignore colliders* (confirmed structurally): v1 cover blocks MOVEMENT, not shots — both sides' + projectiles fly over the waist-high rocks. True shot-blocking = a follow-up (cover in both projectile + sweeps). Enemy-hits-win ordering is deterministic: ProjectileDamage (predicted group, immediate playback) + runs before ResourceHarvest (plain group) — a projectile consumed on an enemy is gone before the harvest + sweep can double-destroy it. +- *Charger smashes through cover*: deliberate follow-up (contact damage from lunging chargers to cover). + +## Live validation (all passed, 2026-07-10) + +3 cover ghosts spawned (Variant 4, Remaining 8) with SOLID baked colliders in the CollisionWorld · +**BLOCK**: `NudgeUntilTick` stayed 0 across 3.5 s of forced zero-progress (the old code arms at 1.5 s) · +**DEPENETRATE**: an enemy shoved inside a live rock exited to 1.7 u · **CARVE**: the rock died to the real +projectile sweep and the spot probed OPEN (not solid) · 470/470 EditMode · console clean. diff --git a/Docs/Vault/06_Roadmap/Iteration_2026-07_CoopHades.md b/Docs/Vault/06_Roadmap/Iteration_2026-07_CoopHades.md index 5ceba1a57..cb05d9ae7 100644 --- a/Docs/Vault/06_Roadmap/Iteration_2026-07_CoopHades.md +++ b/Docs/Vault/06_Roadmap/Iteration_2026-07_CoopHades.md @@ -150,8 +150,11 @@ attacks/animations/effects**. Art direction deliberately UNDECIDED — lighting the client cue, strobing red glow) then radius-damages BOTH sides (bait mechanic; escapable). Zero new replication. Geysers/trap tiles = later hazard variants on the same HazardExplosionSystem chassis. See [[Exploding_Barrels_Build_Spec]]. -8. **Destructible cover:** in-room cover rocks take damage and crumble (Charger smashes through, players carve LOS). - Structures already have Health; **re-validate the enemy stuck-fix backstop when cover can disappear mid-fight.** +8. **Destructible cover — SHIPPED (2026-07-10, `bbf418e77`, review-first `wf_e14dd739-069`): PHASE 1.5 IS + COMPLETE.** Cover = BlightClutter ghosts (Variant 4) with baked env-layer colliders — genuinely block + (the anti-stuck nudge is now cover-aware) until carved (8 hits, zero yield — deposit decoupled from + durability); no cover in Boss rooms; backstop re-validated live (block/depenetrate/carve all proven). + Follow-ups: Charger smashes cover; true projectile-blocking. See [[Destructible_Cover_Build_Spec]]. **Gate:** operator playtest says "no longer static"; node harvest feedback visibly works; art direction LOCKED. diff --git a/Docs/Vault/07_Sessions/2026/2026-07-09_B4d_Tail_Collision_Grounding.md b/Docs/Vault/07_Sessions/2026/2026-07-09_B4d_Tail_Collision_Grounding.md index fa782239b..1da76b47b 100644 --- a/Docs/Vault/07_Sessions/2026/2026-07-09_B4d_Tail_Collision_Grounding.md +++ b/Docs/Vault/07_Sessions/2026/2026-07-09_B4d_Tail_Collision_Grounding.md @@ -229,13 +229,31 @@ Verified: 470/470 (4 new tests) · live smoke: client OBSERVED the fuse cue on t enemy took exactly 26 (30→4), walk-out escape confirmed (fuse is escapable by design — first unpinned bait simply left the radius) · console clean. +## Part K — destructible cover SHIPPED (`bbf418e77`); **PHASE 1.5 COMPLETE** (07-10) + +The last 1.5 item, review-first (`wf_e14dd739-069`; the limit ate 18 duplicate verifiers — the 7 completed +ones covered every DISTINCT finding; folded without a third pass, leftovers reasoned-closed in +[[Destructible_Cover_Build_Spec]]). **Architecture: cover IS clutter with a collider** — a `BlightClutter` +ghost (Variant 4) whose baked env-layer BoxCollider joins BuildPhysicsWorld → blocks the player CC + the +enemy sweep while alive, opens the instant it dies; both hit paths carve it (8 hits, ZERO yield). The two +HIGH folds: (1) **the 07-07 anti-stuck nudge is now COVER-AWARE** (a SphereCast identifies the blocker; a +live destructible ghost suppresses the phase-through — breakable ⇒ no soft-lock; statics still nudge; also +now a CLAUDE.md line); (2) **deposit decoupled from durability** at both hit sites — zero yields nothing, +fractional-positive still floors to 1 (the B1 immortal-sink test caught the first cut truncating 0.5→0 — +a real regression the suite stopped). MEDs: HitRadius 1.2, NO cover in Boss rooms (boss has no depenetrate +backstop), ≥7 u origin keep-out, Variant never rerolled, old static cover colliders + RoomCover_Visuals +REMOVED. Live-verified: 3 solid cover ghosts · BLOCK (NudgeUntilTick 0 across 3.5 s forced-stuck) · +DEPENETRATE (embedded enemy exits to 1.7 u) · CARVE (real-sweep kill → spot probes OPEN) · 470/470 · console +clean. Follow-ups queued: Charger smashes cover · true projectile-blocking cover. + ## Next-session intent -Phase 1.5 remaining: **destructible cover** (the last long-term item — design-review-first, MUST re-validate -the enemy stuck-fix backstop when cover can vanish mid-fight) → then the 1.5 gate lap → **Phase 1.7 boon -overhaul** (design review required — replicated ability swaps). Queued taste items: re-enable curated base -flora · arid brightness · craters call · B5 split-panels smoke · barrel VFX polish (authored explosion -prefab instead of the procedural burst). +**Phase 1.5 is COMPLETE** (collision · lighting · art-look LOCKED clean dark-Synty · ambient motion · +breakables · attack distinctness · exploding barrels · destructible cover). Next per the locked order: +**the operator's 1.5 gate lap** ("no longer static"?) → **Phase 1.7 boon overhaul** (~12 mechanic-changers +on existing hooks; design-review-FIRST — replicated ability swaps) → Phase 2 hub-ification. Taste queue: +re-enable curated base flora (barren hub) · arid brightness · craters call · B5 split-panels smoke · barrel +explosion VFX polish · cover damage-crack visuals. Related: [[Iteration_2026-07_CoopHades]] · [[2026-07-07_Workflow_Consolidation]] · [[2026-07-07_Expedition_Enemy_Stuck_Harvest_Feedback]]