Compare commits

...

2 Commits

Author SHA1 Message Date
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
kronic bbf418e779 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>
2026-07-11 16:15:38 -07:00
17 changed files with 486 additions and 1219 deletions
+1 -760
View File
@@ -2200,96 +2200,6 @@ Transform:
m_CorrespondingSourceObject: {fileID: 1058388337777710864, guid: 4b5b62e8ff478c144863c2750ad3fb24, type: 3} m_CorrespondingSourceObject: {fileID: 1058388337777710864, guid: 4b5b62e8ff478c144863c2750ad3fb24, type: 3}
m_PrefabInstance: {fileID: 44753596} m_PrefabInstance: {fileID: 44753596}
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
--- !u!1 &44814211
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 44814212}
- component: {fileID: 44814214}
- component: {fileID: 44814213}
m_Layer: 0
m_Name: CoverRock_S0_2
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &44814212
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 44814211}
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.2801043, y: 1.2801043, z: 1.2801043}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 1851179016}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!23 &44814213
MeshRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 44814211}
m_Enabled: 1
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_ForceMeshLod: -1
m_MeshLodSelectionBias: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: 9ad3d533612e9404fa35e1d900ab70a9, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_GlobalIlluminationMeshLod: 0
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_MaskInteraction: 0
m_AdditionalVertexStreams: {fileID: 0}
--- !u!33 &44814214
MeshFilter:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 44814211}
m_Mesh: {fileID: -2709579467351344360, guid: d68b1794e4e664d45925e6fe3eedfae2, type: 3}
--- !u!1001 &45326438 --- !u!1001 &45326438
PrefabInstance: PrefabInstance:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -3474,6 +3384,7 @@ MonoBehaviour:
Enabled: 1 Enabled: 1
MaxProjectileLights: 24 MaxProjectileLights: 24
ProjectileColor: {r: 0.45, g: 0.85, b: 1, a: 1} ProjectileColor: {r: 0.45, g: 0.85, b: 1, a: 1}
EnemyProjectileColor: {r: 0.55, g: 1, b: 0.35, a: 1}
ProjectileIntensity: 2.6 ProjectileIntensity: 2.6
ProjectileRange: 7 ProjectileRange: 7
PortalColor: {r: 0.55, g: 0.95, b: 1, a: 1} PortalColor: {r: 0.55, g: 0.95, b: 1, a: 1}
@@ -30237,96 +30148,6 @@ Transform:
m_CorrespondingSourceObject: {fileID: 8315364206485325802, guid: 6bf6dfab11a30084c9736d3b991fdaf6, type: 3} m_CorrespondingSourceObject: {fileID: 8315364206485325802, guid: 6bf6dfab11a30084c9736d3b991fdaf6, type: 3}
m_PrefabInstance: {fileID: 751562110} m_PrefabInstance: {fileID: 751562110}
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
--- !u!1 &752380414
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 752380415}
- component: {fileID: 752380417}
- component: {fileID: 752380416}
m_Layer: 0
m_Name: CoverRock_S1_2
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &752380415
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 752380414}
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.2801043, y: 1.2801043, z: 1.2801043}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 1851179016}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!23 &752380416
MeshRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 752380414}
m_Enabled: 1
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_ForceMeshLod: -1
m_MeshLodSelectionBias: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: 9ad3d533612e9404fa35e1d900ab70a9, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_GlobalIlluminationMeshLod: 0
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_MaskInteraction: 0
m_AdditionalVertexStreams: {fileID: 0}
--- !u!33 &752380417
MeshFilter:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 752380414}
m_Mesh: {fileID: -2709579467351344360, guid: d68b1794e4e664d45925e6fe3eedfae2, type: 3}
--- !u!1001 &752493985 --- !u!1001 &752493985
PrefabInstance: PrefabInstance:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -31867,96 +31688,6 @@ Transform:
m_CorrespondingSourceObject: {fileID: 74766642427550001, guid: ab41e12e3193e5241a054da74ad6cee7, type: 3} m_CorrespondingSourceObject: {fileID: 74766642427550001, guid: ab41e12e3193e5241a054da74ad6cee7, type: 3}
m_PrefabInstance: {fileID: 801385345} m_PrefabInstance: {fileID: 801385345}
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
--- !u!1 &801747704
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 801747705}
- component: {fileID: 801747707}
- component: {fileID: 801747706}
m_Layer: 0
m_Name: CoverRock_S0_0
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &801747705
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 801747704}
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: 1851179016}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!23 &801747706
MeshRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 801747704}
m_Enabled: 1
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_ForceMeshLod: -1
m_MeshLodSelectionBias: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: 9ad3d533612e9404fa35e1d900ab70a9, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_GlobalIlluminationMeshLod: 0
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_MaskInteraction: 0
m_AdditionalVertexStreams: {fileID: 0}
--- !u!33 &801747707
MeshFilter:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 801747704}
m_Mesh: {fileID: -2980332487971928681, guid: b26ded2dffadca04da4b267610d057ab, type: 3}
--- !u!1001 &804084884 --- !u!1001 &804084884
PrefabInstance: PrefabInstance:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -36458,96 +36189,6 @@ Transform:
m_CorrespondingSourceObject: {fileID: 8227573149044680746, guid: b33befb41106070409d86b725f2476e2, type: 3} m_CorrespondingSourceObject: {fileID: 8227573149044680746, guid: b33befb41106070409d86b725f2476e2, type: 3}
m_PrefabInstance: {fileID: 912324564} m_PrefabInstance: {fileID: 912324564}
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
--- !u!1 &913094309
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 913094310}
- component: {fileID: 913094312}
- component: {fileID: 913094311}
m_Layer: 0
m_Name: CoverRock_S1_1
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &913094310
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 913094309}
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.6780516, y: 1.6780518, z: 1.6780516}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 1851179016}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!23 &913094311
MeshRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 913094309}
m_Enabled: 1
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_ForceMeshLod: -1
m_MeshLodSelectionBias: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: 9ad3d533612e9404fa35e1d900ab70a9, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_GlobalIlluminationMeshLod: 0
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_MaskInteraction: 0
m_AdditionalVertexStreams: {fileID: 0}
--- !u!33 &913094312
MeshFilter:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 913094309}
m_Mesh: {fileID: -2980332487971928681, guid: b26ded2dffadca04da4b267610d057ab, type: 3}
--- !u!1001 &913121664 --- !u!1001 &913121664
PrefabInstance: PrefabInstance:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -48598,96 +48239,6 @@ Transform:
m_CorrespondingSourceObject: {fileID: 591573043354113928, guid: bafd1387c024a3a459afa35dd24cec25, type: 3} m_CorrespondingSourceObject: {fileID: 591573043354113928, guid: bafd1387c024a3a459afa35dd24cec25, type: 3}
m_PrefabInstance: {fileID: 1241775351} m_PrefabInstance: {fileID: 1241775351}
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
--- !u!1 &1247362408
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1247362409}
- component: {fileID: 1247362411}
- component: {fileID: 1247362410}
m_Layer: 0
m_Name: CoverRock_S1_3
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &1247362409
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1247362408}
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.8546886, y: 1.8546889, z: 1.8546886}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 1851179016}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!23 &1247362410
MeshRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1247362408}
m_Enabled: 1
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_ForceMeshLod: -1
m_MeshLodSelectionBias: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: 9ad3d533612e9404fa35e1d900ab70a9, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_GlobalIlluminationMeshLod: 0
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_MaskInteraction: 0
m_AdditionalVertexStreams: {fileID: 0}
--- !u!33 &1247362411
MeshFilter:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1247362408}
m_Mesh: {fileID: -2980332487971928681, guid: b26ded2dffadca04da4b267610d057ab, type: 3}
--- !u!1001 &1247686665 --- !u!1001 &1247686665
PrefabInstance: PrefabInstance:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -53015,96 +52566,6 @@ Transform:
m_CorrespondingSourceObject: {fileID: 6875251685013686615, guid: 3e44b897679ea1e458c6a0a8c84ef8ac, type: 3} m_CorrespondingSourceObject: {fileID: 6875251685013686615, guid: 3e44b897679ea1e458c6a0a8c84ef8ac, type: 3}
m_PrefabInstance: {fileID: 1357398796} m_PrefabInstance: {fileID: 1357398796}
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
--- !u!1 &1361156333
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1361156334}
- component: {fileID: 1361156336}
- component: {fileID: 1361156335}
m_Layer: 0
m_Name: CoverRock_S0_1
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &1361156334
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1361156333}
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.6780516, y: 1.6780518, z: 1.6780516}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 1851179016}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!23 &1361156335
MeshRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1361156333}
m_Enabled: 1
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_ForceMeshLod: -1
m_MeshLodSelectionBias: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: 9ad3d533612e9404fa35e1d900ab70a9, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_GlobalIlluminationMeshLod: 0
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_MaskInteraction: 0
m_AdditionalVertexStreams: {fileID: 0}
--- !u!33 &1361156336
MeshFilter:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1361156333}
m_Mesh: {fileID: -2980332487971928681, guid: b26ded2dffadca04da4b267610d057ab, type: 3}
--- !u!1 &1370587944 --- !u!1 &1370587944
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -68965,96 +68426,6 @@ Transform:
- {fileID: 807647776} - {fileID: 807647776}
m_Father: {fileID: 423312854} m_Father: {fileID: 423312854}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &1834212430
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1834212431}
- component: {fileID: 1834212433}
- component: {fileID: 1834212432}
m_Layer: 0
m_Name: CoverRock_S0_3
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &1834212431
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1834212430}
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.8546886, y: 1.8546889, z: 1.8546886}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 1851179016}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!23 &1834212432
MeshRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1834212430}
m_Enabled: 1
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_ForceMeshLod: -1
m_MeshLodSelectionBias: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: 9ad3d533612e9404fa35e1d900ab70a9, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_GlobalIlluminationMeshLod: 0
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_MaskInteraction: 0
m_AdditionalVertexStreams: {fileID: 0}
--- !u!33 &1834212433
MeshFilter:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1834212430}
m_Mesh: {fileID: -2980332487971928681, guid: b26ded2dffadca04da4b267610d057ab, type: 3}
--- !u!1001 &1840780466 --- !u!1001 &1840780466
PrefabInstance: PrefabInstance:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -69583,45 +68954,6 @@ Transform:
m_CorrespondingSourceObject: {fileID: 5731770526695229474, guid: b580bce9b46b41e49aa07bbf1145e610, type: 3} m_CorrespondingSourceObject: {fileID: 5731770526695229474, guid: b580bce9b46b41e49aa07bbf1145e610, type: 3}
m_PrefabInstance: {fileID: 1850925310} m_PrefabInstance: {fileID: 1850925310}
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
--- !u!1 &1851179015
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1851179016}
m_Layer: 0
m_Name: RoomCover_Visuals
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &1851179016
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1851179015}
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:
- {fileID: 801747705}
- {fileID: 1361156334}
- {fileID: 44814212}
- {fileID: 1834212431}
- {fileID: 1851924120}
- {fileID: 913094310}
- {fileID: 752380415}
- {fileID: 1247362409}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &1851908148 --- !u!1 &1851908148
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -69712,96 +69044,6 @@ MeshFilter:
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1851908148} m_GameObject: {fileID: 1851908148}
m_Mesh: {fileID: 6900561688886725036, guid: d02afc6bc2148dd4a9e7d81b46df4b06, type: 3} m_Mesh: {fileID: 6900561688886725036, guid: d02afc6bc2148dd4a9e7d81b46df4b06, type: 3}
--- !u!1 &1851924119
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 1851924120}
- component: {fileID: 1851924122}
- component: {fileID: 1851924121}
m_Layer: 0
m_Name: CoverRock_S1_0
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &1851924120
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1851924119}
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: 1851179016}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!23 &1851924121
MeshRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1851924119}
m_Enabled: 1
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_ForceMeshLod: -1
m_MeshLodSelectionBias: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: 9ad3d533612e9404fa35e1d900ab70a9, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_GlobalIlluminationMeshLod: 0
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_MaskInteraction: 0
m_AdditionalVertexStreams: {fileID: 0}
--- !u!33 &1851924122
MeshFilter:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1851924119}
m_Mesh: {fileID: -2980332487971928681, guid: b26ded2dffadca04da4b267610d057ab, type: 3}
--- !u!1001 &1857983222 --- !u!1001 &1857983222
PrefabInstance: PrefabInstance:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -81382,7 +80624,6 @@ SceneRoots:
- {fileID: 1913270911} - {fileID: 1913270911}
- {fileID: 433101879} - {fileID: 433101879}
- {fileID: 1709609454} - {fileID: 1709609454}
- {fileID: 1851179016}
- {fileID: 70737666} - {fileID: 70737666}
- {fileID: 1276835916} - {fileID: 1276835916}
- {fileID: 1007206783} - {fileID: 1007206783}
+203
View File
@@ -0,0 +1,203 @@
%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!1 &1085570720822716955
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 7703565366570969279}
- component: {fileID: 3470614019461566012}
- component: {fileID: 2902084588362297385}
m_Layer: 8
m_Name: Model
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &7703565366570969279
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1085570720822716955}
serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: -1, z: 0}
m_LocalScale: {x: 1.7, y: 1.7, z: 1.7}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 3572766465862231365}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!33 &3470614019461566012
MeshFilter:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1085570720822716955}
m_Mesh: {fileID: -2980332487971928681, guid: b26ded2dffadca04da4b267610d057ab, type: 3}
--- !u!23 &2902084588362297385
MeshRenderer:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1085570720822716955}
m_Enabled: 1
m_CastShadows: 1
m_ReceiveShadows: 1
m_DynamicOccludee: 1
m_StaticShadowCaster: 0
m_MotionVectors: 1
m_LightProbeUsage: 1
m_ReflectionProbeUsage: 1
m_RayTracingMode: 2
m_RayTraceProcedural: 0
m_RayTracingAccelStructBuildFlagsOverride: 0
m_RayTracingAccelStructBuildFlags: 1
m_SmallMeshCulling: 1
m_ForceMeshLod: -1
m_MeshLodSelectionBias: 0
m_RenderingLayerMask: 1
m_RendererPriority: 0
m_Materials:
- {fileID: 2100000, guid: 71e41e43b459a244abaf5acca76b89ee, type: 2}
m_StaticBatchInfo:
firstSubMesh: 0
subMeshCount: 0
m_StaticBatchRoot: {fileID: 0}
m_ProbeAnchor: {fileID: 0}
m_LightProbeVolumeOverride: {fileID: 0}
m_ScaleInLightmap: 1
m_ReceiveGI: 1
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 1
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
m_AutoUVMaxAngle: 89
m_LightmapParameters: {fileID: 0}
m_GlobalIlluminationMeshLod: 0
m_SortingLayerID: 0
m_SortingLayer: 0
m_SortingOrder: 0
m_MaskInteraction: 0
m_AdditionalVertexStreams: {fileID: 0}
--- !u!1 &3885353946372160549
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 3572766465862231365}
- component: {fileID: 9053853372340598254}
- component: {fileID: 6834786618115927220}
- component: {fileID: 1664972900393443061}
- component: {fileID: 4959636876878325759}
m_Layer: 8
m_Name: CoverRock
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &3572766465862231365
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3885353946372160549}
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:
- {fileID: 7703565366570969279}
m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &9053853372340598254
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3885353946372160549}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: c16549610bfe4458aa9389201d072bb6, type: 3}
m_Name:
m_EditorClassIdentifier: Unity.Entities.Hybrid::Unity.Entities.Hybrid.Baking.LinkedEntityGroupAuthoring
--- !u!114 &6834786618115927220
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3885353946372160549}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 7c79d771cedb4794bf100ce60df5f764, type: 3}
m_Name:
m_EditorClassIdentifier: Unity.NetCode.Authoring.Hybrid::Unity.NetCode.GhostAuthoringComponent
HasOwner: 0
SupportAutoCommandTarget: 1
TrackInterpolationDelay: 0
GhostGroup: 0
UsePreSerialization: 0
UseSingleBaseline: 0
RollbackPredictedSpawnedGhostState: 0
RollbackPredictionOnStructuralChanges: 1
DefaultGhostMode: 0
SupportedGhostModes: 3
OptimizationMode: 0
Importance: 1
MaxSendRate: 0
prefabId: 8565e5eb00679fb45b8b7dac1e2ae9f3
--- !u!114 &1664972900393443061
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3885353946372160549}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 6b1aa9b83194a2c41b940dd9532377f4, type: 3}
m_Name:
m_EditorClassIdentifier: ProjectM.Authoring::ProjectM.Authoring.BlightClutterAuthoring
Remaining: 8
ScrapPerHit: 0
HitRadius: 1.2
Variant: 4
--- !u!65 &4959636876878325759
BoxCollider:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 3885353946372160549}
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: 3
m_Size: {x: 2.6, y: 2.6, z: 2.4}
m_Center: {x: 0, y: 0.1, z: 0}
@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 25159665cc5735b44bf91ab9c8f90b76
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:
@@ -16,8 +16,8 @@ namespace ProjectM.Authoring
[Tooltip("Hit-points before the clutter shatters.")] [Tooltip("Hit-points before the clutter shatters.")]
[Min(1)] public int Remaining = 2; // one-hit pop: both hit paths decrement by max(1,(int)ScrapPerHit) [Min(1)] public int Remaining = 2; // one-hit pop: both hit paths decrement by max(1,(int)ScrapPerHit)
[Tooltip("Scrap (Biomass) yielded per projectile hit — the 'minor scrap' trickle.")] [Tooltip("Scrap (Biomass) yielded per hit. 0 = DESTRUCTIBLE COVER semantics: breaks in Remaining hits, yields nothing (deposit is decoupled from the decrement at both hit sites).")]
[Min(1f)] public float ScrapPerHit = 2f; [Min(0f)] public float ScrapPerHit = 2f;
[Tooltip("Hit radius (world units) for the clear sweep.")] [Tooltip("Hit radius (world units) for the clear sweep.")]
[Min(0f)] public float HitRadius = 1.0f; [Min(0f)] public float HitRadius = 1.0f;
@@ -0,0 +1,35 @@
using ProjectM.Simulation;
using Unity.Entities;
using UnityEngine;
namespace ProjectM.Authoring
{
/// <summary>
/// Authoring for the baked <see cref="CoverFieldSpawner"/> singleton (mirrors ClutterFieldSpawnerAuthoring).
/// Place once in the gameplay subscene and assign the CoverRock ghost prefab; RoomFieldSystem scatters
/// destructible cover per room (never in Boss rooms) with an origin keep-out. Carries no transform.
/// </summary>
public class CoverFieldSpawnerAuthoring : MonoBehaviour
{
[Tooltip("CoverRock ghost prefab: BlightClutterAuthoring (ScrapPerHit=0, Variant=4) + an Environment-layer collider + a GhostAuthoringComponent (ownerless, interpolated).")]
public GameObject CoverPrefab;
[Tooltip("Cover rocks per room (Boss rooms get none).")]
[Min(0)] public int Count = 3;
private class CoverFieldSpawnerBaker : Baker<CoverFieldSpawnerAuthoring>
{
public override void Bake(CoverFieldSpawnerAuthoring authoring)
{
var entity = GetEntity(authoring, TransformUsageFlags.None);
AddComponent(entity, new CoverFieldSpawner
{
Prefab = authoring.CoverPrefab != null
? GetEntity(authoring.CoverPrefab, TransformUsageFlags.Dynamic)
: Entity.Null,
Count = authoring.Count,
});
}
}
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 0a9b08ef91676fa4185406d9dec18c5e
@@ -629,10 +629,26 @@ namespace ProjectM.Server
uint st = progressToward < StuckMinProgressPerTick ? nav.ValueRO.StuckTicks + 1u : 0u; uint st = progressToward < StuckMinProgressPerTick ? nav.ValueRO.StuckTicks + 1u : 0u;
nav.ValueRW.LastPos = npos; nav.ValueRW.LastPos = npos;
if (st >= StuckUnstickTicks) if (st >= StuckUnstickTicks)
{
// COVER-AWARE (destructible-cover review wf_e14dd739-069 HIGH): if what blocks this enemy
// is a LIVE cover GHOST (BlightClutter carrier), do NOT phase-nudge — cover must genuinely
// hold until the player breaks it. No soft-lock is possible: the blocker is destructible,
// and the counter stays primed so any OTHER wedge (static geometry) still nudges next check.
bool blockedByCover = false;
if (havePhysics)
{
float3 toTgt = nTarget - npos; toTgt.y = 0f;
float tl = math.length(toTgt);
if (tl > 1e-4f && physics.CollisionWorld.SphereCast(
npos, 0.35f, toTgt / tl, math.min(1.8f, tl), out var coverHit, envFilter))
blockedByCover = SystemAPI.HasComponent<BlightClutter>(coverHit.Entity);
}
if (!blockedByCover)
{ {
nav.ValueRW.NudgeUntilTick = TickUtil.NonZero(now + NudgeBurstTicks); nav.ValueRW.NudgeUntilTick = TickUtil.NonZero(now + NudgeBurstTicks);
st = 0u; st = 0u;
} }
}
nav.ValueRW.StuckTicks = st; nav.ValueRW.StuckTicks = st;
} }
} }
@@ -153,6 +153,11 @@ namespace ProjectM.Server
// A positive baked yield must always make progress: a raw (int) truncation of a sub-1.0 per-hit // A positive baked yield must always make progress: a raw (int) truncation of a sub-1.0 per-hit
// value would deposit 0 AND never decrement Remaining -> an immortal target that silently eats shots. // value would deposit 0 AND never decrement Remaining -> an immortal target that silently eats shots.
int amount = math.max(1, (int)tgtYieldPerHit[bestIdx]); int amount = math.max(1, (int)tgtYieldPerHit[bestIdx]);
// DECOUPLED deposit (cover review wf_e14dd739-069): DESTRUCTIBLE COVER has ScrapPerHit=0 — it
// breaks in Remaining hits but yields NOTHING (durability must not be an economy faucet).
// Nodes/clutter (PerHit >= 1) keep deposit == decrement exactly as before.
// zero means ZERO (cover); any POSITIVE yield still credits >= 1 (the fractional-yield guard).
int deposit = tgtYieldPerHit[bestIdx] > 0f ? amount : 0;
byte yieldId = tgtYieldId[bestIdx]; byte yieldId = tgtYieldId[bestIdx];
// Route the yield into the HARVESTING player's PERSONAL inventory. The projectile carries the // Route the yield into the HARVESTING player's PERSONAL inventory. The projectile carries the
@@ -162,7 +167,8 @@ namespace ProjectM.Server
if (m_GhostOwnerLookup.HasComponent(projEntity) if (m_GhostOwnerLookup.HasComponent(projEntity)
&& playerByConn.TryGetValue(m_GhostOwnerLookup[projEntity].NetworkId, out var ownedPlayer)) && playerByConn.TryGetValue(m_GhostOwnerLookup[projEntity].NetworkId, out var ownedPlayer))
harvester = ownedPlayer; harvester = ownedPlayer;
HarvestMath.DepositYield(yieldId, amount, tgtToLedger[bestIdx], harvester, if (deposit > 0)
HarvestMath.DepositYield(yieldId, deposit, tgtToLedger[bestIdx], harvester,
m_InvLookup, ledger, true, haveDb, itemDb); m_InvLookup, ledger, true, haveDb, itemDb);
int rem = tgtRemaining[bestIdx] - amount; int rem = tgtRemaining[bestIdx] - amount;
tgtRemaining[bestIdx] = rem; tgtRemaining[bestIdx] = rem;
@@ -128,6 +128,33 @@ namespace ProjectM.Server
} }
} }
// DESTRUCTIBLE COVER (OPTIONAL singleton; review wf_e14dd739-069): never in Boss rooms (the boss
// has no depenetration backstop) and never inside the origin keep-out ring (player landing +
// portal). Variant stays the prefab's 4 — NEVER rerolled (the clutter block's explosive
// reroll must not leak into this copy).
if (plan.RoomType != RoomTypeId.Boss
&& SystemAPI.TryGetSingleton<CoverFieldSpawner>(out var cover)
&& cover.Prefab != Entity.Null)
{
var kBaked = SystemAPI.GetComponent<LocalTransform>(cover.Prefab);
var krng = new Random(RunMapMath.Hash(run.RunSeed, (uint)run.CurrentNodeId, 0xC0Eu) | 1u);
int kCount = math.clamp(cover.Count, 0, 6);
const float KeepOutFromOrigin = 7f;
for (int i = 0; i < kCount; i++)
{
float3 pos = origin;
for (int attempt = 0; attempt < 8; attempt++)
{
pos = RoomLayoutMath.ScatterInShape(plan.ShapeId, origin, i, kCount, ref krng);
if (math.distance(pos.xz, origin.xz) >= KeepOutFromOrigin) break;
}
if (math.distance(pos.xz, origin.xz) < KeepOutFromOrigin) continue; // unlucky draws: drop the piece
var e = ecb.Instantiate(cover.Prefab);
ecb.SetComponent(e, kBaked.WithPosition(pos));
ecb.AddComponent(e, new RoomTag { Room = room });
}
}
rf.LastSpawnedRoomEpoch = run.RoomEpoch; rf.LastSpawnedRoomEpoch = run.RoomEpoch;
SystemAPI.SetComponent(spawnerEntity, rf); SystemAPI.SetComponent(spawnerEntity, rf);
} }
@@ -0,0 +1,22 @@
using Unity.Entities;
namespace ProjectM.Simulation
{
/// <summary>
/// Baked singleton holding the DESTRUCTIBLE COVER ghost prefab (Exploding_Barrels sibling —
/// Cover_Rock_Build: a BlightClutter carrier with ScrapPerHit=0, Variant=4, and a baked
/// Environment-layer collider that blocks the player CC and the enemy sweep while alive).
/// RoomFieldSystem scatters <see cref="Count"/> cover rocks per room epoch — EXCEPT Boss rooms
/// (the boss has no depenetration backstop; review wf_e14dd739-069) — with a keep-out ring
/// around the room origin (player landing + portal). OPTIONAL: absent singleton = no cover.
/// Mirrors <see cref="ClutterFieldSpawner"/>; carries no transform.
/// </summary>
public struct CoverFieldSpawner : IComponentData
{
/// <summary>Baked cover-rock ghost prefab to instantiate.</summary>
public Entity Prefab;
/// <summary>Cover rocks per room (Boss rooms get none).</summary>
public int Count;
}
}
@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 0331196c0b301674189f1c1779f108da
@@ -270,6 +270,10 @@ namespace ProjectM.Simulation
continue; continue;
int amount = math.max(1, (int)harvPerHit[i]); int amount = math.max(1, (int)harvPerHit[i]);
// DECOUPLED deposit (cover review): cover has ScrapPerHit=0 — breaks in Remaining hits,
// yields nothing. Nodes/clutter (PerHit >= 1) keep deposit == decrement as before.
// zero means ZERO (cover); any POSITIVE yield still credits >= 1 (the fractional-yield guard).
int deposit = harvPerHit[i] > 0f ? amount : 0;
byte yieldId = harvYieldId[i]; byte yieldId = harvYieldId[i];
// Route by region: Base nodes credit the shared ledger DIRECTLY (the build pool); an // Route by region: Base nodes credit the shared ledger DIRECTLY (the build pool); an
// expedition / un-tagged target goes to the swinging player's PERSONAL inventory (spill to // expedition / un-tagged target goes to the swinging player's PERSONAL inventory (spill to
@@ -278,10 +282,13 @@ namespace ProjectM.Simulation
Entity meleeHarvester = Entity.Null; Entity meleeHarvester = Entity.Null;
if (meleePlayerByConn.TryGetValue(hc.OwnerId, out var meleePlayer)) if (meleePlayerByConn.TryGetValue(hc.OwnerId, out var meleePlayer))
meleeHarvester = meleePlayer; meleeHarvester = meleePlayer;
bool deposited = HarvestMath.DepositYield(yieldId, amount, harvToLedger[i], meleeHarvester, if (deposit > 0)
{
bool deposited = HarvestMath.DepositYield(yieldId, deposit, harvToLedger[i], meleeHarvester,
m_InvLookup, ledger, haveLedger, haveDb, itemDb); m_InvLookup, ledger, haveLedger, haveDb, itemDb);
if (!deposited) if (!deposited)
continue; continue; // never consume a YIELDING target for zero credit
}
int rem = harvRemaining[i] - amount; int rem = harvRemaining[i] - amount;
harvRemaining[i] = rem; harvRemaining[i] = rem;
+48 -441
View File
@@ -661,60 +661,6 @@ BoxCollider:
serializedVersion: 3 serializedVersion: 3
m_Size: {x: 3.9870093, y: 5, z: 1.5} m_Size: {x: 3.9870093, y: 5, z: 1.5}
m_Center: {x: 0, y: 2, z: 0} 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 --- !u!1 &47846457
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -1591,15 +1537,7 @@ Transform:
m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalPosition: {x: 0, y: 0, z: 0}
m_LocalScale: {x: 1, y: 1, z: 1} m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0 m_ConstrainProportionsScale: 0
m_Children: m_Children: []
- {fileID: 47838510}
- {fileID: 1718746030}
- {fileID: 1814418716}
- {fileID: 1572202107}
- {fileID: 582536833}
- {fileID: 175117792}
- {fileID: 1785428319}
- {fileID: 1438996196}
m_Father: {fileID: 0} m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &135921087 --- !u!1 &135921087
@@ -1920,60 +1858,6 @@ BoxCollider:
serializedVersion: 3 serializedVersion: 3
m_Size: {x: 3.8149579, y: 5, z: 1.5} m_Size: {x: 3.8149579, y: 5, z: 1.5}
m_Center: {x: 0, y: 2, z: 0} 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 --- !u!1 &175286056
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -5058,60 +4942,6 @@ BoxCollider:
serializedVersion: 3 serializedVersion: 3
m_Size: {x: 1.7547715, y: 0.8, z: 1.3944197} m_Size: {x: 1.7547715, y: 0.8, z: 1.3944197}
m_Center: {x: 0.0000024735928, y: 0.4, z: -0.000009506941} 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 --- !u!1 &584781805
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -9082,6 +8912,52 @@ BoxCollider:
serializedVersion: 3 serializedVersion: 3
m_Size: {x: 4.147015, y: 5, z: 1.5} m_Size: {x: 4.147015, y: 5, z: 1.5}
m_Center: {x: 0, y: 2, z: 0} 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 --- !u!1 &1106672234
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -12027,60 +11903,6 @@ BoxCollider:
serializedVersion: 3 serializedVersion: 3
m_Size: {x: 3.9249666, y: 5, z: 1.5} m_Size: {x: 3.9249666, y: 5, z: 1.5}
m_Center: {x: 0, y: 2, z: 0} 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 --- !u!1 &1441917224
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -13448,60 +13270,6 @@ BoxCollider:
serializedVersion: 3 serializedVersion: 3
m_Size: {x: 1.6302872, y: 0.903802, z: 1.4047824} m_Size: {x: 1.6302872, y: 0.903802, z: 1.4047824}
m_Center: {x: -0.07129079, y: 0.451901, z: 0.0632782} 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 --- !u!1 &1578777869
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -14753,60 +14521,6 @@ BoxCollider:
serializedVersion: 3 serializedVersion: 3
m_Size: {x: 3.9799314, y: 5, z: 1.5} m_Size: {x: 3.9799314, y: 5, z: 1.5}
m_Center: {x: 0, y: 2, z: 0} 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 --- !u!1 &1723007258
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -15072,60 +14786,6 @@ BoxCollider:
serializedVersion: 3 serializedVersion: 3
m_Size: {x: 2.4087837, y: 0.9642086, z: 2.2116926} m_Size: {x: 2.4087837, y: 0.9642086, z: 2.2116926}
m_Center: {x: -0.004358411, y: 0.4821043, z: 0.12872449} 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 --- !u!1 &1800669619
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -15391,60 +15051,6 @@ BoxCollider:
serializedVersion: 3 serializedVersion: 3
m_Size: {x: 4.1653576, y: 5, z: 1.5} m_Size: {x: 4.1653576, y: 5, z: 1.5}
m_Center: {x: 0, y: 2, z: 0} 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 --- !u!1 &1815241087
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -18643,3 +18249,4 @@ SceneRoots:
- {fileID: 1518140828} - {fileID: 1518140828}
- {fileID: 125166252} - {fileID: 125166252}
- {fileID: 1384477683} - {fileID: 1384477683}
- {fileID: 1106173031}
+1 -1
View File
@@ -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.10.2). - **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.10.2).
- **VolumeProfile.Add persistence + the URP `m_AssetVersion` build blocker** → archive 2026-07-06 (+ native memory `urp-global-settings-version-blocks-build`). - **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). - **`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. - **A GA "projectile" prefab self-propels** — strip to particles before `Start` (`CombatFeedbackSystem.StripCosmetic`); verify *components*, not the name.
### Aim controls ### Aim controls
@@ -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 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. replication. Geysers/trap tiles = later hazard variants on the same HazardExplosionSystem chassis.
See [[Exploding_Barrels_Build_Spec]]. See [[Exploding_Barrels_Build_Spec]].
8. **Destructible cover:** in-room cover rocks take damage and crumble (Charger smashes through, players carve LOS). 8. **Destructible cover — SHIPPED (2026-07-10, `bbf418e77`, review-first `wf_e14dd739-069`): PHASE 1.5 IS
Structures already have Health; **re-validate the enemy stuck-fix backstop when cover can disappear mid-fight.** 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. **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 enemy took exactly 26 (30→4), walk-out escape confirmed (fuse is escapable by design — first unpinned bait
simply left the radius) · console clean. 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 ## Next-session intent
Phase 1.5 remaining: **destructible cover** (the last long-term item — design-review-first, MUST re-validate **Phase 1.5 is COMPLETE** (collision · lighting · art-look LOCKED clean dark-Synty · ambient motion ·
the enemy stuck-fix backstop when cover can vanish mid-fight) → then the 1.5 gate lap → **Phase 1.7 boon breakables · attack distinctness · exploding barrels · destructible cover). Next per the locked order:
overhaul** (design review required — replicated ability swaps). Queued taste items: re-enable curated base **the operator's 1.5 gate lap** ("no longer static"?) → **Phase 1.7 boon overhaul** (~12 mechanic-changers
flora · arid brightness · craters call · B5 split-panels smoke · barrel VFX polish (authored explosion on existing hooks; design-review-FIRST — replicated ability swaps) → Phase 2 hub-ification. Taste queue:
prefab instead of the procedural burst). 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]] · Related: [[Iteration_2026-07_CoopHades]] · [[2026-07-07_Workflow_Consolidation]] ·
[[2026-07-07_Expedition_Enemy_Stuck_Harvest_Feedback]] [[2026-07-07_Expedition_Enemy_Stuck_Harvest_Feedback]]