import type { Color, DirectionIndex, FriendlyPiece, Graph, Index, ParsedGame, Unoccupied } from '../base'; import type { ToMoves } from '../utils'; export type KingMoves = ToMoves<[ ..._KingStep, ..._KingStep, ..._KingStep, ..._KingStep, ..._KingStep, ..._KingStep, ..._KingStep, ..._KingStep, ..._KingCastle, ..._KingCastle ], From>; /** Normal king movement */ export type _KingStep = Graph[From][Direction] extends infer To extends Index ? Game['board'][To] extends FriendlyPiece ? [] : [To] : []; /** Castling moves */ type _KingCastle = From extends _KingCastleFrom ? _HasCastlingRights extends true ? Direction extends 5 ? Graph[From][5] extends infer Short1 extends Index ? Game['board'][Short1] extends Unoccupied ? Graph[Short1][5] extends infer Short2 extends Index ? Game['board'][Short2] extends Unoccupied ? Graph[Short2][5] extends infer RookPosition extends Index ? Game['board'][RookPosition] extends _FriendlyRook ? [Short2] : [] : [] : [] : [] : [] : [] : Graph[From][3] extends infer Long1 extends Index ? Game['board'][Long1] extends Unoccupied ? Graph[Long1][3] extends infer Long2 extends Index ? Game['board'][Long2] extends Unoccupied ? Graph[Long2][3] extends infer Long3 extends Index ? Game['board'][Long3] extends Unoccupied ? Graph[Long3][3] extends infer RookPosition extends Index ? Game['board'][RookPosition] extends _FriendlyRook ? [Long2] : [] : [] : [] : [] : [] : [] : [] : [] : [] : []; type _KingCastleFrom = T extends 'w' ? 60 : 4; type _HasCastlingRights = Friendly extends 'w' ? Direction extends 3 ? Game['castling']['Q'] : Game['castling']['K'] : Direction extends 3 ? Game['castling']['q'] : Game['castling']['k']; type _FriendlyRook = T extends 'w' ? 'R' : 'r'; export {};