import { randInt } from "@/utils/alea";
export class TeleportRules extends ChessRules {
+
+ hoverHighlight(x, y) {
+ // Testing move validity results in an infinite update loop.
+ // TODO: find a way to test validity anyway.
+ return (this.subTurn == 2 && this.board[x][y] == V.EMPTY);
+ }
+
setOtherVariables(fen) {
super.setOtherVariables(fen);
this.subTurn = 1;
return super.underCheck(color);
}
- getCurrentScore() {
- if (this.subTurn == 2)
- // Move not over
- return "*";
- return super.getCurrentScore();
- }
-
doClick(square) {
if (isNaN(square[0])) return null;
// If subTurn == 2 && square is empty && !underCheck, then teleport
}
}
}
- else {
- // Normal move
- const firstRank = (c == "w" ? V.size.x - 1 : 0);
- const oppCol = V.GetOppCol(c);
- const oppFirstRank = V.size.x - 1 - firstRank;
- if (move.vanish[0].p == V.KING && move.appear.length > 0)
- this.castleFlags[c] = [V.size.y, V.size.y];
- else if (
- move.start.x == firstRank &&
- this.castleFlags[c].includes(move.start.y)
- ) {
- const flagIdx = (move.start.y == this.castleFlags[c][0] ? 0 : 1);
- this.castleFlags[c][flagIdx] = V.size.y;
- }
- if (
- move.end.x == oppFirstRank &&
- this.castleFlags[oppCol].includes(move.end.y)
- ) {
- const flagIdx = (move.end.y == this.castleFlags[oppCol][0] ? 0 : 1);
- this.castleFlags[oppCol][flagIdx] = V.size.y;
- }
- }
+ // Normal check:
+ super.updateCastleFlags(move, move.vanish[0].p, c);
}
undo(move) {
moves2.forEach(m2 => {
this.play(m2);
const score = this.getCurrentScore();
- const mvEval =
- ["1-0", "0-1"].includes(score)
- ? (score == "1-0" ? 1 : -1) * maxeval
- : (score == "1/2" ? 0 : initEval);
+ let mvEval = 0;
+ if (["1-0", "0-1"].includes(score))
+ mvEval = (score == "1-0" ? 1 : -1) * maxeval;
+ else if (score == "*")
+ // Add small fluctuations to avoid dropping pieces always on the
+ // first square available.
+ mvEval = initEval + 0.05 - Math.random() / 10;
if (
(color == 'w' && mvEval > m.eval) ||
(color == 'b' && mvEval < m.eval)
) {
- // TODO: if many second moves have the same eval, only the
- // first is kept. Could be randomized.
m.eval = mvEval;
m.next = m2;
}
move.appear[0].p != V.PAWN ? move.appear[0].p.toUpperCase() : "";
return piece + "@" + V.CoordsToSquare(move.end);
}
+
};