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;
}
}