import { ChessRules, PiPo } from "@/base_rules";
-export const VariantRules = class MagneticRules extends ChessRules
-{
- static get HasEnpassant() { return false; }
+export const VariantRules = class MagneticRules extends ChessRules {
+ static get HasEnpassant() {
+ return false;
+ }
- getPotentialMovesFrom([x,y])
- {
- let standardMoves = super.getPotentialMovesFrom([x,y]);
+ getPotentialMovesFrom([x, y]) {
+ let standardMoves = super.getPotentialMovesFrom([x, y]);
let moves = [];
standardMoves.forEach(m => {
let newMove_s = this.applyMagneticLaws(m);
- if (newMove_s.length == 1)
- moves.push(newMove_s[0]);
- else //promotion
- moves = moves.concat(newMove_s);
+ if (newMove_s.length == 1) moves.push(newMove_s[0]);
+ //promotion
+ else moves = moves.concat(newMove_s);
});
return moves;
}
// Complete a move with magnetic actions
// TODO: job is done multiple times for (normal) promotions.
- applyMagneticLaws(move)
- {
- if (move.appear[0].p == V.KING && move.appear.length==1)
- return [move]; //kings are not charged
- const aIdx = (move.appear[0].p != V.KING ? 0 : 1); //if castling, rook is charged
- const [x,y] = [move.appear[aIdx].x, move.appear[aIdx].y];
+ applyMagneticLaws(move) {
+ // Exception: kings are not charged
+ if (move.appear[0].p == V.KING && move.appear.length == 1) return [move];
+ // If castling, rook is charged:
+ const aIdx = move.appear[0].p != V.KING ? 0 : 1;
+ const [x, y] = [move.appear[aIdx].x, move.appear[aIdx].y];
const color = this.turn;
- const lastRank = (color=="w" ? 0 : 7);
+ const lastRank = color == "w" ? 0 : 7;
const standardMove = JSON.parse(JSON.stringify(move));
this.play(standardMove);
- for (let step of [[-1,0],[1,0],[0,-1],[0,1]])
- {
- let [i,j] = [x+step[0],y+step[1]];
- while (V.OnBoard(i,j))
- {
- if (this.board[i][j] != V.EMPTY)
- {
+ for (let step of [
+ [-1, 0],
+ [1, 0],
+ [0, -1],
+ [0, 1]
+ ]) {
+ let [i, j] = [x + step[0], y + step[1]];
+ while (V.OnBoard(i, j)) {
+ if (this.board[i][j] != V.EMPTY) {
// Found something. Same color or not?
- if (this.getColor(i,j) != color)
- {
+ 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({
- p:this.getPiece(i,j),
- c:this.getColor(i,j),
- x:i,
- y:j
+ p: this.getPiece(i, j),
+ c: this.getColor(i, j),
+ x: i,
+ y: j
})
);
move.appear.push(
new PiPo({
- p:this.getPiece(i,j),
- c:this.getColor(i,j),
- x:x+step[0],
- y:y+step[1]
+ p: this.getPiece(i, j),
+ c: this.getColor(i, j),
+ x: x + step[0],
+ y: y + step[1]
})
);
}
- }
- else
- {
+ } else {
// Repulsion
- if (this.getPiece(i,j) != V.KING)
- {
+ if (this.getPiece(i, j) != V.KING) {
// Push it until we meet an obstacle or edge of the board
- let [ii,jj] = [i+step[0],j+step[1]];
- while (V.OnBoard(ii,jj))
- {
- if (this.board[ii][jj] != V.EMPTY)
- break;
+ let [ii, jj] = [i + step[0], j + step[1]];
+ while (V.OnBoard(ii, jj)) {
+ if (this.board[ii][jj] != V.EMPTY) break;
ii += step[0];
jj += step[1];
}
ii -= step[0];
jj -= step[1];
- if (Math.abs(ii-i)>=1 || Math.abs(jj-j)>=1)
- {
+ if (Math.abs(ii - i) >= 1 || Math.abs(jj - j) >= 1) {
move.vanish.push(
new PiPo({
- p:this.getPiece(i,j),
- c:this.getColor(i,j),
- x:i,
- y:j
+ p: this.getPiece(i, j),
+ c: this.getColor(i, j),
+ x: i,
+ y: j
})
);
move.appear.push(
new PiPo({
- p:this.getPiece(i,j),
- c:this.getColor(i,j),
- x:ii,
- y:jj
+ p: this.getPiece(i, j),
+ c: this.getColor(i, j),
+ x: ii,
+ y: jj
})
);
}
this.undo(standardMove);
let moves = [];
// 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].c==color
- && move.appear[i].x==lastRank)
- {
+ for (let i = 1; i < move.appear.length; i++) {
+ 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);
- for (let piece of [V.KNIGHT, V.BISHOP, V.QUEEN])
- {
+ for (let piece of [V.KNIGHT, V.BISHOP, V.QUEEN]) {
let cmove = JSON.parse(JSON.stringify(move));
cmove.appear[i].p = piece;
moves.push(cmove);
break;
}
}
- if (moves.length == 0) //no pawn on 8th rank
+ if (moves.length == 0)
+ //no pawn on 8th rank
moves.push(move);
return moves;
}
- atLeastOneMove()
- {
- if (this.kingPos[this.turn][0] < 0)
- return false;
+ atLeastOneMove() {
+ if (this.kingPos[this.turn][0] < 0) return false;
return true; //TODO: is it right?
}
- underCheck(color)
- {
- return false; //there is no check
+ filterValid(moves) {
+ // There are no checks
+ return moves;
}
- getCheckSquares(move)
- {
+ getCheckSquares() {
return [];
}
- updateVariables(move)
- {
+ updateVariables(move) {
super.updateVariables(move);
const c = move.vanish[0].c;
- if (move.vanish.length >= 2 && move.vanish[1].p == V.KING)
- {
+ if (move.vanish.length >= 2 && move.vanish[1].p == V.KING) {
// We took opponent king !
const oppCol = V.GetOppCol(c);
- this.kingPos[oppCol] = [-1,-1];
- this.castleFlags[oppCol] = [false,false];
+ 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 firstRank = c == "w" ? 7 : 0;
const oppFirstRank = 7 - firstRank;
const oppCol = V.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;
+ 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)
- {
+ unupdateVariables(move) {
super.unupdateVariables(move);
const c = move.vanish[0].c;
const oppCol = V.GetOppCol(c);
- if (this.kingPos[oppCol][0] < 0)
- {
+ if (this.kingPos[oppCol][0] < 0) {
// Last move took opponent's king
- for (let psq of move.vanish)
- {
- if (psq.p == 'k')
- {
+ for (let psq of move.vanish) {
+ if (psq.p == "k") {
this.kingPos[oppCol] = [psq.x, psq.y];
break;
}
}
}
- getCurrentScore()
- {
+ getCurrentScore() {
const color = this.turn;
const kp = this.kingPos[color];
- if (kp[0] < 0) //king disappeared
- return (color == "w" ? "0-1" : "1-0");
- if (this.atLeastOneMove()) // game not over
+ if (kp[0] < 0)
+ // King disappeared
+ return color == "w" ? "0-1" : "1-0";
+ if (this.atLeastOneMove())
+ // game not over
return "*";
return "1/2"; //no moves but kings still there
}
- static get THRESHOLD_MATE()
- {
+ static get THRESHOLD_MATE() {
return 500; //checkmates evals may be slightly below 1000
}
-}
+};