LANTERN P1 step 1b: per-socket effective-stats fold (additive)

Per Phase1_Combat_Gym_Build_Spec §7 (additive; legacy single EffectiveAbilityStats + its
fold stay until steps 2/2.5 migrate readers, then retired):
- EffectiveSocketStats: 4-wide derived (non-replicated) per-socket effective-stats buffer.
- PlayerAuthoring bakes it (4 rows).
- StatRecomputeSystem: a SECOND fold loop (separate query, under the 7-arg cap) folds each
  socket's SparkId blob base with the SHARED StatModifier band (uniform; per-Spark warping =
  Phase 4) into EffectiveSocketStats[i]; empty socket (SparkId 0) -> zeroed default.
  Fixed CS1654 by writing through a mutable local copy of the buffer handle.
L1 clean; L2 489/489 (new SocketFold_Folds_Per_Socket_With_Uniform_Band).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-14 10:43:31 -07:00
parent 67095024b9
commit b143eb6bb5
5 changed files with 106 additions and 0 deletions
@@ -118,6 +118,11 @@ namespace ProjectM.Authoring
sockets.Add(new AbilitySocket { SparkId = 0 });
AddComponent<SocketCooldown>(entity);
AddComponent<FrameId>(entity);
// Step 1b: per-socket effective-stats buffer (4 rows), folded each predicted tick by
// StatRecomputeSystem (additive; the legacy single EffectiveAbilityStats stays until steps 2/2.5).
var effSockets = AddBuffer<EffectiveSocketStats>(entity);
for (int sk2 = 0; sk2 < SocketId.Count; sk2++)
effSockets.Add(new EffectiveSocketStats());
}
}