Docs: destructible-cover Build Spec + session log Part K — PHASE 1.5 COMPLETE

CLAUDE.md: the enemy anti-stuck nudge is now cover-aware (budget 38.5 KB).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-11 16:17:45 -07:00
parent bbf418e779
commit 03083eb735
4 changed files with 100 additions and 8 deletions
@@ -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 z5), 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.
@@ -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.
@@ -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]]