X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=client%2Fsrc%2Fbase_rules.js;h=7949d7f605d3856c07db605471d5245bca395481;hb=241bf8f2a9a2c48d793aeb0b1d20207f6371de70;hp=056f4774a9c3b56047e7b63ca4f49a6f767f0586;hpb=6808d7a16ec1e761c6a2dffec2281c96953e4d89;p=vchess.git diff --git a/client/src/base_rules.js b/client/src/base_rules.js index 056f4774..7949d7f6 100644 --- a/client/src/base_rules.js +++ b/client/src/base_rules.js @@ -4,8 +4,8 @@ import { ArrayFun } from "@/utils/array"; import { randInt, shuffle } from "@/utils/alea"; +// class "PiPo": Piece + Position export const PiPo = class PiPo { - //Piece+Position // o: {piece[p], color[c], posX[x], posY[y]} constructor(o) { this.p = o.p; @@ -15,7 +15,6 @@ export const PiPo = class PiPo { } }; -// TODO: for animation, moves should contains "moving" and "fading" maybe... export const Move = class Move { // o: {appear, vanish, [start,] [end,]} // appear,vanish = arrays of PiPo @@ -33,17 +32,25 @@ export const ChessRules = class ChessRules { ////////////// // MISC UTILS + // Some variants don't have flags: static get HasFlags() { return true; - } //some variants don't have flags + } + // Some variants don't have en-passant static get HasEnpassant() { return true; - } //some variants don't have ep. + } - // Path to pieces - static getPpath(b) { - return b; //usual pieces in pieces/ folder + // Some variants cannot have analyse mode + static get CanAnalyze() { + return true; + } + + // Some variants show incomplete information, + // and thus show only a partial moves list or no list at all. + static get ShowMoves() { + return "all"; } // Turn "wb" into "B" (for FEN) @@ -84,9 +91,12 @@ export const ChessRules = class ChessRules { if (position.length == 0) return false; const rows = position.split("/"); if (rows.length != V.size.x) return false; + let kings = {}; for (let row of rows) { let sumElts = 0; for (let i = 0; i < row.length; i++) { + if (['K','k'].includes(row[i])) + kings[row[i]] = true; if (V.PIECES.includes(row[i].toLowerCase())) sumElts++; else { const num = parseInt(row[i]); @@ -96,6 +106,9 @@ export const ChessRules = class ChessRules { } if (sumElts != V.size.y) return false; } + // Both kings should be on board: + if (Object.keys(kings).length != 2) + return false; return true; } @@ -142,6 +155,11 @@ export const ChessRules = class ChessRules { return V.CoordToColumn(coords.y) + (V.size.x - coords.x); } + // Path to pieces + getPpath(b) { + return b; //usual pieces in pieces/ folder + } + // Aggregates flags into one object aggregateFlags() { return this.castleFlags; @@ -361,7 +379,9 @@ export const ChessRules = class ChessRules { // INITIALIZATION constructor(fen) { - this.re_init(fen); + // In printDiagram() fen isn't supply because only getPpath() is used + if (fen) + this.re_init(fen); } // Fen string fully describes the game state @@ -417,7 +437,7 @@ export const ChessRules = class ChessRules { if (V.HasEnpassant) { const epSq = parsedFen.enpassant != "-" - ? V.SquareToCoords(parsedFen.enpassant) + ? this.getEpSquare(parsedFen.enpassant) : undefined; this.epSquares = [epSq]; } @@ -704,10 +724,11 @@ export const ChessRules = class ChessRules { const oppCol = V.GetOppCol(c); let moves = []; let i = 0; + // King, then rook: const finalSquares = [ [2, 3], [V.size.y - 2, V.size.y - 3] - ]; //king, then rook + ]; castlingCheck: for ( let castleSide = 0; castleSide < 2; @@ -949,6 +970,8 @@ export const ChessRules = class ChessRules { // After move is played, update variables + flags updateVariables(move) { let piece = undefined; + // TODO: update variables before move is played, and just use this.turn ? + // (doesn't work in general, think MarseilleChess) let c = undefined; if (move.vanish.length >= 1) { // Usual case, something is moved @@ -959,9 +982,8 @@ export const ChessRules = class ChessRules { piece = move.appear[0].p; c = move.appear[0].c; } - if (c == "c") { - //if (!["w","b"].includes(c)) - // 'c = move.vanish[0].c' doesn't work for Checkered + if (!['w','b'].includes(c)) { + // Checkered, for example c = V.GetOppCol(this.turn); } const firstRank = c == "w" ? V.size.x - 1 : 0; @@ -1004,9 +1026,9 @@ export const ChessRules = class ChessRules { play(move) { // DEBUG: - // if (!this.states) this.states = []; - // const stateFen = this.getBaseFen() + this.getTurnFen() + this.getFlagsFen(); - // this.states.push(stateFen); +// if (!this.states) this.states = []; +// const stateFen = this.getBaseFen() + this.getTurnFen() + this.getFlagsFen(); +// this.states.push(stateFen); if (V.HasFlags) move.flags = JSON.stringify(this.aggregateFlags()); //save flags (for undo) if (V.HasEnpassant) this.epSquares.push(this.getEpSquare(move)); @@ -1025,9 +1047,9 @@ export const ChessRules = class ChessRules { this.unupdateVariables(move); // DEBUG: - // const stateFen = this.getBaseFen() + this.getTurnFen() + this.getFlagsFen(); - // if (stateFen != this.states[this.states.length-1]) debugger; - // this.states.pop(); +// const stateFen = this.getBaseFen() + this.getTurnFen() + this.getFlagsFen(); +// if (stateFen != this.states[this.states.length-1]) debugger; +// this.states.pop(); } /////////////// @@ -1036,7 +1058,6 @@ export const ChessRules = class ChessRules { // What is the score ? (Interesting if game is over) getCurrentScore() { if (this.atLeastOneMove()) - // game not over return "*"; // Game over @@ -1247,10 +1268,10 @@ export const ChessRules = class ChessRules { // Capture const startColumn = V.CoordToColumn(move.start.y); notation = startColumn + "x" + finalSquare; - } //no capture + } else notation = finalSquare; if (move.appear.length > 0 && move.appear[0].p != V.PAWN) - //promotion + // Promotion notation += "=" + move.appear[0].p.toUpperCase(); return notation; }