Files
Project-M/Docs/Vault/03_Design/Destructible_Cover_Build_Spec.md
T
kronic 03083eb735 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>
2026-07-11 16:17:45 -07:00

5.0 KiB
Raw Blame History

title, type, permalink
title type permalink
Destructible_Cover_Build_Spec note 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.