XBoard: split printing of the features line for clarity.
[gnushogi.git] / gnushogi / cursesdsp.c
index 9cbca2e..76650a6 100644 (file)
 
 #define FLUSH_SCANW fflush(stdout), scanw
 
-int mycnt1, mycnt2;
-
+#define MARGIN (5)
 #define TAB (58)
 
 #define VIR_C(s)  ((flag.reverse) ? (NO_COLS - 1 - column(s)) : column(s))
 #define VIR_R(s)  ((flag.reverse) ? (NO_ROWS - 1 - row(s)) : row(s))
 
-unsigned short MV[MAXDEPTH];
-int MSCORE;
-char *DRAW;
-
 /****************************************
  * forward declarations
  ****************************************/
@@ -81,9 +76,9 @@ char *DRAW;
 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);
+static void Curses_UpdateDisplay(short f, short t, short redraw, short isspec);
+static void Curses_Die(int sig);
+static void Curses_ShowSidetoMove(void);
 
 /****************************************
  * Trivial output functions.
@@ -97,7 +92,7 @@ ClearEoln(void)
 }
 
 
-void
+static void
 Curses_ClearScreen(void)
 {
     clear();
@@ -112,7 +107,14 @@ gotoXY(short x, short y)
 }
 
 
-void
+static void
+ClearMessage(void)
+{
+    gotoXY(TAB, 6);
+    ClearEoln();
+}
+
+static void
 Curses_ShowCurrentMove(short pnt, short f, short t)
 {
     algbr(f, t, false);
@@ -121,7 +123,7 @@ Curses_ShowCurrentMove(short pnt, short f, short t)
 }
 
 
-void
+static void
 Curses_ShowDepth(char ch)
 {
     gotoXY(TAB, 4);
@@ -130,7 +132,7 @@ Curses_ShowDepth(char ch)
 }
 
 
-void
+static void
 Curses_ShowGameType(void)
 {
     if (flag.post)
@@ -141,7 +143,7 @@ Curses_ShowGameType(void)
 }
 
 
-void
+static void
 ShowHeader(void)
 {
     gotoXY(TAB, 2);
@@ -149,53 +151,61 @@ ShowHeader(void)
 }
 
 
-void
+static void
 Curses_ShowLine(unsigned short *bstline)
 {
 }
 
 
-void
-Curses_ShowMessage(char *s)
+static void
+_vprintw(const char *format, va_list ap)
+{
+    static char buffer[60];
+    vsnprintf(buffer, sizeof(buffer), format, ap);
+    printw("%s", buffer);
+}
+
+static void
+Curses_ShowMessage(char *format, ...)
 {
+    va_list ap;
+    va_start(ap, format);
     gotoXY(TAB, 6);
-    printw("%s", s);
+    _vprintw(format, ap);
+    va_end(ap);
     ClearEoln();
 }
 
-
-void
+static void
 Curses_AlwaysShowMessage(const char *format, ...)
 {
-    static char buffer[60];
     va_list ap;
     va_start(ap, format);
-    vsnprintf(buffer, sizeof(buffer), format, ap);
-    Curses_ShowMessage(buffer);
+    gotoXY(TAB, 6);
+    _vprintw(format, ap);
     va_end(ap);
+    ClearEoln();
 }
 
 
-void
+static void
 Curses_Printf(const char *format, ...)
 {
-    static char buffer[60];
     va_list ap;
     va_start(ap, format);
-    vsnprintf(buffer, sizeof(buffer), format, ap);
-    printw("%s", buffer);
+    _vprintw(format, ap);
     va_end(ap);
 }
 
 
-void
+static void
 Curses_doRequestInputString(const char* fmt, char* buffer)
 {
     FLUSH_SCANW(fmt, buffer);
 }
 
 
-int
+static int
 Curses_GetString(char* sx)
 {
     fflush(stdout);
@@ -203,7 +213,7 @@ Curses_GetString(char* sx)
 }
 
 
-void
+static void
 Curses_ShowNodeCnt(long NodeCnt)
 {
     gotoXY(TAB, 22);
@@ -214,7 +224,7 @@ Curses_ShowNodeCnt(long NodeCnt)
 }
 
 
-void
+static void
 Curses_ShowPatternCount(short side, short n)
 {
     if (flag.post)
@@ -239,7 +249,7 @@ ShowPlayers(void)
 }
 
 
-void
+static void
 Curses_ShowPrompt(void)
 {
     Curses_ShowSidetoMove();
@@ -249,7 +259,7 @@ Curses_ShowPrompt(void)
 }
 
 
-void
+static void
 Curses_ShowResponseTime(void)
 {
     if (flag.post)
@@ -263,7 +273,7 @@ Curses_ShowResponseTime(void)
 }
 
 
-void
+static void
 Curses_ShowResults(short score, unsigned short *bstline, char ch)
 {
     unsigned char d, ply;
@@ -307,7 +317,7 @@ ShowScore(short score)
 }
 
 
-void
+static void
 Curses_ShowSidetoMove(void)
 {
     gotoXY(TAB, 14);
@@ -316,7 +326,7 @@ Curses_ShowSidetoMove(void)
 }
 
 
-void
+static void
 Curses_ShowStage(void)
 {
     gotoXY(TAB, 19);
@@ -329,7 +339,7 @@ Curses_ShowStage(void)
  * End of trivial output routines.
  ****************************************/
 
