Debug Seirawan Chess
[capablanca.git] / lasker-2.2.3 / src / algcheck.c
index aa7d5af..1c1ff75 100644 (file)
@@ -247,12 +247,14 @@ static void add_promotion(struct game_state_t *gs, const char *mstr, struct move
                return;
        }
 
+      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) {
                return;
        }
        if (mt->toRank < gs->ranks - gs->promoZone && mt->toRank >= gs->promoZone) {
                return;
        }
+      }
 
        switch (tolower(s[1])) {
        case 'f':
@@ -338,6 +340,7 @@ int alg_parse_move(char *mstr, struct game_state_t * gs, struct move_t * mt)
   switch(piece) {
     case ELEPHANT:
       if(strstr(gs->variant, "super"))   piece = EMPRESS; else
+      if(strstr(gs->variant, "seirawan"))piece = SELEPHANT; else
       if(strstr(gs->variant, "great"))   piece = MODERNELEPHANT; else
       if(strstr(gs->variant, "courier")) piece = ALFIL2;
       break;
@@ -368,8 +371,9 @@ int alg_parse_move(char *mstr, struct game_state_t * gs, struct move_t * mt)
       if(strstr(gs->variant, "great")) piece = MINISTER;
       break;
     case HORSE:
+      if(strstr(gs->variant, "shogi")) piece = DRAGONHORSE; else
+      if(strstr(gs->variant, "seirawan")) piece = HAWK; else
       if(strstr(gs->variant, "great")) piece = PRIESTESS;
-      if(strstr(gs->variant, "shogi")) piece = DRAGONHORSE;
       break;
     case GOLD:
       if(strstr(gs->variant, "great")) piece = MASTODON;
@@ -571,6 +575,7 @@ char *alg_unparse(struct game_state_t * gs, struct move_t * mt)
     break;
   case EMPRESS:
   case ELEPHANT:
+  case SELEPHANT:
     strcpy(mStr, "E");
     break;
   case ALFIL:
@@ -590,6 +595,8 @@ char *alg_unparse(struct game_state_t * gs, struct move_t * mt)
     strcpy(mStr, "V");
     break;
   case HORSE:
+  case DRAGONHORSE:
+  case HAWK:
     strcpy(mStr, "H");
     break;
   case HONORABLEHORSE:
@@ -598,9 +605,6 @@ char *alg_unparse(struct game_state_t * gs, struct move_t * mt)
   case DRAGONKING:
     strcpy(mStr, "D");
     break;
-  case DRAGONHORSE:
-    strcpy(mStr, "H");
-    break;
   case LANCE:
     strcpy(mStr, "L");
     break;
@@ -687,7 +691,7 @@ 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);
 
-  if ((piece == PAWN || gs->promoType == 3) && (mt->piecePromotionTo != NOPIECE)) {
+  if ((piece == PAWN || gs->promoType == 3 || gs->drops == 2) && (mt->piecePromotionTo != NOPIECE)) {
     strcat(mStr, "=");         /* = before promoting piece */
     switch (piecetype(mt->piecePromotionTo)) {
     case KNIGHT: