Fix classification of variant games
[capablanca.git] / lasker-2.2.3 / src / gamedb.c
index becb7a0..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:
@@ -723,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) {
@@ -808,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';
@@ -844,6 +864,7 @@ char PieceToChar(int piece)
   case W_WAZIR:
   case W_WOODY:
     return 'W';
+  case B_WARLORD:
   case B_WAZIR:
   case B_WOODY:
     return 'w';
@@ -854,6 +875,7 @@ char PieceToChar(int piece)
     return 'H';
   case B_HAWK:
   case B_HORSE:
+  case B_HOPLITE:
   case B_PRIESTESS:
   case B_NIGHTRIDER:
     return 'h';
@@ -869,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:
@@ -885,6 +908,7 @@ char PieceToChar(int piece)
     return 'k';
   case W_LANCE:
     return 'L';
+  case B_LIEUTENANT:
   case B_LANCE:
     return 'l';
   default:
@@ -1716,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;
 }