From a13756124f9078bb1ce68d28c43ddebfddb61855 Mon Sep 17 00:00:00 2001 From: H.G. Muller Date: Sun, 10 Oct 2010 21:07:18 +0200 Subject: [PATCH] Inherit promoted-info that ICS does not give from previous board The ICS does not tell us in Crazyhouse (or Shogi) if a piece is primordial or a promoted pawn (or a promoted other piece). We now derive this info from the previous board. The option -disguisePromotedPieces controls this feature. --- args.h | 1 + backend.c | 26 +++++++++++++++++++++++--- common.h | 1 + 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/args.h b/args.h index b101ef4..bd142ad 100644 --- a/args.h +++ b/args.h @@ -453,6 +453,7 @@ ArgDescriptor argDescriptors[] = { { "soundIcsDraw", ArgFilename, (void *) &appData.soundIcsDraw, TRUE, (ArgIniType) "" }, { "soundIcsUnfinished", ArgFilename, (void *) &appData.soundIcsUnfinished, TRUE, (ArgIniType) "" }, { "soundIcsAlarm", ArgFilename, (void *) &appData.soundIcsAlarm, TRUE, (ArgIniType) "" }, + { "disguisePromotedPieces", ArgBoolean, (void *) &appData.disguise, TRUE, (ArgIniType) TRUE }, { "reuseFirst", ArgBoolean, (void *) &appData.reuseFirst, FALSE, (ArgIniType) TRUE }, { "reuse", ArgTrue, (void *) &appData.reuseFirst, FALSE, INVALID }, { "xreuse", ArgFalse, (void *) &appData.reuseFirst, FALSE, INVALID }, diff --git a/backend.c b/backend.c index 257a806..e5ac879 100644 --- a/backend.c +++ b/backend.c @@ -4337,6 +4337,8 @@ ParseBoard12(string) // So we parse the long-algebraic move string in stead of the SAN move int valid; char buf[MSG_SIZ], *prom; + if(gameInfo.variant == VariantShogi && !strchr(move_str, '=') && !strchr(move_str, '@')) + strcat(move_str, "="); // if ICS does not say 'promote' on non-drop, we defer. // str looks something like "Q/a1-a2"; kill the slash if(str[1] == '/') snprintf(buf, MSG_SIZ,"%c%s", str[0], str+2); @@ -4375,8 +4377,24 @@ 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] = '+'; safeStrCpy(moveList[moveNum - 1], currentMoveString, sizeof(moveList[moveNum - 1])/sizeof(moveList[moveNum - 1][0])); strcat(moveList[moveNum - 1], "\n"); + + if(gameInfo.holdingsWidth && !appData.disguise) // inherit info that ICS does not give from previous board + for(k=0; k= BlackPawn && old < BlackCannon) + boards[moveNum][k][j] = PROMOTED old; // choose correct type of Gold in promotion + else boards[moveNum][k][j] = old; // preserve type of Gold + } else if((old == WhitePawn || old == BlackPawn) && new != EmptySquare) // Pawn promotions (but not e.p.capture!) + boards[moveNum][k][j] = PROMOTED new; // use non-primordial representation of chosen piece + } } else { /* Move from ICS was illegal!? Punt. */ if (appData.debugMode) { @@ -4685,14 +4703,16 @@ SendMoveToICS(moveType, fromX, fromY, toX, toY, promoChar) break; case WhiteDrop: case BlackDrop: + drop: snprintf(user_move, MSG_SIZ, "%c@%c%c\n", - ToUpper(PieceToChar((ChessSquare) fromX)), - AAA + toX, ONE + toY); + ToUpper(PieceToChar((ChessSquare) fromX)), + AAA + toX, ONE + toY); break; + case IllegalMove: /* could be a variant we don't quite understand */ + if(fromY == DROP_RANK) goto drop; // We need 'IllegalDrop' move type? case NormalMove: case WhiteCapturesEnPassant: case BlackCapturesEnPassant: - case IllegalMove: /* could be a variant we don't quite understand */ snprintf(user_move, MSG_SIZ,"%c%c%c%c\n", AAA + fromX, ONE + fromY, AAA + toX, ONE + toY); break; diff --git a/common.h b/common.h index 077c979..4f78597 100644 --- a/common.h +++ b/common.h @@ -495,6 +495,7 @@ typedef struct { char *soundIcsLoss; char *soundIcsDraw; char *soundIcsUnfinished; + Boolean disguise; /* [HGM] Promoted Pawns look like pieces in bughouse */ Boolean reuseFirst; Boolean reuseSecond; Boolean animateDragging; /* If True, animate mouse dragging of pieces */ -- 1.7.0.4