Inherit promoted-info that ICS does not give from previous board
authorH.G. Muller <h.g.muller@hccnet.nl>
Sun, 10 Oct 2010 19:07:18 +0000 (21:07 +0200)
committerArun Persaud <arun@nubati.net>
Sat, 16 Oct 2010 02:19:23 +0000 (19:19 -0700)
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
backend.c
common.h

diff --git a/args.h b/args.h
index b101ef4..bd142ad 100644 (file)
--- 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 },
index 257a806..e5ac879 100644 (file)
--- 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<ranks; k++) for(j=BOARD_LEFT; j<BOARD_RGHT; j++) {
+                ChessSquare old, new = boards[moveNum][k][j];
+                  if(fromY == DROP_RANK && k==toY && j==toX) continue; // dropped pieces always stand for themselves
+                  old = (k==toY && j==toX) ? boards[moveNum-1][fromY][fromX] : boards[moveNum-1][k][j]; // trace back mover
+                  if(old == new) continue;
+                  if(old == PROMOTED new) boards[moveNum][k][j] = old; // prevent promoted pieces to revert to primordial ones
+                  else if(new == WhiteWazir || new == BlackWazir) {
+                      if(old < WhiteCannon || old >= 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;
index 077c979..4f78597 100644 (file)
--- 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 */