if (newMove_s.length == 1)
moves.push(newMove_s[0]);
else //promotion
- moves = moves.concat(moves, newMove_s);
+ moves = moves.concat(newMove_s);
});
return moves;
}
// Complete a move with magnetic actions
+ // TODO: job is done multiple times for (normal) promotions.
applyMagneticLaws(move)
{
const V = VariantRules;
if (this.getColor(i,j) != color)
{
// Attraction
- if ((Math.abs(i-x)>=2 || Math.abs(j-y)>=2)
- && this.getPiece(i,j) != V.KING)
+ if ((Math.abs(i-x)>=2 || Math.abs(j-y)>=2) && this.getPiece(i,j) != V.KING)
{
move.vanish.push(
new PiPo({
// Scan move for pawn (max 1) on 8th rank
for (let i=1; i<move.appear.length; i++)
{
- if (move.appear[i].p==V.PAWN && move.appear[i].x==lastRank)
+ if (move.appear[i].p==V.PAWN && move.appear[i].c==color
+ && move.appear[i].x==lastRank)
{
move.appear[i].p = V.ROOK;
moves.push(move);
return moves;
}
- // TODO: verify this assertion
atLeastOneMove()
{
- return true; //always at least one possible move
+ if (this.kingPos[this.turn][0] < 0)
+ return false;
+ return true; //TODO: is it right?
}
underCheck(move)
{
super.updateVariables(move);
const c = this.getColor(move.start.x,move.start.y);
- if (c != this.getColor(move.end.x,move.end.y)
- && this.board[move.end.x][move.end.y] != VariantRules.EMPTY
+ if (this.board[move.end.x][move.end.y] != VariantRules.EMPTY
+ && c != this.getColor(move.end.x,move.end.y)
&& this.getPiece(move.end.x,move.end.y) == VariantRules.KING)
{
// We took opponent king !
this.kingPos[oppCol] = [-1,-1];
this.castleFlags[oppCol] = [false,false];
}
+ // Did we magnetically move our (init) rooks or opponents' ones ?
+ const firstRank = (c == "w" ? 7 : 0);
+ const oppFirstRank = 7 - firstRank;
+ const oppCol = this.getOppCol(c);
+ move.vanish.forEach(psq => {
+ if (psq.x == firstRank && this.INIT_COL_ROOK[c].includes(psq.y))
+ this.castleFlags[c][psq.y==this.INIT_COL_ROOK[c][0] ? 0 : 1] = false;
+ else if (psq.x == oppFirstRank && this.INIT_COL_ROOK[oppCol].includes(psq.y))
+ this.castleFlags[oppCol][psq.y==this.INIT_COL_ROOK[oppCol][0] ? 0 : 1] = false;
+ });
}
unupdateVariables(move)
}
}
- checkGameOver()
- {
- if (this.checkRepetition())
- return "1/2";
-
- const color = this.turn;
- // TODO: do we need "atLeastOneMove()"?
- if (this.atLeastOneMove() && this.kingPos[color][0] >= 0)
- return "*";
-
- return this.checkGameEnd();
- }
-
checkGameEnd()
{
// No valid move: our king disappeared
return this.turn == "w" ? "0-1" : "1-0";
}
+
+ static get THRESHOLD_MATE() {
+ return 500; //checkmates evals may be slightly below 1000
+ }
}