using Unity.Entities; using Unity.NetCode; namespace ProjectM.Simulation { /// /// MC-0 — server-only dev-telemetry accumulator (a singleton). Counters are incremented at the /// combat stamp sites (wired in MC-1+) so the fun-gate is MEASURED, not argued. NOT a /// [GhostField] (no ghost-hash change); shipped to dev clients via a periodic /// RPC. The component type is unconditional (stable across /// release/dev peers); only the dev send/sample/receive SYSTEMS are #if UNITY_EDITOR. /// public struct DevTelemetry : IComponentData { /// Hits a dash i-frame window negated (incremented in HealthApplyDamageSystem, MC-1). public uint DashIFrameNegatedHits; /// Dashes whose i-frame window negated nothing (spam signal, MC-1). public uint DashesWasted; /// Charger lunges that whiffed and opened a punish window (EnemyAISystem, MC-1). public uint ChargerWhiffWindowsOpened; /// Of those, the ones the player actually punished (MC-1). public uint ChargerWhiffPunishesLanded; /// Living Husks, sampled each report — proof-of-life (changes during play, no MC-1 dep). public uint LiveEnemyCount; /// Server tick at the last sample — proof-of-life that the pipe is live. public uint LastSampleTick; } /// /// MC-0 — server → dev-client telemetry snapshot (sent periodically by the editor-only sampler). /// Unconditional wire type (like ) so the reflection-built /// RpcCollection hash matches across release/dev peers; only the send/receive SYSTEMS are /// #if UNITY_EDITOR. The dev overlay reads the latest snapshot to show live fun-gate counters. /// public struct DebugTelemetryReport : IRpcCommand { public uint DashIFrameNegatedHits; public uint DashesWasted; public uint ChargerWhiffWindowsOpened; public uint ChargerWhiffPunishesLanded; public uint LiveEnemyCount; public uint LastSampleTick; } }