+ super.updateVariables(move);
+ if (move.vanish.length == 2 && move.appear.length == 2)
+ 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;
+ }