-void
+static void
 Curses_Initialize(void)
 {
     signal(SIGINT, Curses_Die);
@@ -339,7 +349,7 @@ Curses_Initialize(void)
 }
 
 
-void
+static void
 Curses_ExitShogi(void)
 { 
     if (!nolist)
@@ -355,7 +365,7 @@ Curses_ExitShogi(void)
 }
 
 
-void
+static void
 Curses_Die(int sig)
 {
     char s[80];
@@ -374,7 +384,7 @@ Curses_Die(int sig)
 }
 
 
-void
+static void
 Curses_TerminateSearch(int sig)
 {
     signal(SIGINT, SIG_IGN);
@@ -390,7 +400,7 @@ Curses_TerminateSearch(int sig)
 }
 
 
-void
+static void
 Curses_help(void)
 {
     Curses_ClearScreen();
@@ -448,8 +458,8 @@ Curses_help(void)
 }
 
 
-static const short x0[2] = { 54, 2 };
-static const short y0[2] = { 20, 4 };
+static const short x0[2] = { MARGIN + 5*NO_COLS + 4, 2 };
+static const short y0[2] = { 4 + 2 * (NO_ROWS - 1), 4 };
 
 
 /*
@@ -458,10 +468,10 @@ static const short y0[2] = { 20, 4 };
  * P* will put a pawn to the captured pieces.
  */
 
