Various bug fixes
[xogo.git] / variants / _SpecialCaptures / class.js
index 9b48266..7d9f786 100644 (file)
@@ -22,8 +22,8 @@ export default class AbstractSpecialCaptureRules extends ChessRules {
   // Modify capturing moves among listed pincer moves
   addPincerCaptures(moves, byChameleon) {
     const steps = this.pieces()['p'].moves[0].steps;
-    const color = this.turn;
-    const oppCol = C.GetOppCol(color);
+    const color = moves[0].vanish[0].c;
+    const oppCol = C.GetOppTurn(color);
     moves.forEach(m => {
       if (byChameleon && m.start.x != m.end.x && m.start.y != m.end.y)
         // Chameleon not moving as pawn
@@ -60,8 +60,8 @@ export default class AbstractSpecialCaptureRules extends ChessRules {
   }
 
   addCoordinatorCaptures(moves, byChameleon) {
-    const color = this.turn;
-    const oppCol = V.GetOppCol(color);
+    const color = moves[0].vanish[0].c;
+    const oppCol = V.GetOppTurn(color);
     const kp = this.searchKingPos(color)[0];
     moves.forEach(m => {
       // Check piece-king rectangle (if any) corners for enemy pieces
@@ -90,8 +90,8 @@ export default class AbstractSpecialCaptureRules extends ChessRules {
   getLeaperCaptures([x, y], byChameleon, onlyOne) {
     // Look in every direction for captures
     const steps = this.pieces()['r'].moves[0].steps;
-    const color = this.turn;
-    const oppCol = C.GetOppCol(color);
+    const color = this.getColor(x, y);
+    const oppCol = C.GetOppTurn(color);
     let moves = [];
     outerLoop: for (let step of steps) {
       let [i, j] = [x + step[0], this.getY(y + step[1])];
@@ -112,7 +112,7 @@ export default class AbstractSpecialCaptureRules extends ChessRules {
         [i, j] = [i + step[0], this.getY(j + step[1])];
         while (this.onBoard(i, j) && this.board[i][j] == "") {
           let mv = this.getBasicMove([x, y], [i, j]);
-          Array.prorotype.push.apply(mv.vanish, vanished);
+          Array.prototype.push.apply(mv.vanish, vanished);
           moves.push(mv);
           [i, j] = [i + step[0], this.getY(j + step[1])];
         }
@@ -133,7 +133,7 @@ export default class AbstractSpecialCaptureRules extends ChessRules {
   getChameleonCaptures(moves, pushPullType, onlyOneJump) {
     const [x, y] = [moves[0].start.x, moves[0].start.y];
     moves = moves.concat(
-      this.getKnightCaptures([x, y], "asChameleon", onlyOneJump));
+      this.getLeaperCaptures([x, y], "asChameleon", onlyOneJump));
     // No "king capture" because king cannot remain under check
     this.addPincerCaptures(moves, "asChameleon");
     this.addCoordinatorCaptures(moves, "asChameleon");
@@ -154,13 +154,11 @@ export default class AbstractSpecialCaptureRules extends ChessRules {
 
   // type: nothing (freely, capture all), or pull or push, or "exclusive"
   addPushmePullyouCaptures(moves, byChameleon, type) {
-    if (moves.length == 0)
-      return;
     const [sx, sy] = [moves[0].start.x, moves[0].start.y];
     const adjacentSteps = this.pieces()['r'].moves[0].steps;
     let capturingPullDir = {};
-    const color = this.turn;
-    const oppCol = C.GetOppCol(color);
+    const color = moves[0].vanish[0].c;
+    const oppCol = C.GetOppTurn(color);
     if (type != "push") {
       adjacentSteps.forEach(step => {
         const [bi, bj] = [sx - step[0], this.getY(sy - step[1])];
@@ -177,8 +175,8 @@ export default class AbstractSpecialCaptureRules extends ChessRules {
     moves.forEach(m => {
       const [ex, ey] = [m.end.x, m.end.y];
       const step = [
-        ex != x ? (ex - x) / Math.abs(ex - x) : 0,
-        ey != y ? (ey - y) / Math.abs(ey - y) : 0
+        ex != sx ? (ex - sx) / Math.abs(ex - sx) : 0,
+        ey != sy ? (ey - sy) / Math.abs(ey - sy) : 0
       ];
       let vanishPull, vanishPush;
       if (type != "pull") {
@@ -194,7 +192,7 @@ export default class AbstractSpecialCaptureRules extends ChessRules {
         }
       }
       if (capturingPullDir[step[0] + "." + step[1]]) {
-        const [bi, bj] = [x - step[0], this.getY(y - step[1])];
+        const [bi, bj] = [sx - step[0], this.getY(sy - step[1])];
         vanishPull =
           new PiPo({x: bi, y: bj, p: this.getPiece(bi, bj), c: oppCol});
       }
@@ -216,14 +214,14 @@ export default class AbstractSpecialCaptureRules extends ChessRules {
     });
   }
 
-  underAttack([x, y], oppCol) {
+  underAttack([x, y], oppCols) {
     // Generate all potential opponent moves, check if king captured.
     // TODO: do it more efficiently.
     const color = this.getColor(x, y);
     for (let i = 0; i < this.size.x; i++) {
       for (let j = 0; j < this.size.y; j++) {
         if (
-          this.board[i][j] != "" && this.getColor(i, j) == oppCol &&
+          this.board[i][j] != "" && oppCols.includes(this.getColor(i, j)) &&
           this.getPotentialMovesFrom([i, j]).some(m => {
             return (
               m.vanish.length >= 2 &&