X-Git-Url: https://git.auder.net/?p=vchess.git;a=blobdiff_plain;f=client%2Fsrc%2Fvariants%2FAtomic.js;h=996f2d1a203f64591a4676d595f3037bcf3e41a2;hp=3d4f541f478c95229737427fecf23e8fdf0d7b2c;hb=6808d7a16ec1e761c6a2dffec2281c96953e4d89;hpb=ae2c49bb0bbaac3953f63be5b720e9c6835f00b6 diff --git a/client/src/variants/Atomic.js b/client/src/variants/Atomic.js index 3d4f541f..996f2d1a 100644 --- a/client/src/variants/Atomic.js +++ b/client/src/variants/Atomic.js @@ -1,29 +1,43 @@ import { ChessRules, PiPo } from "@/base_rules"; -export const VariantRules = class AtomicRules extends ChessRules -{ - getPotentialMovesFrom([x,y]) - { - let moves = super.getPotentialMovesFrom([x,y]); +export const VariantRules = class AtomicRules extends ChessRules { + getPotentialMovesFrom([x, y]) { + let moves = super.getPotentialMovesFrom([x, y]); // Handle explosions moves.forEach(m => { - if (m.vanish.length > 1 && m.appear.length <= 1) //avoid castles - { + if (m.vanish.length > 1 && m.appear.length <= 1) { + //avoid castles // Explosion! OPTION (TODO?): drop moves which explode our king here - let steps = [ [-1,-1],[-1,0],[-1,1],[0,-1],[0,1],[1,-1],[1,0],[1,1] ]; - for (let step of steps) - { + let steps = [ + [-1, -1], + [-1, 0], + [-1, 1], + [0, -1], + [0, 1], + [1, -1], + [1, 0], + [1, 1] + ]; + for (let step of steps) { let x = m.end.x + step[0]; let y = m.end.y + step[1]; - if (V.OnBoard(x,y) && this.board[x][y] != V.EMPTY - && this.getPiece(x,y) != V.PAWN) - { + if ( + V.OnBoard(x, y) && + this.board[x][y] != V.EMPTY && + this.getPiece(x, y) != V.PAWN + ) { m.vanish.push( - new PiPo({p:this.getPiece(x,y),c:this.getColor(x,y),x:x,y:y})); + new PiPo({ + p: this.getPiece(x, y), + c: this.getColor(x, y), + x: x, + y: y + }) + ); } } - m.end = {x:m.appear[0].x, y:m.appear[0].y}; + m.end = { x: m.appear[0].x, y: m.appear[0].y }; m.appear.pop(); //Nothin appears in this case } }); @@ -31,56 +45,53 @@ export const VariantRules = class AtomicRules extends ChessRules return moves; } - getPotentialKingMoves([x,y]) - { + getPotentialKingMoves([x, y]) { // King cannot capture: let moves = []; const steps = V.steps[V.ROOK].concat(V.steps[V.BISHOP]); - for (let step of steps) - { + for (let step of steps) { const i = x + step[0]; const j = y + step[1]; - if (V.OnBoard(i,j) && this.board[i][j] == V.EMPTY) - moves.push(this.getBasicMove([x,y], [i,j])); + if (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) + moves.push(this.getBasicMove([x, y], [i, j])); } - return moves.concat(this.getCastleMoves([x,y])); + return moves.concat(this.getCastleMoves([x, y])); } - isAttacked(sq, colors) - { - if (this.getPiece(sq[0],sq[1]) == V.KING && this.isAttackedByKing(sq, colors)) + isAttacked(sq, colors) { + if ( + this.getPiece(sq[0], sq[1]) == V.KING && + this.isAttackedByKing(sq, colors) + ) return false; //king cannot take... - return (this.isAttackedByPawn(sq, colors) - || this.isAttackedByRook(sq, colors) - || this.isAttackedByKnight(sq, colors) - || this.isAttackedByBishop(sq, colors) - || this.isAttackedByQueen(sq, colors)); + return ( + this.isAttackedByPawn(sq, colors) || + this.isAttackedByRook(sq, colors) || + this.isAttackedByKnight(sq, colors) || + this.isAttackedByBishop(sq, colors) || + this.isAttackedByQueen(sq, colors) + ); } - updateVariables(move) - { + updateVariables(move) { super.updateVariables(move); - const color = move.vanish[0].c; - if (move.appear.length == 0) //capture - { - const firstRank = {"w": 7, "b": 0}; - for (let c of ["w","b"]) - { + if (move.appear.length == 0) { + //capture + const firstRank = { w: 7, b: 0 }; + for (let c of ["w", "b"]) { // Did we explode king of color c ? (TODO: remove move earlier) - if (Math.abs(this.kingPos[c][0]-move.end.x) <= 1 - && Math.abs(this.kingPos[c][1]-move.end.y) <= 1) - { - this.kingPos[c] = [-1,-1]; - this.castleFlags[c] = [false,false]; - } - else - { + if ( + Math.abs(this.kingPos[c][0] - move.end.x) <= 1 && + Math.abs(this.kingPos[c][1] - move.end.y) <= 1 + ) { + this.kingPos[c] = [-1, -1]; + this.castleFlags[c] = [false, false]; + } else { // Now check if init rook(s) exploded - if (Math.abs(move.end.x-firstRank[c]) <= 1) - { - if (Math.abs(move.end.y-this.INIT_COL_ROOK[c][0]) <= 1) + if (Math.abs(move.end.x - firstRank[c]) <= 1) { + if (Math.abs(move.end.y - this.INIT_COL_ROOK[c][0]) <= 1) this.castleFlags[c][0] = false; - if (Math.abs(move.end.y-this.INIT_COL_ROOK[c][1]) <= 1) + if (Math.abs(move.end.y - this.INIT_COL_ROOK[c][1]) <= 1) this.castleFlags[c][1] = false; } } @@ -88,59 +99,56 @@ export const VariantRules = class AtomicRules extends ChessRules } } - unupdateVariables(move) - { + unupdateVariables(move) { super.unupdateVariables(move); const c = move.vanish[0].c; const oppCol = V.GetOppCol(c); - if ([this.kingPos[c][0],this.kingPos[oppCol][0]].some(e => { return e < 0; })) - { + if ( + [this.kingPos[c][0], this.kingPos[oppCol][0]].some(e => { + return e < 0; + }) + ) { // There is a chance that last move blowed some king away.. - for (let psq of move.vanish) - { - if (psq.p == 'k') - this.kingPos[psq.c==c ? c : oppCol] = [psq.x, psq.y]; + for (let psq of move.vanish) { + if (psq.p == "k") + this.kingPos[psq.c == c ? c : oppCol] = [psq.x, psq.y]; } } } - underCheck(color) - { + underCheck(color) { const oppCol = V.GetOppCol(color); let res = undefined; // If our king disappeared, move is not valid - if (this.kingPos[color][0] < 0) - res = true; + if (this.kingPos[color][0] < 0) res = true; // If opponent king disappeared, move is valid - else if (this.kingPos[oppCol][0] < 0) - res = false; + else if (this.kingPos[oppCol][0] < 0) res = false; // Otherwise, if we remain under check, move is not valid - else - res = this.isAttacked(this.kingPos[color], [oppCol]); + else res = this.isAttacked(this.kingPos[color], [oppCol]); return res; } - getCheckSquares(color) - { - let res = [ ]; - if (this.kingPos[color][0] >= 0 //king might have exploded - && this.isAttacked(this.kingPos[color], [V.GetOppCol(color)])) - { - res = [ JSON.parse(JSON.stringify(this.kingPos[color])) ] + getCheckSquares(color) { + let res = []; + if ( + this.kingPos[color][0] >= 0 && //king might have exploded + this.isAttacked(this.kingPos[color], [V.GetOppCol(color)]) + ) { + res = [JSON.parse(JSON.stringify(this.kingPos[color]))]; } return res; } - getCurrentScore() - { + getCurrentScore() { const color = this.turn; const kp = this.kingPos[color]; - if (kp[0] < 0) //king disappeared + if (kp[0] < 0) + //king disappeared return color == "w" ? "0-1" : "1-0"; - if (this.atLeastOneMove()) // game not over + if (this.atLeastOneMove()) + // game not over return "*"; - if (!this.isAttacked(kp, [V.GetOppCol(color)])) - return "1/2"; + if (!this.isAttacked(kp, [V.GetOppCol(color)])) return "1/2"; return color == "w" ? "0-1" : "1-0"; //checkmate } -} +};