X-Git-Url: https://git.auder.net/?p=vchess.git;a=blobdiff_plain;f=client%2Fsrc%2Fvariants%2FOmega.js;h=355960b737801fe4690639a98234f54cba396c99;hp=7b5576cff2b29a6f04c37a6a488f280ce2959528;hb=b19c68965d6249ab4d7873b99e2f22471049b2c1;hpb=f6c6d0c3c1b2fa33f8c7cfbbc1e9ab869c0054dd diff --git a/client/src/variants/Omega.js b/client/src/variants/Omega.js index 7b5576cf..355960b7 100644 --- a/client/src/variants/Omega.js +++ b/client/src/variants/Omega.js @@ -36,6 +36,7 @@ export class OmegaRules extends ChessRules { return ([V.CHAMPION, V.WIZARD].includes(b[1]) ? "Omega/" : "") + b; } + // TODO: the wall position should be checked too static IsGoodPosition(position) { if (position.length == 0) return false; const rows = position.split("/"); @@ -47,7 +48,7 @@ export class OmegaRules extends ChessRules { if (['K','k'].includes(row[i])) kings[row[i]]++; if (['x'].concat(V.PIECES).includes(row[i].toLowerCase())) sumElts++; else { - const num = parseInt(row[i]); + const num = parseInt(row[i], 10); if (isNaN(num)) return false; sumElts += num; } @@ -161,21 +162,19 @@ export class OmegaRules extends ChessRules { // The second bishop must be on a square of different color let randIndex_tmp = 2 * randInt(5) + 1; const bishop2Pos = positions[randIndex_tmp]; - positions.splice(Math.max(randIndex, randIndex_tmp), 1); - positions.splice(Math.min(randIndex, randIndex_tmp), 1); // Get random squares for champions - randIndex = 2 * randInt(4); - let bishopSameColorPos = (bishop1Pos % 2 == 0 ? bishop1Pos : bishop2Pos); - if (randIndex >= bishopSameColorPos) randIndex += 2; - const champion1Pos = positions[randIndex]; + let randIndexC = 2 * randInt(4); + if (randIndexC >= bishop1Pos) randIndexC += 2; + const champion1Pos = positions[randIndexC]; // The second champion must be on a square of different color - randIndex_tmp = 2 * randInt(4) + 1; - bishopSameColorPos = (bishop1Pos % 2 == 0 ? bishop1Pos : bishop2Pos); - if (randIndex_tmp >= bishopSameColorPos) randIndex_tmp += 2; - const champion2Pos = positions[randIndex_tmp]; - positions.splice(Math.max(randIndex, randIndex_tmp), 1); - positions.splice(Math.min(randIndex, randIndex_tmp), 1); + let randIndex_tmpC = 2 * randInt(4) + 1; + if (randIndex_tmpC >= bishop2Pos) randIndex_tmpC += 2; + const champion2Pos = positions[randIndex_tmpC]; + + let usedIndices = [randIndex, randIndex_tmp, randIndexC, randIndex_tmpC]; + usedIndices.sort(); + for (let i = 3; i >= 0; i--) positions.splice(usedIndices[i], 1); // Get random squares for other pieces randIndex = randInt(6); @@ -204,7 +203,7 @@ export class OmegaRules extends ChessRules { pieces[c][knight2Pos] = "n"; pieces[c][rook2Pos] = "r"; pieces[c][champion2Pos] = "c"; - flags += V.CoordToColumn(rook1Pos) + V.CoordToColumn(rook2Pos); + flags += V.CoordToColumn(rook1Pos+1) + V.CoordToColumn(rook2Pos+1); } // Add turn + flags + enpassant return ( @@ -228,6 +227,15 @@ export class OmegaRules extends ChessRules { return res.slice(0, -1); //remove last comma } + canTake([x1, y1], [x2, y2]) { + return ( + // Cannot take wall :) + // NOTE: this check is useful only for pawns where OnBoard() isn't used + this.board[x2][y2] != V.NOTHING && + this.getColor(x1, y1) !== this.getColor(x2, y2) + ); + } + // En-passant after 2-sq or 3-sq jumps getEpSquare(moveOrSquare) { if (!moveOrSquare) return undefined; @@ -299,6 +307,22 @@ export class OmegaRules extends ChessRules { return moves; } + addPawnMoves([x1, y1], [x2, y2], moves, promotions) { + let finalPieces = [V.PAWN]; + const color = this.turn; + const lastRank = (color == "w" ? 1 : V.size.x - 2); + if (x2 == lastRank) { + // promotions arg: special override for Hiddenqueen variant + if (!!promotions) finalPieces = promotions; + else if (!!V.PawnSpecs.promotions) finalPieces = V.PawnSpecs.promotions; + } + let tr = null; + for (let piece of finalPieces) { + tr = (piece != V.PAWN ? { c: color, p: piece } : null); + moves.push(this.getBasicMove([x1, y1], [x2, y2], tr)); + } + } + getPotentialChampionMoves(sq) { return this.getSlideNJumpMoves(sq, V.steps[V.CHAMPION], "oneStep"); }