Don't always use UCI Cyclone dialect in Xiangqi
authorH.G.Muller <hgm@hgm-xboard.(none)>
Thu, 16 Apr 2020 18:18:55 +0000 (20:18 +0200)
committerH.G.Muller <hgm@hgm-xboard.(none)>
Sat, 18 Apr 2020 17:46:57 +0000 (19:46 +0200)
Whether the Cyclone dialect is used (omitting 'position' and using 'r'
for white-to-move in the FEN) is now determined by whether the engine
is called with -c or without protocol specifier; in the latter case
it uses standard UCI even in Xiangqi.

UCI2WB.c

index 1799897..e636628 100644 (file)
--- a/UCI2WB.c
+++ b/UCI2WB.c
@@ -40,6 +40,7 @@
 #define VARIANTS ",normal,xiangqi"\r
 #define STDVARS "chess,chess960,crazyhouse,3check,giveaway,suicide,losers,atomic,seirawan,shogi,xiangqi"\r
 #define EGT ",gaviotaTbPath,syzygyPath,nalimovPath,robbotripleBaseDirectory,robbototalBaseDirectory,bitbases path,"\r
+#define XQPOS "position fen rnbakabnr/9/1c5c1/p1p1p1p1p/9/9/P1P1P1P1P/1C5C1/9/RNBAKABNR"\r
 \r
 #define DPRINT if(debug) printf\r
 #define EPRINT(X) { char f[999]; sprintf X; DPRINT("%s", f); fprintf(toE, "%s", f + 2*(*f == '#')); /* strip optional # prefix */ }\r
@@ -49,7 +50,7 @@
 #define NONE  2\r
 #define ANALYZE 3\r
 \r
-char move[2000][10], iniPos[256], hashOpt[20], suspended, ponder, post, hasHash, c, sc='c', suffix[81], varOpt, searching, *binary;\r
+char move[2000][10], iniPos[256], hashOpt[20], suspended, ponder, post, hasHash, c, sc=' ', sc2, suffix[81], varOpt, searching, *binary;\r
 int mps, tc, inc, sTime, depth, myTime, hisTime, stm, computer = NONE, memory, oldMem=0, cores, moveNr, lastDepth, lastScore, startTime, debug, flob;\r
 int statDepth, statScore, statNodes, statTime, currNr, size, collect, nr, sm, inex, on[500], frc, byo = -1, namOpt, comp;\r
 char currMove[20], moveMap[500][10], /* for analyze mode */ canPonder[20], threadOpt[20], varList[8000], anaOpt[20], checkOptions[8192] = "Ponder";\r
@@ -138,7 +139,7 @@ int
 Play(int nr)\r
 {\r
        int i, last = -1;\r
-       FromFEN(iniPos + 4); // in XQ iniPos always has just "fen " prefix\r
+       FromFEN(iniPos + 13); // FEN part\r
        for(i=0; i<nr; i++) {\r
            int from=Sqr(move[i], 0), to=Sqr(move[i], 2);\r
            if(board[to] || (board[from]|32)  == 'p' && move[i][1] != move[i][3]) last = i;\r
@@ -181,7 +182,7 @@ LoadPos(int moveNr)
        if(sc == 'x') { // UCCI: send only reversible moves\r
            lastCapt = Play(moveNr); // find last capture (returns -1 if none!)\r
            Play(++lastCapt);        // reconstruct board after last capture\r
-           stm = (!strstr(iniPos+4, " b ") ^ lastCapt & 1 ? 'w' :  'b');\r
+           stm = (!strstr(iniPos+13, " b ") ^ lastCapt & 1 ? 'w' :  'b');\r
            sprintf(buf, "position fen %s", ToFEN(stm)); pos = buf; // send it as FEN (with "position" in UCCI!)\r
        }\r
        EPRINT((f, "# %s moves", pos))\r
@@ -540,6 +541,7 @@ GUI2Engine()
     }\r
 }\r
 \r
+\r
 void\r
 DoCommand ()\r
 {\r
@@ -604,7 +606,7 @@ DoCommand ()
                }\r
                if(!strcmp(line+8, "shogi\n")) size = 9, strcpy(iniPos, "position startpos");\r
                if(!strcmp(line+8, "5x5+5_shogi\n")) size = 5, strcpy(iniPos, "position startpos");\r
-               if(!strcmp(line+8, "xiangqi\n")) strcpy(iniPos, "fen rnbakabnr/9/1c5c1/p1p1p1p1p/9/9/P1P1P1P1P/1C5C1/9/RNBAKABNR r");\r
+               if(!strcmp(line+8, "xiangqi\n")) sprintf(iniPos, "%s %c", XQPOS+9*(sc2 == 'c'), sc2 == 'c' ? 'r' : 'w'); // with -c use Cyclone dialect\r
                if(!strcmp(line+8, "fischerandom\n")) { frc |= 1; if(frc > 0) EPRINT((f, "# setoption name UCI_Chess960 value true\n")) }\r
        }\r
        else if(!strcmp(command, "undo") && (i=1) || !strcmp(command, "remove") && (i=2)) {\r
@@ -756,7 +758,7 @@ main(int argc, char **argv)
 \r
         if(sc == 'x') nameWord = valueWord = bTime = "", wTime = "opp", bInc = "increment", wInc = "oppincrement", unit = 1000; // switch to UCCI keywords\r
        else if(sc == 'f' ) frc = -1, sc = 'c';   // UCI for unannounced Chess960\r
-       else if(sc == 'n') sc = 'c'; // UCI for normal Chess\r
+       else if(sc != 's') sc2 = sc, sc = 'c';    // UCI for normal Chess\r
 \r
        // spawn engine proc\r
        if(StartEngine(binary = argv[1], dir) != NO_ERROR) { perror(argv[1]), exit(-1); }\r