}
getPPpath(m) {
+ if (!!m.promoteInto) return m.promoteInto;
let piece = m.appear[0].p;
if (Object.keys(V.IMMOBILIZE_DECODE).includes(piece))
piece = V.IMMOBILIZE_DECODE[piece];
}
if (sumElts != V.size.y) return false;
}
- if (kings['k'] + kings['l'] != 1 || kings['K'] + kings['L'] != 1)
+ if (kings['k'] + kings['l'] == 0 || kings['K'] + kings['L'] == 0)
return false;
return true;
}
if (piece == V.PAWN) {
const forward = (color == 'w' ? -1 : 1);
return (
- this.board[x + forward][y] != oppCol ||
+ V.OnBoard(x + forward, y) &&
(
- V.OnBoard(x + forward, y + 1) &&
- this.board[x + forward][y + 1] != V.EMPTY &&
- this.getColor[x + forward, y + 1] == oppCol
- ) ||
- (
- V.OnBoard(x + forward, y - 1) &&
- this.board[x + forward][y - 1] != V.EMPTY &&
- this.getColor[x + forward, y - 1] == oppCol
+ this.board[x + forward][y] != oppCol ||
+ (
+ V.OnBoard(x + forward, y + 1) &&
+ this.board[x + forward][y + 1] != V.EMPTY &&
+ this.getColor[x + forward, y + 1] == oppCol
+ ) ||
+ (
+ V.OnBoard(x + forward, y - 1) &&
+ this.board[x + forward][y - 1] != V.EMPTY &&
+ this.getColor[x + forward, y - 1] == oppCol
+ )
)
);
}
getBasicMove_aux(psq1, sq2, tr, initMove) {
const [x1, y1] = [psq1.x, psq1.y];
const color1 = this.turn;
- const piece1 = psq1.p || this.getPiece(x1, y1);
+ const piece1 = (!!tr ? tr.p : (psq1.p || this.getPiece(x1, y1)));
const oppCol = V.GetOppCol(color1);
if (!sq2) {
let move = {
const [x2, y2] = [sq2[0], sq2[1]];
// The move starts normally, on board:
let move = super.getBasicMove([x1, y1], [x2, y2], tr);
+ if (!!tr) move.promoteInto = tr.c + tr.p; //in case of (chomped...)
const L = this.firstMove.length;
if (
[V.PAWN, V.KNIGHT].includes(piece1) &&
// start is wrong for Toadette moves --> it's fixed later
move.start = { x: psq1.x, y: psq1.y };
move.end = !!sq2 ? { x: sq2[0], y: sq2[1] } : { x: psq1.x, y: psq1.y };
+ if (!!tr) move.promoteInto = moves[0].promoteInto;
let lm = moves[moves.length-1];
if (this.subTurn == 1 && !!lm.end.effect)
move.end.effect = lm.end.effect;
}
else if (move.appear[0].p == V.INVISIBLE_QUEEN)
this.powerFlags[move.appear[0].c][V.QUEEN] = false;
- if (move.turn[1] == 2) return;
+ if (this.subTurn == 2) return;
if (
+ move.turn[1] == 1 &&
move.appear.length == 0 ||
!(Object.keys(V.IMMOBILIZE_DECODE).includes(move.appear[0].p))
) {
// Look for an immobilized piece of my color: it can now move
- // Also make opponent invisible queen visible again, if any
- const oppCol = V.GetOppCol(color);
for (let i=0; i<8; i++) {
for (let j=0; j<8; j++) {
if (this.board[i][j] != V.EMPTY) {
- const colIJ = this.getColor(i, j);
const piece = this.getPiece(i, j);
if (
- colIJ == color &&
+ this.getColor(i, j) == color &&
Object.keys(V.IMMOBILIZE_DECODE).includes(piece)
) {
this.board[i][j] = color + V.IMMOBILIZE_DECODE[piece];
move.wasImmobilized = [i, j];
}
- else if (
- colIJ == oppCol &&
- piece == V.INVISIBLE_QUEEN
- ) {
- this.board[i][j] = oppCol + V.QUEEN;
- move.wasInvisible = [i, j];
- }
}
}
}
}
+ // Also make opponent invisible queen visible again, if any
+ const oppCol = V.GetOppCol(color);
+ for (let i=0; i<8; i++) {
+ for (let j=0; j<8; j++) {
+ if (
+ this.board[i][j] != V.EMPTY &&
+ this.getColor(i, j) == oppCol &&
+ this.getPiece(i, j) == V.INVISIBLE_QUEEN
+ ) {
+ this.board[i][j] = oppCol + V.QUEEN;
+ move.wasInvisible = [i, j];
+ }
+ }
+ }
}
undo(move) {
return moves;
}
+ static get VALUES() {
+ return Object.assign(
+ {},
+ ChessRules.VALUES,
+ {
+ s: 1,
+ u: 5,
+ o: 3,
+ c: 3,
+ t: 9,
+ l: 1000,
+ e: 0,
+ d: 0,
+ w: 0,
+ m: 0
+ }
+ );
+ }
+
+ static get SEARCH_DEPTH() {
+ return 1;
+ }
+
getComputerMove() {
- // Random mover:
const moves = this.getAllValidMoves();
- let move1 = moves[randInt(moves.length)];
+ // Split into "normal" and "random" moves:
+ // (Next splitting condition is OK because cannot take self object
+ // without a banana or bomb on the way).
+ const deterministicMoves = moves.filter(m => {
+ return m.vanish.every(a => a.c != 'a' || a.p == V.MUSHROOM);
+ });
+ const randomMoves = moves.filter(m => {
+ return m.vanish.some(a => a.c == 'a' && a.p != V.MUSHROOM);
+ });
+ if (Math.random() < deterministicMoves.length / randomMoves.length)
+ // Play a deterministic one: capture king or material if possible
+ return super.getComputerMove(deterministicMoves);
+ // Play a random effect move, at random:
+ let move1 = randomMoves[randInt(moves.length)];
this.play(move1);
let move2 = undefined;
if (this.subTurn == 2) {