Send game result to USI engines
authorH.G.Muller <hgm@hgm-xboard.(none)>
Wed, 21 Sep 2016 12:42:20 +0000 (14:42 +0200)
committerH.G.Muller <hgm@hgm-xboard.(none)>
Wed, 21 Sep 2016 12:42:20 +0000 (14:42 +0200)
The USI 'gameover' command is now used as translation of the CECP
'result' command, to relay the result to the engine. To decide how
the absolute game result (white/black) is translated to a relative one
(win/lose), the side last moved for is used as indication, and remembered
whenever the engine is set thinking on a move (as it could already be
switched to force mode at the time the 'result' command is received).

UCI2WB.c

index 459c748..62e17e4 100644 (file)
--- a/UCI2WB.c
+++ b/UCI2WB.c
@@ -379,7 +379,7 @@ Move4Engine(char *m)
 void\r
 GUI2Engine()\r
 {\r
-    char line[256], command[256], *p, *q, *r;\r
+    char line[256], command[256], *p, *q, *r, mySide;\r
 \r
     while(1) {\r
        int i, x;\r
@@ -388,7 +388,7 @@ GUI2Engine()
            DPRINT("# start search\n");\r
            LoadPos(moveNr); fflush(stdout); // load position\r
            // and set engine thinking (note USI swaps colors!)\r
-           startTime = GetTickCount();\r
+           startTime = GetTickCount(); mySide = stm; // remember side we last played for\r
            if(computer == ANALYZE) {\r
                fprintf(toE, "\ngo infinite"); DPRINT("\n# go infinite");\r
                if(sm & 1) { // some moves are disabled\r
@@ -517,6 +517,7 @@ GUI2Engine()
        else if(!strcmp(command, "sd"))     sscanf(line, "sd %d", &depth);\r
        else if(!strcmp(command, "st"))     sscanf(line, "st %d", &sTime), sTime = 1000*sTime - 30, inc = 0, sTime /= unit;\r
        else if(!strcmp(command, "offer"))  drawOffer = 1;\r
+       else if(!strcmp(command, "result")) { if(sc == 's') fprintf(toE, "gameover %s\n", line[8] == '/' ? "draw" : (line[7] == '0') == mySide ? "win" : "lose"); }\r
        else if(!strcmp(command, "quit"))   fprintf(toE, "quit\n"), fflush(toE), exit(0);\r
     }\r
 }\r