#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
#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
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
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
}\r
}\r
\r
+\r
void\r
DoCommand ()\r
{\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
- 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
\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