X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=gnushogi%2Fcommondsp.c;h=14fd3876e24d25406b6e9f3940427ea6689866dc;hb=9621a4712b7df55d6fe4fff44789c8e4c7476013;hp=603143c1482aa31d233cbd616d87fb1cae5b63eb;hpb=b1b9616a3147b835beaabfaaa8f2de0db6d12ee9;p=gnushogi.git diff --git a/gnushogi/commondsp.c b/gnushogi/commondsp.c index 603143c..14fd387 100644 --- a/gnushogi/commondsp.c +++ b/gnushogi/commondsp.c @@ -50,10 +50,11 @@ #include "gnushogi.h" char mvstr[4][6]; -char *InPtr; int mycnt1, mycnt2; +static char *InPtr; struct display *dsp = &raw_display; +short xboard = false; #if defined(BOOKTEST) @@ -94,20 +95,20 @@ movealgbr(short m, char *s) s++; *s = '*'; s++; - *s = cxx[column(t)]; + *s = COL_NAME(column(t)); s++; - *s = rxx[row(t)]; + *s = ROW_NAME(row(t)); s++; } else { - *s = cxx[column(f)]; + *s = COL_NAME(column(f)); s++; - *s = rxx[row(f)]; + *s = ROW_NAME(row(f)); s++; - *s = cxx[column(t)]; + *s = COL_NAME(column(t)); s++; - *s = rxx[row(t)]; + *s = ROW_NAME(row(t)); s++; if (flag & promote) @@ -138,7 +139,10 @@ movealgbr(short m, char *s) * - NO_SQUARES <= f NO_SQUARES + 2*NO_PIECES dropped piece modulo NO_PIECES * - t & 0x7f target square * - t & 0x80 promotion flag - * - flag FIXME: must be zero ? + * - flag + * - if flag & dropmask, piece type encoded in flag & pmask + * + * FIXME: that makes 2 ways to specify drops and promotions, why ? * * OUTPUT: * - GLOBAL mvstr @@ -178,9 +182,9 @@ algbr(short f, short t, short flag) short piece = flag & pmask; mvstr[0][0] = pxx[piece]; - mvstr[0][1] = '*'; - mvstr[0][2] = cxx[column(t)]; - mvstr[0][3] = rxx[row(t)]; + mvstr[0][1] = xboard ? '@' : '*'; + mvstr[0][2] = COL_NAME(column(t)); + mvstr[0][3] = ROW_NAME(row(t)); mvstr[0][4] = '\0'; strcpy(mvstr[1], mvstr[0]); strcpy(mvstr[2], mvstr[0]); @@ -188,20 +192,27 @@ algbr(short f, short t, short flag) } else if ((f != 0) || (t != 0)) { - /* algebraic notation */ - mvstr[0][0] = cxx[column(f)]; - mvstr[0][1] = rxx[row(f)]; - mvstr[0][2] = cxx[column(t)]; - mvstr[0][3] = rxx[row(t)]; - mvstr[0][4] = mvstr[3][0] = '\0'; + /* pure coordinates notation */ + mvstr[0][0] = COL_NAME(column(f)); + mvstr[0][1] = ROW_NAME(row(f)); + mvstr[0][2] = COL_NAME(column(t)); + mvstr[0][3] = ROW_NAME(row(t)); + mvstr[0][4] = '\0'; + + /* algebraic notation without disambiguation */ mvstr[1][0] = pxx[board[f]]; + mvstr[1][1] = mvstr[0][2]; /* to column */ + mvstr[1][2] = mvstr[0][3]; /* to row */ + mvstr[1][3] = '\0'; + /* algebraic notation with row disambiguation */ mvstr[2][0] = mvstr[1][0]; mvstr[2][1] = mvstr[0][1]; + mvstr[2][2] = mvstr[0][2]; /* to column */ + mvstr[2][3] = mvstr[0][3]; /* to row */ + mvstr[2][4] = '\0'; - mvstr[2][2] = mvstr[1][1] = mvstr[0][2]; /* to column */ - mvstr[2][3] = mvstr[1][2] = mvstr[0][3]; /* to row */ - mvstr[2][4] = mvstr[1][3] = '\0'; + /* algebraic notation with column disambiguation */ strcpy(mvstr[3], mvstr[2]); mvstr[3][1] = mvstr[0][0]; @@ -300,7 +311,7 @@ VerifyMove(char *s, VerifyMove_mode iop, unsigned short *mv) 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 @@ -342,7 +353,7 @@ VerifyMove(char *s, VerifyMove_mode iop, unsigned short *mv) } } - dsp->AlwaysShowMessage("Illegal move (no match) %s", s); + dsp->AlwaysShowMessage("Illegal move (no match): %s", s); if (!XSHOGI && (cnt > 1)) { @@ -374,17 +385,17 @@ parser(char *f, short *fpiece) 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; @@ -1409,16 +1420,15 @@ TestPSpeed(short(*f) (short side), unsigned j) 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); @@ -1442,16 +1452,15 @@ SetOppTime(char *time) 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); @@ -1485,7 +1494,9 @@ SetMachineTime(char *time) void InputCommand(char *command) { +#ifdef QUIETBACKGROUND short have_shown_prompt = false; +#endif short ok, done, is_move = false; unsigned short mv; char s[80], sx[80]; @@ -1604,9 +1615,15 @@ InputCommand(char *command) } else if (strcmp(s, "post") == 0) { - flag.post = !flag.post; + flag.post = (xboard ? 1 : !flag.post); + } + else if (strcmp(s, "nopost") == 0) + { + flag.post = 0; } - else if (strcmp(s, "alg") == 0) + else if (strcmp(s, "alg") == 0 || + strcmp(s, "accepted") == 0 || strcmp(s, "rejected") == 0 || + strcmp(s, "variant") == 0 || strcmp(s, "computer") == 0) { /* noop */ ; } @@ -1615,6 +1632,22 @@ InputCommand(char *command) { flag.quit = true; } + 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 %sShogi %s\" variants=\"%sshogi\" debug=1 setboard=0 sigint=0 done=1\n", +#ifdef MINISHOGI + "mini", PACKAGE_VERSION, "5x5+5_" +#else + "", PACKAGE_VERSION, "" +#endif + ); + } else if ((strcmp(s, "set") == 0) || (strcmp(s, "edit") == 0)) { @@ -1702,7 +1735,8 @@ InputCommand(char *command) { 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")); } @@ -1745,8 +1779,9 @@ InputCommand(char *command) 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; @@ -1758,7 +1793,7 @@ InputCommand(char *command) * 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;