diff --git a/src/lib/chess/types.ts b/src/lib/chess/types.ts index 1abd471..44e147d 100644 --- a/src/lib/chess/types.ts +++ b/src/lib/chess/types.ts @@ -9,4 +9,36 @@ export enum Piece { WHITE = 8, BLACK = 16, +} + +export const CHAR_TO_PIECE: Record = { + "-": Piece.EMPTY, + "K": Piece.WHITE | Piece.KING, + "Q": Piece.WHITE | Piece.QUEEN, + "R": Piece.WHITE | Piece.ROOK, + "B": Piece.WHITE | Piece.BISHOP, + "N": Piece.WHITE | Piece.KNIGHT, + "P": Piece.WHITE | Piece.PAWN, + "k": Piece.BLACK | Piece.KING, + "q": Piece.BLACK | Piece.QUEEN, + "r": Piece.BLACK | Piece.ROOK, + "b": Piece.BLACK | Piece.BISHOP, + "n": Piece.BLACK | Piece.KNIGHT, + "p": Piece.BLACK | Piece.PAWN, +}; + +export const PIECE_TO_CHAR: Record = { + [Piece.EMPTY]: "-", + [Piece.WHITE | Piece.KING]: "K", + [Piece.WHITE | Piece.QUEEN]: "Q", + [Piece.WHITE | Piece.ROOK]: "R", + [Piece.WHITE | Piece.BISHOP]: "B", + [Piece.WHITE | Piece.KNIGHT]: "N", + [Piece.WHITE | Piece.PAWN]: "P", + [Piece.BLACK | Piece.KING]: "k", + [Piece.BLACK | Piece.QUEEN]: "q", + [Piece.BLACK | Piece.ROOK]: "r", + [Piece.BLACK | Piece.BISHOP]: "b", + [Piece.BLACK | Piece.KNIGHT]: "n", + [Piece.BLACK | Piece.PAWN]: "p", } \ No newline at end of file diff --git a/src/lib/chess/utils.ts b/src/lib/chess/utils.ts index 6f2e7f8..90acea8 100644 --- a/src/lib/chess/utils.ts +++ b/src/lib/chess/utils.ts @@ -1,29 +1,11 @@ -import { Piece } from "./types"; - -// export function fen2array(fen: string): Int8Array { -// } +import { CHAR_TO_PIECE, Piece } from "./types"; export const startFEN = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0"; -const CHAR_TO_PIECE: Record = { - "-": Piece.EMPTY, - "K": Piece.WHITE | Piece.KING, - "Q": Piece.WHITE | Piece.QUEEN, - "R": Piece.WHITE | Piece.ROOK, - "B": Piece.WHITE | Piece.BISHOP, - "N": Piece.WHITE | Piece.KNIGHT, - "P": Piece.WHITE | Piece.PAWN, - "k": Piece.BLACK | Piece.KING, - "q": Piece.BLACK | Piece.QUEEN, - "r": Piece.BLACK | Piece.ROOK, - "b": Piece.BLACK | Piece.BISHOP, - "n": Piece.BLACK | Piece.KNIGHT, - "p": Piece.BLACK | Piece.PAWN, -}; export class Board { public board = new Int8Array(8 ** 2); public details = { - turn: "w", + whiteTurn: true, castling: { white: { king: true, queen: true }, black: { king: true, queen: true }, @@ -39,8 +21,8 @@ export class Board { loadFEN(fen = startFEN) { const [position, turn, castling, enPassant, halfMove, fullMove] = fen.split(" "); - this.board.fill(Piece.EMPTY); + this.board.fill(Piece.EMPTY); position.split("/").forEach((row, rank) => { let file = 0; row.split("").forEach((char) => { @@ -49,5 +31,33 @@ export class Board { file++; }); }); + + this.details.whiteTurn = turn === "w"; + + this.details.castling.white.king = castling.includes("K"); + this.details.castling.white.queen = castling.includes("Q"); + this.details.castling.black.king = castling.includes("k"); + this.details.castling.black.queen = castling.includes("q"); + + this.details.enPassant = algebraicToIndex(enPassant); + + this.details.halfMove = parseInt(halfMove); + this.details.fullMove = parseInt(fullMove); + } +} + +function algebraicToIndex(algebraic: string): number { + const FILE_TO_INDEX: Record = { + a: 0, b: 1, c: 2, d: 3, e: 4, f: 5, g: 6, h: 7, + } + try { + if (algebraic.length !== 2) return -1; + const [file, rank] = algebraic.split(""); + const rankIndex = parseInt(rank) - 1; + const fileIndex = FILE_TO_INDEX[file]; + + return rankIndex * 8 + fileIndex; + } catch { + return -1; } } \ No newline at end of file diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 4eff4e1..3ac01ec 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -1,4 +1,5 @@