Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- function log(msg) {
- //channel.message(msg);
- }
- var PAWN = function(src, dst, game, simulate) {
- log("Evaluating move function for pawn at " + src.x + ", " + src.y + " to " + dst.x + ", " + dst.y);
- var board = game.board;
- var black = getPiece(board, src).black;
- var dir = black ? -1 : 1;
- if (dst.y != src.y + dir) {
- if (dst.x != src.x)
- return false;
- if (dst.y != src.y + dir * 2)
- return false;
- if (src.y != (black ? 6 : 1))
- return false;
- if (getPiece(board, add(src, 0, dir)) !== null || getPiece(board, dst) !== null)
- return false;
- if (!simulate)
- game.enPassantSquare = dst;
- } else if (dst.x == src.x) {
- if (getPiece(board, add(src, 0, dir)) !== null)
- return false;
- if (!simulate)
- game.enPassantSquare = null;
- } else {
- if (Math.abs(dst.x - src.x) != 1)
- return false;
- if (getPiece(board, dst) === null) {
- var eps = add(dst, 0, -dir);
- if (game.enPassantSquare === null || game.enPassantSquare.x != eps.x || game.enPassantSquare.y != eps.y)
- return false;
- if (!simulate)
- setPiece(board, eps, null);
- } else {
- if (getPiece(board, dst).black == black)
- return false;
- }
- if (!simulate)
- game.enPassantSquare = null;
- }
- if (!simulate) {
- var piece = getPiece(board, src);
- if (dst.y == 0 || dst.y == 7)
- piece.type = game.promotePiece;
- setPiece(board, dst, piece);
- setPiece(board, src, null);
- }
- return true;
- };
- var ROOK = function(src, dst, game, simulate) {
- log("Evaluating move function for rook at " + src.x + ", " + src.y + " to " + dst.x + ", " + dst.y);
- var board = game.board;
- if (src.y == dst.y) {
- var minX = Math.min(src.x, dst.x);
- var maxX = Math.max(src.x, dst.x);
- for (var x = minX + 1; x < maxX; x++) {
- if (getPiece(board, {x: x, y: src.y}) !== null)
- return false;
- }
- } else if (src.x == dst.x) {
- var minY = Math.min(src.y, dst.y);
- var maxY = Math.max(src.y, dst.y);
- for (var y = minY + 1; y < maxY; y++) {
- if (getPiece(board, {x: src.x, y: y}) !== null)
- return false;
- }
- } else {
- return false;
- }
- if (getPiece(board, dst) !== null && getPiece(board, dst).black == getPiece(board, src).black)
- return false;
- if (!simulate) {
- setPiece(board, dst, getPiece(board, src));
- setPiece(board, src, null);
- if (src.x == 0) {
- if (src.y == 0)
- game.castleState[0].queenside = false;
- else if (src.y == 7)
- game.castleState[1].queenside = false;
- } else if (src.x == 7) {
- if (src.y == 0)
- game.castleState[0].kingside = false;
- else if (src.y == 7)
- game.castleState[1].kingside = false;
- }
- game.enPassantSquare = null;
- }
- return true;
- };
- var KNIGHT = function(src, dst, game, simulate) {
- log("Evaluating move function for knight at " + src.x + ", " + src.y + " to " + dst.x + ", " + dst.y);
- var board = game.board;
- if (src.x == dst.x || src.y == dst.y)
- return false;
- if (Math.abs(dst.x - src.x) + Math.abs(dst.y - src.y) != 3)
- return false;
- if (getPiece(board, dst) !== null && getPiece(board, dst).black == getPiece(board, src).black)
- return false;
- if (!simulate) {
- setPiece(board, dst, getPiece(board, src));
- setPiece(board, src, null);
- game.enPassantSquare = null;
- }
- return true;
- };
- var BISHOP = function(src, dst, game, simulate) {
- log("Evaluating move function for bishop at " + src.x + ", " + src.y + " to " + dst.x + ", " + dst.y);
- var board = game.board;
- var black = getPiece(board, src).black;
- var dx = dst.x - src.x;
- var dy = dst.y - src.y;
- if (Math.abs(dx) != Math.abs(dy))
- return false;
- if (dst.x == src.x)
- return false;
- var dirX = dx < 0 ? -1 : 1;
- var dirY = dy < 0 ? -1 : 1;
- for (var x = src.x + dirX, y = src.y + dirY; x != dst.x; x += dirX, y += dirY) {
- if (getPiece(board, {x: x, y: y}) !== null)
- return false;
- }
- if (getPiece(board, dst) !== null && getPiece(board, dst).black == black)
- return false;
- if (!simulate) {
- setPiece(board, dst, getPiece(board, src));
- setPiece(board, src, null);
- game.enPassantSquare = null;
- }
- return true;
- };
- var QUEEN = function(src, dst, game, simulate) {
- log("Evaluating move function for queen at " + src.x + ", " + src.y + " to " + dst.x + ", " + dst.y);
- var board = game.board;
- var black = getPiece(board, src).black;
- var dx = dst.x - src.x;
- var dy = dst.y - src.y;
- if (Math.abs(dx) != Math.abs(dy) && dx != 0 && dy != 0)
- return false;
- var dirX = dx < 0 ? -1 : dx > 0 ? 1 : 0;
- var dirY = dy < 0 ? -1 : dy > 0 ? 1 : 0;
- for (var x = src.x + dirX, y = src.y + dirY; x != dst.x || y != dst.y; x += dirX, y += dirY) {
- if (getPiece(board, {x: x, y: y}) !== null)
- return false;
- }
- if (getPiece(board, dst) !== null && getPiece(board, dst).black == black)
- return false;
- if (!simulate) {
- setPiece(board, dst, getPiece(board, src));
- setPiece(board, src, null);
- game.enPassantSquare = null;
- }
- return true;
- };
- var KING = function(src, dst, game, simulate) {
- log("Evaluating move function for king at " + src.x + ", " + src.y + " to " + dst.x + ", " + dst.y);
- var board = game.board;
- var black = getPiece(board, src).black;
- var dx = dst.x - src.x;
- var dy = dst.y - src.y;
- if (Math.abs(dy) > 1)
- return false;
- if (Math.abs(dx) > 2)
- return false;
- if (getPiece(board, dst) !== null && getPiece(board, dst).black == black)
- return false;
- if (Math.abs(dx) == 2) {
- if (dy != 0)
- return false;
- if (dx < 0) {
- if (!game.castleState[black ? 1 : 0].queenside)
- return false;
- if (getPiece(board, {x: 1, y: src.y}) !== null)
- return false;
- } else {
- if (!game.castleState[black ? 1 : 0].kingside)
- return false;
- }
- if (getPiece(board, dst) !== null)
- return false;
- if (getPiece(board, add(src, dx / 2, 0)) !== null)
- return false;
- if (isPieceAttacked(game, src))
- return false;
- var piece = getPiece(board, src);
- setPiece(board, add(src, dx / 2, 0), piece);
- setPiece(board, src, null);
- var attacked = isPieceAttacked(game, add(src, dx / 2, 0));
- setPiece(board, add(src, dx / 2, 0), null);
- setPiece(board, src, piece);
- if (attacked) {
- return false;
- }
- if (!simulate) {
- setPiece(board, {x: dx < 0 ? 0 : 7, y: src.y}, null);
- setPiece(board, add(src, dx / 2, 0), {type: "r", black: black});
- }
- }
- if (!simulate) {
- setPiece(board, dst, getPiece(board, src));
- setPiece(board, src, null);
- game.castleState[black ? 1 : 0].queenside = false;
- game.castleState[black ? 1 : 0].kingside = false;
- game.enPassantSquare = null;
- }
- return true;
- };
- var pieceMoveFuncs = {
- "p": PAWN,
- "r": ROOK,
- "n": KNIGHT,
- "b": BISHOP,
- "q": QUEEN,
- "k": KING
- };
- function add(posA, x, y) {
- return {x: posA.x + x, y: posA.y + y};
- }
- function newBoard() {
- var board = {tiles: []};
- for (var x = 0; x < 8; x++) {
- board.tiles[x] = [];
- for (var y = 0; y < 8; y++) {
- board.tiles[x][y] = null;
- }
- }
- return board;
- }
- function checkBounds(pos) {
- if (pos.x < 0 || pos.y < 0 || pos.x >= 8 || pos.y >= 8) {
- channel.message(new Error().stack);
- throw (pos.x + ", " + pos.y + " out of bounds");
- }
- }
- function getPiece(board, pos) {
- checkBounds(pos);
- return board.tiles[pos.x][pos.y];
- }
- function setPiece(board, pos, piece) {
- checkBounds(pos);
- board.tiles[pos.x][pos.y] = piece;
- }
- function newGame(userWhite, userBlack) {
- var game = {};
- game.userWhite = userWhite;
- game.userBlack = userBlack;
- game.blackToMove = false;
- game.castleState = [{queenside: true, kingside: true}, {queenside: true, kingside: true}]
- game.enPassantSquare = null;
- game.board = newBoard();
- var majors = ["r", "n", "b", "q", "k", "b", "n", "r"];
- for (var x = 0; x < 8; x++) {
- setPiece(game.board, {x: x, y: 0}, {type: majors[x], black: false});
- setPiece(game.board, {x: x, y: 1}, {type: "p", black: false});
- setPiece(game.board, {x: x, y: 6}, {type: "p", black: true});
- setPiece(game.board, {x: x, y: 7}, {type: majors[x], black: true});
- }
- game.promotePiece = null;
- game.lastMove = null;
- return game;
- }
- function isPieceAttacked(game, pos) {
- log("isPieceAttacked(" + pos.x + ", " + pos.y + ")");
- if (getPiece(game.board, pos) === null)
- return false;
- var black = getPiece(game.board, pos).black;
- for (x = 0; x < 8; x++) {
- for (y = 0; y < 8; y++) {
- var piece = getPiece(game.board, {x: x, y: y});
- if (piece !== null && piece.black != black) {
- if (pieceMoveFuncs[piece.type]({x: x, y: y}, pos, game, true))
- return true;
- }
- }
- }
- return false;
- }
- var games = storage.get("chessGames");
- games = JSON.parse(games);
- if (games === null)
- games = [];
- var options = storage.get("chessOptions");
- options = JSON.parse(options);
- if (options === null)
- options = {};
- function getOptions(user) {
- if (user in options)
- return options[user];
- var opts = {};
- opts.flip = true;
- options[user] = opts;
- saveOptions();
- return opts;
- }
- function saveOptions() {
- storage.set("chessOptions", JSON.stringify(options));
- }
- function saveGames() {
- storage.set("chessGames", JSON.stringify(games));
- }
- function userName(user) {
- var userObj = guild.getUser(user);
- if (userObj.getNickname() === null)
- return userObj.getName();
- else
- return userObj.getNickname();
- }
- function makePing(user) {
- var userObj = guild.getUser(user);
- if (userObj.getNickname() === null)
- return "<@" + user + ">";
- else
- return "<@!" + user + ">";
- }
- function parseMoveWithContext(moveStr, game) {
- var match;
- try {
- match = parseMove(moveStr);
- } catch (e) {
- return {error: "Invalid syntax"};
- }
- var ret = {};
- if ("promotePiece" in match) {
- ret.promotePiece = match.promotePiece.toLowerCase();
- }
- if ("queensideCastle" in match) {
- if (!game.castleState[game.blackToMove ? 1 : 0].queenside) {
- return {error: "Illegal move"};
- }
- ret.fromX = 4;
- ret.fromY = game.blackToMove ? 7 : 0;
- ret.toX = 2;
- ret.toY = ret.fromY;
- } else if ("kingsideCastle" in match) {
- if (!game.castleState[game.blackToMove ? 1 : 0].kingside) {
- return {error: "Illegal move"};
- }
- ret.fromX = 4;
- ret.fromY = game.blackToMove ? 7 : 0;
- ret.toX = 6;
- ret.toY = ret.fromY;
- } else if ("fromFile" in match && "fromRank" in match) {
- ret.fromX = match.fromFile.toLowerCase().charCodeAt(0) - 97;
- ret.fromY = parseInt(match.fromRank) - 1;
- ret.toX = match.toFile.toLowerCase().charCodeAt(0) - 97;
- ret.toY = parseInt(match.toRank) - 1;
- } else {
- ret.toX = match.toFile.toLowerCase().charCodeAt(0) - 97;
- ret.toY = parseInt(match.toRank) - 1;
- var dst = {x: ret.toX, y: ret.toY};
- var fromX = ("fromFile" in match) ? match.fromFile.toLowerCase().charCodeAt(0) - 97 : -1;
- var fromY = ("fromRank" in match) ? parseInt(match.fromRank) - 1 : -1;
- var foundPiece = false;
- for (var x = 0; x < 8; x++) {
- if (fromX == -1 || x == fromX) {
- for (var y = 0; y < 8; y++) {
- if (fromY == -1 || y == fromY) {
- var pos = {x: x, y: y};
- var piece = getPiece(game.board, pos);
- if (piece !== null && piece.black == game.blackToMove && piece.type == match.piece.toLowerCase()) {
- if (pieceMoveFuncs[match.piece.toLowerCase()](pos, dst, game, true)) {
- if (foundPiece) {
- return {error: "Ambiguous move"};
- }
- log("Found piece at " + x + ", " + y);
- foundPiece = true;
- ret.fromX = x;
- ret.fromY = y;
- }
- }
- }
- }
- }
- }
- if (!foundPiece)
- return {error: "Invalid move"};
- }
- var piece = getPiece(game.board, {x: ret.fromX, y: ret.fromY});
- if (piece !== null && piece.type == "p" && (ret.toY == 0 || ret.toY == 7))
- if (!("promotePiece" in ret))
- return {error: "Don't know what to promote to"};
- return ret;
- }
- function getGame(user) {
- for (var i = 0; i < games.length; i++) {
- var game = games[i];
- if (game.userWhite == user || game.userBlack == user)
- return game;
- }
- return null;
- }
- function startGame(userA, userB) {
- if (userA == userB) {
- channel.message("You cannot play yourself!");
- return;
- }
- if (getGame(userA) !== null) {
- channel.message(userName(userA) + " is already in a game");
- return;
- }
- if (getGame(userB) !== null) {
- channel.message(userName(userB) + " is already in a game");
- return;
- }
- var game;
- if (Math.random() < 0.5)
- game = newGame(userA, userB);
- else
- game = newGame(userB, userA);
- games.push(game);
- saveGames();
- printBoard(game, true, game.userWhite);
- }
- function resignGame(resigner) {
- var game = getGame(resigner);
- if (game === null) {
- channel.message("You aren't in a game");
- return;
- }
- var opponent;
- if (resigner == game.userWhite)
- opponent = game.userBlack;
- else
- opponent = game.userWhite;
- games.splice(games.indexOf(game), 1);
- saveGames();
- channel.message(userName(resigner) + " resigned, " + makePing(opponent) + " wins!");
- }
- function doMove(user, arg) {
- var game = getGame(user);
- if (game === null) {
- channel.message("You aren't in a game");
- return;
- }
- var black;
- var opponent;
- if (user == game.userWhite) {
- black = false;
- opponent = game.userBlack;
- } else {
- black = true;
- opponent = game.userWhite;
- }
- if (black != game.blackToMove) {
- channel.message("It's not your turn");
- return;
- }
- var move = parseMoveWithContext(arg, game);
- if ("error" in move) {
- channel.message(move.error);
- return;
- }
- if ("promotePiece" in move) {
- game.promotePiece = move.promotePiece;
- } else {
- game.promotePiece = null;
- }
- var src = {x: move.fromX, y: move.fromY};
- var dst = {x: move.toX, y: move.toY};
- var piece = getPiece(game.board, src);
- if (piece === null || piece.black != black) {
- channel.message("Invalid piece");
- return;
- }
- if (!pieceMoveFuncs[piece.type](src, dst, game, false)) {
- channel.message("Invalid move");
- return;
- }
- if (getCheckedKing(game)) {
- channel.message("Illegal move");
- return;
- }
- game.lastMove = {fromX: src.x, fromY: src.y, toX: dst.x, toY: dst.y};
- game.blackToMove = !game.blackToMove;
- var winState = detectWinState(game);
- printBoard(game, winState == 0, opponent);
- if (winState == 1) { // checkmate
- channel.message("Checkmate! " + userName(user) + " wins! " + makePing(opponent) + " lost.");
- } else if (winState == 2) { // stalemate
- channel.message("Stalemate. Draw between " + userName(user) + " and " + makePing(opponent) + ".");
- }
- if (winState != 0) {
- games.splice(games.indexOf(game), 1);
- }
- saveGames();
- }
- function getCheckedKing(game) {
- var kingPos;
- outerLoop:
- for (var x = 0; x < 8; x++) {
- for (var y = 0; y < 8; y++) {
- kingPos = {x: x, y: y};
- var piece = getPiece(game.board, kingPos);
- if (piece !== null && piece.black == game.blackToMove && piece.type == "k") {
- break outerLoop;
- }
- }
- }
- return isPieceAttacked(game, kingPos) ? kingPos : null;
- }
- // 0 for none, 1 for checkmate, 2 for stalemate
- function detectWinState(game) {
- for (var fromX = 0; fromX < 8; fromX++) {
- for (var fromY = 0; fromY < 8; fromY++) {
- var src = {x: fromX, y: fromY};
- var piece = getPiece(game.board, src);
- if (piece !== null && piece.black == game.blackToMove) {
- for (var toX = 0; toX < 8; toX++) {
- for (var toY = 0; toY < 8; toY++) {
- var dst = {x: toX, y: toY};
- if (pieceMoveFuncs[piece.type](src, dst, game, true)) {
- var gameCopy = JSON.parse(JSON.stringify(game));
- pieceMoveFuncs[piece.type](src, dst, gameCopy, false);
- if (!getCheckedKing(gameCopy))
- return 0;
- }
- }
- }
- }
- }
- }
- return getCheckedKing(game) ? 1 : 2;
- }
- function printBoard(game, includeToMoveMessage, user) {
- var fen = "";
- for (var y = 7; y >= 0; y--) {
- var emptySquaresCount = 0;
- for (var x = 0; x < 8; x++) {
- var piece = getPiece(game.board, {x: x, y: y});
- if (piece === null) {
- emptySquaresCount++;
- } else {
- if (emptySquaresCount != 0)
- fen += emptySquaresCount;
- emptySquaresCount = 0;
- if (piece.black)
- fen += piece.type;
- else
- fen += piece.type.toUpperCase();
- }
- }
- if (emptySquaresCount != 0)
- fen += emptySquaresCount;
- if (y != 0)
- fen += "/";
- }
- var url = "https://backscattering.de/web-boardimage/board.png";
- url += "?fen=" + fen;
- if (getOptions(user).flip)
- url += "&orientation=" + (user == game.userBlack ? "black" : "white");
- if (game.lastMove != null) {
- url += "&lastMove=";
- url += String.fromCharCode(97 + game.lastMove.fromX);
- url += 1 + game.lastMove.fromY;
- url += String.fromCharCode(97 + game.lastMove.toX);
- url += 1 + game.lastMove.toY;
- }
- var kingPos = getCheckedKing(game);
- if (kingPos != null) {
- url += "&check=";
- url += String.fromCharCode(97 + kingPos.x);
- url += 1 + kingPos.y;
- }
- channel.message(embeds.newEmbed().setImage(url).build());
- if (includeToMoveMessage) {
- if (game.blackToMove)
- channel.message("Black to move " + makePing(game.userBlack));
- else
- channel.message("White to move " + makePing(game.userWhite));
- }
- }
- function setOption(user, opt, value) {
- var opts = getOptions(user);
- if (opt in opts) {
- var valid = true;
- if (value == "true") {
- opts[opt] = true;
- } else if (value == "false") {
- opts[opt] = false;
- } else {
- channel.message("Invalid option value");
- valid = false;
- }
- if (valid) {
- channel.message("Option \"" + opt + "\" set to " + value + " for " + userName(user));
- }
- } else {
- channel.message("Invalid option name. Type $chess help for a list of accepted options.");
- }
- saveOptions();
- }
- function printUsage() {
- var usage = "```\n"
- + "$chess start <@opponent>\n"
- + "$chess [move] <theMove>\n"
- + "$chess resign\n"
- + "$chess board\n"
- + "$chess help\n"
- + "$chess option <flip> <value>\n"
- + "```";
- channel.message(usage);
- }
- var arg = message.getContent();
- var args = arg.split(" ");
- if (args.length < 2) {
- printUsage();
- } else {
- arg = args[1];
- if (arg == "start") {
- if (args.length != 3) {
- printUsage();
- } else {
- var regex = /^<@!?(\d+)>$/
- var match = regex.exec(args[2]);
- if (match === null) {
- printUsage();
- } else {
- startGame(message.getUser().getID(), match[1]);
- }
- }
- } else if (arg == "resign") {
- resignGame(message.getUser().getID());
- } else if (arg == "help" || arg == "?") {
- printUsage();
- } else if (arg == "board") {
- var game = getGame(message.getUser().getID());
- if (game === null) {
- channel.message("You aren't in a game");
- } else {
- printBoard(game, true, message.getUser().getID());
- }
- } else if (arg == "option") {
- if (args.length != 4)
- printUsage();
- setOption(message.getUser().getID(), args[2], args[3]);
- } else {
- var move;
- if (arg == "move")
- move = args.slice(2).join(" ");
- else
- move = args.slice(1).join(" ");
- doMove(message.getUser().getID(), move);
- }
- }
- // ====== MOVE PARSER ====== //
- function parsePeek(parser) {
- return parser.input.charAt(parser.pos);
- }
- function parsePeekN(parser, n) {
- return parser.input.charAt(parser.pos + n - 1);
- }
- function parseConsumeAny(parser) {
- return parser.input.charAt(parser.pos++);
- }
- function parseConsume(parser, expected) {
- var token = parseConsumeAny(parser);
- if (token != expected)
- parseError();
- return token;
- }
- function parseError() {
- throw 1;
- }
- function parseMove(input) {
- var parser = {input: input, pos: 0, result: {}};
- try {
- parseStandardMove(parser);
- parseSuffix(parser);
- parseConsume(parser, "");
- } catch (e) {
- parser.pos = 0;
- parser.result = {};
- parseSimpleMove(parser);
- parseSuffix(parser);
- parseConsume(parser, "");
- }
- return parser.result;
- }
- function parseStandardMove(parser) {
- var next = parsePeek(parser);
- if (next == "0") {
- parseCastle(parser);
- } else if (["p", "P", "r", "R", "n", "N", "q", "Q", "k", "K"].indexOf(next) != -1) {
- parseNormalMove(parser);
- } else {
- var nextNext = parsePeekN(parser, 2);
- if (nextNext == "x") {
- if (next == "B") {
- parseBishopMove(parser);
- } else {
- parsePawnMove(parser);
- }
- } else {
- if ((next == "b" || next == "B") && ["1", "2", "3", "4", "5", "6", "7", "8"].indexOf(nextNext) == -1) {
- parseBishopMove(parser);
- } else {
- parsePawnMove(parser);
- }
- }
- }
- }
- function parseCastle(parser) {
- parseConsume(parser, "0");
- parseConsume(parser, "-");
- parseConsume(parser, "0");
- if (parsePeek(parser) == "-") {
- parseConsume(parser, "-");
- parseConsume(parser, "0");
- parser.result.queensideCastle = true;
- } else {
- parser.result.kingsideCastle = true;
- }
- }
- function parseNormalMove(parser) {
- parser.result.piece = parseConsumeAny(parser);
- if (isNextRank(parser, 1)) {
- parser.result.fromRank = parseRank(parser);
- } else if (isNextFile(parser, 1)) {
- if (isNextFile(parser, 2) || parsePeekN(parser, 2) == "x") {
- parser.result.fromFile = parseFile(parser);
- }
- }
- if (parsePeek(parser) == "x")
- parseConsume(parser, "x");
- parser.result.toFile = parseFile(parser);
- parser.result.toRank = parseRank(parser);
- }
- function parseBishopMove(parser) {
- log("Parsing bishop move")
- if (parsePeekN(parser, 2) == "x" || parsePeekN(parser, 3) == "x") {
- parser.result.piece = parseConsume(parser, "B");
- if (isNextFile(parser, 1))
- parser.result.fromFile = parseFile(parser);
- parseConsume(parser, "x");
- } else {
- var token = parseConsumeAny(parser);
- if (token != "b" && token != "B") {
- parseError();
- }
- parser.result.piece = token;
- }
- parser.result.toFile = parseFile(parser);
- parser.result.toRank = parseRank(parser);
- }
- function parsePawnMove(parser) {
- parser.result.piece = "p";
- if (parsePeekN(parser, 2) == "x") {
- parser.result.fromFile = parseFile(parser);
- parseConsume(parser, "x");
- }
- parser.result.toFile = parseFile(parser);
- parser.result.toRank = parseRank(parser);
- }
- function isNextFile(parser, n) {
- var token = parsePeekN(parser, n);
- return ["a", "b", "c", "d", "e", "f", "g", "h"].indexOf(token.toLowerCase()) != -1;
- }
- function isNextRank(parser, n) {
- var token = parsePeekN(parser, n);
- return ["1", "2", "3", "4", "5", "6", "7", "8"].indexOf(token) != -1;
- }
- function parseFile(parser) {
- if (isNextFile(parser, 1)) {
- return parseConsumeAny(parser);
- } else {
- parseError();
- }
- }
- function parseRank(parser) {
- if (isNextRank(parser, 1)) {
- return parseConsumeAny(parser);
- } else {
- parseError();
- }
- }
- function parseSimpleMove(parser) {
- parser.result.fromFile = parseFile(parser);
- parser.result.fromRank = parseRank(parser);
- if (parsePeek(parser) == "x")
- parseConsume(parser, "x");
- else if (parsePeek(parser) == "-")
- parseConsume(parser, "-");
- else if (parsePeek(parser) == " ")
- parseConsume(parser, " ");
- parser.result.toFile = parseFile(parser);
- parser.result.toRank = parseRank(parser);
- }
- function parseSuffix(parser) {
- if (parsePeek(parser) == "=") {
- parseConsume(parser, "=");
- var piece = parseConsumeAny(parser);
- if (["r", "n", "b", "q"].indexOf(piece.toLowerCase()) == -1)
- parseError();
- parser.result.promotePiece = piece;
- }
- if (parsePeek(parser) == "#") {
- parseConsume(parser, "#");
- } else if (parsePeek(parser) == "+") {
- parseConsume(parser, "+");
- if (parsePeek(parser) == "+")
- parseConsume(parser, "+");
- }
- }
Add Comment
Please, Sign In to add comment