{label: "Asymmetric random", value: 2}
]
}],
- check: [
+ input: [
{
label: "Capture king",
- defaut: false,
- variable: "taking"
+ variable: "taking",
+ type: "checkbox",
+ defaut: false
},
{
label: "Falling pawn",
- defaut: false,
- variable: "pawnfall"
+ variable: "pawnfall",
+ type: "checkbox",
+ defaut: false
}
],
// Game modifiers (using "elementary variants"). Default: false
(!!this.options["recycle"] && !this.options["teleport"])
);
}
+ // Some variants do not store reserve state (Align4, Chakart...)
+ get hasReserveFen() {
+ return this.hasReserve;
+ }
get noAnimate() {
return !!this.options["dark"];
// Setup the initial random-or-not (asymmetric-or-not) position
genRandInitFen(seed) {
- Random.setSeed(seed);
-
let fen, flags = "0707";
if (!this.options.randomness)
// Deterministic:
else {
// Randomize
- let pieces = { w: new Array(8), b: new Array(8) };
+ Random.setSeed(seed);
+ let pieces = {w: new Array(8), b: new Array(8)};
flags = "";
// Shuffle pieces on first (and last rank if randomness == 2)
for (let c of ["w", "b"]) {
parts.push(`"flags":"${this.getFlagsFen()}"`);
if (this.hasEnpassant)
parts.push(`"enpassant":"${this.getEnpassantFen()}"`);
- if (this.hasReserve)
+ if (this.hasReserveFen)
parts.push(`"reserve":"${this.getReserveFen()}"`);
if (this.options["crazyhouse"])
parts.push(`"ispawn":"${this.getIspawnFen()}"`);
if (this.options[opt.variable] === undefined)
this.options[opt.variable] = opt.defaut;
});
+ if (o.genFenOnly)
+ // This object will be used only for initial FEN generation
+ return;
this.playerColor = o.color;
this.afterPlay = o.afterPlay; //trigger some actions after playing a move
this.re_drawReserve(['w', 'b'], r);
}
- // NOTE: assume !!this.reserve
+ // NOTE: assume this.reserve != null
re_drawReserve(colors, r) {
if (this.r_pieces) {
// Remove (old) reserve pieces
for (let c of colors) {
- if (!this.reserve[c])
- continue;
- Object.keys(this.reserve[c]).forEach(p => {
- if (this.r_pieces[c][p]) {
- this.r_pieces[c][p].remove();
- delete this.r_pieces[c][p];
- const numId = this.getReserveNumId(c, p);
- document.getElementById(numId).remove();
- }
+ Object.keys(this.r_pieces[c]).forEach(p => {
+ this.r_pieces[c][p].remove();
+ delete this.r_pieces[c][p];
+ const numId = this.getReserveNumId(c, p);
+ document.getElementById(numId).remove();
});
- let reservesDiv = document.getElementById("reserves_" + c);
- if (reservesDiv)
- reservesDiv.remove();
}
}
else
if (!r)
r = container.querySelector(".chessboard").getBoundingClientRect();
for (let c of colors) {
+ let reservesDiv = document.getElementById("reserves_" + c);
+ if (reservesDiv)
+ reservesDiv.remove();
if (!this.reserve[c])
continue;
const nbR = this.getNbReservePieces(c);
};
const mouseup = (e) => {
- const newR = chessboard.getBoundingClientRect();
- if (newR.width != r.width || newR.height != r.height) {
- this.rescale();
- return;
- }
if (!start)
return;
const [x, y] = [start.x, start.y];
curPiece.remove();
};
- const wheelResize = (e) => {
- this.rescale(e.deltaY < 0 ? "up" : "down");
- };
-
if ('onmousedown' in window) {
document.addEventListener("mousedown", mousedown);
document.addEventListener("mousemove", mousemove);
document.addEventListener("mouseup", mouseup);
- document.addEventListener("wheel", wheelResize);
+ document.addEventListener("wheel",
+ (e) => this.rescale(e.deltaY < 0 ? "up" : "down"));
}
if ('ontouchstart' in window) {
// https://stackoverflow.com/a/42509310/12660887
}
static GetColorClass(c) {
- return (c == 'w' ? "white" : "black");
+ if (c == 'w')
+ return "white";
+ if (c == 'b')
+ return "black";
+ return "other-color"; //unidentified color
}
// Assume square i,j isn't empty
move.appear.forEach(a => {
this.g_pieces[a.x][a.y] = document.createElement("piece");
this.g_pieces[a.x][a.y].classList.add(this.pieces()[a.p]["class"]);
- this.g_pieces[a.x][a.y].classList.add(a.c == "w" ? "white" : "black");
+ this.g_pieces[a.x][a.y].classList.add(C.GetColorClass(a.c));
this.g_pieces[a.x][a.y].style.width = pieceWidth + "px";
this.g_pieces[a.x][a.y].style.height = pieceWidth + "px";
const [ip, jp] = this.getPixelPosition(a.x, a.y, r);