Slice 2 (WIP): class data layer + melee-augment routing

Foundation for Two Classes (DR-037). New ids (CharacterId.Warrior/Ranger,
AbilityId.WarriorCone, StatTarget.MeleeDamage/MeleeRange); CharacterStatsRef.Id ->
[GhostField] so the owning client folds the right class stats; MeleeComboSystem
folds per-player MeleeDamage/MeleeRange off the replicated StatModifier buffer
(HasBuffer-guarded -> identity without class seeds, so behavior-preserving).
345/345 EditMode. Slice 2 design review + locked forks logged in the session note.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-18 00:23:56 -07:00
parent f98125f0b2
commit d9d67c4e78
4 changed files with 33 additions and 9 deletions
@@ -1,15 +1,16 @@
using Unity.Entities;
using Unity.NetCode;
namespace ProjectM.Simulation
{
/// <summary>
/// Which authored character-stats definition this entity uses - a light key into the CharacterStats
/// blob, replacing M2's inlined PlayerMoveStats values. Not replicated (baked identically on both
/// worlds); promote to a GhostField if runtime character changes are ever needed. <c>Id</c> stores a
/// blob, replacing M2's inlined PlayerMoveStats values. NOW a [GhostField] (Slice 2 classes) so the
/// server-written per-player class id replicates -> the owning client folds correct stats. <c>Id</c> stores a
/// <see cref="CharacterId"/>.
/// </summary>
public struct CharacterStatsRef : IComponentData
{
public byte Id;
[GhostField] public byte Id;
}
}