Check-in modifications made by HGM so far
[capablanca.git] / lasker-2.2.3 / src / gameproc.c
index 7e2cd5d..a0dba3f 100644 (file)
@@ -139,6 +139,11 @@ void game_ended(int g, int winner, int why)
     strcpy(EndSymbol, "Mat");
     rate_change = 1;
     break;
+  case END_BARE:
+    sprintf(tmp, "%s bared} %s", NameOfLoser, winSymbol);
+    strcpy(EndSymbol, "Bar");
+    rate_change = 1;
+    break;
   case END_RESIGN:
     sprintf(tmp, "%s resigns} %s", NameOfLoser, winSymbol);
     strcpy(EndSymbol, "Res");
@@ -335,7 +340,7 @@ void game_ended(int g, int winner, int why)
           pprintf (p,"\n%s",avail_black);
           avail_printed = 1;
         }
-        if (gl != -1) /* bughouse ? */ {
+        if (gl == -1) /* bughouse ? */ {
           if (((player_globals.parray[game_globals.garray[gl].white].b_stats.rating <= pp->availmax) && (player_globals.parray[game_globals.garray[gl].white].b_stats.rating >= pp->availmin)) || (!pp->availmax)) {
             pprintf (p,"\n%s",avail_bugwhite);
             avail_printed = 1;
@@ -547,6 +552,7 @@ void process_move(int p, char *command)
   }
   if ((len = strlen(command)) > 1) {
     if (command[len - 2] == '=') {
+printf("promo '%s'\n", command);
       switch (tolower(command[strlen(command) - 1])) {
       case 'n':
        pp->promote = KNIGHT;
@@ -557,9 +563,41 @@ void process_move(int p, char *command)
       case 'r':
        pp->promote = ROOK;
        break;
+      case 'a':
+       pp->promote = CARDINAL;
+       break;
+      case 'c':
+       pp->promote = MARSHALL;
+       break;
+      case 'm':
+       pp->promote = MAN;
+       break;
       case 'q':
        pp->promote = QUEEN;
        break;
+      // courier promotion
+      case 'f':
+       pp->promote = FERZ2;
+       break;
+      // Superchess promotions
+      case 'e':
+       pp->promote = EMPRESS;
+       break;
+      case 's':
+       pp->promote = PRINCESS;
+       break;
+      case 'v':
+       pp->promote = CENTAUR;
+       break;
+      case 'w':
+       pp->promote = WOODY;
+       break;
+      case 'o':
+       pp->promote = SQUIRREL;
+       break;
+      case 'g':
+       pp->promote = MASTODON;
+       break;
       default:
        pprintf(p, "Don't understand that move.\n");
        return;
@@ -567,6 +605,7 @@ void process_move(int p, char *command)
       }
     }
   }
+
   switch (parse_move(command, &gg->game_state, &move, pp->promote)) {
   case MOVE_ILLEGAL:
     pprintf(p, "Illegal move.\n");
@@ -633,13 +672,19 @@ void process_move(int p, char *command)
       gg->moveList = (struct move_t *) realloc(gg->moveList, sizeof(struct move_t) * gg->moveListSize);
     }
     result = execute_move(&gg->game_state, &move, 1);
-    if (result == MOVE_OK && gg->link >= 0 && move.pieceCaptured != NOPIECE) {
+    if (result == MOVE_OK && (gg->link >= 0 || gg->game_state.holdings) && move.pieceCaptured != NOPIECE) {
       /* transfer captured piece to partner */
       /* check if piece reverts to a pawn */
+      int victim = move.pieceCaptured, partner = gg->link;
+      // [HGM] zh: if not Bughouse, the game_state.holdings field decides what happens
+      if(gg->link < 0) { 
+       partner = g; // pieces stay with current board
+       if(gg->game_state.holdings == -1) victim ^= WHITE|BLACK; // flip color
+      } 
       if (was_promoted(&game_globals.garray[g], move.toFile, move.toRank))
-        update_holding(gg->link, colorval(move.pieceCaptured) | PAWN);
+        update_holding(partner, colorval(victim) | PAWN); // [HGM] todo: for Shogi we would have to demote differently!
       else
-        update_holding(gg->link, move.pieceCaptured);
+        update_holding(partner, victim);
     }
     now = tenth_secs();
     move.atTime = now;
@@ -733,6 +778,22 @@ void process_move(int p, char *command)
       game_ended(g, CToggle(gg->game_state.onMove), END_NOMATERIAL);
     }
   }
+  if (result == MOVE_BARE) {
+    if (gg->status == GAME_EXAMINE) {
+      int p1;
+
+      for (p1 = 0; p1 < player_globals.p_num; p1++) {
+       if (player_globals.parray[p1].status != PLAYER_PROMPT)
+         continue;
+       if (player_is_observe(p1, g) || player_globals.parray[p1].game == g) {
+         pprintf(p1, "%s bared.\n",
+                 (gg->game_state.onMove == BLACK) ? "White" : "Black");
+       }
+      }
+    } else {
+      game_ended(g, gg->game_state.onMove, END_BARE);
+    }
+  }
 }
 
 int com_resign(int p, param_list param)
@@ -1039,8 +1100,8 @@ static int player_has_mating_material(struct game_state_t *gs, int color)
   int piece;
   int minor_pieces = 0;
 
-  for (i = 0; i < 8; i++)
-    for (j = 0; j < 8; j++) {
+  for (i = 0; i < gs->files; i++)
+    for (j = 0; j < gs->ranks; j++) {
       piece = gs->board[i][j];
       switch (piecetype(piece)) {
       case BISHOP: