export interface Hovering { fen: Fen; uci: Uci; } export type ExplorerDb = 'lichess' | 'masters' | 'player'; export type ExplorerSpeed = Speed; export type ExplorerMode = 'casual' | 'rated'; export interface PlayerOpts { name: string; } export interface ExplorerOpts { endpoint: string; endpoint3: string; tablebaseEndpoint: string; } export interface ExplorerData { fen: Fen; moves: MoveStats[]; isOpening?: true; tablebase?: true; } export interface OpeningData extends ExplorerData, Partial { moves: OpeningMoveStats[]; topGames?: OpeningGame[]; recentGames?: OpeningGame[]; opening?: Opening; } export interface Opening { eco: string; name: string; } export interface OpeningGame { id: string; white: OpeningPlayer; black: OpeningPlayer; winner?: Color; year?: string; month?: string; speed?: Speed; } interface OpeningPlayer { name: string; rating: number; } export type TablebaseCategory = | 'loss' | 'unknown' | 'maybe-loss' | 'blessed-loss' | 'draw' | 'cursed-win' | 'maybe-win' | 'win'; export interface TablebaseData extends ExplorerData { moves: TablebaseMoveStats[]; dtz: number | null; dtm: number | null; checkmate: boolean; stalemate: boolean; variant_win: boolean; variant_loss: boolean; insufficient_material: boolean; category: TablebaseCategory; } export interface MoveStats { uci: Uci; san: San; } export interface OpeningMoveStats extends MoveStats { white: number; black: number; draws: number; averageRating: number; } export interface TablebaseMoveStats extends MoveStats { dtz: number | null; dtm: number | null; checkmate: boolean; stalemate: boolean; variant_win: boolean; variant_loss: boolean; insufficient_material: boolean; zeroing: boolean; category: TablebaseCategory; } export function isOpening(m: ExplorerData): m is OpeningData { return !!m.isOpening; } export function isTablebase(m: ExplorerData): m is TablebaseData { return !!m.tablebase; } export interface SimpleTablebaseHit { fen: Fen; best?: Uci; // no move if checkmate/stalemate winner: Color | undefined; }