Fix multi-leg promotions
[xboard.git] / backend.c
index a67ca7c..79d04fb 100644 (file)
--- a/backend.c
+++ b/backend.c
@@ -5169,7 +5169,7 @@ SendMoveToProgram (int moveNum, ChessProgramState *cps)
                                               m[2], m[3] - '0',
                                               m[5], m[6] - '0',
                                               m[2] + (m[0] > m[5] ? 1 : -1), m[3] - '0');
-       else if(*c && m[8]) { // kill square followed by 2 characters: 2nd kill square rather than promo suffix
+       else if(*c && m[8] != '\n') { // kill square followed by 2 characters: 2nd kill square rather than promo suffix
          *c = m[9]; if(*c == '\n') *c = NULLCHAR;
          snprintf(buf, MSG_SIZ, "%c%d%c%d,%c%d%c%d,%c%d%c%d%s\n", m[0], m[1] - '0', // convert to three moves
                                               m[7], m[8] - '0',
@@ -5386,7 +5386,7 @@ CoordsToComputerAlgebraic (int rf, int ff, int rt, int ft, char promoChar, char
            sprintf(move, "%c%c%c%c%c\n",
                     AAA + ff, ONE + rf, AAA + ft, ONE + rt, promoChar);
          if(killX >= 0 && killY >= 0) {
-           sprintf(move+4, ";%c%c\n", AAA + killX, ONE + killY);
+           sprintf(move+4, ";%c%c%c\n", AAA + killX, ONE + killY, promoChar);
            if(kill2X >= 0 && kill2Y >= 0) sprintf(move+7, "%c%c%c\n", AAA + kill2X, ONE + kill2Y, promoChar);
          }
        }
@@ -6707,6 +6707,7 @@ HasPromotionChoice (int fromX, int fromY, int toX, int toY, char *promoChoice, i
     piece = boards[currentMove][fromY][fromX];
     if(gameInfo.variant == VariantChu) {
         promotionZoneSize = BOARD_HEIGHT/3;
+        if(legal[toY][toX] == 6) return FALSE; // no promotion if highlights deny it
         highestPromotingPiece = (PieceToChar(piece) == '+' || PieceToChar(CHUPROMOTED(piece)) != '+') ? WhitePawn : WhiteKing;
     } else if(gameInfo.variant == VariantShogi) {
         promotionZoneSize = BOARD_HEIGHT/3 +(BOARD_HEIGHT == 8);
@@ -7399,14 +7400,13 @@ MarkByFEN(char *fen)
 {
        int r, f;
        if(!appData.markers || !appData.highlightDragging) return;
-       for(r=0; r<BOARD_HEIGHT; r++) for(f=BOARD_LEFT; f<BOARD_RGHT; f++) legal[r][f] = 0;
+       for(r=0; r<BOARD_HEIGHT; r++) for(f=BOARD_LEFT; f<BOARD_RGHT; f++) legal[r][f] = marker[r][f] = 0;
        r=BOARD_HEIGHT-1-deadRanks; f=BOARD_LEFT;
        while(*fen) {
            int s = 0;
-           marker[r][f] = 0;
            if(*fen == 'M') legal[r][f] = 2; else // request promotion choice
            if(*fen == 'B') legal[r][f] = 4; else // request auto-promotion to victim
-           if(*fen >= 'A' && *fen <= 'Z') legal[r][f] = 3; else
+           if(*fen >= 'A' && *fen <= 'Z') legal[r][f] = 6; else
            if(*fen >= 'a' && *fen <= 'z') *fen += 'A' - 'a';
            if(*fen == '/' && f > BOARD_LEFT) f = BOARD_LEFT, r--; else
            if(*fen == 'T') marker[r][f++] = 0; else
@@ -19109,7 +19109,7 @@ LoadTheme ()
          if(appData.trueColors != 2) // 2 is a kludge to suppress this in WinBoard
            snprintf(buf+strlen(buf), MSG_SIZ-strlen(buf), " -trueColors %s", appData.trueColors ? "true" : "false");
        }
-       if(!appData.pieceDirectory[0] && !appData.trueColors)
+       if(!appData.pieceDirectory[0] || !appData.trueColors)
          snprintf(buf+strlen(buf), MSG_SIZ-strlen(buf), " -wpc %s -bpc %s",
                Col2Text(0),   // whitePieceColor
                Col2Text(1) ); // blackPieceColor