From: Benjamin Auder Date: Sat, 1 Dec 2018 00:14:00 +0000 (+0100) Subject: Fix Crazyhouse X-Git-Url: https://git.auder.net/assets/doc/html/rpsls.js?a=commitdiff_plain;h=8a60cacd26d8c47f52ecac26091d6a6f65e6bbc5;p=vchess.git Fix Crazyhouse --- diff --git a/public/javascripts/base_rules.js b/public/javascripts/base_rules.js index e8862736..6bc3591c 100644 --- a/public/javascripts/base_rules.js +++ b/public/javascripts/base_rules.js @@ -724,6 +724,8 @@ class ChessRules // DEBUG: // if (!this.states) this.states = []; // if (!ingame) this.states.push(JSON.stringify(this.board)); +// if (!this.rstates) this.rstates = []; +// if (!ingame) this.rstates.push(JSON.stringify(this.promoted)+"-"+JSON.stringify(this.reserve)); if (!!ingame) move.notation = [this.getNotation(move), this.getLongNotation(move)]; @@ -745,7 +747,8 @@ class ChessRules // DEBUG: // let state = this.states.pop(); -// if (JSON.stringify(this.board) != state) +// let rstate = this.rstates.pop(); +// if (JSON.stringify(this.board) != state || JSON.stringify(this.promoted)+"-"+JSON.stringify(this.reserve) != rstate) // debugger; } diff --git a/public/javascripts/variants/Crazyhouse.js b/public/javascripts/variants/Crazyhouse.js index 37337650..88193edb 100644 --- a/public/javascripts/variants/Crazyhouse.js +++ b/public/javascripts/variants/Crazyhouse.js @@ -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