Implement UCI_Variant option
authorH.G.Muller <hgm@hgm-xboard.(none)>
Sat, 5 Nov 2016 12:45:51 +0000 (13:45 +0100)
committerH.G.Muller <hgm@hgm-xboard.(none)>
Sat, 5 Nov 2016 12:45:51 +0000 (13:45 +0100)
A UCI combo option UCI_Variant is now recognized as special, and translated
to 'feature variant=...' rather than 'feature option="UCI_Variant ..."'.
The CECP 'variant' command now leads to setting of this option, while on
the 'new' command the option is reset to 'chess'.
  The variant names are transmitted as given, except for 'chess',
which is traslated to 'normal', and 'threecheck' (CECP: 3check).

UCI2WB.c

index cf1dcf0..21f5fa0 100644 (file)
--- a/UCI2WB.c
+++ b/UCI2WB.c
 #define NONE  2\r
 #define ANALYZE 3\r
 \r
-char move[2000][10], checkOptions[8192], iniPos[256], hashOpt[20], pause, pondering, suspended, ponder, post, hasHash, c, sc='c', suffix[81], *variants;\r
+char move[2000][10], checkOptions[8192], iniPos[256], hashOpt[20], pause, pondering, suspended, ponder, post, hasHash, c, sc='c', suffix[81], *variants, varOpt;\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;\r
-char currMove[20], moveMap[500][10], /* for analyze mode */ canPonder[20], threadOpt[20];\r
+char currMove[20], moveMap[500][10], /* for analyze mode */ canPonder[20], threadOpt[20], varList[8000];\r
 char board[100];  // XQ board for UCCI\r
 char *nameWord = "name ", *valueWord = "value ", *wTime = "w", *bTime = "b", *wInc = "winc", *bInc = "binc", newGame; // keywords that differ in UCCI\r
 int unit = 1, drawOffer;\r
@@ -312,6 +312,7 @@ Engine2GUI()
            if(p = strstr(line+6, " default "))  sscanf(p+1, "default %[^\n]*", val), *p = '\n';\r
            if(!(p = strstr(line+6, " name "))) p = line+1; sscanf(p+6, "%[^\n]", name); // 'name' is omitted in UCCI\r
            if(!strcasecmp(name, "UCI_Chess960")) { frc=2; continue; }\r
+           if(!strcasecmp(name, "UCI_Variant")) { if(p = strstr(line+6, " var ")) strcpy(varList, p); varOpt = 1; continue; }\r
            if(frc< 0 && (strstr(name, "960") || strcasestr(name, "frc")) && !strcmp(type, "check")) {\r
                fprintf(toE, "setoption name %s value true\n", name); strcpy(val, "true"); // set non-standard suspected FRC options\r
            }\r
@@ -351,7 +352,13 @@ Engine2GUI()
        }\r
        else if(!strcmp(command, "readyok")) { pause = 0; Sync(WAKEUP); } // resume processing of GUI commands\r
        else if(sc == 'x'&& !strcmp(command, "ucciok") || sscanf(command, "u%ciok", &c)==1 && c==sc) {\r
-           if(frc) printf("feature variants=\"normal,fischerandom\" oocastle=%d\n", frc<0); // unannounced FRC uses O-O castling\r
+           char *p = varList, *q = varList;\r
+           while(*q && *q != '\n')  if(!strncmp(q, " var ", 5)) *p++ = ',', q +=5; // replace var keywords by commas\r
+                               else if(!strncmp(q-1, " chess ", 7)) strcpy(p, "normal"), p += 6, q += 5; // 'chess' is called 'normal' in CECP\r
+                               else if(!strncmp(q-1, " threecheck", 11)) *p++ = '3', q += 5; // 'threecheck' is written '3check' in CECP\r
+                               else *p++ = *q++; // copy other variant names unmodified\r
+           if(frc) sprintf(p, ",normal,fischerandom"), printf("feature oocastle=%d\n", frc<0); // unannounced FRC uses O-O castling\r
+           if(*varList) printf("feature variants=\"%s\"\n", varList+1); // from UCI_Variant combo and/or UCI_Chess960 check options\r
            printf("feature smp=1 memory=%d done=1\n", hasHash);\r
            if(unit == 2) unit = 1, fprintf(toE, "setoption usemillisec true\n");\r
            Sync(WAKEUP); // done with options\r
@@ -412,6 +419,7 @@ GUI2Engine()
            oldMem = memory;\r
            // we can set other options here\r
            if(sc == 'x') { if(newGame) fprintf(toE, "setoption newgame\n"); } else // optional in UCCI\r
+           if(varOpt) fprintf(toE, "setoption name UCI_Variant value chess\n");\r
            pause = 1; // wait for option settings to take effect\r
            fprintf(toE, "isready\n"); fflush(toE);\r
            Sync(PAUSE); // wait for readyok\r
@@ -472,6 +480,7 @@ GUI2Engine()
                iniPos[strlen(iniPos)-1] = sm = 0; collect = (computer == ANALYZE);\r
        }\r
        else if(!strcmp(command, "variant")) {\r
+               if(varOpt) fprintf(toE, "setoption name UCI_Variant value %sucinewgame\n", strcmp(line+8, "3check\n") ? line+8 : "threecheck\n");\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