Implement Spartan Chess
[capablanca.git] / lasker-2.2.3 / src / gamedb.c
index 82eef2e..da255dc 100644 (file)
@@ -588,6 +588,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 +608,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 +723,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 +772,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 +821,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 +835,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 +858,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 +885,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 +902,7 @@ char PieceToChar(int piece)
     return 'k';
   case W_LANCE:
     return 'L';
+  case B_LIEUTENANT:
   case B_LANCE:
     return 'l';
   default:
@@ -1705,7 +1734,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;
 }