static char *InPtr;
struct display *dsp = &raw_display;
+short xboard = false;
#if defined(BOOKTEST)
short piece = flag & pmask;
mvstr[0][0] = pxx[piece];
- mvstr[0][1] = '*';
+ mvstr[0][1] = xboard ? '@' : '*';
mvstr[0][2] = COL_NAME(column(t));
mvstr[0][3] = ROW_NAME(row(t));
mvstr[0][4] = '\0';
if (SqAttacked(PieceList[opponent][0], computer, &blocked))
{
UnmakeMove(opponent, &xnode, &tempb, &tempc, &tempsf, &tempst);
- dsp->AlwaysShowMessage("Illegal move (in check) %s", s);
+ dsp->AlwaysShowMessage("Illegal move (in check): %s", s);
return false;
}
else
}
}
- dsp->AlwaysShowMessage("Illegal move (no match) %s", s);
+ dsp->AlwaysShowMessage("Illegal move (no match): %s", s);
if (!XSHOGI && (cnt > 1))
{
if (f[1] == '*' || f[1] == '\'')
{
- c2 = COL_NAME(f[2]);
- r2 = ROW_NAME(f[3]);
+ c2 = COL_NUM(f[2]);
+ r2 = ROW_NUM(f[3]);
return ((NO_SQUARES + *fpiece) << 8) | locn(r2, c2);
}
else
{
- c1 = COL_NAME(f[1]);
- r1 = ROW_NAME(f[2]);
- c2 = COL_NAME(f[3]);
- r2 = ROW_NAME(f[4]);
+ c1 = COL_NUM(f[1]);
+ r1 = ROW_NUM(f[2]);
+ c2 = COL_NUM(f[3]);
+ r2 = ROW_NUM(f[4]);
p = (f[5] == '+') ? 0x80 : 0;
return (locn(r1, c1) << 8) | locn(r2, c2) | p;
RequestInputString(fname, sizeof(fname)-1);
}
- if (fname[0] == '\0')
+ if (fname[0] == '\0') {
+ dsp->AlwaysShowMessage("aborting book save");
return;
+ }
if ((fd = fopen(fname, "a")) != NULL)
{
static void
SetOppTime(char *time)
{
- int m, t, sec;
+ int m, t;
- sec = 0;
t = (int)strtol(time, &time, 10);
if (*time == ':')
{
time++;
/* FIXME: sec is parsed but ignored */
- sec = (int)strtol(time, &time, 10);
+ (void)strtol(time, &time, 10);
}
m = (int)strtol(time, &time, 10);
static void
SetMachineTime(char *time)
{
- int m, t, sec;
+ int m, t;
- sec = 0;
t = (int)strtol(time, &time, 10);
if (*time == ':')
{
time++;
/* FIXME: sec is parsed but ignored */
- sec = (int)strtol(time, &time, 10);
+ (void)strtol(time, &time, 10);
}
m = (int)strtol(time, &time, 10);
* the hint move, then set Sdepth to zero.
*/
-void
-InputCommand(char *command)
+int
+InputCommand(char *command, int root)
{
+#ifdef QUIETBACKGROUND
short have_shown_prompt = false;
+#endif
short ok, done, is_move = false;
unsigned short mv;
char s[80], sx[80];
+ static char backlog[80];
ok = flag.quit = done = false;
player = opponent;
ZeroTTable();
#endif
- if ((hint > 0) && !flag.easy && !flag.force)
+ if ((hint > 0) && !flag.easy && !flag.force && !command && !backlog[0] && root)
{
/*
* A hint move for the player is available. Compute a move for the
{
player = opponent;
+ if (flag.analyze && !command && !backlog[0] && root) {
+ SelectMove(opponent, BACKGROUND_MODE);
+ }
+
#ifdef QUIETBACKGROUND
if (!have_shown_prompt)
{
have_shown_prompt = false;
#endif /* QUIETBACKGROUND */
+ if (!command && backlog[0]) command = backlog; /* pick up backlogged command */
+
if (command == NULL) {
int eof = dsp->GetString(sx);
if (eof)
dsp->ExitShogi();
} else {
strcpy(sx, command);
+ backlog[0]= '\0'; /* make sure no backlog is left */
done = true;
}
if (sscanf(sx, "%s", s) < 1)
continue;
+ if (!root && strcmp(s, "."))
+ { /* during search most commands can only be done after abort */
+ strcpy(backlog, sx); /* backlog the command */
+ return true; /* and order search abort */
+ }
+
if (strcmp(s, "bd") == 0) /* bd -- display board */
{
/* FIXME: Hack alert! */
}
else if (strcmp(s, "post") == 0)
{
- flag.post = !flag.post;
+ flag.post = (xboard ? 1 : !flag.post);
}
- else if (strcmp(s, "alg") == 0)
+ else if (strcmp(s, "nopost") == 0)
+ {
+ flag.post = 0;
+ }
+#ifdef MINISHOGI
+ else if (strcmp(s, "variant") == 0)
+ { /* only variant we play is minishogi */
+ printf("setup (P.BR.S...G.+.++.+Kp.br.s...g.+.++.+k) 5x5+5_shogi rbsgk/4p/5/P4/KGSBR [-] w 0 1\n");
+ }
+#endif
+ else if (strcmp(s, "alg") == 0 ||
+ strcmp(s, "accepted") == 0 || strcmp(s, "rejected") == 0 ||
+ strcmp(s, "variant") == 0 || strcmp(s, "computer") == 0)
{
/* noop */ ;
}
- else if ((strcmp(s, "quit") == 0)
- || (strcmp(s, "exit") == 0))
+ else if ((strcmp(s, "quit") == 0) ||
+ (strcmp(s, "exit") == 0) && !xboard)
{
flag.quit = true;
}
- else if ((strcmp(s, "set") == 0)
- || (strcmp(s, "edit") == 0))
+ else if (strcmp(s, "xboard") == 0)
+ {
+ xboard = true;
+ strcpy(ColorStr[0], "White");
+ strcpy(ColorStr[1], "Black");
+ }
+ else if (strcmp(s, "protover") == 0)
+ {
+ printf("feature myname=\"GNU %s %s\" ",
+#ifdef MINISHOGI
+ "MiniShogi",
+#else
+ "Shogi",
+#endif
+ PACKAGE_VERSION
+ );
+ printf("variants=\"%s\" ",
+#ifdef MINISHOGI
+ "5x5+5_shogi,minishogi"
+#else
+ "shogi"
+#endif
+ );
+ printf("debug=1 setboard=0 sigint=0 done=1\n");
+ }
+ else if (strcmp(s, ".") == 0)
+ { // periodic update request of analysis info: send stat01 info
+ ElapsedTime(2);
+ algbr((short)(currentMove >> 8), (short)(currentMove & 0xFF), 0);
+ printf("stat01: %4ld %8ld %2d %2d %2d %s\n",
+ et, NodeCnt, Sdepth, movesLeft, TrPnt[2]-TrPnt[1], mvstr[0]);
+ fflush(stdout);
+ if (!root) return false; /* signal no abort needed */
+ }
+ else if (strcmp(s, "exit") == 0)
+ {
+ flag.analyze = false;
+ flag.force = true;
+ }
+ else if (strcmp(s, "analyze") == 0)
+ {
+ flag.analyze = true;
+ flag.force = true;
+ }
+ else if ((strcmp(s, "set") == 0) ||
+ (strcmp(s, "edit") == 0))
{
dsp->EditBoard();
}
{
SetMachineTime(sx + strlen("time"));
}
- else if (strcmp(s, "otime") == 0)
+ else if ((strcmp(s, "otime") == 0) ||
+ (xboard && (strcmp(s, "otim")) == 0))
{
SetOppTime(sx + strlen("otime"));
}
flag.force = false;
Sdepth = 0;
ok = true;
+ dsp->UpdateDisplay(0, 0, 1, 0);
}
- else if (strcmp(s, "black") == 0)
+ else if (xboard ? strcmp(s, "white") == 0 : strcmp(s, "black") == 0)
{
computer = white;
opponent = black;
* ok = true; don't automatically start with black command
*/
}
- else if (strcmp(s, "white") == 0)
+ else if (xboard ? strcmp(s, "black") == 0 : strcmp(s, "white") == 0)
{
computer = black;
opponent = white;
BookSave();
}
#ifdef EASY_OPENINGS
- else if ((strcmp(s, "?") == 0)
- || (strcmp(s, "!") == 0)
- || (strcmp(s, "~") == 0))
+ else if ((strcmp(s, "?") == 0) ||
+ (strcmp(s, "!") == 0) ||
+ (strcmp(s, "~") == 0))
#else
- else if ((strcmp(s, "?") == 0)
- || (strcmp(s, "!") == 0))
+ else if ((strcmp(s, "?") == 0) ||
+ (strcmp(s, "!") == 0))
#endif
{
FlagMove(*s);
++mycnt2, s, TimeControl.clock[player] * 10);
}
}
+
+ return true;
}