chess-legal-moves
Version:
Analyses a given chess game position in Fen notation to return legal moves and provides the next game position after a given move
52 lines (51 loc) • 2.12 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.mapPositionToBoardIndex = exports.parseMove = void 0;
var regex_1 = require("../helpers/regex");
// Document parseMove function
function parseMove(moveString) {
// @TODO extract functions to improve readability
// @TODO test everything
var from = moveString.substring(0, 2);
var to = moveString.substring(2, 4);
var parsedMove = {
move: [mapPositionToBoardIndex(from), mapPositionToBoardIndex(to)],
};
var isPromotionMove = moveString.match(regex_1.default.promotionMove);
if (isPromotionMove)
parsedMove.promotionPiece = moveString.substring(4);
var isCastlingMove = moveString.match(regex_1.default.castlingMove);
var castlingMap = {
e1g1: { moveIndexes: [7, 5], castlingLetter: 'K' },
e1c1: { moveIndexes: [0, 3], castlingLetter: 'Q' },
e8g8: { moveIndexes: [63, 61], castlingLetter: 'k' },
e8c8: { moveIndexes: [56, 59], castlingLetter: 'q' },
};
if (isCastlingMove)
parsedMove.castling = {
rookMove: castlingMap[moveString].moveIndexes,
letter: castlingMap[moveString].castlingLetter,
};
var isPawnDoubleMove = moveString.match(regex_1.default.pawnDoubleMove);
if (isPawnDoubleMove) {
var from_1 = moveString.substring(0, 2);
parsedMove.enPassantTarget = from_1;
parsedMove.enPassantTarget = parsedMove.enPassantTarget.replace('2', '3');
parsedMove.enPassantTarget = parsedMove.enPassantTarget.replace('7', '6');
}
return parsedMove;
}
exports.parseMove = parseMove;
function mapPositionToBoardIndex(position) {
var filesLetter = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'];
var indexMap = {};
var counter = 0;
for (var rank = 1; rank <= 8; rank++) {
for (var fileIndex = 0; fileIndex < filesLetter.length; fileIndex++) {
indexMap[filesLetter[fileIndex] + rank.toString()] = counter;
counter++;
}
}
return indexMap[position];
}
exports.mapPositionToBoardIndex = mapPositionToBoardIndex;