X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=client%2Fsrc%2Fvariants%2FExtinction.js;h=e25713782f679ef0773f794a47c8f7071206410a;hb=32f6285ee325a14286562a53baefc647201df2af;hp=75db0e1120b763975f9f0b7a5f131e6324d0a31d;hpb=6808d7a16ec1e761c6a2dffec2281c96953e4d89;p=vchess.git diff --git a/client/src/variants/Extinction.js b/client/src/variants/Extinction.js index 75db0e11..e2571378 100644 --- a/client/src/variants/Extinction.js +++ b/client/src/variants/Extinction.js @@ -1,6 +1,31 @@ import { ChessRules } from "@/base_rules"; -export const VariantRules = class ExtinctionRules extends ChessRules { +export class ExtinctionRules extends ChessRules { + static get PawnSpecs() { + return Object.assign( + {}, + ChessRules.PawnSpecs, + { promotions: ChessRules.PawnSpecs.promotions.concat([V.KING]) } + ); + } + + static IsGoodPosition(position) { + if (!ChessRules.IsGoodPosition(position)) + return false; + // Also check that each piece type is present + const rows = position.split("/"); + let pieces = {}; + for (let row of rows) { + for (let i = 0; i < row.length; i++) { + if (isNaN(parseInt(row[i])) && !pieces[row[i]]) + pieces[row[i]] = true; + } + } + if (Object.keys(pieces).length != 12) + return false; + return true; + } + setOtherVariables(fen) { super.setOtherVariables(fen); const pos = V.ParseFen(fen).position; @@ -26,58 +51,21 @@ export const VariantRules = class ExtinctionRules extends ChessRules { }; } - getPotentialPawnMoves([x, y]) { - let moves = super.getPotentialPawnMoves([x, y]); - // Add potential promotions into king - const color = this.turn; - const shift = color == "w" ? -1 : 1; - const lastRank = color == "w" ? 0 : V.size.x - 1; - - if (x + shift == lastRank) { - // Normal move - if (this.board[x + shift][y] == V.EMPTY) - moves.push( - this.getBasicMove([x, y], [x + shift, y], { c: color, p: V.KING }) - ); - // Captures - if ( - y > 0 && - this.board[x + shift][y - 1] != V.EMPTY && - this.canTake([x, y], [x + shift, y - 1]) - ) { - moves.push( - this.getBasicMove([x, y], [x + shift, y - 1], { c: color, p: V.KING }) - ); - } - if ( - y < V.size.y - 1 && - this.board[x + shift][y + 1] != V.EMPTY && - this.canTake([x, y], [x + shift, y + 1]) - ) { - moves.push( - this.getBasicMove([x, y], [x + shift, y + 1], { c: color, p: V.KING }) - ); - } - } - - return moves; - } - // TODO: verify this assertion atLeastOneMove() { return true; //always at least one possible move } - underCheck() { - return false; //there is no check + filterValid(moves) { + return moves; //there is no check } getCheckSquares() { return []; } - updateVariables(move) { - super.updateVariables(move); + postPlay(move) { + super.postPlay(move); // Treat the promotion case: (not the capture part) if (move.appear[0].p != move.vanish[0].p) { this.material[move.appear[0].c][move.appear[0].p]++; @@ -88,8 +76,8 @@ export const VariantRules = class ExtinctionRules extends ChessRules { this.material[move.vanish[1].c][move.vanish[1].p]--; } - unupdateVariables(move) { - super.unupdateVariables(move); + postUndo(move) { + super.postUndo(move); if (move.appear[0].p != move.vanish[0].p) { this.material[move.appear[0].c][move.appear[0].p]--; this.material[move.appear[0].c][V.PAWN]++; @@ -100,7 +88,7 @@ export const VariantRules = class ExtinctionRules extends ChessRules { getCurrentScore() { if (this.atLeastOneMove()) { - // game not over? + // Game not over? const color = this.turn; if ( Object.keys(this.material[color]).some(p => {