-void
+static void
 Curses_EditBoard(void)
 {
-    short a, c, sq, i;
+    short a, c, sq, i, found;
     short r = 0;
     char s[80];
 
@@ -469,23 +479,28 @@ Curses_EditBoard(void)
     Book = BOOKFAIL;
     Curses_ClearScreen();
     Curses_UpdateDisplay(0, 0, 1, 0);
-    gotoXY(TAB, 3);
+    gotoXY(TAB, 11);
     printw(".   Exit to main\n");
-    gotoXY(TAB, 4);
+    gotoXY(TAB, 12);
     printw("#   Clear board\n");
-    gotoXY(TAB, 5);
+    gotoXY(TAB, 13);
     printw("c   Change sides\n");
     gotoXY(TAB, 7);
     printw("Enter piece & location: ");
     a = black;
 
-    do
+    while(1)
     {
-        gotoXY(TAB, 6);
+        gotoXY(TAB, 4);
         printw("Editing: %s", ColorStr[a]);
-        gotoXY(TAB + 24, 7);
+        gotoXY(TAB + 2, 8);
         ClearEoln();
         FLUSH_SCANW("%s", s);
+        found = 0;
+        ClearMessage();
+
+        if (s[0] == '.')
+            break;
 
         if (s[0] == '#')
         {
@@ -498,50 +513,61 @@ Curses_EditBoard(void)
 
             ClearCaptured();
             UpdateCatched();
+            continue;
         }
 
-        if (s[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;
+            if (!found)
+                dsp->AlwaysShowMessage("Invalid piece type '%c'", s[0]);
+            continue;
         }
-        else
-        {
-            c = COL_NAME(s[1]);
-            r = ROW_NAME(s[2]);
+
+        c = COL_NUM(s[1]);
+        r = ROW_NUM(s[2]);
+
+        if ((c < 0) || (c >= NO_COLS) || (r < 0) || (r >= NO_ROWS)) {
+            dsp->AlwaysShowMessage("Out-of-board '%c%c'", s[1], s[2]);
+            continue;
         }
 
-        if ((c >= 0) && (c < NO_COLS) && (r >= 0) && (r < NO_ROWS))
-        {
-            sq = locn(r, c);
+        sq = locn(r, c);
 
-            for (i = NO_PIECES; i > no_piece; i--)
+        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;
+                color[sq] = a;
+                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];
+        if (!found)
+            dsp->AlwaysShowMessage("Invalid piece type '%c'", s[0]);
 
-            board[sq] = i;
-            color[sq] = ((board[sq] == no_piece) ? neutral : a);
-            DrawPiece(sq);
-        }
+        DrawPiece(sq);
     }
-    while (s[0] != '.');
 
     for (sq = 0; sq < NO_SQUARES; sq++)
         Mvboard[sq] = ((board[sq] != Stboard[sq]) ? 10 : 0);
@@ -607,7 +633,7 @@ UpdateCatched()
 }
 
 
-void
+static void
 Curses_SearchStartStuff(short side)
 {
     short i;
@@ -623,7 +649,7 @@ Curses_SearchStartStuff(short side)
 }
 
 
-void
+static void
 Curses_OutputMove(void)
 {
 
@@ -688,7 +714,7 @@ Curses_OutputMove(void)
 }
 
 
-void
+static void
 Curses_UpdateClocks(void)
 {
     short m, s;
@@ -712,9 +738,9 @@ Curses_UpdateClocks(void)
         s = 0;
 
     if (player == black)
-        gotoXY(20, (flag.reverse) ? 2 : 23);
+        gotoXY(20, (flag.reverse) ? 2 : (5 + 2*NO_ROWS));
     else
-        gotoXY(20, (flag.reverse) ? 23 : 2);
+        gotoXY(20, (flag.reverse) ? (5 + 2*NO_ROWS) : 2);
 
     /* printw("%d:%02d %ld  ", m, s, dt); */
     printw("%d:%02d  ", m, s); 
@@ -759,7 +785,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);
 }
 
@@ -767,7 +793,7 @@ DrawPiece(short sq)
 /*
  * Curses_ShowPostnValue(): must have called ExaminePosition() first
  */
-void
+static void
 Curses_ShowPostnValue(short sq)
 {
     gotoXY(4 + 5 * VIR_C(sq), 5 + 2 * (7 - VIR_R(sq)));        /* CHECKME */
@@ -790,7 +816,7 @@ Curses_ShowPostnValue(short sq)
 }
 
 
-void
+static void
 Curses_ShowPostnValues(void)
 {
     short sq, score;
@@ -810,7 +836,7 @@ Curses_ShowPostnValues(void)
 }
 
 
