Implement Spartan Chess
[capablanca.git] / lasker-2.2.3 / src / gameproc.c
index ec6918c..c5f5d35 100644 (file)
@@ -416,7 +416,7 @@ static int was_promoted(struct game *g, int f, int r)
       if (g->moveList[i].piecePromotionTo) {
        switch(g->moveList[i].moveString[0]) { // [HGM] return original piece type rather than just TRUE
           case 'P': return PAWN;
-          case 'N': return KNIGHT;
+          case 'N': return HONORABLEHORSE; // !!! this is Shogi, so no KNIGHT !!!
           case 'B': return BISHOP;
           case 'R': return ROOK;
           case 'L': return LANCE;
@@ -525,7 +525,7 @@ void process_move(int p, char *command)
 {
   struct player *pp = &player_globals.parray[p];
   struct game *gg;
-  int g, result, len, i;
+  int g, result, len, i, f;
   struct move_t move;
   unsigned now = 0;
 
@@ -561,9 +561,9 @@ void process_move(int p, char *command)
   }
   pp->promote = NOPIECE; // [HGM] this seemed to be uninitialized, which caused spurious promotion in Shogi
   if ((len = strlen(command)) > 1) {
-    if (command[len - 2] == '=') {
+    if (command[len - 2] == '=' || gg->game_state.drops == 2 && command[len - 2] == '/') { // [HGM] encode gating as promotion
 printf("promo '%s'\n", command);
-      switch (tolower(command[strlen(command) - 1])) {
+      switch (tolower(command[len - 1])) {
       case 'n':
        pp->promote = KNIGHT;
        break;
@@ -608,7 +608,19 @@ printf("promo '%s'\n", command);
       case 'g':
        pp->promote = MASTODON;
        break;
+      case 'l':
+       pp->promote = LIEUTENANT;
+       break;
+      case 'k':
+       pp->promote = KING;
+       break;
       // Shogi promotions
+      case 'h':
+       pp->promote = DRAGONHORSE;
+       break;
+      case 'd':
+       pp->promote = DRAGONKING;
+       break;
       case '^':
       case '+':
        pp->promote = GOLD;
@@ -890,13 +902,14 @@ static int CheckRepetition (int p, int g)
   if (game_globals.garray[g].numHalfMoves < 8)  /* can't have three repeats any quicker. */
     return 0;
 
-  for (move_num = game_globals.garray[g].game_state.lastIrreversable;
+  for (move_num = game_globals.garray[g].game_state.lastIrreversable - 1; // [HGM] FEN stored in moveList[numHalfMoves-1] !
        move_num < game_globals.garray[g].numHalfMoves - 1; move_num++) {
     pos = GetFENpos (g, move_num);
     if (strlen(pos1) == strlen(pos) && !strcmp(pos1, pos))
       flag1++;
     if (strlen(pos2) == strlen(pos) && !strcmp(pos2, pos))
       flag2++;
+printf("%2d. %d-%d %s %s %s\n", move_num, flag1, flag2, pos1,pos2,pos);
   }
   if (flag1 >= 3 || flag2 >= 3) {
     if ((pend = find_pend(pp->opponent, p, PEND_DRAW)) != NULL) {