X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=public%2Fjavascripts%2Fbase_rules.js;h=5763af7e1d0f86e40789ff7c9467ce66a3bd1334;hb=7931e479adf93c87771ded1892a0873af72ae46d;hp=51c9dda87966492acf10b645d90b539b85446a6a;hpb=0b7d99ecbb5dedc02cd96c457b5fc2962db9b297;p=vchess.git diff --git a/public/javascripts/base_rules.js b/public/javascripts/base_rules.js index 51c9dda8..5763af7e 100644 --- a/public/javascripts/base_rules.js +++ b/public/javascripts/base_rules.js @@ -54,12 +54,15 @@ class ChessRules constructor(fen, moves) { this.moves = moves; - // Use fen string to initialize variables, flags and board - this.board = V.GetBoard(fen); - this.setFlags(fen); + // Use fen string to initialize variables, flags, turn and board + const fenParts = fen.split(" "); + this.board = V.GetBoard(fenParts[0]); + this.setFlags(fenParts[1]); //NOTE: fenParts[1] might be undefined + this.setTurn(fenParts[2]); //Same note this.initVariables(fen); } + // Some additional variables from FEN (variant dependant) initVariables(fen) { this.INIT_COL_KING = {'w':-1, 'b':-1}; @@ -95,7 +98,7 @@ class ChessRules this.INIT_COL_ROOK['w'][1] = k; break; default: - let num = parseInt(position[i].charAt(j)); + const num = parseInt(position[i].charAt(j)); if (!isNaN(num)) k += (num-1); } @@ -106,18 +109,68 @@ class ChessRules this.epSquares = [ epSq ]; } + // Check if FEN describe a position + static IsGoodFen(fen) + { + const fenParts = fen.split(" "); + if (fenParts.length== 0 || fenParts.length > 3) + return false; + // 1) Check position + const position = fenParts[0]; + const rows = position.split("/"); + if (rows.length != V.size.x) + return false; + for (let row of rows) + { + let sumElts = 0; + for (let i=0; i= 2) + { + if (!V.IsGoodFlags(fenParts[1])) + return false; + } + // 3) Check turn (if present) + if (fenParts.length == 3) + { + if (!["w","b"].includes(fenParts[2])) + return false; + } + return true; + } + + // For FEN checking + static IsGoodFlags(flags) + { + return !!flags.match(/^[01]{4,4}$/); + } + // Turn diagram fen into double array ["wb","wp","bk",...] static GetBoard(fen) { - let rows = fen.split(" ")[0].split("/"); + const rows = fen.split(" ")[0].split("/"); let board = doubleArray(V.size.x, V.size.y, ""); for (let i=0; i0 ? this.moves[L-1] : null); } - get turn() { - return (this.moves.length%2==0 ? 'w' : 'b'); - } - // Pieces codes static get PAWN() { return 'p'; } static get ROOK() { return 'r'; } @@ -166,6 +222,11 @@ class ChessRules static get QUEEN() { return 'q'; } static get KING() { return 'k'; } + // For FEN checking: + static get PIECES() { + return [V.PAWN,V.ROOK,V.KNIGHT,V.BISHOP,V.QUEEN,V.KING]; + } + // Empty square static get EMPTY() { return ''; } @@ -483,9 +544,7 @@ class ChessRules canIplay(side, [x,y]) { - return ((side=='w' && this.moves.length%2==0) - || (side=='b' && this.moves.length%2==1)) - && this.getColor(x,y) == side; + return (this.turn == side && this.getColor(x,y) == side); } getPossibleMovesFrom(sq) @@ -717,7 +776,7 @@ class ChessRules // Hash of position+flags+turn after a move is played (to detect repetitions) getHashState() { - return hex_md5(this.getFen() + " " + this.turn); + return hex_md5(this.getFen()); } play(move, ingame) @@ -1054,7 +1113,7 @@ class ChessRules // Return current fen according to pieces+colors state getFen() { - return this.getBaseFen() + " " + this.getFlagsFen(); + return this.getBaseFen() + " " + this.getFlagsFen() + " " + this.turn; } // Position part of the FEN string