X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=public%2Fjavascripts%2Fvariants%2FMagnetic.js;h=7d9d5113f9f2cf524004eb1a4cefe95d4ae19b79;hb=9234226104764b91df9d677fb360ad538b98510c;hp=2d576e1b5eaad331fe668293d9d72cf9cbdafaae;hpb=7f0711a8515a199efe66ab903a2e710d77b1ce76;p=vchess.git diff --git a/public/javascripts/variants/Magnetic.js b/public/javascripts/variants/Magnetic.js index 2d576e1b..7d9d5113 100644 --- a/public/javascripts/variants/Magnetic.js +++ b/public/javascripts/variants/Magnetic.js @@ -5,26 +5,46 @@ class MagneticRules extends ChessRules return undefined; //no en-passant } + 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); + }); + return moves; + } + // Complete a move with magnetic actions - applyMagneticLaws([x,y], move) + // TODO: job is done multiple times for (normal) promotions. + applyMagneticLaws(move) { + const V = VariantRules; + 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]; + const color = this.turn; + const lastRank = (color=="w" ? 0 : 7); const standardMove = JSON.parse(JSON.stringify(move)); this.play(standardMove); - const color = this.getColor(x,y); - const [sizeX,sizeY] = VariantRules.size; + const [sizeX,sizeY] = V.size; for (let step of [[-1,0],[1,0],[0,-1],[0,1]]) { let [i,j] = [x+step[0],y+step[1]]; while (i>=0 && i=0 && j=2 || Math.abs(j-y)>=2) - && this.getPiece(i,j) != VariantRules.KING) + if ((Math.abs(i-x)>=2 || Math.abs(j-y)>=2) && this.getPiece(i,j) != V.KING) { move.vanish.push( new PiPo({ @@ -47,13 +67,13 @@ class MagneticRules extends ChessRules else { // Repulsion - if (this.getPiece(i,j) != VariantRules.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 (ii>=0 && ii=0 && jj= 0 && x+shift < sizeX && x+shift != lastRank) - { - // Normal moves - if (this.board[x+shift][y] == V.EMPTY) - { - moves.push(this.getBasicMove([x,y], [x+shift,y])); - if ([startRank,firstRank].includes(x) && this.board[x+2*shift][y] == V.EMPTY) - { - // Two squares jump - moves.push(this.getBasicMove([x,y], [x+2*shift,y])); - } - } - // Captures - if (y>0 && this.canTake([x,y], [x+shift,y-1]) && this.board[x+shift][y-1] != V.EMPTY) - moves.push(this.getBasicMove([x,y], [x+shift,y-1])); - if (y { - // Normal move - if (this.board[x+shift][y] == V.EMPTY) - moves.push(this.getBasicMove([x,y], [x+shift,y], {c:color,p:p})); - // Captures - if (y>0 && this.canTake([x,y], [x+shift,y-1]) && this.board[x+shift][y-1] != V.EMPTY) - moves.push(this.getBasicMove([x,y], [x+shift,y-1], {c:color,p:p})); - if (y { + let tmp = m.appear[0]; + m.appear[0] = m.appear[i]; + m.appear[i] = tmp; + }); + break; } - - // Nothing on the path to the rook? - step = castleSide == 0 ? -1 : 1; - for (i = y + step; i != this.INIT_COL_ROOK[c][castleSide]; i += step) - { - if (this.board[x][i] != V.EMPTY) - continue castlingCheck; - } - const rookPos = this.INIT_COL_ROOK[c][castleSide]; - - // Nothing on final squares, except maybe king and castling rook? - for (i=0; i<2; i++) - { - if (this.board[x][finalSquares[castleSide][i]] != V.EMPTY && - this.getPiece(x,finalSquares[castleSide][i]) != V.KING && - finalSquares[castleSide][i] != rookPos) - { - continue castlingCheck; - } - } - - // If this code is reached, castle is valid - let cmove = new Move({ - appear: [ - new PiPo({x:x,y:finalSquares[castleSide][0],p:V.KING,c:c}), - new PiPo({x:x,y:finalSquares[castleSide][1],p:V.ROOK,c:c})], - vanish: [ - new PiPo({x:x,y:y,p:V.KING,c:c}), - new PiPo({x:x,y:rookPos,p:V.ROOK,c:c})], - end: Math.abs(y - rookPos) <= 2 - ? {x:x, y:rookPos} - : {x:x, y:y + 2 * (castleSide==0 ? -1 : 1)} - }); - this.applyMagneticLaws([x,finalSquares[castleSide][1]], cmove); - moves.push(cmove); } - + if (moves.length == 0) //no pawn on 8th rank + moves.push(move); return moves; } // TODO: verify this assertion -// atLeastOneMove() -// { -// return true; //always at least one possible move -// } + atLeastOneMove() + { + return true; //always at least one possible move + } underCheck(move) { @@ -283,8 +172,18 @@ class MagneticRules extends ChessRules // We took opponent king ! const oppCol = this.getOppCol(c); this.kingPos[oppCol] = [-1,-1]; - this.flags[oppCol] = [false,false]; + 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) @@ -324,4 +223,8 @@ class MagneticRules extends ChessRules // 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 + } }