Started code review + some fixes (unfinished)
[vchess.git] / client / src / variants / Magnetic.js
index 3789de3..0110c49 100644 (file)
@@ -1,98 +1,92 @@
 import { ChessRules, PiPo } from "@/base_rules";
 
-export const VariantRules = class  MagneticRules extends ChessRules
-{
-  static get HasEnpassant() { return false; }
+export const VariantRules = class MagneticRules extends ChessRules {
+  static get HasEnpassant() {
+    return false;
+  }
 
-  getPotentialMovesFrom([x,y])
-  {
-    let standardMoves = super.getPotentialMovesFrom([x,y]);
+  getPotentialMovesFrom([x, y]) {
+    let standardMoves = super.getPotentialMovesFrom([x, y]);
     let moves = [];
     standardMoves.forEach(m => {
       let newMove_s = this.applyMagneticLaws(m);
-      if (newMove_s.length == 1)
-        moves.push(newMove_s[0]);
-      else //promotion
-        moves = moves.concat(newMove_s);
+      if (newMove_s.length == 1) moves.push(newMove_s[0]);
+      //promotion
+      else moves = moves.concat(newMove_s);
     });
     return moves;
   }
 
   // Complete a move with magnetic actions
   // TODO: job is done multiple times for (normal) promotions.
-  applyMagneticLaws(move)
-  {
-    if (move.appear[0].p == V.KING && move.appear.length==1)
-      return [move]; //kings are not charged
-    const aIdx = (move.appear[0].p != V.KING ? 0 : 1); //if castling, rook is charged
-    const [x,y] = [move.appear[aIdx].x, move.appear[aIdx].y];
+  applyMagneticLaws(move) {
+    if (move.appear[0].p == V.KING && move.appear.length == 1) return [move]; //kings are not charged
+    const aIdx = move.appear[0].p != V.KING ? 0 : 1; //if castling, rook is charged
+    const [x, y] = [move.appear[aIdx].x, move.appear[aIdx].y];
     const color = this.turn;
-    const lastRank = (color=="w" ? 0 : 7);
+    const lastRank = color == "w" ? 0 : 7;
     const standardMove = JSON.parse(JSON.stringify(move));
     this.play(standardMove);
-    for (let step of [[-1,0],[1,0],[0,-1],[0,1]])
-    {
-      let [i,j] = [x+step[0],y+step[1]];
-      while (V.OnBoard(i,j))
-      {
-        if (this.board[i][j] != V.EMPTY)
-        {
+    for (let step of [
+      [-1, 0],
+      [1, 0],
+      [0, -1],
+      [0, 1]
+    ]) {
+      let [i, j] = [x + step[0], y + step[1]];
+      while (V.OnBoard(i, j)) {
+        if (this.board[i][j] != V.EMPTY) {
           // Found something. Same color or not?
-          if (this.getColor(i,j) != color)
-          {
+          if (this.getColor(i, j) != color) {
             // Attraction
-            if ((Math.abs(i-x)>=2 || Math.abs(j-y)>=2) && this.getPiece(i,j) != V.KING)
-            {
+            if (
+              (Math.abs(i - x) >= 2 || Math.abs(j - y) >= 2) &&
+              this.getPiece(i, j) != V.KING
+            ) {
               move.vanish.push(
                 new PiPo({
-                  p:this.getPiece(i,j),
-                  c:this.getColor(i,j),
-                  x:i,
-                  y:j
+                  p: this.getPiece(i, j),
+                  c: this.getColor(i, j),
+                  x: i,
+                  y: j
                 })
               );
               move.appear.push(
                 new PiPo({
-                  p:this.getPiece(i,j),
-                  c:this.getColor(i,j),
-                  x:x+step[0],
-                  y:y+step[1]
+                  p: this.getPiece(i, j),
+                  c: this.getColor(i, j),
+                  x: x + step[0],
+                  y: y + step[1]
                 })
               );
             }
-          }
-          else
-          {
+          } else {
             // Repulsion
-            if (this.getPiece(i,j) != V.KING)
-            {
+            if (this.getPiece(i, j) != V.KING) {
               // Push it until we meet an obstacle or edge of the board
-              let [ii,jj] = [i+step[0],j+step[1]];
-              while (V.OnBoard(ii,jj))
-              {
-                if (this.board[ii][jj] != V.EMPTY)
-                  break;
+              let [ii, jj] = [i + step[0], j + step[1]];
+              while (V.OnBoard(ii, jj)) {
+                if (this.board[ii][jj] != V.EMPTY) break;
                 ii += step[0];
                 jj += step[1];
               }
               ii -= step[0];
               jj -= step[1];
-              if (Math.abs(ii-i)>=1 || Math.abs(jj-j)>=1)
-              {
+              if (Math.abs(ii - i) >= 1 || Math.abs(jj - j) >= 1) {
                 move.vanish.push(
                   new PiPo({
-                    p:this.getPiece(i,j),
-                    c:this.getColor(i,j),
-                    x:i,
-                    y:j
+                    p: this.getPiece(i, j),
+                    c: this.getColor(i, j),
+                    x: i,
+                    y: j
                   })
                 );
                 move.appear.push(
                   new PiPo({
-                    p:this.getPiece(i,j),
-                    c:this.getColor(i,j),
-                    x:ii,
-                    y:jj
+                    p: this.getPiece(i, j),
+                    c: this.getColor(i, j),
+                    x: ii,
+                    y: jj
                   })
                 );
               }
@@ -107,15 +101,15 @@ export const VariantRules = class  MagneticRules extends ChessRules
     this.undo(standardMove);
     let moves = [];
     // Scan move for pawn (max 1) on 8th rank
-    for (let i=1; i<move.appear.length; i++)
-    {
-      if (move.appear[i].p==V.PAWN && move.appear[i].c==color
-        && move.appear[i].x==lastRank)
-      {
+    for (let i = 1; i < move.appear.length; i++) {
+      if (
+        move.appear[i].p == V.PAWN &&
+        move.appear[i].c == color &&
+        move.appear[i].x == lastRank
+      ) {
         move.appear[i].p = V.ROOK;
         moves.push(move);
-        for (let piece of [V.KNIGHT, V.BISHOP, V.QUEEN])
-        {
+        for (let piece of [V.KNIGHT, V.BISHOP, V.QUEEN]) {
           let cmove = JSON.parse(JSON.stringify(move));
           cmove.appear[i].p = piece;
           moves.push(cmove);
@@ -129,63 +123,59 @@ export const VariantRules = class  MagneticRules extends ChessRules
         break;
       }
     }
-    if (moves.length == 0) //no pawn on 8th rank
+    if (moves.length == 0)
+      //no pawn on 8th rank
       moves.push(move);
     return moves;
   }
 
-  atLeastOneMove()
-  {
-    if (this.kingPos[this.turn][0] < 0)
-      return false;
+  atLeastOneMove() {
+    if (this.kingPos[this.turn][0] < 0) return false;
     return true; //TODO: is it right?
   }
 
-  underCheck(color)
-  {
+  underCheck() {
     return false; //there is no check
   }
 
-  getCheckSquares(move)
-  {
+  getCheckSquares() {
     return [];
   }
 
-  updateVariables(move)
-  {
+  updateVariables(move) {
     super.updateVariables(move);
     const c = move.vanish[0].c;
-    if (move.vanish.length >= 2 && move.vanish[1].p == V.KING)
-    {
+    if (move.vanish.length >= 2 && move.vanish[1].p == V.KING) {
       // We took opponent king !
       const oppCol = V.GetOppCol(c);
-      this.kingPos[oppCol] = [-1,-1];
-      this.castleFlags[oppCol] = [false,false];
+      this.kingPos[oppCol] = [-1, -1];
+      this.castleFlags[oppCol] = [false, false];
     }
     // Did we magnetically move our (init) rooks or opponents' ones ?
-    const firstRank = (c == "w" ? 7 : 0);
+    const firstRank = c == "w" ? 7 : 0;
     const oppFirstRank = 7 - firstRank;
     const oppCol = V.GetOppCol(c);
     move.vanish.forEach(psq => {
       if (psq.x == firstRank && this.INIT_COL_ROOK[c].includes(psq.y))
-        this.castleFlags[c][psq.y==this.INIT_COL_ROOK[c][0] ? 0 : 1] = false;
-      else if (psq.x == oppFirstRank && this.INIT_COL_ROOK[oppCol].includes(psq.y))
-        this.castleFlags[oppCol][psq.y==this.INIT_COL_ROOK[oppCol][0] ? 0 : 1] = false;
+        this.castleFlags[c][psq.y == this.INIT_COL_ROOK[c][0] ? 0 : 1] = false;
+      else if (
+        psq.x == oppFirstRank &&
+        this.INIT_COL_ROOK[oppCol].includes(psq.y)
+      )
+        this.castleFlags[oppCol][
+          psq.y == this.INIT_COL_ROOK[oppCol][0] ? 0 : 1
+        ] = false;
     });
   }
 
-  unupdateVariables(move)
-  {
+  unupdateVariables(move) {
     super.unupdateVariables(move);
     const c = move.vanish[0].c;
     const oppCol = V.GetOppCol(c);
-    if (this.kingPos[oppCol][0] < 0)
-    {
+    if (this.kingPos[oppCol][0] < 0) {
       // Last move took opponent's king
-      for (let psq of move.vanish)
-      {
-        if (psq.p == 'k')
-        {
+      for (let psq of move.vanish) {
+        if (psq.p == "k") {
           this.kingPos[oppCol] = [psq.x, psq.y];
           break;
         }
@@ -193,19 +183,19 @@ export const VariantRules = class  MagneticRules extends ChessRules
     }
   }
 
-  getCurrentScore()
-  {
+  getCurrentScore() {
     const color = this.turn;
     const kp = this.kingPos[color];
-    if (kp[0] < 0) //king disappeared
-      return (color == "w" ? "0-1" : "1-0");
-    if (this.atLeastOneMove()) // game not over
+    if (kp[0] < 0)
+      //king disappeared
+      return color == "w" ? "0-1" : "1-0";
+    if (this.atLeastOneMove())
+      // game not over
       return "*";
     return "1/2"; //no moves but kings still there
   }
 
-  static get THRESHOLD_MATE()
-  {
+  static get THRESHOLD_MATE() {
     return 500; //checkmates evals may be slightly below 1000
   }
-}
+};