import { ChessRules, PiPo, Move } from "@/base_rules";
export class ParachuteRules extends ChessRules {
+
static get HasFlags() {
return false;
}
return true;
}
+ static IsGoodPosition(position) {
+ if (position.length == 0) return false;
+ const rows = position.split("/");
+ if (rows.length != V.size.x) return false;
+ for (let row of rows) {
+ let sumElts = 0;
+ for (let i = 0; i < row.length; i++) {
+ if (V.PIECES.includes(row[i].toLowerCase())) sumElts++;
+ else {
+ const num = parseInt(row[i], 10);
+ if (isNaN(num)) return false;
+ sumElts += num;
+ }
+ }
+ if (sumElts != V.size.y) return false;
+ }
+ return true;
+ }
+
static ParseFen(fen) {
const fenParts = fen.split(" ");
return Object.assign(
setOtherVariables(fen) {
super.setOtherVariables(fen);
- const fenParsed = V.ParseFen(fen);
// Also init reserves (used by the interface to show landable pieces)
+ const reserve =
+ V.ParseFen(fen).reserve.split("").map(x => parseInt(x, 10));
this.reserve = {
w: {
- [V.PAWN]: parseInt(fenParsed.reserve[0]),
- [V.ROOK]: parseInt(fenParsed.reserve[1]),
- [V.KNIGHT]: parseInt(fenParsed.reserve[2]),
- [V.BISHOP]: parseInt(fenParsed.reserve[3]),
- [V.QUEEN]: parseInt(fenParsed.reserve[4]),
- [V.KING]: parseInt(fenParsed.reserve[5])
+ [V.PAWN]: reserve[0],
+ [V.ROOK]: reserve[1],
+ [V.KNIGHT]: reserve[2],
+ [V.BISHOP]: reserve[3],
+ [V.QUEEN]: reserve[4],
+ [V.KING]: reserve[5]
},
b: {
- [V.PAWN]: parseInt(fenParsed.reserve[6]),
- [V.ROOK]: parseInt(fenParsed.reserve[7]),
- [V.KNIGHT]: parseInt(fenParsed.reserve[8]),
- [V.BISHOP]: parseInt(fenParsed.reserve[9]),
- [V.QUEEN]: parseInt(fenParsed.reserve[10]),
- [V.KING]: parseInt(fenParsed.reserve[11])
+ [V.PAWN]: reserve[6],
+ [V.ROOK]: reserve[7],
+ [V.KNIGHT]: reserve[8],
+ [V.BISHOP]: reserve[9],
+ [V.QUEEN]: reserve[10],
+ [V.KING]: reserve[11]
}
};
}
return true;
}
+ underCheck(color) {
+ if (this.kingPos[color][0] < 0)
+ // A king outside the board isn't under check
+ return false;
+ return this.isAttacked(this.kingPos[color], V.GetOppCol(color));
+ }
+
prePlay(move) {
super.prePlay(move);
if (move.vanish.length == 0) this.reserve[this.turn][move.appear[0].p]--;
move.appear[0].p != V.PAWN ? move.appear[0].p.toUpperCase() : "";
return piece + "@" + V.CoordsToSquare(move.end);
}
+
};