using Unity.Entities;
using Unity.Mathematics;
namespace ProjectM.Simulation
{
///
/// MC-1 — predicted, NON-replicated dash window on the owner-predicted player. A SHAPE-clone of
/// KnockbackState, but UNLIKE KnockbackState it lives on a PREDICTED player and is re-simulated from
/// the replicated InputEvent every predicted tick — so it is authoritative on
/// the server at the tick HealthApplyDamageSystem drains damage, even for a melee strike appended a
/// tick earlier in the plain group. All ticks routed through TickUtil.NonZero; compared via
/// only (never raw uint). NOT a [GhostField] (no player-ghost
/// re-bake). Baked all-zero (idle).
///
public struct DashState : IComponentData
{
/// Planar XZ dash heading, captured at dash-start.
public float2 Dir;
/// Raw ServerTick at dash-start (NonZero-coerced). Lower (inclusive) bound of the i-frame window.
public uint StartTick;
/// StartTick + i-frame window (NonZero). I-frames cover the HALF-OPEN range [StartTick, IFrameUntilTick).
public uint IFrameUntilTick;
/// IFrameUntilTick + recovery tail (NonZero). Movement-lock tail (no i-frames) so a panic-dash is punishable.
public uint RecoverUntilTick;
/// Hits negated by THIS dash's i-frame window. SERVER-written (HealthApplyDamageSystem);
/// 0 at window-close = a wasted dash (DevTelemetry.DashesWasted spam signal). The client copy stays 0.
public uint NegatedCount;
}
}