Fix classification of variant games
[capablanca.git] / lasker-2.2.3 / src / gamedb.c
index 0d1223f..c0fa3b3 100644 (file)
@@ -167,12 +167,13 @@ int game_isblitz(int wt, int winc, int bt, int binc,
       return TYPE_KNIGHTMATE;
     if (!strcmp(cat, "capablanca"))
       return TYPE_CAPABLANCA;
-    if (board && board[0]) {
+    if (board && board[0] && strcmp(board, "0")) {
       if (!strcmp(cat, "wild"))
         return TYPE_WILD;
       if (strcmp(cat, "standard") || strcmp(board, "standard"))
         return TYPE_NONSTANDARD;
     }
+    return TYPE_WILD;
   }
 
   if ((wt == 0) || (bt == 0))
@@ -362,6 +363,10 @@ char *EndString(int g, int personal)
     sprintf(endstr, "%s bared",
            game_globals.garray[g].winner == WHITE ? blackguy : whiteguy);
     break;
+  case END_PERPETUAL:
+    sprintf(endstr, "%s perpetually checking",
+           game_globals.garray[g].winner == WHITE ? blackguy : whiteguy);
+    break;
   case END_RESIGN:
     sprintf(endstr, "%s resigned",
            game_globals.garray[g].winner == WHITE ? blackguy : whiteguy);
@@ -442,6 +447,7 @@ const char *EndSym(int g)
        case END_FLAG:
        case END_ADJWIN:
        case END_BARE:
+       case END_PERPETUAL:
                return ((game_globals.garray[g].winner == WHITE) ? symbols[0] : symbols[1]);
                break;
        case END_AGREEDDRAW:
@@ -588,6 +594,7 @@ char *movesToString(int g, int pgn)
       sprintf(tmp, "%d minutes, increment: %d seconds.\n\n", game_globals.garray[g].wInitTime / 600, game_globals.garray[g].wIncrement / 10);
     }
     strcat(gameString, tmp);
+
     if(game_globals.garray[g].game_state.setup) { // [HGM] setup: print the initial position board
        char *q; struct game_state_t initial_gs; struct move_t ml[600]; int r, f;
 
@@ -607,7 +614,7 @@ char *movesToString(int g, int pgn)
         for (f = 0; f < 2; f++) {
           for (r = 0; r < initial_gs.files; r++)
              initial_gs.ep_possible[f][r] = 0;
-          for (r = PAWN; r <= QUEEN; r++)
+          for (r = PAWN; r <= PIECES-1; r++)
             initial_gs.holding[f][r-PAWN] = 0;
        }
        FEN_to_board(game_globals.garray[g].FENstartPos ,&initial_gs);
@@ -722,6 +729,19 @@ int CharToPiece(char c, char *variant)
        case 'v':
          return B_CENTAUR;
       }
+    } else if(!strcmp(variant, "spartan")) {
+      switch(c) {
+       case 'w':
+         return B_WARLORD;
+       case 'g':
+         return B_GENERAL;
+       case 'l':
+         return B_LIEUTENANT;
+       case 'c':
+         return B_CAPTAIN;
+       case 'h':
+         return B_HOPLITE;
+      }
     }
   }
   switch (c) {
@@ -758,9 +778,15 @@ int CharToPiece(char c, char *variant)
   case 'q':
     return B_QUEEN;
   case 'E':
+    if(!strcmp(variant, "seirawan")) return W_ELEPHANT;
     return W_ELEPHANT;
   case 'e':
+    if(!strcmp(variant, "seirawan")) return B_ELEPHANT;
     return B_ELEPHANT;
+  case 'H':
+    return W_HAWK;
+  case 'h':
+    return B_HAWK;
   case 'K':
     return W_KING;
   case 'k':
@@ -801,6 +827,7 @@ char PieceToChar(int piece)
   case W_CANNON:
   case W_MARSHALL:
     return 'C';
+  case B_CAPTAIN:
   case B_CANNON:
   case B_MARSHALL:
     return 'c';
@@ -814,9 +841,11 @@ char PieceToChar(int piece)
     return 'Q';
   case B_QUEEN:
     return 'q';
+  case W_SELEPHANT:
   case W_ELEPHANT:
   case W_EMPRESS:
     return 'E';
+  case B_SELEPHANT:
   case B_ELEPHANT:
   case B_EMPRESS:
     return 'e';
@@ -835,14 +864,18 @@ char PieceToChar(int piece)
   case W_WAZIR:
   case W_WOODY:
     return 'W';
+  case B_WARLORD:
   case B_WAZIR:
   case B_WOODY:
     return 'w';
+  case W_HAWK:
   case W_HORSE:
   case W_PRIESTESS:
   case W_NIGHTRIDER:
     return 'H';
+  case B_HAWK:
   case B_HORSE:
+  case B_HOPLITE:
   case B_PRIESTESS:
   case B_NIGHTRIDER:
     return 'h';
@@ -858,6 +891,7 @@ char PieceToChar(int piece)
   case W_MASTODON:
     return 'G';
   case B_GOLD:
+  case B_GENERAL:
   case B_MASTODON:
     return 'g';
   case W_AMAZON:
@@ -874,6 +908,7 @@ char PieceToChar(int piece)
     return 'k';
   case W_LANCE:
     return 'L';
+  case B_LIEUTENANT:
   case B_LANCE:
     return 'l';
   default:
@@ -1652,10 +1687,10 @@ void game_write_complete(int g, int isDraw, char *EndSymbol)
        
        sprintf(fname, "%s/player_data/%c/%s.%s", STATS_DIR,
                player_globals.parray[wp].login[0], player_globals.parray[wp].login, STATS_GAMES);
-       write_g_out(g, fname, 10, isDraw, EndSymbol, player_globals.parray[wp].name, &now);
+       write_g_out(g, fname, 40, isDraw, EndSymbol, player_globals.parray[wp].name, &now);
        sprintf(fname, "%s/player_data/%c/%s.%s", STATS_DIR,
                player_globals.parray[bp].login[0], player_globals.parray[bp].login, STATS_GAMES);
-       write_g_out(g, fname, 10, isDraw, EndSymbol, player_globals.parray[bp].name, &now);
+       write_g_out(g, fname, 40, isDraw, EndSymbol, player_globals.parray[bp].name, &now);
        
        if (isDraw)
                Result = -1;
@@ -1705,7 +1740,7 @@ static int check_kings(struct game_state_t *gs)
                }
        }
        
-       if (blackking == 1 && whiteking == 1) return 0; /* Perfect! */
+       if ((blackking == 1 || blackking == 2 && !strcmp(gs->variant, "spartan")) && whiteking == 1) return 0; /* Perfect! */
        
        return -1;
 }