import { ArrayFun } from "@/utils/array";
import { randInt } from "@/utils/alea";
-export const VariantRules = class HiddenRules extends ChessRules {
+export class HiddenRules extends ChessRules {
+
static get HasFlags() {
return false;
}
return false;
}
+ static get SomeHiddenMoves() {
+ return true;
+ }
+
// Analyse in Hidden mode makes no sense
static get CanAnalyze() {
return false;
}
- // Moves are revealed only when game ends
+ // Moves are revealed only when game ends, but are highlighted on board
static get ShowMoves() {
- return "none";
+ return "highlight";
}
static get HIDDEN_DECODE() {
}
static get PIECES() {
- return ChessRules.PIECES.concat(Object.values(V.HIDDEN_CODE));
+ return ChessRules.PIECES.concat(Object.keys(V.HIDDEN_DECODE));
}
// Pieces can be hidden :)
return piece;
}
+ getPpath(b, color, score) {
+ if (Object.keys(V.HIDDEN_DECODE).includes(b[1])) {
+ // Supposed to be hidden.
+ if (score == "*" && (!color || color != b[0]))
+ return "Hidden/" + b[0] + "p";
+ // Else: condition OK to show the piece
+ return b[0] + V.HIDDEN_DECODE[b[1]];
+ }
+ // The piece is already not supposed to be hidden:
+ return b;
+ }
+
// Scan board for kings positions (no castling)
- scanKingsRooks(fen) {
+ scanKings(fen) {
this.kingPos = { w: [-1, -1], b: [-1, -1] };
const fenRows = V.ParseFen(fen).position.split("/");
for (let i = 0; i < fenRows.length; i++) {
this.kingPos["w"] = [i, k];
break;
default: {
- const num = parseInt(fenRows[i].charAt(j));
+ const num = parseInt(fenRows[i].charAt(j), 10);
if (!isNaN(num)) k += num - 1;
}
}
}
}
- getPpath(b, color, score) {
- if (Object.keys(V.HIDDEN_DECODE).includes(b[1])) {
- // Supposed to be hidden.
- if (score == "*" && (!color || color != b[0]))
- return "Hidden/" + b[0] + "p";
- // Else: condition OK to show the piece
- return b[0] + V.HIDDEN_DECODE[b[1]];
- }
- // The piece is already not supposed to be hidden:
- return b;
- }
-
getBasicMove([sx, sy], [ex, ey], tr) {
if (
tr &&
return mv;
}
- // What are the king moves from square x,y ?
- getPotentialKingMoves(sq) {
- // No castling:
- return this.getSlideNJumpMoves(
- sq,
- V.steps[V.ROOK].concat(V.steps[V.BISHOP]),
- "oneStep"
- );
- }
-
filterValid(moves) {
return moves;
}
+ // Ignore randomness here: placement is always random asymmetric
static GenRandInitFen() {
let pieces = { w: new Array(8), b: new Array(8) };
// Shuffle pieces + pawns on two first ranks
pieces[c][rook2Pos] = "u";
}
let upFen = pieces["b"].join("");
- upFen = upFen.substr(0,8) + "/" + upFen.substr(8).split("").reverse().join("");
+ upFen = upFen.substr(0,8) + "/" +
+ upFen.substr(8).split("").reverse().join("");
let downFen = pieces["b"].join("").toUpperCase();
- downFen = downFen.substr(0,8) + "/" + downFen.substr(8).split("").reverse().join("");
+ downFen = downFen.substr(0,8) + "/" +
+ downFen.substr(8).split("").reverse().join("");
return upFen + "/8/8/8/8/" + downFen + " w 0";
}
return [];
}
- updateVariables(move) {
- super.updateVariables(move);
+ postPlay(move) {
+ super.postPlay(move);
if (
move.vanish.length >= 2 &&
[V.KING,V.HIDDEN_CODE[V.KING]].includes(move.vanish[1].p)
}
}
- unupdateVariables(move) {
- super.unupdateVariables(move);
+ postUndo(move) {
+ super.postUndo(move);
const c = move.vanish[0].c;
const oppCol = V.GetOppCol(c);
if (this.kingPos[oppCol][0] < 0)
if (move.vanish.length == 2 && move.vanish[1].c != color) {
// OK this isn't a castling move
const myPieceVal = V.VALUES[move.appear[0].p];
- const hisPieceVal = Object.keys(V.HIDDEN_DECODE).includes(move.vanish[1].p)
- ? undefined
- : V.VALUES[move.vanish[1].p];
+ const hisPieceVal =
+ Object.keys(V.HIDDEN_DECODE).includes(move.vanish[1].p)
+ ? undefined
+ : V.VALUES[move.vanish[1].p];
if (!hisPieceVal) {
// Opponent's piece is unknown: do not take too much risk
move.eval = -myPieceVal + 1.5; //so that pawns always take
// If no capture, favor small step moves,
// but sometimes move the knight anyway
const penalty = V.Decode(move.vanish[0].p) != V.KNIGHT
- ? Math.abs(move.end.x - move.start.x) + Math.abs(move.end.y - move.start.y)
+ ? Math.abs(move.end.x - move.start.x) +
+ Math.abs(move.end.y - move.start.y)
: (Math.random() < 0.5 ? 3 : 1);
move.eval -= penalty / (V.size.x + V.size.y - 1);
}
finalSquare
);
}
+
};