Allow arbitrary board size in USI
authorH.G.Muller <hgm@hgm-xboard.(none)>
Wed, 15 Jul 2020 07:55:29 +0000 (09:55 +0200)
committerH.G.Muller <hgm@hgm-xboard.(none)>
Wed, 15 Jul 2020 08:17:10 +0000 (10:17 +0200)
Apart from regular Shogi on 9x9, UCI2WB would only handle 5x5 boards
in USI. The conversion of square coordinates requires the board size
to be known. This patch allows UCI2WB to recognize any board-size-overruled
Shogi variant NxM+H_shogi, and distinguishes width N from height M when
doing the coordinate conversions. This means it now also supports Judkin's
Shogi (6x6), a variant that te Petit Shogi engine seems to play.

UCI2WB.c

index 1dd839e..58f4ab2 100644 (file)
--- a/UCI2WB.c
+++ b/UCI2WB.c
@@ -52,7 +52,7 @@
 \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
 \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
+int statDepth, statScore, statNodes, statTime, currNr, hsize=9, size=9, 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
 char pvs[99][999], 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
 char currMove[20], moveMap[500][10], /* for analyze mode */ canPonder[20], threadOpt[20], varList[8000], anaOpt[20], checkOptions[8192] = "Ponder";\r
 char pvs[99][999], 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
@@ -213,7 +213,7 @@ char *Convert(char *pv)
     if(sc != 's') return pv;\r
     p = pv; q = buf;\r
     while(c = *p++) {\r
     if(sc != 's') return pv;\r
     p = pv; q = buf;\r
     while(c = *p++) {\r
-        if(c >= '0' && c <= '9' || c >= 'a' && c <= 'z') *q++ = 'a'+'0'+size - c; else *q++ = c;\r
+        if(c >= '0' && c <= '9' || c >= 'a' && c <= 'z') *q++ = 'a'+'0' + (c >= 'a' ? size : hsize) - c; else *q++ = c;\r
     }\r
     *q++ = 0;\r
     return buf;\r
     }\r
     *q++ = 0;\r
     return buf;\r
@@ -224,12 +224,12 @@ Move4GUI(char *m)
 {\r
     if(sc == 's') {\r
       // convert USI move to WB format\r
 {\r
     if(sc == 's') {\r
       // convert USI move to WB format\r
-      m[2] = 'a'+'0'+size - m[2];\r
+      m[2] = 'a'+'0'+hsize - m[2];\r
       m[3] = 'a'+'0'+size - m[3];\r
       if(m[1] == '*') { // drop\r
        m[1] = '@';\r
       } else {\r
       m[3] = 'a'+'0'+size - m[3];\r
       if(m[1] == '*') { // drop\r
        m[1] = '@';\r
       } else {\r
-       m[0] = 'a'+'0'+size - m[0];\r
+       m[0] = 'a'+'0'+hsize - m[0];\r
        m[1] = 'a'+'0'+size - m[1];\r
        if((stm == WHITE ? (m[1]>'0'+size-size/3 || m[3]>'0'+size-size/3)\r
                                 : (m[1] <= '0'+size/3 || m[3] <= '0'+size/3)) && m[4] != '+')\r
        m[1] = 'a'+'0'+size - m[1];\r
        if((stm == WHITE ? (m[1]>'0'+size-size/3 || m[3]>'0'+size-size/3)\r
                                 : (m[1] <= '0'+size/3 || m[3] <= '0'+size/3)) && m[4] != '+')\r
@@ -413,10 +413,10 @@ Move4Engine(char *m)
       if(m[1] == '@') { // drop\r
        m[1] = '*';\r
       } else {\r
       if(m[1] == '@') { // drop\r
        m[1] = '*';\r
       } else {\r
-       m[0] = 'a'+'0'+size - m[0];\r
+       m[0] = 'a'+'0'+hsize - m[0];\r
        m[1] = 'a'+'0'+size - m[1];\r
       }\r
        m[1] = 'a'+'0'+size - m[1];\r
       }\r
-      m[2] = 'a'+'0'+size - m[2];\r
+      m[2] = 'a'+'0'+hsize - m[2];\r
       m[3] = 'a'+'0'+size - m[3];\r
       if(m[4] == '=') m[4] = 0; // no '=' in USI format!\r
       else if(m[4]) m[4] = '+'; // cater to WB 4.4 bug :-(\r
       m[3] = 'a'+'0'+size - m[3];\r
       if(m[4] == '=') m[4] = 0; // no '=' in USI format!\r
       else if(m[4]) m[4] = '+'; // cater to WB 4.4 bug :-(\r
@@ -546,7 +546,7 @@ GUI2Engine()
 void\r
 DoCommand ()\r
 {\r
 void\r
 DoCommand ()\r
 {\r
-    char line[1024], command[256], *p, *q, *r, type[99];\r
+    char line[1024], command[256], *p, *q, *r, type[99], c;\r
     int i;\r
 \r
     p=line; while(qStart < qEnd && (*p++ = *qStart++) != '\n') {} *p = 0;\r
     int i;\r
 \r
     p=line; while(qStart < qEnd && (*p++ = *qStart++) != '\n') {} *p = 0;\r
@@ -605,8 +605,8 @@ DoCommand ()
                    EPRINT((f, "# setoption name UCI_Variant value %sucinewgame\nisready\n", line+8))\r
                    fflush(toE); HandleEngineOutput(); // wait for readyok\r
                }\r
                    EPRINT((f, "# setoption name UCI_Variant value %sucinewgame\nisready\n", line+8))\r
                    fflush(toE); HandleEngineOutput(); // wait for readyok\r
                }\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
+               c = 0; if(sscanf(line+8, "%dx%d+%d_shogi%c", &hsize, &size, &i, &c) && c == '\n') strcpy(iniPos, "position startpos");\r
+               if(!strcmp(line+8, "shogi\n")) hsize = size = 9, strcpy(iniPos, "position startpos");\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
                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