Fix loading positions in engine-defined variant
authorH.G. Muller <h.g.muller@hccnet.nl>
Mon, 17 Mar 2014 22:26:08 +0000 (23:26 +0100)
committerH.G. Muller <h.g.muller@hccnet.nl>
Mon, 17 Mar 2014 22:26:08 +0000 (23:26 +0100)
Paste Position did not work when an engine-defined variant had redefined
the pieceToCharTable, as the position would be interpreted and sent to the
engine before receiving the setup command. Copying the pieceToCharTable
received from an earlier game to appData cures this, because it will then
be used by InitPosition, which would reset the table to default otherwise.
 Another problem was that setupSpoiledMachineBlack would not be reset
after a game with no moves, leading to a spurious 'go' command to the engine.

backend.c

index dd962a3..6cb1bf9 100644 (file)
--- a/backend.c
+++ b/backend.c
@@ -8852,7 +8852,10 @@ printf("score=%d count=%d\n",score,count);
       int dummy, w, h, hand, s=6; char buf[MSG_SIZ], varName[MSG_SIZ];
       if(appData.icsActive || forwardMostMove != 0 || cps != &first) return;
       *buf = NULLCHAR;
-      if(sscanf(message, "setup (%s", buf) == 1) s = 8 + strlen(buf), buf[s-9] = NULLCHAR, SetCharTable(pieceToChar, buf);
+      if(sscanf(message, "setup (%s", buf) == 1) {
+        s = 8 + strlen(buf), buf[s-9] = NULLCHAR, SetCharTable(pieceToChar, buf);
+        ASSIGN(appData.pieceToCharTable, buf);
+      }
       if(startedFromSetupPosition) return;
       dummy = sscanf(message+s, "%dx%d+%d_%s", &w, &h, &hand, varName);
       if(dummy >= 3) {
@@ -10424,6 +10427,7 @@ InitChessProgram (ChessProgramState *cps, int setup)
        SendToProgram(buf, cps);
     }
 
+    setboardSpoiledMachineBlack = FALSE;
     SendToProgram(cps->initString, cps);
     if (gameInfo.variant != VariantNormal &&
        gameInfo.variant != VariantLoadable