* ----------------------------------------------------------------------
* 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
*
* ----------------------------------------------------------------------
*/
+/* request *snprintf prototypes*/
+#define _POSIX_C_SOURCE 200112L
#include <ctype.h>
#include <signal.h>
#include <stdio.h>
+#include <stdarg.h>
#include <sys/param.h>
#include <sys/types.h>
#include <curses.h>
#include "gnushogi.h"
-#include "cursesdsp.h"
#if HAVE_UNISTD_H
#include <unistd.h>
int MSCORE;
char *DRAW;
-/* Forward declarations. */
-/* FIXME: change this name, puh-leeze! */
+/****************************************
+ * forward declarations
+ ****************************************/
+/* FIXME: change this name, puh-leeze! */
static void UpdateCatched(void);
static void DrawPiece(short sq);
static void ShowScore(short score);
+void Curses_UpdateDisplay(short f, short t, short redraw, short isspec);
+void Curses_Die(int sig);
+void Curses_ShowSidetoMove(void);
/****************************************
* Trivial output functions.
static void
-ClearMessage(void)
-{
- gotoXY(TAB, 6);
- ClearEoln();
-}
-
-
-static void
gotoXY(short x, short y)
{
move(y - 1, x - 1);
Curses_ShowDepth(char ch)
{
gotoXY(TAB, 4);
- printw(CP[53], Sdepth, ch); /* Depth = %d%c */
+ printw("Depth= %d%c ", Sdepth, ch);
ClearEoln();
}
ShowHeader(void)
{
gotoXY(TAB, 2);
- printw(CP[69], version, patchlevel);
+ printw("GNU Shogi %s", PACKAGE_VERSION);
}
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();
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();
}
{
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();
ShowScore(short score)
{
gotoXY(TAB, 5);
- printw(CP[104], score);
+ printw("Score= %d", score);
ClearEoln();
}
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);
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 <RET> 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);
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
{
gotoXY(TAB, 6);
- printw(CP[60], ColorStr[a]); /* Editing %s */
+ printw("Editing: %s", ColorStr[a]);
gotoXY(TAB + 24, 7);
ClearEoln();
FLUSH_SCANW("%s", s);
- if (s[0] == CP[28][0]) /* # */
+ if (s[0] == '#')
{
for (sq = 0; sq < NO_SQUARES; sq++)
{
UpdateCatched();
}
- if (s[0] == CP[136][0]) /* c */
+ if (s[0] == 'c')
a = otherside[a];
if (s[1] == '*')
DrawPiece(sq);
}
}
- while (s[0] != CP[29][0]); /* . */
+ while (s[0] != '.');
for (sq = 0; sq < NO_SQUARES; sq++)
Mvboard[sq] = ((board[sq] != Stboard[sq]) ? 10 : 0);
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);
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();
t = (l + h) >> 1;
}
- ShowNodeCnt(NodeCnt);
+ Curses_ShowNodeCnt(NodeCnt);
gotoXY(TAB, 23);
- printw(CP[81], t); /* Max Tree= */
+ printw("Max Tree = %5d", t);
ClearEoln();
}
}
-static void
-UpdateClocks(void)
+void
+Curses_UpdateClocks(void)
{
short m, s;
long dt;
printw("%d:%02d ", m, s);
if (flag.post)
- ShowNodeCnt(NodeCnt);
+ Curses_ShowNodeCnt(NodeCnt);
refresh();
}
void
Curses_ShowPostnValue(short sq)
{
- short score;
-
gotoXY(4 + 5 * VIR_C(sq), 5 + 2 * (7 - VIR_R(sq))); /* CHECKME */
- score = ScorePosition(color[sq]);
+ (void) ScorePosition(color[sq]);
if (color[sq] != neutral)
#if defined SAVE_SVALUE
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]);
gotoXY(3, 4 + 2*NO_ROWS);
printw(" ");
+#ifndef MINISHOGI
if (flag.reverse)
- printw(CP[16]);
+ printw(" 1 2 3 4 5 6 7 8 9");
else
- printw(CP[15]);
+ printw(" 9 8 7 6 5 4 3 2 1");
+#else
+ if (flag.reverse)
+ printw(" 1 2 3 4 5");
+ else
+ printw(" 1 2 3 4 5");
+#endif
for (sq = 0; sq < NO_SQUARES; sq++)
DrawPiece(sq);
void
Curses_ChangeAlphaWindow(void)
{
- Curses_ShowMessage(CP[114]);
+ Curses_ShowMessage("WAwindow = ");
FLUSH_SCANW("%hd", &WAwindow);
- Curses_ShowMessage(CP[34]);
+ Curses_ShowMessage("BAwindow = ");
FLUSH_SCANW("%hd", &BAwindow);
}
void
Curses_ChangeBetaWindow(void)
{
- Curses_ShowMessage(CP[115]);
+ Curses_ShowMessage("WBwindow = ");
FLUSH_SCANW("%hd", &WBwindow);
- Curses_ShowMessage(CP[35]);
+ Curses_ShowMessage("BBwindow = ");
FLUSH_SCANW("%hd", &BBwindow);
}
if (hint)
{
algbr((short) (hint >> 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");
}
}
void
-Curses_ChangeSearchDepth(void)
+Curses_ChangeSearchDepth(char* sx)
{
- Curses_ShowMessage(CP[150]);
+ Curses_ShowMessage("depth = ");
FLUSH_SCANW("%hd", &MaxSearchDepth);
TCflag = !(MaxSearchDepth > 0);
}
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);
}
void
Curses_SetContempt(void)
{
- Curses_ShowMessage(CP[142]);
+ Curses_ShowMessage("contempt = ");
FLUSH_SCANW("%hd", &contempt);
}
void
Curses_ChangeXwindow(void)
{
- Curses_ShowMessage(CP[208]);
+ Curses_ShowMessage("xwndw= ");
FLUSH_SCANW("%hd", &xwndw);
}
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;
TCseconds = 0;
gotoXY(20, 17);
- printw(CP[62]);
+ printw("Enter Level: ");
refresh();
FLUSH_SCANW("%d", &item);
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--)
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]);
}
-/*
- * 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");
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;
- }
-
- if (!NOT_CURSES)
- {
-#ifdef QUIETBACKGROUND
- if (!background)
-#endif
- UpdateClocks();
- }
- }
}
+
void
Curses_SetupBoard(void)
{
Curses_ShowMessage("'setup' command is not supported in Cursesmode");
}
+
+
+struct display curses_display =
+{
+ .ChangeAlphaWindow = Curses_ChangeAlphaWindow,
+ .ChangeBetaWindow = Curses_ChangeBetaWindow,
+ .ChangeHashDepth = Curses_ChangeHashDepth,
+ .ChangeSearchDepth = Curses_ChangeSearchDepth,
+ .ChangeXwindow = Curses_ChangeXwindow,
+ .ClearScreen = Curses_ClearScreen,
+ .DoDebug = Curses_DoDebug,
+ .DoTable = Curses_DoTable,
+ .EditBoard = Curses_EditBoard,
+ .ExitShogi = Curses_ExitShogi,
+ .GiveHint = Curses_GiveHint,
+ .Initialize = Curses_Initialize,
+ .ShowNodeCnt = Curses_ShowNodeCnt,
+ .OutputMove = Curses_OutputMove,
+ .PollForInput = Curses_PollForInput,
+ .SetContempt = Curses_SetContempt,
+ .SearchStartStuff = Curses_SearchStartStuff,
+ .SelectLevel = Curses_SelectLevel,
+ .ShowCurrentMove = Curses_ShowCurrentMove,
+ .ShowDepth = Curses_ShowDepth,
+ .ShowGameType = Curses_ShowGameType,
+ .ShowLine = Curses_ShowLine,
+ .ShowMessage = Curses_ShowMessage,
+ .AlwaysShowMessage = Curses_AlwaysShowMessage,
+ .Printf = Curses_Printf,
+ .doRequestInputString = Curses_doRequestInputString,
+ .GetString = Curses_GetString,
+ .SetupBoard = Curses_SetupBoard,
+ .ShowPatternCount = Curses_ShowPatternCount,
+ .ShowPostnValue = Curses_ShowPostnValue,
+ .ShowPostnValues = Curses_ShowPostnValues,
+ .ShowPrompt = Curses_ShowPrompt,
+ .ShowResponseTime = Curses_ShowResponseTime,
+ .ShowResults = Curses_ShowResults,
+ .ShowSidetoMove = Curses_ShowSidetoMove,
+ .ShowStage = Curses_ShowStage,
+ .TerminateSearch = Curses_TerminateSearch,
+ .UpdateClocks = Curses_UpdateClocks,
+ .UpdateDisplay = Curses_UpdateDisplay,
+ .help = Curses_help,
+};