X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=client%2Fsrc%2Fvariants%2FArena.js;h=33940b8345cdb2cafbb4b3e2ea8f723c60550539;hb=6f2f94374f1e73c375edf732d9425e575e81fff7;hp=f3713e27def9d4ace0aa24cbf773e06b956ac2e4;hpb=7ba4a5bc5b64e19a1e7f26aa232d5c50770d07ad;p=vchess.git diff --git a/client/src/variants/Arena.js b/client/src/variants/Arena.js index f3713e27..33940b83 100644 --- a/client/src/variants/Arena.js +++ b/client/src/variants/Arena.js @@ -1,14 +1,51 @@ import { ChessRules } from "@/base_rules"; -export const VariantRules = class ArenaRules extends ChessRules { - static get hasFlags() { +export class ArenaRules extends ChessRules { + static get HasFlags() { return false; } + static get PawnSpecs() { + return Object.assign( + {}, + ChessRules.PawnSpecs, + { captureBackward: true } + ); + } + + static IsGoodPosition(position) { + if (position.length == 0) return false; + const rows = position.split("/"); + if (rows.length != V.size.x) return false; + // At most and at least one king or queen per color + let royals = { "k": 0, "K": 0, "q": 0, "Q": 0 }; + for (let row of rows) { + let sumElts = 0; + for (let i = 0; i < row.length; i++) { + if (['K','k','Q','q'].includes(row[i])) royals[row[i]]++; + if (V.PIECES.includes(row[i].toLowerCase())) sumElts++; + else { + const num = parseInt(row[i]); + if (isNaN(num)) return false; + sumElts += num; + } + } + if (sumElts != V.size.y) return false; + } + if ( + Object.values(royals).some(v => v >= 2) || + royals['K'] + royals['Q'] == 0 || + royals['k'] + royals['q'] == 0 + ) { + return false; + } + return true; + } + + scanKings() {} + static GenRandInitFen(randomness) { - return ChessRules - .GenRandInitFen(randomness) - .replace("w 0 1111 -", "w 0 -"); + return ChessRules.GenRandInitFen(randomness).slice(0, -6) + "-"; } static InArena(x) { @@ -30,60 +67,6 @@ export const VariantRules = class ArenaRules extends ChessRules { return moves; } - getPotentialPawnMoves([x, y]) { - const color = this.turn; - let moves = []; - const [sizeX, sizeY] = [V.size.x, V.size.y]; - const shiftX = color == "w" ? -1 : 1; - const startRank = color == "w" ? sizeX - 2 : 1; - - if (this.board[x + shiftX][y] == V.EMPTY) { - // One square forward - moves.push(this.getBasicMove([x, y], [x + shiftX, y])); - // Next condition because pawns on 1st rank can generally jump - if ( - x == startRank && - this.board[x + 2 * shiftX][y] == V.EMPTY - ) { - // Two squares jump - moves.push(this.getBasicMove([x, y], [x + 2 * shiftX, y])); - } - } - // Captures: also possible backward - for (let shiftY of [-1, 1]) { - if (y + shiftY >= 0 && y + shiftY < sizeY) { - for (let direction of [-1,1]) { - if ( - this.board[x + direction][y + shiftY] != V.EMPTY && - this.canTake([x, y], [x + direction, y + shiftY]) - ) { - moves.push(this.getBasicMove([x, y], [x + direction, y + shiftY])); - } - } - } - } - - // En passant - const Lep = this.epSquares.length; - const epSquare = this.epSquares[Lep - 1]; //always at least one element - if ( - !!epSquare && - epSquare.x == x + shiftX && - Math.abs(epSquare.y - y) == 1 - ) { - let enpassantMove = this.getBasicMove([x, y], [epSquare.x, epSquare.y]); - enpassantMove.vanish.push({ - x: x, - y: epSquare.y, - p: "p", - c: this.getColor(x, epSquare.y) - }); - moves.push(enpassantMove); - } - - return moves; - } - getPotentialQueenMoves(sq) { return this.getSlideNJumpMoves( sq, @@ -153,4 +136,8 @@ export const VariantRules = class ArenaRules extends ChessRules { } return "*"; } + + static get SEARCH_DEPTH() { + return 4; + } };