Fix gating on corner squares
[capablanca.git] / lasker-2.2.3 / src / movecheck.c
index 6d05050..e9b3a15 100644 (file)
@@ -1710,7 +1710,7 @@ static int move_calculate(struct game_state_t * gs, struct move_t * mt, int prom
     for (i = g->numHalfMoves-1; i >= 0; i--) {
       if (g->moveList[i].fromFile == mt->fromFile && g->moveList[i].fromRank == mt->fromRank ||
           g->moveList[i].toFile   == mt->fromFile && g->moveList[i].toRank   == mt->fromRank ||
-         g->moveList[i].fromFile == ALG_CASTLE && (gs->onMove == WHITE ? 0 : gs->ranks-1) == mt->fromRank &&
+         g->moveList[i].fromFile == ALG_CASTLE && (i&1 ? gs->ranks-1 : 0) == mt->fromRank &&
                 (g->moveList[i].fromRank == mt->fromFile || gs->files>>1 == mt->fromFile )) return MOVE_ILLEGAL;
     }
     mt->piecePromotionTo = promote; // gating OK
@@ -2289,7 +2289,7 @@ int backup_move(int g, int mode)
 {
   struct game_state_t *gs;
   struct move_t *m, *m1;
-  int now, i;
+  int now, i, piece;
 
   if (game_globals.garray[g].link >= 0)        /*IanO: not implemented for bughouse yet */
     return MOVE_ILLEGAL;
@@ -2330,12 +2330,11 @@ int backup_move(int g, int mode)
     gs->board[kingFromFile][rank] = KING | m->color; // King fromSquare
     goto cleanupMove;
   }
+  piece = gs->board[m->toFile][m->toRank];
   if(gs->board[m->fromFile][m->fromRank] != NOPIECE) { // [HGM] from-square occupied; move must have been Seirawan-style gating
     gs->holding[gs->onMove==WHITE ? 1 : 0][piecetype(gs->board[m->fromFile][m->fromRank])-1]++; // put back in holdings (onMove not flipped yet!)
-  }
-  gs->board[m->fromFile][m->fromRank] = gs->board[m->toFile][m->toRank];
-  if (m->piecePromotionTo != NOPIECE) {
-    int piece;
+  } else
+  if (m->piecePromotionTo != NOPIECE) { // it is a real promotion
     switch(piecetype(m->piecePromotionTo)) { // Spartan pieces came from Hoplite, Shogi is problematic
       case KING:
       case CAPTAIN:
@@ -2347,9 +2346,9 @@ int backup_move(int g, int mode)
       case GOLD: // TODO: figure out what original was
       default: piece = PAWN;
     }
-    gs->board[m->fromFile][m->fromRank] = piece |
-      colorval(gs->board[m->fromFile][m->fromRank]);
+    piece |= colorval(gs->board[m->toFile][m->toRank]);
   }
+  gs->board[m->fromFile][m->fromRank] = piece;
   /******************
      When takeback a _first_ move of rook, the ??rmoved variable
      must be cleared . To check, if the move is first, we should