Hazard: destructible cover — carve-able rocks that genuinely block until broken

Phase 1.5 long-term #8, the LAST 1.5 item (design review wf_e14dd739-069:
both HIGHs + the distinct MEDs verified before the session limit ate the
duplicate verifiers; unverified leftovers reasoned-closed in the spec).

Cover = a BlightClutter ghost (Variant 4) with a baked Environment-layer
BoxCollider: the runtime ghost's collider joins BuildPhysicsWorld ->
blocks the player CC and the enemy sweep while alive, and the gap opens
the instant the entity dies. Both hit paths already break it (the
clutter chassis); 8 hits to carve.

Review folds:
- HIGH: the 07-07 anti-stuck nudge would phase enemies THROUGH cover
  after ~1.5s (it exists to prevent room soft-locks). The nudge is now
  COVER-AWARE: a SphereCast identifies the blocker; a live BlightClutter
  ghost suppresses the phase (no soft-lock possible - the blocker is
  destructible); static-geometry wedges still nudge.
- HIGH: yield==durability made tanky cover an economy faucet. Deposit
  is DECOUPLED from the decrement at both hit sites: ScrapPerHit=0 =
  breaks in Remaining hits, yields NOTHING; fractional POSITIVE yields
  still credit >=1 (the B1 immortal-sink test pinned this - zero means
  zero, positive floors to 1).
