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
49 lines (48 loc) • 2.27 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var parseBoard_1 = require("./parseBoard");
var parseMove_1 = require("./parseMove");
var composeBoardArrayToString_1 = require("./composeBoardArrayToString");
var helpers_1 = require("./helpers");
/**
* Creates new game state from the current state and the added move
* @param move - a string representing a move in long UCI notation
* @param state - an IGameState object representing the current state of the game
* @returns the new game state after the move is added
*
* @internal
*/
function createNewGameState(move, state) {
var boardArray = (0, parseBoard_1.parseBoard)(state.fenBoard);
var isHalfMoveClockMove;
var castlingLetter;
var parsedMove = (0, parseMove_1.parseMove)(move);
var _a = parsedMove.move, fromIndex = _a[0], toIndex = _a[1];
var pieceToMove = boardArray[fromIndex];
if (!(0, helpers_1.isPawn)(pieceToMove) && !(0, helpers_1.isCapture)(pieceToMove, boardArray[toIndex])) {
isHalfMoveClockMove = true;
}
boardArray[fromIndex] = '.';
boardArray[toIndex] = parsedMove.promotionPiece
? parsedMove.promotionPiece
: pieceToMove;
if (parsedMove.castling) {
var _b = parsedMove.castling.rookMove, rookFromIndex = _b[0], rookToindex = _b[1];
boardArray[rookFromIndex] = '.';
boardArray[rookToindex] = state.hasToPlay === 'w' ? 'R' : 'r';
castlingLetter = parsedMove.castling.letter;
}
// Updates the state before returning it
state.fenBoard = (0, helpers_1.updateFenBoard)((0, composeBoardArrayToString_1.composeBoardArrayToString)(boardArray));
if (state.hasToPlay === 'b')
state.fullMoveClock = (0, helpers_1.incrementFullMoveClock)(state.fullMoveClock);
if (isHalfMoveClockMove)
state.halfMoveClock = (0, helpers_1.incrementHalfMoveClock)(state.halfMoveClock);
if (castlingLetter)
state.availableCastlings = (0, helpers_1.updateAvailableCastlings)(state.availableCastlings, castlingLetter);
if (parsedMove.enPassantTarget)
state.enPassantTarget = parsedMove.enPassantTarget;
state.hasToPlay = (0, helpers_1.toggleHasToPlay)(state.hasToPlay);
return state;
}
exports.default = createNewGameState;