import { DominoValue } from '../game/DominoValue'; import { TrainBranch } from '../game/TrainData'; import { TrainLayoutEntry, TrainLayoutStyle, TrainSegment } from '../app/trainLayout'; export interface LayoutValidationIssue { code: string; message: string; index?: number; } export interface LayoutValidationResult { valid: boolean; issues: LayoutValidationIssue[]; } export declare function projectOnTrainAxis(dx: number, dy: number, angle: number): number; export declare function projectOnPerpendicularAxis(dx: number, dy: number, angle: number): number; export declare function validateDominoChain(dominoes: readonly DominoValue[]): LayoutValidationResult; export interface AxisPosition { along: number; perp: number; } /** * Reconstructs the expected position of every tile in train-axis space * (along the train and perpendicular to it), mirroring computeTrainLayout. * Positions are relative to the first tile, so only deltas are meaningful. */ export declare function expectedAxisLayout(layout: readonly TrainLayoutEntry[], layoutStyle: TrainLayoutStyle, outwardSign: number, dominoWidth?: number, dominoHeight?: number): AxisPosition[]; export declare function validateConsecutiveSpacing(layout: readonly TrainLayoutEntry[], angle: number, layoutStyle: TrainLayoutStyle, tolerance?: number, outwardSignOverride?: number): LayoutValidationResult; export declare function validateNoPairOverlap(layout: readonly TrainLayoutEntry[], angle: number, layoutStyle: TrainLayoutStyle, tolerance?: number, outwardSignOverride?: number): LayoutValidationResult; export declare function validateTrainLayout(layout: readonly TrainLayoutEntry[], dominoes: readonly DominoValue[], angle: number, layoutStyle: TrainLayoutStyle, tolerance?: number, outwardSignOverride?: number): LayoutValidationResult; /** * Validates the chicken-foot branch tree as data: every chain links up, every * foot hangs off a real double, and every toe's first tile matches the double's * value. Recurses into nested feet. */ export declare function validateChickenFootChain(branch: TrainBranch): LayoutValidationResult; /** * Validates a laid-out chicken-foot tree. Each run's tiles must link up by value * and match its tile count; each toe must start the right distance out from its * host double (measured along the toe's axis); and — the hard physical rule — no * two tiles anywhere in the tree may overlap. * * The center toe is a centered linear run while the inbound spine is offset, so * a single run can mix layout styles; the per-tile overlap test below checks the * real constraint directly rather than reconstructing each style's spacing. */ export declare function validateTrainTree(segments: readonly TrainSegment[], tolerance?: number): LayoutValidationResult; export declare function dominoCorners(entry: TrainLayoutEntry, dominoWidth?: number, dominoHeight?: number): { x: number; y: number; }[];