-void
+static void
 Curses_UpdateDisplay(short f, short t, short redraw, short isspec)
 {
     short i, sq, z;
@@ -822,42 +848,41 @@ 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<NO_COLS; j++)
            printw("----+");
 
         while (i <= 1 + 2*NO_ROWS)
         {
-            gotoXY(1, ++i);
+            gotoXY(MARGIN, ++i);
 
             if (flag.reverse)
                 z = (i / 2) - 1;
             else
                 z = NO_ROWS + 2 - ((i + 1) / 2);
 
-            printw("    %c |", ROW_NAME(z+1));
+            printw("%c |", ROW_NAME(z+1));
            for (j=0; j<NO_COLS; j++)
                printw("    |");
 
-            gotoXY(3, ++i);
+            gotoXY(MARGIN, ++i);
 
             if (i < 2 + 2*NO_ROWS)
             {
-               printw("    +");
+               printw("  +");
                for (j=0; j<NO_COLS; j++)
                    printw("----+");
             }
         }
 
-       printw("    +");
+       printw("  +");
        for (j=0; j<NO_COLS; j++)
            printw("----+");
 
-        gotoXY(3, 4 + 2*NO_ROWS);
-        printw("    ");
-
+        gotoXY(MARGIN, 4 + 2*NO_ROWS);
+        printw("  ");
 #ifndef MINISHOGI
         if (flag.reverse)
             printw("  1    2    3    4    5    6    7    8    9");
@@ -867,7 +892,7 @@ Curses_UpdateDisplay(short f, short t, short redraw, short isspec)
         if (flag.reverse)
             printw("  1    2    3    4    5");
         else
-            printw("  1    2    3    4    5");
+            printw("  5    4    3    2    1");
 #endif
 
         for (sq = 0; sq < NO_SQUARES; sq++)
@@ -928,7 +953,7 @@ Curses_UpdateDisplay(short f, short t, short redraw, short isspec)
 }
 
 
-void
+static void
 Curses_ChangeAlphaWindow(void)
 {
     Curses_ShowMessage("WAwindow = ");
@@ -938,7 +963,7 @@ Curses_ChangeAlphaWindow(void)
 }
 
 
-void
+static void
 Curses_ChangeBetaWindow(void)
 {
     Curses_ShowMessage("WBwindow = ");
@@ -948,7 +973,7 @@ Curses_ChangeBetaWindow(void)
 }
 
 
-void
+static void
 Curses_GiveHint(void)
 {
     char s[40];
@@ -967,7 +992,7 @@ Curses_GiveHint(void)
 }
 
 
-void
+static void
 Curses_ChangeSearchDepth(char* sx)
 {
     Curses_ShowMessage("depth = ");
@@ -976,7 +1001,7 @@ Curses_ChangeSearchDepth(char* sx)
 }
 
 
-void
+static void
 Curses_ChangeHashDepth(void)
 {
     Curses_ShowMessage("hashdepth = ");
@@ -986,7 +1011,7 @@ Curses_ChangeHashDepth(void)
 }
 
 
-void
+static void
 Curses_SetContempt(void)
 {
     Curses_ShowMessage("contempt = ");
@@ -994,7 +1019,7 @@ Curses_SetContempt(void)
 }
 
 
-void
+static void
 Curses_ChangeXwindow(void)
 {
     Curses_ShowMessage("xwndw= ");
@@ -1002,7 +1027,7 @@ Curses_ChangeXwindow(void)
 }
 
 
-void
+static void
 Curses_SelectLevel(char *sx)
 {
     int item;
@@ -1112,7 +1137,7 @@ Curses_SelectLevel(char *sx)
 }
 
 
-void
+static void
 Curses_DoDebug(void)
 {
     short c, p, sq, tp, tc, tsq, score;
@@ -1159,7 +1184,7 @@ Curses_DoDebug(void)
 }
 
 
-void
+static void
 Curses_DoTable(short table[NO_SQUARES])
 {
     short  sq;
@@ -1173,7 +1198,7 @@ Curses_DoTable(short table[NO_SQUARES])
 } 
 
 
-void
+static void
 Curses_PollForInput(void)
 {
     int  i;
@@ -1199,7 +1224,7 @@ Curses_PollForInput(void)
 }
 
 
-void
+static void
 Curses_SetupBoard(void)
 {
     Curses_ShowMessage("'setup' command is not supported in Cursesmode");