Implement Spartan Chess
[capablanca.git] / lasker-2.2.3 / src / algcheck.c
index 33f6b28..219b5de 100644 (file)
@@ -248,7 +248,8 @@ static void add_promotion(struct game_state_t *gs, const char *mstr, struct move
        }
 
       if(gs->drops != 2 || (gs->onMove == WHITE ? 0 : gs->ranks-1) != mt->fromRank) { // [HGM] always accept if backrank mover in Seirawan
-       if (piecetype(gs->board[mt->fromFile][mt->fromRank]) != PAWN) {
+       if (piecetype(gs->board[mt->fromFile][mt->fromRank]) != PAWN &&
+           piecetype(gs->board[mt->fromFile][mt->fromRank]) != HOPLITE) {
                return;
        }
        if (mt->toRank < gs->ranks - gs->promoZone && mt->toRank >= gs->promoZone) {
@@ -264,6 +265,7 @@ static void add_promotion(struct game_state_t *gs, const char *mstr, struct move
                piece = QUEEN;
                break;
        case 'c':
+               if(piecetype(gs->board[mt->fromFile][mt->fromRank]) == HOPLITE) piece = CAPTAIN; else
                if(!gs->capablancaPieces) return; // [HGM] should make variant-dependent piece mask
                piece = MARSHALL;
                break;
@@ -287,14 +289,24 @@ static void add_promotion(struct game_state_t *gs, const char *mstr, struct move
                break;
        // Superchess promotons: filtered out later by promoType
        case 'g':
+               if(piecetype(gs->board[mt->fromFile][mt->fromRank]) == HOPLITE) piece = GENERAL; else
                piece = MASTODON;
                break;
        case 'o':
                piece = SQUIRREL;
                break;
        case 'w':
+               if(piecetype(gs->board[mt->fromFile][mt->fromRank]) == HOPLITE) piece = WARLORD; else
                piece = WOODY;
                break;
+       case 'k':
+               if(piecetype(gs->board[mt->fromFile][mt->fromRank]) != HOPLITE) return;
+               piece = KING;
+               break;
+       case 'l':
+               if(piecetype(gs->board[mt->fromFile][mt->fromRank]) != HOPLITE) return;
+               piece = LIEUTENANT;
+               break;
        case 'v':
                piece = CENTAUR;
                break;
@@ -568,6 +580,7 @@ char *alg_unparse(struct game_state_t * gs, struct move_t * mt)
   case CARDINAL:
     strcpy(mStr, "A");
     break;
+  case CAPTAIN:
   case CANNON:
   case MARSHALL:
     strcpy(mStr, "C");
@@ -590,6 +603,7 @@ char *alg_unparse(struct game_state_t * gs, struct move_t * mt)
   case FERZ2:
     strcpy(mStr, "F");
     break;
+  case WARLORD:
   case WOODY:
   case WAZIR:
     strcpy(mStr, "W");
@@ -603,6 +617,7 @@ char *alg_unparse(struct game_state_t * gs, struct move_t * mt)
   case HORSE:
   case DRAGONHORSE:
   case HAWK:
+  case HOPLITE:
     strcpy(mStr, "H");
     break;
   case HONORABLEHORSE:
@@ -611,6 +626,7 @@ char *alg_unparse(struct game_state_t * gs, struct move_t * mt)
   case DRAGONKING:
     strcpy(mStr, "D");
     break;
+  case LIEUTENANT:
   case LANCE:
     strcpy(mStr, "L");
     break;
@@ -619,6 +635,7 @@ char *alg_unparse(struct game_state_t * gs, struct move_t * mt)
     strcpy(mStr, "S");
     break;
   case MASTODON:
+  case GENERAL:
   case GOLD:
     strcpy(mStr, "G");
     break;
@@ -697,9 +714,12 @@ char *alg_unparse(struct game_state_t * gs, struct move_t * mt)
   sprintf(tmp, "%c%d", mt->toFile + 'a', mt->toRank + 1 - (gs->ranks > 9));
   strcat(mStr, tmp);
 suffix:
-  if ((piece == PAWN || gs->promoType == 3 || gs->drops == 2) && (mt->piecePromotionTo != NOPIECE)) {
+  if ((piece == PAWN || piece == HOPLITE || gs->promoType == 3 || gs->drops == 2) && (mt->piecePromotionTo != NOPIECE)) {
     strcat(mStr, "=");         /* = before promoting piece */
     switch (piecetype(abs(mt->piecePromotionTo))) {
+    case KING:
+      strcat(mStr, "K");
+      break;
     case KNIGHT:
       strcat(mStr, "N");
       break;
@@ -713,6 +733,7 @@ suffix:
       strcat(mStr, "A");
       break;
     case MARSHALL:
+    case CAPTAIN:
       strcat(mStr, "C");
       break;
     case MAN:
@@ -724,6 +745,7 @@ suffix:
     case FERZ2:
       strcat(mStr, "F");
       break;
+    case WARLORD:
     case WOODY:
       strcat(mStr, "W");
       break;
@@ -741,8 +763,7 @@ suffix:
       strcat(mStr, "O");
       break;
     case MASTODON:
-      strcat(mStr, "G");
-      break;
+    case GENERAL:
     case GOLD: // [HGM] Shogi promotions: avoid use of '+'
       strcat(mStr, "G");
       break;
@@ -753,6 +774,9 @@ suffix:
     case DRAGONKING:
       strcat(mStr, "D");
       break;
+    case LIEUTENANT:
+      strcat(mStr, "L");
+      break;
     default:
       break;
     }