Some debug, plan several short + long term TODOs
[vchess.git] / public / javascripts / base_rules.js
index 891948b..8f875e4 100644 (file)
@@ -186,7 +186,8 @@ class ChessRules
                // 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)
+               // TODO: next conditions are first for Atomic, and third for Checkered
+               if (move.appear.length > 0 && move.appear[0].p == V.PAWN && ["w","b"].includes(move.appear[0].c) && Math.abs(sx - ex) == 2)
                {
                        return {
                                x: (sx + ex)/2,
@@ -628,7 +629,8 @@ class ChessRules
                const lastRank = (color == "w" ? 0 : sizeX-1);
                const pawnColor = this.getColor(x,y); //can be different for checkered
 
-               if (x+shiftX >= 0 && x+shiftX < sizeX) //TODO: always true
+               // NOTE: next condition is generally true (no pawn on last rank)
+               if (x+shiftX >= 0 && x+shiftX < sizeX)
                {
                        const finalPieces = x + shiftX == lastRank
                                ? [V.ROOK,V.KNIGHT,V.BISHOP,V.QUEEN]
@@ -1001,22 +1003,27 @@ class ChessRules
                {
                        this.kingPos[c][0] = move.appear[0].x;
                        this.kingPos[c][1] = move.appear[0].y;
-                       this.castleFlags[c] = [false,false];
+                       if (V.HasFlags)
+                               this.castleFlags[c] = [false,false];
                        return;
                }
-               const oppCol = this.getOppCol(c);
-               const oppFirstRank = (V.size.x-1) - firstRank;
-               if (move.start.x == firstRank //our rook moves?
-                       && this.INIT_COL_ROOK[c].includes(move.start.y))
-               {
-                       const flagIdx = (move.start.y == this.INIT_COL_ROOK[c][0] ? 0 : 1);
-                       this.castleFlags[c][flagIdx] = false;
-               }
-               else if (move.end.x == oppFirstRank //we took opponent rook?
-                       && this.INIT_COL_ROOK[oppCol].includes(move.end.y))
+               if (V.HasFlags)
                {
-                       const flagIdx = (move.end.y == this.INIT_COL_ROOK[oppCol][0] ? 0 : 1);
-                       this.castleFlags[oppCol][flagIdx] = false;
+                       // Update castling flags if rooks are moved
+                       const oppCol = this.getOppCol(c);
+                       const oppFirstRank = (V.size.x-1) - firstRank;
+                       if (move.start.x == firstRank //our rook moves?
+                               && this.INIT_COL_ROOK[c].includes(move.start.y))
+                       {
+                               const flagIdx = (move.start.y == this.INIT_COL_ROOK[c][0] ? 0 : 1);
+                               this.castleFlags[c][flagIdx] = false;
+                       }
+                       else if (move.end.x == oppFirstRank //we took opponent rook?
+                               && this.INIT_COL_ROOK[oppCol].includes(move.end.y))
+                       {
+                               const flagIdx = (move.end.y == this.INIT_COL_ROOK[oppCol][0] ? 0 : 1);
+                               this.castleFlags[oppCol][flagIdx] = false;
+                       }
                }
        }
 
@@ -1244,7 +1251,7 @@ class ChessRules
                }
                else
                        return currentBest;
-               //console.log(moves1.map(m => { return [this.getNotation(m), m.eval]; }));
+//             console.log(moves1.map(m => { return [this.getNotation(m), m.eval]; }));
 
                candidates = [0];
                for (let j=1; j<moves1.length && moves1[j].eval == moves1[0].eval; j++)
@@ -1366,15 +1373,22 @@ class ChessRules
        getPGN(mycolor, score, fenStart, mode)
        {
                let pgn = "";
-               pgn += '[Site "vchess.club"]<br>';
+               pgn += '[Site "vchess.club"]\n';
                const opponent = mode=="human" ? "Anonymous" : "Computer";
-               pgn += '[Variant "' + variant + '"]<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>';
-               pgn += '[Fen "' + this.getFen() + '"]<br>';
-               pgn += '[Result "' + score + '"]<br><br>';
+               pgn += '[Variant "' + variant + '"]\n';
+               pgn += '[Date "' + getDate(new Date()) + '"]\n';
+               // TODO: later when users are a bit less anonymous, use better names
+               const whiteName = ["human","computer"].includes(mode)
+                       ? (mycolor=='w'?'Myself':opponent)
+                       : "analyze";
+               const blackName = ["human","computer"].includes(mode)
+                       ? (mycolor=='b'?'Myself':opponent)
+                       : "analyze";
+               pgn += '[White "' + whiteName + '"]\n';
+               pgn += '[Black "' + blackName + '"]\n';
+               pgn += '[FenStart "' + fenStart + '"]\n';
+               pgn += '[Fen "' + this.getFen() + '"]\n';
+               pgn += '[Result "' + score + '"]\n\n';
 
                // Standard PGN
                for (let i=0; i<this.moves.length; i++)
@@ -1383,7 +1397,7 @@ class ChessRules
                                pgn += ((i/2)+1) + ".";
                        pgn += this.moves[i].notation[0] + " ";
                }
-               pgn += "<br><br>";
+               pgn += "\n\n";
 
                // "Complete moves" PGN (helping in ambiguous cases)
                for (let i=0; i<this.moves.length; i++)
@@ -1393,6 +1407,6 @@ class ChessRules
                        pgn += this.moves[i].notation[1] + " ";
                }
 
-               return pgn;
+               return pgn + "\n";
        }
 }