+ const color = this.turn;
+ let moves = [];
+ const [sizeX,sizeY] = [V.size.x,V.size.y];
+ const shiftX = (color == "w" ? -1 : 1);
+ const startRanks = (color == "w" ? [sizeX-2,sizeX-3] : [1,2]);
+ const lastRanks = (color == "w" ? [0,1,2] : [sizeX-1,sizeX-2,sizeX-3]);
+ const promotionPieces =
+ [V.ROOK,V.KNIGHT,V.BISHOP,V.QUEEN,V.MARSHALL,V.CARDINAL];
+
+ // Always x+shiftX >= 0 && x+shiftX < sizeX, because no pawns on last rank
+ let finalPieces = undefined;
+ if (lastRanks.includes(x + shiftX))
+ {
+ finalPieces = promotionPieces.filter(p => this.captured[color][p] > 0);
+ if (x + shiftX != lastRanks[0])
+ finalPieces.push(V.PAWN);
+ }
+ else
+ finalPieces = [V.PAWN];
+ if (this.board[x+shiftX][y] == V.EMPTY)
+ {
+ // One square forward
+ for (let piece of finalPieces)
+ moves.push(this.getBasicMove([x,y], [x+shiftX,y], {c:color,p:piece}));
+ if (startRanks.includes(x))
+ {
+ if (this.board[x+2*shiftX][y] == V.EMPTY)
+ {
+ // Two squares jump
+ moves.push(this.getBasicMove([x,y], [x+2*shiftX,y]));
+ if (x==startRanks[0] && this.board[x+3*shiftX][y] == V.EMPTY)
+ {
+ // Three squares jump
+ moves.push(this.getBasicMove([x,y], [x+3*shiftX,y]));
+ }
+ }
+ }
+ }
+ // Captures
+ for (let shiftY of [-1,1])
+ {
+ if (y + shiftY >= 0 && y + shiftY < sizeY
+ && this.board[x+shiftX][y+shiftY] != V.EMPTY
+ && this.canTake([x,y], [x+shiftX,y+shiftY]))
+ {
+ for (let piece of finalPieces)
+ {
+ moves.push(this.getBasicMove([x,y], [x+shiftX,y+shiftY],
+ {c:color,p:piece}));
+ }
+ }
+ }
+
+ // En passant
+ const Lep = this.epSquares.length;
+ const epSquare = this.epSquares[Lep-1];
+ if (!!epSquare)
+ {
+ for (let epsq of epSquare)
+ {
+ // TODO: some redundant checks
+ if (epsq.x == x+shiftX && Math.abs(epsq.y - y) == 1)
+ {
+ var enpassantMove = this.getBasicMove([x,y], [epsq.x,epsq.y]);
+ // WARNING: the captured pawn may be diagonally behind us,
+ // if it's a 3-squares jump and we take on 1st passing square
+ const px = (this.board[x][epsq.y] != V.EMPTY ? x : x - shiftX);
+ enpassantMove.vanish.push({
+ x: px,
+ y: epsq.y,
+ p: 'p',
+ c: this.getColor(px,epsq.y)
+ });
+ moves.push(enpassantMove);
+ }
+ }
+ }
+
+ return moves;