X-Git-Url: https://git.auder.net/images/pieces/current/gitweb.js?a=blobdiff_plain;f=public%2Fjavascripts%2Fvariants%2FCrazyhouse.js;h=b297f1fb78cbe776d3abb3d65e18ce2ac9d9da37;hb=18f9c763d17110b75489f721bf155bb88ac6c5c1;hp=37337650c7bb94bf506cfd5fe8fab251eef8677f;hpb=6752407b88b6d7678b9b19df4ffe1224d17625d7;p=vchess.git diff --git a/public/javascripts/variants/Crazyhouse.js b/public/javascripts/variants/Crazyhouse.js index 37337650..b297f1fb 100644 --- a/public/javascripts/variants/Crazyhouse.js +++ b/public/javascripts/variants/Crazyhouse.js @@ -51,7 +51,7 @@ class CrazyhouseRules extends ChessRules return color + VariantRules.RESERVE_PIECES[index]; } - // Put an ordering on reserve pieces + // Ordering on reserve pieces static get RESERVE_PIECES() { const V = VariantRules; return [V.PAWN,V.ROOK,V.KNIGHT,V.BISHOP,V.QUEEN]; @@ -97,7 +97,7 @@ class CrazyhouseRules extends ChessRules const sizeX = VariantRules.size[0]; if (x >= sizeX) { - // Reserves, outside of board: x == sizeX + // Reserves, outside of board: x == sizeX(+1) return this.getReserveMoves([x,y]); } // Standard moves @@ -138,80 +138,41 @@ class CrazyhouseRules extends ChessRules return; //skip castle const color = this.turn; const V = VariantRules; - // Three types of move: - // 1. Rebirth: just update material - // 2. Standard move: - // a. check if a promoted piece is moving - // b. check if it's a promotion (mutually exclusive) - // 3. Capture: - // a. check if a promoted piece is captured (and mark move) - // b. check if a promoted piece is moving - // c. check if it's a promotion (mutually exclusive with b) if (move.vanish.length == 0) - this.reserve[color][move.appear[0].p]--; - else if (move.vanish.length == 1) - { - if (this.promoted[move.start.x][move.start.y]) - { - this.promoted[move.start.x][move.start.y] = false; - this.promoted[move.end.x][move.end.y] = true; - } - else if (move.vanish[0].p == V.PAWN && move.appear[0].p != V.PAWN) - this.promoted[move.end.x][move.end.y] = true; - } - else //capture { - if (this.promoted[move.end.x][move.end.y]) - { - move.capturePromoted = true; //required for undo - this.reserve[color][VariantRules.PAWN]++; - this.promoted[move.end.x][move.end.y] = false; - } - else - this.reserve[color][move.vanish[1].p]++; - if (this.promoted[move.start.x][move.start.y]) - { - this.promoted[move.start.x][move.start.y] = false; - this.promoted[move.end.x][move.end.y] = true; - } - else if (move.vanish[0].p == V.PAWN && move.appear[0].p != V.PAWN) - this.promoted[move.end.x][move.end.y] = true; + this.reserve[color][move.appear[0].p]--; + return; } + move.movePromoted = this.promoted[move.start.x][move.start.y]; + move.capturePromoted = this.promoted[move.end.x][move.end.y] + this.promoted[move.start.x][move.start.y] = false; + this.promoted[move.end.x][move.end.y] = move.movePromoted + || (move.vanish[0].p == V.PAWN && move.appear[0].p != V.PAWN); + if (move.capturePromoted) + this.reserve[color][VariantRules.PAWN]++; + else if (move.vanish.length == 2) + this.reserve[color][move.vanish[1].p]++; } unupdateVariables(move) { super.unupdateVariables(move); + if (move.vanish.length == 2 && move.appear.length == 2) + return; const color = this.turn; const V = VariantRules; if (move.vanish.length == 0) - this.reserve[color][move.appear[0].p]++; - else if (move.vanish.length == 1) - { - if (this.promoted[move.end.x][move.end.y]) - { - this.promoted[move.end.x][move.end.y] = false; - if (move.vanish[0].p != V.PAWN || move.appear[0].p == V.PAWN) - { - // Not a promotion (= promoted piece creation) - this.promoted[move.start.x][move.start.y] = true; - } - } - } - else //capture { - if (this.promoted[move.end.x][move.end.y]) - { - this.promoted[move.end.x][move.end.y] = !!move.capturePromoted; - if (move.vanish[0].p != V.PAWN || move.appear[0].p == V.PAWN) - this.promoted[move.start.x][move.start.y] = true; - } - // Un-update material: - if (move.capturePromoted) - this.reserve[color][VariantRules.PAWN]--; - else - this.reserve[color][move.vanish[1].p]--; + this.reserve[color][move.appear[0].p]++; + return; } + if (move.movePromoted) + this.promoted[move.start.x][move.start.y] = true; + this.promoted[move.end.x][move.end.y] = move.capturePromoted; + if (move.capturePromoted) + this.reserve[color][VariantRules.PAWN]--; + else if (move.vanish.length == 2) + this.reserve[color][move.vanish[1].p]--; } static get SEARCH_DEPTH() { return 2; } //high branching factor