From d317f73d655954f4c081ed6bfdcd4134ac6d9b1f Mon Sep 17 00:00:00 2001 From: "H.G.Muller" Date: Wed, 15 Jul 2020 09:55:29 +0200 Subject: [PATCH] Allow arbitrary board size in USI 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 | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/UCI2WB.c b/UCI2WB.c index 1dd839e..58f4ab2 100644 --- a/UCI2WB.c +++ b/UCI2WB.c @@ -52,7 +52,7 @@ char move[2000][10], iniPos[256], hashOpt[20], suspended, ponder, post, hasHash, c, sc=' ', sc2, suffix[81], varOpt, searching, *binary; int mps, tc, inc, sTime, depth, myTime, hisTime, stm, computer = NONE, memory, oldMem=0, cores, moveNr, lastDepth, lastScore, startTime, debug, flob; -int statDepth, statScore, statNodes, statTime, currNr, size, collect, nr, sm, inex, on[500], frc, byo = -1, namOpt, comp; +int statDepth, statScore, statNodes, statTime, currNr, hsize=9, size=9, collect, nr, sm, inex, on[500], frc, byo = -1, namOpt, comp; char currMove[20], moveMap[500][10], /* for analyze mode */ canPonder[20], threadOpt[20], varList[8000], anaOpt[20], checkOptions[8192] = "Ponder"; char pvs[99][999], board[100]; // XQ board for UCCI char *nameWord = "name ", *valueWord = "value ", *wTime = "w", *bTime = "b", *wInc = "winc", *bInc = "binc", newGame; // keywords that differ in UCCI @@ -213,7 +213,7 @@ char *Convert(char *pv) if(sc != 's') return pv; p = pv; q = buf; while(c = *p++) { - if(c >= '0' && c <= '9' || c >= 'a' && c <= 'z') *q++ = 'a'+'0'+size - c; else *q++ = c; + if(c >= '0' && c <= '9' || c >= 'a' && c <= 'z') *q++ = 'a'+'0' + (c >= 'a' ? size : hsize) - c; else *q++ = c; } *q++ = 0; return buf; @@ -224,12 +224,12 @@ Move4GUI(char *m) { if(sc == 's') { // convert USI move to WB format - m[2] = 'a'+'0'+size - m[2]; + m[2] = 'a'+'0'+hsize - m[2]; m[3] = 'a'+'0'+size - m[3]; if(m[1] == '*') { // drop m[1] = '@'; } else { - m[0] = 'a'+'0'+size - m[0]; + m[0] = 'a'+'0'+hsize - m[0]; m[1] = 'a'+'0'+size - m[1]; if((stm == WHITE ? (m[1]>'0'+size-size/3 || m[3]>'0'+size-size/3) : (m[1] <= '0'+size/3 || m[3] <= '0'+size/3)) && m[4] != '+') @@ -413,10 +413,10 @@ Move4Engine(char *m) if(m[1] == '@') { // drop m[1] = '*'; } else { - m[0] = 'a'+'0'+size - m[0]; + m[0] = 'a'+'0'+hsize - m[0]; m[1] = 'a'+'0'+size - m[1]; } - m[2] = 'a'+'0'+size - m[2]; + m[2] = 'a'+'0'+hsize - m[2]; m[3] = 'a'+'0'+size - m[3]; if(m[4] == '=') m[4] = 0; // no '=' in USI format! else if(m[4]) m[4] = '+'; // cater to WB 4.4 bug :-( @@ -546,7 +546,7 @@ GUI2Engine() void DoCommand () { - char line[1024], command[256], *p, *q, *r, type[99]; + char line[1024], command[256], *p, *q, *r, type[99], c; int i; p=line; while(qStart < qEnd && (*p++ = *qStart++) != '\n') {} *p = 0; @@ -605,8 +605,8 @@ DoCommand () EPRINT((f, "# setoption name UCI_Variant value %sucinewgame\nisready\n", line+8)) fflush(toE); HandleEngineOutput(); // wait for readyok } - if(!strcmp(line+8, "shogi\n")) size = 9, strcpy(iniPos, "position startpos"); - if(!strcmp(line+8, "5x5+5_shogi\n")) size = 5, strcpy(iniPos, "position startpos"); + c = 0; if(sscanf(line+8, "%dx%d+%d_shogi%c", &hsize, &size, &i, &c) && c == '\n') strcpy(iniPos, "position startpos"); + if(!strcmp(line+8, "shogi\n")) hsize = size = 9, strcpy(iniPos, "position startpos"); if(!strcmp(line+8, "xiangqi\n")) sprintf(iniPos, "%s %c", XQPOS+9*(sc2 == 'c'), sc2 == 'c' ? 'r' : 'w'); // with -c use Cyclone dialect if(!strcmp(line+8, "fischerandom\n")) { frc |= 1; if(frc > 0) EPRINT((f, "# setoption name UCI_Chess960 value true\n")) } } -- 2.17.1