X-Git-Url: http://winboard.nl/cgi-bin?p=gnushogi.git;a=blobdiff_plain;f=gnushogi%2Fcursesdsp.c;h=205b7491f3bc206c51a7b25e98dcd78cab15dabd;hp=7b37fc6ba55b0a88b44df3b28e60773dd7050338;hb=4657fa333b7f33709b6c817211bbd6bd581e7de0;hpb=b2175fa6df0d070125fa766c2bb7a40382b9c6aa diff --git a/gnushogi/cursesdsp.c b/gnushogi/cursesdsp.c index 7b37fc6..205b749 100644 --- a/gnushogi/cursesdsp.c +++ b/gnushogi/cursesdsp.c @@ -6,6 +6,7 @@ * ---------------------------------------------------------------------- * Copyright (c) 1993, 1994, 1995 Matthias Mutz * Copyright (c) 1999 Michael Vanier and the Free Software Foundation + * Copyright (c) 2008, 2013, 2014 Yann Dirson and the Free Software Foundation * * GNU SHOGI is based on GNU CHESS * @@ -30,6 +31,8 @@ * ---------------------------------------------------------------------- */ +/* request *snprintf prototypes*/ +#define _POSIX_C_SOURCE 200112L #include #include @@ -61,6 +64,7 @@ int mycnt1, mycnt2; +#define MARGIN (4) #define TAB (58) #define VIR_C(s) ((flag.reverse) ? (NO_COLS - 1 - column(s)) : column(s)) @@ -98,17 +102,17 @@ Curses_ClearScreen(void) static void -ClearMessage(void) +gotoXY(short x, short y) { - gotoXY(TAB, 6); - ClearEoln(); + move(y - 1, x - 1); } static void -gotoXY(short x, short y) +ClearMessage(void) { - move(y - 1, x - 1); + gotoXY(TAB, 6); + ClearEoln(); } @@ -125,7 +129,7 @@ void Curses_ShowDepth(char ch) { gotoXY(TAB, 4); - printw(CP[53], Sdepth, ch); /* Depth = %d%c */ + printw("Depth= %d%c ", Sdepth, ch); ClearEoln(); } @@ -145,7 +149,7 @@ void ShowHeader(void) { gotoXY(TAB, 2); - printw(CP[69], version, patchlevel); + printw("GNU Shogi %s", PACKAGE_VERSION); } @@ -165,26 +169,20 @@ Curses_ShowMessage(char *s) void -Curses_AlwaysShowMessage(const char *format, ...) +Curses_AlwaysShowMessage(const char *format, va_list ap) { static char buffer[60]; - va_list ap; - va_start(ap, format); vsnprintf(buffer, sizeof(buffer), format, ap); Curses_ShowMessage(buffer); - va_end(ap); } void -Curses_Printf(const char *format, ...) +Curses_Printf(const char *format, va_list ap) { static char buffer[60]; - va_list ap; - va_start(ap, format); vsnprintf(buffer, sizeof(buffer), format, ap); printw("%s", buffer); - va_end(ap); } @@ -207,7 +205,7 @@ void Curses_ShowNodeCnt(long NodeCnt) { gotoXY(TAB, 22); - /* printw(CP[90], NodeCnt, (et > 100) ? NodeCnt / (et / 100) : 0); */ + /* printw("Nodes = %8ld, Nodes/Sec = %5ld", NodeCnt, (et > 100) ? NodeCnt / (et / 100) : 0); */ printw("n = %ld n/s = %ld", NodeCnt, (et > 100) ? NodeCnt / (et / 100) : 0); ClearEoln(); @@ -233,18 +231,18 @@ static void ShowPlayers(void) { gotoXY(5, ((flag.reverse) ? (5 + 2*NO_ROWS) : 2)); - printw("%s", (computer == white) ? CP[218] : CP[74]); + printw("%s", (computer == white) ? "Computer" : "Human "); gotoXY(5, ((flag.reverse) ? 2 : (5 + 2*NO_ROWS))); - printw("%s", (computer == black) ? CP[218] : CP[74]); + printw("%s", (computer == black) ? "Computer" : "Human "); } -static void +void Curses_ShowPrompt(void) { Curses_ShowSidetoMove(); gotoXY(TAB, 17); - printw(CP[121]); /* Your move is? */ + printw("Your move is? "); ClearEoln(); } @@ -256,8 +254,6 @@ Curses_ShowResponseTime(void) { short TCC = TCcount; gotoXY(TAB, 21); - /* printw("RT = %ld TCC = %d TCL = %ld EX = %ld ET = %ld TO = %d", - ResponseTime, TCC, TCleft, ExtraTime, et, flag.timeout); */ printw("%ld, %d, %ld, %ld, %ld, %d", ResponseTime, TCC, TCleft, ExtraTime, et, flag.timeout); ClearEoln(); @@ -304,7 +300,7 @@ static void ShowScore(short score) { gotoXY(TAB, 5); - printw(CP[104], score); + printw("Score= %d", score); ClearEoln(); } @@ -365,10 +361,10 @@ Curses_Die(int sig) signal(SIGINT, SIG_IGN); signal(SIGQUIT, SIG_IGN); - Curses_ShowMessage(CP[31]); /* Abort? */ + Curses_ShowMessage("Abort? "); FLUSH_SCANW("%s", s); - if (strcmp(s, CP[210]) == 0) /* yes */ + if (strcmp(s, "yes") == 0) Curses_ExitShogi(); signal(SIGINT, Curses_Die); @@ -396,76 +392,44 @@ void Curses_help(void) { Curses_ClearScreen(); - /* printw("GNU Shogi ??p? command summary\n"); */ - printw(CP[40], version, patchlevel); + printw("GNU Shogi %s command summary\n", PACKAGE_VERSION); printw("-------------------------------" "---------------------------------\n"); - /* printw("7g7f move from 7g to 7f quit - * Exit Shogi\n"); */ - printw(CP[158]); - /* printw("S6h move silver to 6h beep - * turn %s\n", (flag.beep) ? "off" : "on"); */ - printw(CP[86], (flag.beep) ? CP[92] : CP[93]); - /* printw("2d2c+ move to 2c and promote\n"); */ - printw(CP[128], (flag.material) ? CP[92] : CP[93]); - /* printw("P*5e drop a pawn to 5e easy - * turn %s\n", (flag.easy) ? "off" : "on"); */ - printw(CP[173], (flag.easy) ? CP[92] : CP[93]); - /* printw(" hash - * turn %s\n", (flag.hash) ? "off" : "on"); */ - printw(CP[174], (flag.hash) ? CP[92] : CP[93]); - /* printw("bd redraw board reverse - * board display\n"); */ - printw(CP[130]); - /* printw("list game to shogi.lst book - * turn %s used %d of %d\n", (Book) ? "off" : "on", book - count, booksize); */ - printw(CP[170], (Book) ? CP[92] : CP[93], bookcount, BOOKSIZE); - /* printw("undo undo last ply remove - * take back a move\n"); */ - printw(CP[200]); - /* printw("edit edit board force - * enter game moves\n"); */ - printw(CP[153]); - /* printw("switch sides with computer both - * computer match\n"); */ - printw(CP[194]); - /* printw("black computer plays black white - * computer plays white\n"); */ - printw(CP[202]); - /* printw("depth set search depth clock - * set time control\n"); */ - printw(CP[149]); - /* printw("hint suggest a move post - * turn %s principle variation\n", (flag.post) ? "off" : - * "on"); */ - printw(CP[177], (flag.post) ? CP[92] : CP[93]); - /* printw("save game to file get - * game from file\n"); */ - printw(CP[188]); - /* printw("random randomize play new - * start new game\n"); */ - printw(CP[181]); + printw("7g7f move from 7g to 7f quit Exit Shogi\n"); + printw("S6h move silver to 6h beep turn %s\n", (flag.beep) ? "OFF" : "ON"); + printw("2d2c+ move to 2c and promote material turn %s\n", (flag.material) ? "OFF" : "ON"); + printw("P*5e drop pawn to 5e easy turn %s\n", (flag.easy) ? "OFF" : "ON"); + printw("tsume toggle tsume mode hash turn %s\n", (flag.hash) ? "OFF" : "ON"); + printw("bd redraw board reverse board display\n"); + printw("list game to shogi.lst book turn %s used %d of %d\n", (Book) ? "OFF" : "ON", bookcount, BOOKSIZE); + printw("undo undo last ply remove take back a move\n"); + printw("edit edit board force toggle manual move mode\n"); + printw("switch sides with computer both computer match\n"); + printw("black computer plays black white computer plays white\n"); + printw("depth set search depth clock set time control\n"); + printw("post principle variation hint suggest a move\n", (flag.post) ? "OFF" : "ON"); + printw("save game to file get game from file\n"); + printw("random randomize play new start new game\n"); gotoXY(10, 20); - printw(CP[47], ColorStr[computer]); + printw("Computer: %s", ColorStr[computer]); gotoXY(10, 21); - printw(CP[97], ColorStr[opponent]); + printw("Opponent: %s", ColorStr[opponent]); gotoXY(10, 22); - printw(CP[79], MaxResponseTime/100); + printw("Level: %ld", MaxResponseTime/100); gotoXY(10, 23); - printw(CP[59], (flag.easy) ? CP[93] : CP[92]); + printw("Easy mode: %s", (flag.easy) ? "ON" : "OFF"); gotoXY(25, 23); - printw(CP[231], (flag.tsume) ? CP[93] : CP[92]); + printw("Tsume: %s", (flag.tsume) ? "ON" : "OFF"); gotoXY(40, 20); - printw(CP[52], MaxSearchDepth); + printw("Depth: %d", MaxSearchDepth); gotoXY(40, 21); - printw(CP[100], (dither) ? CP[93] : CP[92]); + printw("Random: %s", (dither) ? "ON" : "OFF"); gotoXY(40, 22); - printw(CP[112], (flag.hash) ? CP[93] : CP[92]); + printw("Transposition table: %s", (flag.hash) ? "ON" : "OFF"); gotoXY(40, 23); - printw(CP[73]); + printw("Hit to return: "); gotoXY(10, 24); - printw(CP[110], (TCflag) ? CP[93] : CP[92], + printw("Time Control %s %d moves %d sec %d add %d depth\n", (TCflag) ? "ON" : "OFF", TimeControl.moves[black], TimeControl.clock[black] / 100, OperatorTime, MaxSearchDepth); @@ -495,7 +459,7 @@ static const short y0[2] = { 20, 4 }; void Curses_EditBoard(void) { - short a, c, sq, i; + short a, c, sq, i, found; short r = 0; char s[80]; @@ -504,24 +468,28 @@ Curses_EditBoard(void) Curses_ClearScreen(); Curses_UpdateDisplay(0, 0, 1, 0); gotoXY(TAB, 3); - printw(CP[29]); + printw(". Exit to main\n"); gotoXY(TAB, 4); - printw(CP[28]); + printw("# Clear board\n"); gotoXY(TAB, 5); - printw(CP[136]); + printw("c Change sides\n"); gotoXY(TAB, 7); - printw(CP[64]); + printw("Enter piece & location: "); a = black; - do + while(1) { gotoXY(TAB, 6); - printw(CP[60], ColorStr[a]); /* Editing %s */ + printw("Editing: %s", ColorStr[a]); gotoXY(TAB + 24, 7); ClearEoln(); FLUSH_SCANW("%s", s); + found = 0; + + if (s[0] == '.') + break; - if (s[0] == CP[28][0]) /* # */ + if (s[0] == '#') { for (sq = 0; sq < NO_SQUARES; sq++) { @@ -532,50 +500,60 @@ Curses_EditBoard(void) ClearCaptured(); UpdateCatched(); + continue; } - if (s[0] == CP[136][0]) /* c */ + if (s[0] == 'c') { a = otherside[a]; + continue; + } if (s[1] == '*') { for (i = NO_PIECES; i > no_piece; i--) { if ((s[0] == pxx[i]) || (s[0] == qxx[i])) + { + Captured[a][unpromoted[i]]++; + UpdateCatched(); + found = 1; break; + } } - Captured[a][unpromoted[i]]++; - UpdateCatched(); - c = -1; - } - else - { - c = COL_NAME(s[1]); - r = ROW_NAME(s[2]); + continue; } - if ((c >= 0) && (c < NO_COLS) && (r >= 0) && (r < NO_ROWS)) - { - sq = locn(r, c); + c = COL_NUM(s[1]); + r = ROW_NUM(s[2]); - for (i = NO_PIECES; i > no_piece; i--) + if ((c < 0) || (c >= NO_COLS) || (r < 0) || (r >= NO_ROWS)) + continue; + + sq = locn(r, c); + color[sq] = a; + board[sq] = no_piece; + + for (i = NO_PIECES; i > no_piece; i--) + { + if ((s[0] == pxx[i]) || (s[0] == qxx[i])) { - if ((s[0] == pxx[i]) || (s[0] == qxx[i])) - break; + if (s[3] == '+') + board[sq] = promoted[i]; + else + board[sq] = unpromoted[i]; + + found = 1; + break; } + } - if (s[3] == '+') - i = promoted[i]; - else - i = unpromoted[i]; - board[sq] = i; - color[sq] = ((board[sq] == no_piece) ? neutral : a); - DrawPiece(sq); - } + if (found == 0) + color[sq] = neutral; + + DrawPiece(sq); } - while (s[0] != CP[29][0]); /* . */ for (sq = 0; sq < NO_SQUARES; sq++) Mvboard[sq] = ((board[sq] != Stboard[sq]) ? 10 : 0); @@ -666,11 +644,11 @@ Curses_OutputMove(void) if (flag.illegal) { - printw(CP[225]); + printw("Illegal position."); return; } - printw(CP[84], mvstr[0]); /* My move is %s */ + printw("My move is: %5s", mvstr[0]); if (flag.beep) putchar(7); @@ -680,16 +658,16 @@ Curses_OutputMove(void) gotoXY(TAB, 18); if (root->flags & draw) - printw(CP[58]); + printw("Drawn game!"); else if (root->score == -(SCORE_LIMIT + 999)) - printw(CP[95]); + printw("Opponent mates!"); else if (root->score == SCORE_LIMIT + 998) - printw(CP[44]); + printw("Computer mates!"); #ifdef VERYBUGGY else if (root->score < -SCORE_LIMIT) - printw(CP[96], SCORE_LIMIT + 999 + root->score - 1); + printw("Opp: mate in %d!", SCORE_LIMIT + 999 + root->score - 1); else if (root->score > SCORE_LIMIT) - printw(CP[45], SCORE_LIMIT + 998 - root->score - 1); + printw("Comp: mate in %d!", SCORE_LIMIT + 998 - root->score - 1); #endif /* VERYBUGGY */ ClearEoln(); @@ -714,7 +692,7 @@ Curses_OutputMove(void) ShowNodeCnt(NodeCnt); gotoXY(TAB, 23); - printw(CP[81], t); /* Max Tree= */ + printw("Max Tree = %5d", t); ClearEoln(); } @@ -722,8 +700,8 @@ Curses_OutputMove(void) } -static void -UpdateClocks(void) +void +Curses_UpdateClocks(void) { short m, s; long dt; @@ -793,7 +771,7 @@ DrawPiece(short sq) y = pxx[(int)piece]; } - gotoXY(8 + 5 * VIR_C(sq), 4 + 2 * ((NO_ROWS - 1) - VIR_R(sq))); + gotoXY(MARGIN + 3 + 5 * VIR_C(sq), 4 + 2 * ((NO_ROWS - 1) - VIR_R(sq))); printw("%c%c%c%c", l, p, y, r); } @@ -838,7 +816,7 @@ Curses_ShowPostnValues(void) score = ScorePosition(opponent); gotoXY(TAB, 5); - printw(CP[103], score, + printw("S%d m%d ps%d gt%c m%d ps%d gt%c", score, mtl[computer], pscore[computer], GameType[computer], mtl[opponent], pscore[opponent], GameType[opponent]); @@ -858,46 +836,52 @@ Curses_UpdateDisplay(short f, short t, short redraw, short isspec) ShowPlayers(); i = 2; - gotoXY(3, ++i); + gotoXY(MARGIN, ++i); - printw(" +"); + printw(" +"); for (j=0; j> 8), (short) (hint & 0xFF), false); - strcpy(s, CP[198]); /* try */ + strcpy(s, "try "); strcat(s, mvstr[0]); Curses_ShowMessage(s); } else { - Curses_ShowMessage(CP[223]); + Curses_ShowMessage("I have no idea.\n"); } } @@ -999,7 +983,7 @@ Curses_GiveHint(void) void Curses_ChangeSearchDepth(void) { - Curses_ShowMessage(CP[150]); + Curses_ShowMessage("depth = "); FLUSH_SCANW("%hd", &MaxSearchDepth); TCflag = !(MaxSearchDepth > 0); } @@ -1008,9 +992,9 @@ Curses_ChangeSearchDepth(void) void Curses_ChangeHashDepth(void) { - Curses_ShowMessage(CP[163]); + Curses_ShowMessage("hashdepth = "); FLUSH_SCANW("%hd", &HashDepth); - Curses_ShowMessage(CP[82]); + Curses_ShowMessage("MoveLimit = "); FLUSH_SCANW("%hd", &HashMoveLimit); } @@ -1018,7 +1002,7 @@ Curses_ChangeHashDepth(void) void Curses_SetContempt(void) { - Curses_ShowMessage(CP[142]); + Curses_ShowMessage("contempt = "); FLUSH_SCANW("%hd", &contempt); } @@ -1026,7 +1010,7 @@ Curses_SetContempt(void) void Curses_ChangeXwindow(void) { - Curses_ShowMessage(CP[208]); + Curses_ShowMessage("xwndw= "); FLUSH_SCANW("%hd", &xwndw); } @@ -1038,27 +1022,27 @@ Curses_SelectLevel(char *sx) Curses_ClearScreen(); gotoXY(32, 2); - printw(CP[41], version, patchlevel); + printw("GNU Shogi %s", PACKAGE_VERSION); gotoXY(20, 4); - printw(CP[18]); + printw(" 1. 40 moves in 5 minutes"); gotoXY(20, 5); - printw(CP[19]); + printw(" 2. 40 moves in 15 minutes"); gotoXY(20, 6); - printw(CP[20]); + printw(" 3. 40 moves in 30 minutes"); gotoXY(20, 7); - printw(CP[21]); + printw(" 4. all moves in 15 minutes"); gotoXY(20, 8); - printw(CP[22]); + printw(" 5. all moves in 30 minutes"); gotoXY(20, 9); - printw(CP[23]); + printw(" 6. all moves in 15 minutes, 30 seconds fischer clock"); gotoXY(20, 10); - printw(CP[24]); + printw(" 7. all moves in 30 minutes, 30 seconds fischer clock"); gotoXY(20, 11); - printw(CP[25]); + printw(" 8. 1 move in 1 minute"); gotoXY(20, 12); - printw(CP[26]); + printw(" 9. 1 move in 15 minutes"); gotoXY(20, 13); - printw(CP[27]); + printw("10. 1 move in 30 minutes"); OperatorTime = 0; TCmoves = 40; @@ -1066,7 +1050,7 @@ Curses_SelectLevel(char *sx) TCseconds = 0; gotoXY(20, 17); - printw(CP[62]); + printw("Enter Level: "); refresh(); FLUSH_SCANW("%d", &item); @@ -1148,14 +1132,14 @@ Curses_DoDebug(void) char s[40]; ExaminePosition(opponent); - Curses_ShowMessage(CP[65]); + Curses_ShowMessage("Enter piece: "); FLUSH_SCANW("%s", s); c = neutral; - if ((s[0] == CP[9][0]) || (s[0] == CP[9][1])) /* b B */ + if ((s[0] == 'b') || (s[0] == 'B')) c = black; - if ((s[0] == CP[9][2]) || (s[0] == CP[9][3])) /* w W */ + if ((s[0] == 'w') || (s[0] == 'W')) c = white; for (p = king; p > no_piece; p--) @@ -1180,7 +1164,7 @@ Curses_DoDebug(void) score = ScorePosition(opponent); gotoXY(TAB, 5); - printw(CP[103], score, + printw("S%d m%d ps%d gt%c m%d ps%d gt%c", score, mtl[computer], pscore[computer], GameType[computer], mtl[opponent], pscore[opponent], GameType[opponent]); @@ -1202,25 +1186,12 @@ Curses_DoTable(short table[NO_SQUARES]) } -/* - * Determine the time that has passed since the search was started. If the - * elapsed time exceeds the target(ResponseTime + ExtraTime) then set timeout - * to true which will terminate the search. - * iop = COMPUTE_MODE calculate et, bump ETnodes - * iop = COMPUTE_AND_INIT_MODE calculate et, set timeout if time exceeded, - * set reference time - */ void -Curses_ElapsedTime(ElapsedTime_mode iop) +Curses_PollForInput(void) { - long current_time; int i; int nchar; -#ifdef HAVE_GETTIMEOFDAY - struct timeval tv; -#endif - if ((i = ioctl((int) 0, FIONREAD, &nchar))) { perror("FIONREAD"); @@ -1238,54 +1209,9 @@ Curses_ElapsedTime(ElapsedTime_mode iop) flag.bothsides = false; } - -#ifdef HAVE_GETTIMEOFDAY - gettimeofday(&tv, NULL); - current_time = tv.tv_sec*100 + (tv.tv_usec/10000); -#else - et = ((current_time = time((long *) 0)) - time0) * 100; -#endif - -#ifdef INTERRUPT_TEST - if (iop == INIT_INTERRUPT_MODE) - { - itime0 = current_time; - } - else if (iop == COMPUTE_INTERRUPT_MODE) - { - it = current_time - itime0; - } - else -#endif - { -#ifdef HAVE_GETTIMEOFDAY - et = current_time - time0; -#endif - ETnodes = NodeCnt + znodes; - - if (et < 0) - { -#ifdef INTERRUPT_TEST - printf("elapsed time %ld not positive\n", et); -#endif - et = 0; - } - - if (iop == COMPUTE_AND_INIT_MODE) - { - if ((et > (ResponseTime + ExtraTime)) && (Sdepth > MINDEPTH)) - flag.timeout = true; - - time0 = current_time; - } - -#ifdef QUIETBACKGROUND - if (!background) -#endif - UpdateClocks(); - } } + void Curses_SetupBoard(void) {