X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=base_rules.js;h=4805f174b55773fc5e5a3e79dc9792d8a8b6dfaf;hb=0c44c6768654f7127e36aa75beee58d61df4fc64;hp=a2cb95169f38767d837c4b7696c6d654915a6800;hpb=639afc982f9c3be3b4748ef10e8ef771a295712f;p=xogo.git diff --git a/base_rules.js b/base_rules.js index a2cb951..4805f17 100644 --- a/base_rules.js +++ b/base_rules.js @@ -118,13 +118,13 @@ export default class ChessRules { //////////////////// // COORDINATES UTILS - // a3 --> {x:10, y:3} + // 3a --> {x:3, y:10} static SquareToCoords(sq) { return ArrayFun.toObject(["x", "y"], [0, 1].map(i => parseInt(sq[i], 36))); } - // {x:1, y:12} --> 1c + // {x:11, y:12} --> bc static CoordsToSquare(cd) { return Object.values(cd).map(c => c.toString(36)).join(""); } @@ -162,12 +162,12 @@ export default class ChessRules { // Turn "wb" into "B" (for FEN) board2fen(b) { - return b[0] == "w" ? b[1].toUpperCase() : b[1]; + return (b[0] == "w" ? b[1].toUpperCase() : b[1]); } // Turn "p" into "bp" (for board) fen2board(f) { - return f.charCodeAt(0) <= 90 ? "w" + f.toLowerCase() : "b" + f; + return (f.charCodeAt(0) <= 90 ? "w" + f.toLowerCase() : "b" + f); } // Setup the initial random-or-not (asymmetric-or-not) position @@ -672,7 +672,7 @@ export default class ChessRules { } else this.r_pieces = { 'w': {}, 'b': {} }; - let chessboard = + let chessboard = document.getElementById(this.containerId).querySelector(".chessboard"); if (!r) r = chessboard.getBoundingClientRect(); @@ -1065,13 +1065,7 @@ export default class ChessRules { // Am I allowed to move thing at square x,y ? canIplay(x, y) { - return ( - this.playerColor == this.turn && - ( - (typeof x == "number" && this.getColor(x, y) == this.turn) || - (typeof x == "string" && x == this.turn) //reserve - ) - ); + return (this.playerColor == this.turn && this.getColor(x, y) == this.turn); } //////////////////////// @@ -1342,19 +1336,16 @@ export default class ChessRules { } } if (!this.options["rifle"]) - m.appear.pop(); //nothin appears + m.appear.pop(); //nothing appears } }); } -// TODO: pawnfall + Cannibal issues - pawnPostProcess(moves, color, oppCol) { let moreMoves = []; const lastRank = (color == "w" ? 0 : this.size.x - 1); const initPiece = this.getPiece(moves[0].start.x, moves[0].start.y); moves.forEach(m => { - let finalPieces = ["p"]; const [x1, y1] = [m.start.x, m.start.y]; const [x2, y2] = [m.end.x, m.end.y]; const promotionOk = ( @@ -1363,34 +1354,30 @@ export default class ChessRules { ); if (!promotionOk) return; //nothing to do - if (!this.options["pawnfall"]) { - if ( - this.options["cannibal"] && - this.board[x2][y2] != "" && - this.getColor(x2, y2) == oppCol - ) { - finalPieces = [this.getPieceType(x2, y2)]; - } - else - finalPieces = this.pawnPromotions; + if (this.options["pawnfall"]) { + m.appear.shift(); + return; + } + let finalPieces = ["p"]; + if ( + this.options["cannibal"] && + this.board[x2][y2] != "" && + this.getColor(x2, y2) == oppCol + ) { + finalPieces = [this.getPieceType(x2, y2)]; } + else + finalPieces = this.pawnPromotions; m.appear[0].p = finalPieces[0]; if (initPiece == "!") //cannibal king-pawn m.appear[0].p = C.CannibalKingCode[finalPieces[0]]; for (let i=1; i { + return this.castleFlags[c].some(val => val < this.size.y)}) ) { - // OK, not a drop move - if ( - this.hasCastle && - // If flags already off, no need to re-check: - Object.keys(this.castleFlags).some(c => { - return this.castleFlags[c].some(val => val < this.size.y)}) - ) { - this.updateCastleFlags(move); - } - const initSquare = C.CoordsToSquare(move.start); - if ( - this.options["crazyhouse"] && - (!this.options["rifle"] || !move.capture) - ) { + this.updateCastleFlags(move); + } + if (this.options["crazyhouse"]) { + move.vanish.forEach(v => { + const square = C.CoordsToSquare({x: v.x, y: v.y}); + if (this.ispawn[square]) + delete this.ispawn[square]; + }); + if (move.appear.length > 0 && move.vanish.length > 0) { + // Assumption: something is moving + const initSquare = C.CoordsToSquare(move.start); const destSquare = C.CoordsToSquare(move.end); - if (this.ispawn[initSquare]) { - delete this.ispawn[initSquare]; - this.ispawn[destSquare] = true; - } - else if ( - move.vanish[0].p == "p" && - move.appear[0].p != "p" + if ( + this.ispawn[initSquare] || + (move.vanish[0].p == "p" && move.appear[0].p != "p") ) { this.ispawn[destSquare] = true; } @@ -1988,18 +1965,28 @@ export default class ChessRules { } } const minSize = Math.min(move.appear.length, move.vanish.length); - if (this.hasReserve && !move.pawnfall) { + if ( + this.hasReserve && + // Warning; atomic pawn removal isn't a capture + (!this.options["atomic"] || !this.rempawn || this.movesCount >= 1) + ) { const color = this.turn; for (let i=minSize; i