chlss
Version:
Open-Source Chess Engine in TypeScript.
81 lines (80 loc) • 4.43 kB
JavaScript
;
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);
}
}
}
};