UNPKG

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
"use strict"; 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;