X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=public%2Fjavascripts%2Fvariants%2FAntiking.js;h=2821f3f5d9f4c8c2362b4533a0c0023973dd7751;hb=7931e479adf93c87771ded1892a0873af72ae46d;hp=f8c7465aeeed1cfc683c00b11b8c4c315efc90fb;hpb=a37076f1ac8f4c19d9b34a60cbe89df86b88fa0b;p=vchess.git diff --git a/public/javascripts/variants/Antiking.js b/public/javascripts/variants/Antiking.js index f8c7465a..2821f3f5 100644 --- a/public/javascripts/variants/Antiking.js +++ b/public/javascripts/variants/Antiking.js @@ -1,13 +1,16 @@ class AntikingRules extends ChessRules { - // Path to pieces static getPpath(b) { return b[1]=='a' ? "Antiking/"+b : b; } static get ANTIKING() { return 'a'; } - + + static get PIECES() { + return ChessRules.PIECES.concat([V.ANTIKING]); + } + initVariables(fen) { super.initVariables(fen); @@ -42,7 +45,7 @@ class AntikingRules extends ChessRules const piece2 = this.getPiece(x2,y2); const color1 = this.getColor(x1,y1); const color2 = this.getColor(x2,y2); - return !["a","A"].includes(piece2) && + return piece2 != "a" && ((piece1 != "a" && color1 != color2) || (piece1 == "a" && color1 == color2)); } @@ -50,7 +53,7 @@ class AntikingRules extends ChessRules { switch (this.getPiece(x,y)) { - case VariantRules.ANTIKING: + case V.ANTIKING: return this.getPotentialAntikingMoves([x,y]); default: return super.getPotentialMovesFrom([x,y]); @@ -59,7 +62,6 @@ class AntikingRules extends ChessRules getPotentialAntikingMoves(sq) { - const V = VariantRules; return this.getSlideNJumpMoves(sq, V.steps[V.ROOK].concat(V.steps[V.BISHOP]), "oneStep"); } @@ -71,7 +73,6 @@ class AntikingRules extends ChessRules isAttackedByKing([x,y], colors) { - const V = VariantRules; if (this.getPiece(x,y) == V.ANTIKING) return false; //antiking is not attacked by king return this.isAttackedBySlideNJump([x,y], colors, V.KING, @@ -80,9 +81,8 @@ class AntikingRules extends ChessRules isAttackedByAntiking([x,y], colors) { - const V = VariantRules; - if (this.getPiece(x,y) == V.KING) - return false; //king is not attacked by antiking + if ([V.KING,V.ANTIKING].includes(this.getPiece(x,y))) + return false; //(anti)king is not attacked by antiking return this.isAttackedBySlideNJump([x,y], colors, V.ANTIKING, V.steps[V.ROOK].concat(V.steps[V.BISHOP]), "oneStep"); } @@ -92,8 +92,8 @@ class AntikingRules extends ChessRules const c = this.turn; const oppCol = this.getOppCol(c); this.play(move) - let res = this.isAttacked(this.kingPos[c], oppCol) - || !this.isAttacked(this.antikingPos[c], oppCol); + let res = this.isAttacked(this.kingPos[c], [oppCol]) + || !this.isAttacked(this.antikingPos[c], [oppCol]); this.undo(move); return res; } @@ -103,7 +103,7 @@ class AntikingRules extends ChessRules let res = super.getCheckSquares(move); this.play(move); const c = this.turn; - if (!this.isAttacked(this.antikingPos[c], this.getOppCol(c))) + if (!this.isAttacked(this.antikingPos[c], [this.getOppCol(c)])) res.push(JSON.parse(JSON.stringify(this.antikingPos[c]))); this.undo(move); return res; @@ -115,7 +115,7 @@ class AntikingRules extends ChessRules const piece = this.getPiece(move.start.x,move.start.y); const c = this.getColor(move.start.x,move.start.y); // Update antiking position - if (piece == VariantRules.ANTIKING) + if (piece == V.ANTIKING) { this.antikingPos[c][0] = move.appear[0].x; this.antikingPos[c][1] = move.appear[0].y; @@ -126,7 +126,7 @@ class AntikingRules extends ChessRules { super.unupdateVariables(move); const c = this.getColor(move.start.x,move.start.y); - if (this.getPiece(move.start.x,move.start.y) == VariantRules.ANTIKING) + if (this.getPiece(move.start.x,move.start.y) == V.ANTIKING) this.antikingPos[c] = [move.start.x, move.start.y]; } @@ -134,38 +134,73 @@ class AntikingRules extends ChessRules { const color = this.turn; const oppCol = this.getOppCol(color); - if (!this.isAttacked(this.kingPos[color], oppCol) - && this.isAttacked(this.antikingPos[color], oppCol)) + if (!this.isAttacked(this.kingPos[color], [oppCol]) + && this.isAttacked(this.antikingPos[color], [oppCol])) { return "1/2"; } return color == "w" ? "0-1" : "1-0"; } - // Pieces values (TODO: use Object.assign() + ChessRules.VALUES ?) static get VALUES() { - return { - 'p': 1, - 'r': 5, - 'n': 3, - 'b': 3, - 'q': 9, - 'k': 1000, - 'a': 1000 - }; + return Object.assign( + ChessRules.VALUES, + { 'a': 1000 } + ); } static GenRandInitFen() { - let randFen = ChessRules.GenRandInitFen(); - // Black side - let antikingPos = _.random(7); - let ranks23 = "pppppppp/" + (antikingPos>0?antikingPos:"") + "A" + (antikingPos<7?7-antikingPos:""); - randFen = randFen.replace("pppppppp/8", ranks23); - // White side - antikingPos = _.random(7); - ranks23 = (antikingPos>0?antikingPos:"") + "a" + (antikingPos<7?7-antikingPos:"") + "/PPPPPPPP"; - randFen = randFen.replace("8/PPPPPPPP", ranks23); - return randFen; + let pieces = { "w": new Array(8), "b": new Array(8) }; + let antikingPos = { "w": -1, "b": -1 }; + for (let c of ["w","b"]) + { + let positions = _.range(8); + + // Get random squares for bishops, but avoid corners; because, + // if an antiking blocks a cornered bishop, it can never be checkmated + let randIndex = 2 * _.random(1,3); + const bishop1Pos = positions[randIndex]; + let randIndex_tmp = 2 * _.random(2) + 1; + const bishop2Pos = positions[randIndex_tmp]; + positions.splice(Math.max(randIndex,randIndex_tmp), 1); + positions.splice(Math.min(randIndex,randIndex_tmp), 1); + + randIndex = _.random(5); + const knight1Pos = positions[randIndex]; + positions.splice(randIndex, 1); + randIndex = _.random(4); + const knight2Pos = positions[randIndex]; + positions.splice(randIndex, 1); + + randIndex = _.random(3); + const queenPos = positions[randIndex]; + positions.splice(randIndex, 1); + + const rook1Pos = positions[0]; + const kingPos = positions[1]; + const rook2Pos = positions[2]; + + // Random squares for antikings + antikingPos[c] = _.random(7); + + pieces[c][rook1Pos] = 'r'; + pieces[c][knight1Pos] = 'n'; + pieces[c][bishop1Pos] = 'b'; + pieces[c][queenPos] = 'q'; + pieces[c][kingPos] = 'k'; + pieces[c][bishop2Pos] = 'b'; + pieces[c][knight2Pos] = 'n'; + pieces[c][rook2Pos] = 'r'; + } + const ranks23_black = "pppppppp/" + (antikingPos["w"]>0?antikingPos["w"]:"") + + "A" + (antikingPos["w"]<7?7-antikingPos["w"]:""); + const ranks23_white = (antikingPos["b"]>0?antikingPos["b"]:"") + "a" + + (antikingPos["b"]<7?7-antikingPos["b"]:"") + "/PPPPPPPP"; + let fen = pieces["b"].join("") + "/" + ranks23_black + + "/8/8/" + + ranks23_white + "/" + pieces["w"].join("").toUpperCase() + + " 1111"; + return fen; } }