return `${this.containerId}|rnum-${color}${piece}`;
}
+ static AddClass_es(piece, class_es) {
+ if (!Array.isArray(class_es))
+ class_es = [class_es];
+ class_es.forEach(cl => {
+ piece.classList.add(cl);
+ });
+ }
+
+ static RemoveClass_es(piece, class_es) {
+ if (!Array.isArray(class_es))
+ class_es = [class_es];
+ class_es.forEach(cl => {
+ piece.classList.remove(cl);
+ });
+ }
+
graphicalInit() {
// NOTE: not window.onresize = this.re_drawBoardElts because scope (this)
window.onresize = () => this.re_drawBoardElements();
// Compare window ratio width / height to aspectRatio:
const windowRatio = window.innerWidth / window.innerHeight;
let cbWidth, cbHeight;
- if (windowRatio <= this.size.ratio) {
+ const vRatio = this.size.ratio || 1;
+ if (windowRatio <= vRatio) {
// Limiting dimension is width:
cbWidth = Math.min(window.innerWidth, 767);
- cbHeight = cbWidth / this.size.ratio;
+ cbHeight = cbWidth / vRatio;
}
else {
// Limiting dimension is height:
cbHeight = Math.min(window.innerHeight, 767);
- cbWidth = cbHeight * this.size.ratio;
+ cbWidth = cbHeight * vRatio;
}
if (this.hasReserve) {
const sqSize = cbWidth / this.size.y;
// Cannot use getReserveSquareSize() here, but sqSize is an upper bound.
if ((window.innerHeight - cbHeight) / 2 < sqSize + 5) {
cbHeight = window.innerHeight - 2 * (sqSize + 5);
- cbWidth = cbHeight * this.size.ratio;
+ cbWidth = cbHeight * vRatio;
}
}
chessboard.style.width = cbWidth + "px";
const flipped = (this.playerColor == 'b');
let board = `
<svg
- viewBox="0 0 80 80"
+ viewBox="0 0 ${10*this.size.y} ${10*this.size.x}"
class="chessboard_SVG">`;
for (let i=0; i < this.size.x; i++) {
for (let j=0; j < this.size.y; j++) {
const color = this.getColor(i, j);
const piece = this.getPiece(i, j);
this.g_pieces[i][j] = document.createElement("piece");
- this.g_pieces[i][j].classList.add(this.pieces()[piece]["class"]);
+ C.AddClass_es(this.g_pieces[i][j], this.pieces()[piece]["class"]);
this.g_pieces[i][j].classList.add(C.GetColorClass(color));
this.g_pieces[i][j].style.width = pieceWidth + "px";
this.g_pieces[i][j].style.height = pieceWidth + "px";
r_cell.style.height = sqResSize + "px";
rcontainer.appendChild(r_cell);
let piece = document.createElement("piece");
- const pieceSpec = this.pieces()[p];
- piece.classList.add(pieceSpec["class"]);
+ C.AddClass_es(piece, this.pieces()[p]["class"]);
piece.classList.add(C.GetColorClass(c));
piece.style.width = "100%";
piece.style.height = "100%";
const multFact = (mode == "up" ? 1.05 : 0.95);
let [newWidth, newHeight] = [multFact * r.width, multFact * r.height];
// Stay in window:
+ const vRatio = this.size.ratio || 1;
if (newWidth > window.innerWidth) {
newWidth = window.innerWidth;
- newHeight = newWidth / this.size.ratio;
+ newHeight = newWidth / vRatio;
}
if (newHeight > window.innerHeight) {
newHeight = window.innerHeight;
- newWidth = newHeight * this.size.ratio;
+ newWidth = newHeight * vRatio;
}
chessboard.style.width = newWidth + "px";
chessboard.style.height = newHeight + "px";
let chessboard = container.querySelector(".chessboard");
let choices = document.createElement("div");
choices.id = "choices";
+ if (!r)
+ r = chessboard.getBoundingClientRect();
choices.style.width = r.width + "px";
choices.style.height = r.height + "px";
choices.style.left = r.x + "px";
choice.style.backgroundColor = "lightyellow";
choice.onclick = () => callback(moves[i]);
const piece = document.createElement("piece");
- const pieceSpec = this.pieces()[moves[i].appear[0].p];
- piece.classList.add(pieceSpec["class"]);
+ const cdisp = moves[i].choice || moves[i].appear[0].p;
+ C.AddClass_es(piece, this.pieces()[cdisp]["class"]);
piece.classList.add(C.GetColorClass(color));
piece.style.width = "100%";
piece.style.height = "100%";
return {
x: 8,
y: 8,
- ratio: 1 //for rectangular board = y / x
+ ratio: 1 //for rectangular board = y / x (optional, 1 = default)
};
}
return false;
}
+ canStepOver(i, j) {
+ // In some variants, objects on boards don't stop movement (Chakart)
+ return this.board[i][j] == "";
+ }
+
// Generic method to find possible moves of "sliding or jumping" pieces
getPotentialMovesOf(piece, [x, y]) {
const color = this.getColor(x, y);
let stepCounter = 0;
while (
this.onBoard(i, j) &&
- (this.board[i][j] == "" || (i == x && j == y))
+ (this.canStepOver(i, j) || (i == x && j == y))
) {
if (
type != "attack" &&
return [-1, -1]; //king not found
}
- filterValid(moves) {
+ // Some variants (e.g. Refusal) may need to check opponent moves too
+ filterValid(moves, color) {
if (moves.length == 0)
return [];
- const color = this.turn;
+ if (!color)
+ color = this.turn;
const oppCol = C.GetOppCol(color);
if (this.options["balance"] && [1, 3].includes(this.movesCount)) {
// Forbid moves either giving check or exploding opponent's king:
const pieceWidth = this.getPieceWidth(r.width);
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"]);
+ C.AddClass_es(this.g_pieces[a.x][a.y], this.pieces()[a.p]["class"]);
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";
this.afterPlay(move); //user method
}
- getMaxDistance(rwidth) {
+ getMaxDistance(r) {
// Works for all rectangular boards:
- return Math.sqrt(rwidth ** 2 + (rwidth / this.size.ratio) ** 2);
+ return Math.sqrt(r.width ** 2 + r.height ** 2);
}
getDomPiece(x, y) {
movingPiece.style.width = pieceWidth + "px";
movingPiece.style.height = pieceWidth + "px";
}
- const maxDist = this.getMaxDistance(r.width);
+ const maxDist = this.getMaxDistance(r);
const pieces = this.pieces();
if (move.drag) {
const startCode = this.getPiece(move.start.x, move.start.y);
- movingPiece.classList.remove(pieces[startCode]["class"]);
- movingPiece.classList.add(pieces[move.drag.p]["class"]);
+ C.RemoveClass_es(movingPiece, pieces[startCode]["class"]);
+ C.AddClass_es(movingPiece, pieces[move.drag.p]["class"]);
const apparentColor = this.getColor(move.start.x, move.start.y);
if (apparentColor != move.drag.c) {
movingPiece.classList.remove(C.GetColorClass(apparentColor));