Save state - unfinished changes
[vchess.git] / public / javascripts / base_rules.js
index 5763af7..2a962a9 100644 (file)
@@ -50,7 +50,7 @@ class ChessRules
        /////////////////
        // INITIALIZATION
 
-       // fen == "position flags"
+       // fen == "position [flags [turn]]"
        constructor(fen, moves)
        {
                this.moves = moves;
@@ -105,15 +105,14 @@ class ChessRules
                                k++;
                        }
                }
-               const epSq = (this.moves.length > 0 ? this.getEpSquare(this.lastMove) : undefined);
-               this.epSquares = [ epSq ];
+               this.epSquares = [ this.getEpSquare(this.lastMove || fenParts[3]) ];
        }
 
        // Check if FEN describe a position
        static IsGoodFen(fen)
        {
                const fenParts = fen.split(" ");
-               if (fenParts.length== 0 || fenParts.length > 3)
+               if (fenParts.length== 0)
                        return false;
                // 1) Check position
                const position = fenParts[0];
@@ -145,7 +144,7 @@ class ChessRules
                                return false;
                }
                // 3) Check turn (if present)
-               if (fenParts.length == 3)
+               if (fenParts.length >= 3)
                {
                        if (!["w","b"].includes(fenParts[2]))
                                return false;
@@ -251,8 +250,20 @@ class ChessRules
        }
 
        // En-passant square, if any
-       getEpSquare(move)
+       getEpSquare(moveOrSquare)
        {
+               if (typeof moveOrSquare === "string")
+               {
+                       const square = moveOrSquare;
+                       if (square == "-")
+                               return undefined;
+                       return {
+                               x: square[0].charCodeAt()-97,
+                               y: V.size.x-parseInt(square[1])
+                       };
+               }
+               // Argument is a move:
+               const move = moveOrSquare;
                const [sx,sy,ex] = [move.start.x,move.start.y,move.end.x];
                if (this.getPiece(sx,sy) == V.PAWN && Math.abs(sx - ex) == 2)
                {
@@ -792,6 +803,7 @@ class ChessRules
                this.updateVariables(move);
                this.moves.push(move);
                this.epSquares.push( this.getEpSquare(move) );
+               this.turn = this.getOppCol(this.turn);
                V.PlayOnBoard(this.board, move);
 
                if (!!ingame)
@@ -801,6 +813,7 @@ class ChessRules
        undo(move)
        {
                V.UndoOnBoard(this.board, move);
+               this.turn = this.getOppCol(this.turn);
                this.epSquares.pop();
                this.moves.pop();
                this.unupdateVariables(move);
@@ -1107,7 +1120,7 @@ class ChessRules
                return pieces["b"].join("") +
                        "/pppppppp/8/8/8/8/PPPPPPPP/" +
                        pieces["w"].join("").toUpperCase() +
-                       " 1111"; //add flags
+                       " 1111 w"; //add flags + turn
        }
 
        // Return current fen according to pieces+colors state
@@ -1209,14 +1222,11 @@ class ChessRules
        // The score is already computed when calling this function
        getPGN(mycolor, score, fenStart, mode)
        {
-               const zeroPad = x => { return (x<10 ? "0" : "") + x; };
                let pgn = "";
                pgn += '[Site "vchess.club"]<br>';
-               const d = new Date();
                const opponent = mode=="human" ? "Anonymous" : "Computer";
                pgn += '[Variant "' + variant + '"]<br>';
-               pgn += '[Date "' + d.getFullYear() + '-' + (d.getMonth()+1) +
-                       '-' + zeroPad(d.getDate()) + '"]<br>';
+               pgn += '[Date "' + getDate(new Date()) + '"]<br>';
                pgn += '[White "' + (mycolor=='w'?'Myself':opponent) + '"]<br>';
                pgn += '[Black "' + (mycolor=='b'?'Myself':opponent) + '"]<br>';
                pgn += '[FenStart "' + fenStart + '"]<br>';