Feel: breakable clutter reads as Hades-style barrels, one-hit pop

The BlightClutter destructible-ghost chain (per-room seeding, unified
DR-018-safe sweep, melee + projectile breaking, personal-inventory
drops) already existed end-to-end - the roadmap item's gap was FEEL:

- Visual: prefab Model mesh swapped SM_Env_Rock_Chunk_01 (read as
  scenery) -> SM_Prop_Barrel_01 (FantasyKingdom, same proven atlas
  material). Base-pivot barrel offset -1 on the Model child (scatter
  y=1 is the capsule plane - the base-pivot float gotcha).
- One-hit pop: prefab Remaining 8 -> 2 (both hit paths decrement by
  max(1,(int)ScrapPerHit)=2, so one swing/shot shatters); authoring
  default kept in sync.
- Density: MaxClutterPerRoom 6 -> 8.

Verified live: 8 barrels seeded in a combat room, grounded (screenshot);
an injected projectile through the real ResourceHarvestSystem sweep
popped one barrel in ONE hit (8 -> 7) and credited 2 Biomass; 466/466
EditMode, console clean.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-09 22:14:43 -07:00
parent 28a683b358
commit 53bc21143d
3 changed files with 5 additions and 5 deletions
+3 -3
View File
@@ -27,7 +27,7 @@ Transform:
m_GameObject: {fileID: 1085570720822716955} m_GameObject: {fileID: 1085570720822716955}
serializedVersion: 2 serializedVersion: 2
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalPosition: {x: 0, y: -1, z: 0}
m_LocalScale: {x: 1.5, y: 1.5, z: 1.5} m_LocalScale: {x: 1.5, y: 1.5, z: 1.5}
m_ConstrainProportionsScale: 0 m_ConstrainProportionsScale: 0
m_Children: [] m_Children: []
@@ -40,7 +40,7 @@ MeshFilter:
m_PrefabInstance: {fileID: 0} m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1085570720822716955} m_GameObject: {fileID: 1085570720822716955}
m_Mesh: {fileID: 4300000, guid: d8de5840b690b8c4cb783b65f1196981, type: 3} m_Mesh: {fileID: 4300000, guid: ad7e0b3cc539c4c4d9adbe26d67de586, type: 3}
--- !u!23 &2902084588362297385 --- !u!23 &2902084588362297385
MeshRenderer: MeshRenderer:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@@ -175,7 +175,7 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 6b1aa9b83194a2c41b940dd9532377f4, type: 3} m_Script: {fileID: 11500000, guid: 6b1aa9b83194a2c41b940dd9532377f4, type: 3}
m_Name: m_Name:
m_EditorClassIdentifier: ProjectM.Authoring::ProjectM.Authoring.BlightClutterAuthoring m_EditorClassIdentifier: ProjectM.Authoring::ProjectM.Authoring.BlightClutterAuthoring
Remaining: 8 Remaining: 2
ScrapPerHit: 2 ScrapPerHit: 2
HitRadius: 1 HitRadius: 1
Variant: 0 Variant: 0
@@ -14,7 +14,7 @@ namespace ProjectM.Authoring
public class BlightClutterAuthoring : MonoBehaviour public class BlightClutterAuthoring : MonoBehaviour
{ {
[Tooltip("Hit-points before the clutter shatters.")] [Tooltip("Hit-points before the clutter shatters.")]
[Min(1)] public int Remaining = 8; [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 projectile hit — the 'minor scrap' trickle.")]
[Min(1f)] public float ScrapPerHit = 2f; [Min(1f)] public float ScrapPerHit = 2f;
@@ -35,7 +35,7 @@ namespace ProjectM.Server
public partial struct RoomFieldSystem : ISystem public partial struct RoomFieldSystem : ISystem
{ {
/// <summary>Max clutter pieces per room — cosmetic ghosts still cost relevancy, keep the dressing light.</summary> /// <summary>Max clutter pieces per room — cosmetic ghosts still cost relevancy, keep the dressing light.</summary>
const int MaxClutterPerRoom = 6; const int MaxClutterPerRoom = 8;
EntityQuery m_RoomTagged; EntityQuery m_RoomTagged;