Fix takeback of S-Chess gatings
authorH.G. Muller <h.g.muller@hccnet.nl>
Sun, 8 Jan 2012 22:53:08 +0000 (23:53 +0100)
committerH.G. Muller <h.g.muller@hccnet.nl>
Sun, 8 Jan 2012 22:53:08 +0000 (23:53 +0100)
The code for takeback of Spartan promotions had broken this, as it was
applied to gatings too, reverting the moved piece to Pawn!

lasker-2.2.3/src/movecheck.c

index 6d05050..d575915 100644 (file)
@@ -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