X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=backend.c;h=5c7ebaded08e781900eaf87b0235e526cf2ecb9c;hb=d098a3196db8758737f6a79992b460306045d499;hp=16fdc62ae564ea11c28a4a71f2461421e1e90577;hpb=eb0b8eabe5bf8d5139bc82bf79b88aded98d96c8;p=xboard.git diff --git a/backend.c b/backend.c index 16fdc62..5c7ebad 100644 --- a/backend.c +++ b/backend.c @@ -4377,7 +4377,7 @@ ParseBoard12(string) strcat(parseList[moveNum - 1], " "); strcat(parseList[moveNum - 1], elapsed_time); /* currentMoveString is set as a side-effect of ParseOneMove */ - if(gameInfo.variant == VariantShogi && currentMoveString[4]) currentMoveString[4] = '+'; + if(gameInfo.variant == VariantShogi && currentMoveString[4]) currentMoveString[4] = '^'; safeStrCpy(moveList[moveNum - 1], currentMoveString, sizeof(moveList[moveNum - 1])/sizeof(moveList[moveNum - 1][0])); strcat(moveList[moveNum - 1], "\n"); @@ -4804,7 +4804,7 @@ CoordsToComputerAlgebraic(rf, ff, rt, ft, promoChar, move) AAA + ff, ONE + rf, AAA + ft, ONE + rt); } else { sprintf(move, "%c%c%c%c%c\n", - AAA + ff, ONE + rf, AAA + ft, ONE + rt, promoChar); + AAA + ff, ONE + rf, AAA + ft, ONE + rt, promoChar == '^' ? '+' : promoChar); } } } @@ -4884,10 +4884,16 @@ ParseOneMove(move, moveNum, moveType, fromX, fromY, toX, toY, promoChar) int *fromX, *fromY, *toX, *toY; char *promoChar; { + char moveCopy[20], *p = moveCopy; + strncpy(moveCopy, move, 20); // make a copy of move to preprocess it + if(gameInfo.variant == VariantShogi) { + while(*p && *p != ' ') p++; + if(p[-1] == '+') p[-1] = '^'; // in Shogi '+' is promotion, distinguish from check + } if (appData.debugMode) { - fprintf(debugFP, "move to parse: %s\n", move); + fprintf(debugFP, "move to parse: %s\n", moveCopy); } - *moveType = yylexstr(moveNum, move, yy_textstr, sizeof yy_textstr); + *moveType = yylexstr(moveNum, moveCopy, yy_textstr, sizeof yy_textstr); switch (*moveType) { case WhitePromotion: @@ -5694,14 +5700,14 @@ HasPromotionChoice(int fromX, int fromY, int toX, int toY, char *promoChoice) if(toY == 0 && piece == BlackPawn || toY == 0 && piece == BlackQueen || toY <= 1 && piece == BlackKnight) { - *promoChoice = '+'; + *promoChoice = '^'; return FALSE; } } else { if(toY == BOARD_HEIGHT-1 && piece == WhitePawn || toY == BOARD_HEIGHT-1 && piece == WhiteQueen || toY >= BOARD_HEIGHT-2 && piece == WhiteKnight) { - *promoChoice = '+'; + *promoChoice = '^'; return FALSE; } } @@ -5738,7 +5744,7 @@ HasPromotionChoice(int fromX, int fromY, int toX, int toY, char *promoChoice) gameMode == IcsPlayingBlack && WhiteOnMove(currentMove); if(appData.testLegality && !premove) { moveType = LegalityTest(boards[currentMove], PosFlags(currentMove), - fromY, fromX, toY, toX, NULLCHAR); + fromY, fromX, toY, toX, gameInfo.variant == VariantShogi ? '^' : NULLCHAR); if(moveType != WhitePromotion && moveType != BlackPromotion) return FALSE; } @@ -8644,7 +8650,7 @@ ApplyMove(fromX, fromY, toX, toY, promoChar, board) board[toY][toX] = EmptySquare; } } - if(promoChar == '+') { + if(promoChar == '^') { /* [HGM] Shogi-style promotions, to piece implied by original (Might overwrite orinary Pawn promotion) */ board[toY][toX] = (ChessSquare) (PROMOTED piece); } else if(!appData.testLegality) { // without legality testing, unconditionally believe promoChar