+ this.riflePromotePostProcess(moves);
+ }
+
+ return moves;
+ }
+
+ capturePostProcess(moves, oppCol) {
+ // Filter out non-capturing moves (not using m.vanish because of
+ // self captures of Recycle and Teleport).
+ return moves.filter(m => {
+ return (
+ this.board[m.end.x][m.end.y] != "" &&
+ this.getColor(m.end.x, m.end.y) == oppCol
+ );
+ });
+ }
+
+ atomicPostProcess(moves, oppCol) {
+ moves.forEach(m => {
+ if (
+ this.board[m.end.x][m.end.y] != "" &&
+ this.getColor(m.end.x, m.end.y) == oppCol
+ ) {
+ // Explosion!
+ let steps = [
+ [-1, -1],
+ [-1, 0],
+ [-1, 1],
+ [0, -1],
+ [0, 1],
+ [1, -1],
+ [1, 0],
+ [1, 1]
+ ];
+ for (let step of steps) {
+ let x = m.end.x + step[0];
+ let y = this.computeY(m.end.y + step[1]);
+ if (
+ this.onBoard(x, y) &&
+ this.board[x][y] != "" &&
+ this.getPieceType(x, y) != "p"
+ ) {
+ m.vanish.push(
+ new PiPo({
+ p: this.getPiece(x, y),
+ c: this.getColor(x, y),
+ x: x,
+ y: y
+ })
+ );
+ }
+ }
+ if (!this.options["rifle"])
+ m.appear.pop(); //nothin appears
+ }
+ });
+ }
+
+ 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 = (
+ x2 == lastRank &&
+ (!this.options["rifle"] || this.board[x2][y2] == "")
+ );
+ if (!promotionOk)
+ return; //nothing to do
+ if (!this.options["pawnfall"]) {