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");
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);
}
}
}
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:
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;
}
}
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;
}
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