namespace MinecraftClient.Pathing.Moves;
///
/// Kind of jump-family move. Each flavor selects a different evaluator path
/// inside while sharing low-level primitives
/// (head clearance, destination clearance, flight-path sweep, cost model).
///
public enum JumpFlavor
{
///
/// Single-block cardinal or diagonal walk at the same Y. No jump input.
/// Covers the old MoveTraverse and MoveDiagonal.
///
Walk,
///
/// Single-block vertical step (dy = +1 up or dy = -1 down), cardinal or
/// diagonal. Covers MoveAscend, MoveDiagonalAscend, and
/// MoveDiagonalDescend.
///
Step,
///
/// Multi-block sprint jump, cardinal or diagonal. Covers MoveParkour.
///
SprintJump,
///
/// Dominant-axis sprint jump that uses an inner wall for support. Covers
/// MoveSidewallParkour.
///
Sidewall,
}
///
/// Fully describes a single jump-family move (Walk / Step / SprintJump /
/// Sidewall). All geometry that downstream planners or templates need can be
/// derived from this value, so A* only needs to enumerate descriptors rather
/// than hard-coded IMove subclasses.
///
public readonly record struct JumpDescriptor(
int XOffset,
int ZOffset,
int YDelta,
JumpFlavor Flavor)
{
public bool IsCardinal => (XOffset == 0) != (ZOffset == 0);
public bool IsDiagonal => XOffset != 0 && ZOffset != 0;
public int HorizontalMajor
=> System.Math.Max(System.Math.Abs(XOffset), System.Math.Abs(ZOffset));
public int HorizontalMinor
=> System.Math.Min(System.Math.Abs(XOffset), System.Math.Abs(ZOffset));
}