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:
@@ -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.
|
||||
Reference in New Issue
Block a user