- MEDs: HitRadius 1.2 (visual core, not a shot-eating disc), NO cover
  in Boss rooms (no boss depenetration backstop), scatter keep-out >=7u
  from the room origin (player landing + portal), Variant=4 explicit
  (the clutter block's explosive reroll cannot leak).
- Old static layer removed: 8 WorldColliders_RoomCover colliders
  (subscene) + the RoomCover_Visuals root (Game.unity).

Verified live: 3 cover ghosts spawned with SOLID baked colliders;
BLOCK - NudgeUntilTick stayed 0 across 3.5s of forced zero-progress
(old code arms at 1.5s); DEPENETRATE - an enemy shoved inside a live
rock exited to 1.7u (backstop holds against ghost colliders); CARVE -
the rock died to the real sweep and the spot probed OPEN. 470/470
EditMode; console clean.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-11 16:15:38 -07:00
parent d8e724e40a
commit bbf418e779
13 changed files with 386 additions and 1211 deletions
+48 -441
View File
@@ -661,60 +661,6 @@ BoxCollider:
serializedVersion: 3
m_Size: {x: 3.9870093, y: 5, z: 1.5}
m_Center: {x: 0, y: 2, z: 0}
--- !u!1 &47838509
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 47838510}
- component: {fileID: 47838511}
m_Layer: 8
m_Name: Cover_S0_0
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &47838510
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 47838509}
serializedVersion: 2
m_LocalRotation: {x: -0, y: 0.1305262, z: -0, w: 0.9914449}
m_LocalPosition: {x: 993, y: 0, z: 6}
m_LocalScale: {x: 1.6780516, y: 1.6780518, z: 1.6780516}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 125166252}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!64 &47838511
MeshCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 47838509}
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_IsTrigger: 0
m_ProvidesContacts: 0
m_Enabled: 1
serializedVersion: 5
m_Convex: 1
m_CookingOptions: 30
m_Mesh: {fileID: -2980332487971928681, guid: b26ded2dffadca04da4b267610d057ab, type: 3}
--- !u!1 &47846457
GameObject:
m_ObjectHideFlags: 0
@@ -1591,15 +1537,7 @@ Transform:
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children:
- {fileID: 47838510}
- {fileID: 1718746030}
- {fileID: 1814418716}
- {fileID: 1572202107}
- {fileID: 582536833}
- {fileID: 175117792}
- {fileID: 1785428319}
- {fileID: 1438996196}
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &135921087
@@ -1920,60 +1858,6 @@ BoxCollider:
serializedVersion: 3
m_Size: {x: 3.8149579, y: 5, z: 1.5}
m_Center: {x: 0, y: 2, z: 0}
--- !u!1 &175117791
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 175117792}
- component: {fileID: 175117793}
m_Layer: 8
m_Name: Cover_S1_1
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &175117792
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 175117791}
serializedVersion: 2
m_LocalRotation: {x: -0, y: 0.57357645, z: -0, w: 0.81915206}
m_LocalPosition: {x: 1508, y: 0, z: 5}
m_LocalScale: {x: 1.6780517, y: 1.6780518, z: 1.6780517}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 125166252}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!64 &175117793
MeshCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 175117791}
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_IsTrigger: 0
m_ProvidesContacts: 0
m_Enabled: 1
serializedVersion: 5
m_Convex: 1
m_CookingOptions: 30
m_Mesh: {fileID: -2980332487971928681, guid: b26ded2dffadca04da4b267610d057ab, type: 3}
--- !u!1 &175286056
GameObject:
m_ObjectHideFlags: 0
@@ -5058,60 +4942,6 @@ BoxCollider:
serializedVersion: 3
m_Size: {x: 1.7547715, y: 0.8, z: 1.3944197}
m_Center: {x: 0.0000024735928, y: 0.4, z: -0.000009506941}
--- !u!1 &582536832
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 582536833}
- component: {fileID: 582536834}
m_Layer: 8
m_Name: Cover_S1_0
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &582536833
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 582536832}
serializedVersion: 2
m_LocalRotation: {x: -0, y: 0.1305262, z: -0, w: 0.9914449}
m_LocalPosition: {x: 1493, y: 0, z: 6}
m_LocalScale: {x: 1.6780516, y: 1.6780518, z: 1.6780516}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 125166252}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!64 &582536834
MeshCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 582536832}
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_IsTrigger: 0
m_ProvidesContacts: 0
m_Enabled: 1
serializedVersion: 5
m_Convex: 1
m_CookingOptions: 30
m_Mesh: {fileID: -2980332487971928681, guid: b26ded2dffadca04da4b267610d057ab, type: 3}
--- !u!1 &584781805
GameObject:
m_ObjectHideFlags: 0
@@ -9082,6 +8912,52 @@ BoxCollider:
serializedVersion: 3
m_Size: {x: 4.147015, y: 5, z: 1.5}
m_Center: {x: 0, y: 2, z: 0}
--- !u!1 &1106173029
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1106173031}
- component: {fileID: 1106173030}
m_Layer: 0
m_Name: CoverFieldSpawner
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &1106173030
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1106173029}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 0a9b08ef91676fa4185406d9dec18c5e, type: 3}
m_Name:
m_EditorClassIdentifier: ProjectM.Authoring::ProjectM.Authoring.CoverFieldSpawnerAuthoring
CoverPrefab: {fileID: 3885353946372160549, guid: 25159665cc5735b44bf91ab9c8f90b76, type: 3}
Count: 3
--- !u!4 &1106173031
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1106173029}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &1106672234
GameObject:
m_ObjectHideFlags: 0
@@ -12027,60 +11903,6 @@ BoxCollider:
serializedVersion: 3
m_Size: {x: 3.9249666, y: 5, z: 1.5}
m_Center: {x: 0, y: 2, z: 0}
--- !u!1 &1438996195
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1438996196}
- component: {fileID: 1438996197}
m_Layer: 8
m_Name: Cover_S1_3
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &1438996196
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1438996195}
serializedVersion: 2
m_LocalRotation: {x: -0, y: 0.86602545, z: -0, w: 0.49999997}
m_LocalPosition: {x: 1509, y: 0, z: -7}
m_LocalScale: {x: 1.8546889, y: 1.8546889, z: 1.8546889}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 125166252}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!64 &1438996197
MeshCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1438996195}
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_IsTrigger: 0
m_ProvidesContacts: 0
m_Enabled: 1
serializedVersion: 5
m_Convex: 1
m_CookingOptions: 30
m_Mesh: {fileID: -2980332487971928681, guid: b26ded2dffadca04da4b267610d057ab, type: 3}
--- !u!1 &1441917224
GameObject:
m_ObjectHideFlags: 0
@@ -13448,60 +13270,6 @@ BoxCollider:
serializedVersion: 3
m_Size: {x: 1.6302872, y: 0.903802, z: 1.4047824}
m_Center: {x: -0.07129079, y: 0.451901, z: 0.0632782}
--- !u!1 &1572202106
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1572202107}
- component: {fileID: 1572202108}
m_Layer: 8
m_Name: Cover_S0_3
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &1572202107
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1572202106}
serializedVersion: 2
m_LocalRotation: {x: -0, y: 0.86602545, z: -0, w: 0.49999997}
m_LocalPosition: {x: 1009, y: 0, z: -7}
m_LocalScale: {x: 1.8546889, y: 1.8546889, z: 1.8546889}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 125166252}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!64 &1572202108
MeshCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1572202106}
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_IsTrigger: 0
m_ProvidesContacts: 0
m_Enabled: 1
serializedVersion: 5
m_Convex: 1
m_CookingOptions: 30
m_Mesh: {fileID: -2980332487971928681, guid: b26ded2dffadca04da4b267610d057ab, type: 3}
--- !u!1 &1578777869
GameObject:
m_ObjectHideFlags: 0
@@ -14753,60 +14521,6 @@ BoxCollider:
serializedVersion: 3
m_Size: {x: 3.9799314, y: 5, z: 1.5}
m_Center: {x: 0, y: 2, z: 0}
--- !u!1 &1718746029
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1718746030}
- component: {fileID: 1718746031}
m_Layer: 8
m_Name: Cover_S0_1
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &1718746030
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1718746029}
serializedVersion: 2
m_LocalRotation: {x: -0, y: 0.57357645, z: -0, w: 0.81915206}
m_LocalPosition: {x: 1008, y: 0, z: 5}
m_LocalScale: {x: 1.6780517, y: 1.6780518, z: 1.6780517}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 125166252}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!64 &1718746031
MeshCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1718746029}
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_IsTrigger: 0
m_ProvidesContacts: 0
m_Enabled: 1
serializedVersion: 5
m_Convex: 1
m_CookingOptions: 30
m_Mesh: {fileID: -2980332487971928681, guid: b26ded2dffadca04da4b267610d057ab, type: 3}
--- !u!1 &1723007258
GameObject:
m_ObjectHideFlags: 0
@@ -15072,60 +14786,6 @@ BoxCollider:
serializedVersion: 3
m_Size: {x: 2.4087837, y: 0.9642086, z: 2.2116926}
m_Center: {x: -0.004358411, y: 0.4821043, z: 0.12872449}
--- !u!1 &1785428318
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1785428319}
- component: {fileID: 1785428320}
m_Layer: 8
m_Name: Cover_S1_2
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &1785428319
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1785428318}
serializedVersion: 2
m_LocalRotation: {x: -0, y: 0.34202015, z: -0, w: 0.9396927}
m_LocalPosition: {x: 1495, y: 0, z: -9}
m_LocalScale: {x: 1.2801044, y: 1.2801043, z: 1.2801044}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 125166252}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!64 &1785428320
MeshCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1785428318}
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_IsTrigger: 0
m_ProvidesContacts: 0
m_Enabled: 1
serializedVersion: 5
m_Convex: 1
m_CookingOptions: 30
m_Mesh: {fileID: -2709579467351344360, guid: d68b1794e4e664d45925e6fe3eedfae2, type: 3}
--- !u!1 &1800669619
GameObject:
m_ObjectHideFlags: 0
@@ -15391,60 +15051,6 @@ BoxCollider:
serializedVersion: 3
m_Size: {x: 4.1653576, y: 5, z: 1.5}
m_Center: {x: 0, y: 2, z: 0}
--- !u!1 &1814418715
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1814418716}
- component: {fileID: 1814418717}
m_Layer: 8
m_Name: Cover_S0_2
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &1814418716
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1814418715}
serializedVersion: 2
m_LocalRotation: {x: -0, y: 0.34202015, z: -0, w: 0.9396927}
m_LocalPosition: {x: 995, y: 0, z: -9}
m_LocalScale: {x: 1.2801044, y: 1.2801043, z: 1.2801044}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 125166252}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!64 &1814418717
MeshCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1814418715}
m_Material: {fileID: 0}
m_IncludeLayers:
serializedVersion: 2
m_Bits: 0
m_ExcludeLayers:
serializedVersion: 2
m_Bits: 0
m_LayerOverridePriority: 0
m_IsTrigger: 0
m_ProvidesContacts: 0
m_Enabled: 1
serializedVersion: 5
m_Convex: 1
m_CookingOptions: 30
m_Mesh: {fileID: -2709579467351344360, guid: d68b1794e4e664d45925e6fe3eedfae2, type: 3}
--- !u!1 &1815241087
GameObject:
m_ObjectHideFlags: 0
@@ -18643,3 +18249,4 @@ SceneRoots:
- {fileID: 1518140828}
- {fileID: 125166252}
- {fileID: 1384477683}
- {fileID: 1106173031}