UNPKG

chlss

Version:

Open-Source Chess Engine in TypeScript.

81 lines (80 loc) 4.43 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.MoveGenerator = void 0; const colour_1 = require("./colour"); const piece_1 = require("./piece"); const boardPosition_1 = require("./boardPosition"); const coords_1 = require("./coords"); const queenMoveGenerator_1 = require("./queenMoveGenerator"); const pawnMoveGenerator_1 = require("./pawnMoveGenerator"); const bishopMoveGenerator_1 = require("./bishopMoveGenerator"); const rookMoveGenerator_1 = require("./rookMoveGenerator"); const knightMoveGenerator_1 = require("./knightMoveGenerator"); const kingMoveGenerator_1 = require("./kingMoveGenerator"); const castlingMoveGenerator_1 = require("./castlingMoveGenerator"); const moveMaker_1 = require("./moveMaker"); exports.MoveGenerator = { filterIllegalMoves(moveList, colourToMove, boardPosition, enPassant) { for (const iMove of [...moveList].reverse()) { // TODO: Instead of copy boardPosition, try to undo move. const position = boardPosition_1.BoardPosition.copyAsync(boardPosition); moveMaker_1.MoveMaker.makeMoveOnBoard(position, iMove); const enemyMoves = []; exports.MoveGenerator.generatePseudoLegalMoves(position, colour_1.Colours.inverseColour(colourToMove), enemyMoves, enPassant); const ourKingPiece = piece_1.Piece.getKing(colourToMove); const canKillKing = enemyMoves.some(function (m) { return m.targetPiece === ourKingPiece; }); if (canKillKing) { moveList.splice(moveList.indexOf(iMove), 1); } } }, generateLegalMoves(board, colourToMove) { const moveList = []; this.generatePseudoLegalMoves(board.position, colourToMove, moveList, board.enPassant); this.filterIllegalMoves(moveList, colourToMove, board.position, board.enPassant); castlingMoveGenerator_1.CastlingMoveGenerator.generateCastlingMoves(board, colourToMove, moveList); return moveList; }, generatePseudoLegalMoves(boardPosition, colourToMove, moveList, enPassant) { /* * When all data is reached, and we have to use some generator [KingMoveGenerator etc.] to generate moves * We're adding it to the 'taskList' which is list of Promises. * */ for (let index = 0; index < 64; index++) { const squareIndex = index; const piece = boardPosition_1.BoardPosition.getPieceOrNull(boardPosition, squareIndex); /* if piece is empty, go to next square */ if (piece == null) continue; const pieceColour = piece_1.Piece.getColour(piece); if (pieceColour == null) continue; /* If piece is not colour to move, go to next square. */ if (!(piece_1.Piece.compareColour(pieceColour, colourToMove))) continue; /* get the square coords, to avoid double calls of the same methods... */ const posX = coords_1.Coords.toX(squareIndex); const posY = coords_1.Coords.toY(squareIndex); if (piece_1.Piece.isPawn(piece)) { pawnMoveGenerator_1.PawnMoveGenerator.generatePawnMoves(boardPosition, piece, squareIndex, posX, posY, pieceColour, moveList, enPassant); } else if (piece_1.Piece.isQueen(piece)) { queenMoveGenerator_1.QueenMoveGenerator.generateQueenMoves(boardPosition, piece, pieceColour, squareIndex, posX, posY, moveList); } else if (piece_1.Piece.isBishop(piece)) { bishopMoveGenerator_1.BishopMoveGenerator.generateBishopMoves(boardPosition, piece, pieceColour, squareIndex, posX, posY, moveList); } else if (piece_1.Piece.isRook(piece)) { rookMoveGenerator_1.RookMoveGenerator.generateRookMoves(boardPosition, piece, pieceColour, squareIndex, posX, posY, moveList); } else if (piece_1.Piece.isKnight(piece)) { knightMoveGenerator_1.KnightMoveGenerator.generateKnightMoves(boardPosition, piece, pieceColour, squareIndex, posX, posY, moveList); } else if (piece_1.Piece.isKing(piece)) { kingMoveGenerator_1.KingMoveGenerator.generateKingMoves(boardPosition, squareIndex, piece, pieceColour, posX, posY, moveList); } } } };