]> git.cameronkatri.com Git - bsdgames-darwin.git/blobdiff - gomoku/bdisp.c
Reset CVS keywords
[bsdgames-darwin.git] / gomoku / bdisp.c
index 522d92f1eab10c9d081ff5410cfb5e6ef9eb0a1d..db2e74a2235d03f813fd172eecb3150f85b5c872 100644 (file)
@@ -1,4 +1,4 @@
-/*     $NetBSD: bdisp.c,v 1.8 2003/08/07 09:37:16 agc Exp $    */
+/*     $NetBSD: bdisp.c,v 1.17 2014/03/22 18:58:57 dholland Exp $      */
 
 /*
  * Copyright (c) 1994
 #if 0
 static char sccsid[] = "@(#)bdisp.c    8.2 (Berkeley) 5/3/95";
 #else
-__RCSID("$NetBSD: bdisp.c,v 1.8 2003/08/07 09:37:16 agc Exp $");
+__RCSID("$NetBSD: bdisp.c,v 1.17 2014/03/22 18:58:57 dholland Exp $");
 #endif
 #endif /* not lint */
 
 #include <curses.h>
 #include <string.h>
+#include <stdlib.h>
+#include <err.h>
 #include "gomoku.h"
 
 #define        SCRNH           24              /* assume 24 lines for the moment */
@@ -51,33 +53,42 @@ __RCSID("$NetBSD: bdisp.c,v 1.8 2003/08/07 09:37:16 agc Exp $");
 static int     lastline;
 static char    pcolor[] = "*O.?";
 
-extern int interactive;
-extern char *plyr[];
-
 /*
  * Initialize screen display.
  */
 void
-cursinit()
+cursinit(void)
 {
 
-       initscr();
+       if (!initscr()) {
+               errx(EXIT_FAILURE, "Couldn't initialize screen");
+       }
+       if ((LINES < SCRNH) || (COLS < SCRNW)) {
+               errx(EXIT_FAILURE, "Screen too small (need %d%xd)",
+                   SCRNW, SCRNH);
+       }
+       keypad(stdscr, TRUE);
+       nonl();
        noecho();
        cbreak();
-       leaveok(stdscr, TRUE);
+       leaveok(stdscr, FALSE);
+
+#if 0 /* no mouse support in netbsd curses yet */
+       mousemask(BUTTON1_CLICKED, NULL);
+#endif
 }
 
 /*
  * Restore screen display.
  */
 void
-cursfini()
+cursfini(void)
 {
 
-       leaveok(stdscr, FALSE);
-       move(23, 0);
+       move(BSZ4, 0);
        clrtoeol();
        refresh();
+       echo();
        endwin();
 }
 
@@ -85,7 +96,7 @@ cursfini()
  * Initialize board display.
  */
 void
-bdisp_init()
+bdisp_init(void)
 {
        int i, j;
 
@@ -117,21 +128,30 @@ bdisp_init()
  * Update who is playing whom.
  */
 void
-bdwho(update)
-       int update;
+bdwho(int update)
 {
-       int i;
+       int i, j;
 
        move(21, 0);
-       clrtoeol();
-       i = 6 - strlen(plyr[BLACK]) / 2;
-       move(21, i > 0 ? i : 0);
-       printw("BLACK/%s", plyr[BLACK]);
-       i = 30 - strlen(plyr[WHITE]) / 2;
-       move(21, i);
-       printw("WHITE/%s", plyr[WHITE]);
-       move(21, 19);
-       addstr(" vs. ");
+        printw("                                              ");
+       i = strlen(plyr[BLACK]);
+       j = strlen(plyr[WHITE]);
+       if (i + j <= 20) {
+               move(21, 10 - (i+j)/2);
+               printw("BLACK/%s (*) vs. WHITE/%s (O)",
+                   plyr[BLACK], plyr[WHITE]);
+       } else {
+               move(21, 0);
+               if (i <= 10) {
+                       j = 20 - i;
+               } else if (j <= 10) {
+                       i = 20 - j;
+               } else {
+                       i = j = 10;
+               }
+               printw("BLACK/%.*s (*) vs. WHITE/%.*s (O)",
+                   i, plyr[BLACK], j, plyr[WHITE]);
+       }
        if (update)
                refresh();
 }
@@ -140,7 +160,7 @@ bdwho(update)
  * Update the board display after a move.
  */
 void
-bdisp()
+bdisp(void)
 {
        int i, j, c;
        struct spotstr *sp;
@@ -150,9 +170,9 @@ bdisp()
                        move(BSZ1 - j, 2 * i + 1);
                        sp = &board[i + j * BSZ1];
                        if (debug > 1 && sp->s_occ == EMPTY) {
-                               if (sp->s_flg & IFLAGALL)
+                               if (sp->s_flags & IFLAGALL)
                                        c = '+';
-                               else if (sp->s_flg & CFLAGALL)
+                               else if (sp->s_flags & CFLAGALL)
                                        c = '-';
                                else
                                        c = '.';
@@ -169,8 +189,7 @@ bdisp()
  * Dump board display to a file.
  */
 void
-bdump(fp)
-       FILE *fp;
+bdump(FILE *fp)
 {
        int i, j, c;
        struct spotstr *sp;
@@ -184,9 +203,9 @@ bdump(fp)
                for (i = 1; i < BSZ1; i++) {
                        sp = &board[i + j * BSZ1];
                        if (debug > 1 && sp->s_occ == EMPTY) {
-                               if (sp->s_flg & IFLAGALL)
+                               if (sp->s_flags & IFLAGALL)
                                        c = '+';
-                               else if (sp->s_flg & CFLAGALL)
+                               else if (sp->s_flags & CFLAGALL)
                                        c = '-';
                                else
                                        c = '.';
@@ -208,18 +227,17 @@ bdump(fp)
  * Display a transcript entry
  */
 void
-dislog(str)
-       const char *str;
+dislog(const char *str)
 {
 
        if (++lastline >= SCRNH - 1) {
                /* move 'em up */
                lastline = 1;
        }
-       move(lastline, 46);
-       addnstr(str, SCRNW - 46 - 1);
+       move(lastline, TRANSCRIPT_COL);
+       addnstr(str, SCRNW - TRANSCRIPT_COL - 1);
        clrtoeol();
-       move(lastline + 1, 46);
+       move(lastline + 1, TRANSCRIPT_COL);
        clrtoeol();
 }
 
@@ -228,22 +246,37 @@ dislog(str)
  */
 
 void
-ask(str)
-       const char *str;
+ask(const char *str)
 {
        int len = strlen(str);
 
-       move(23, 0);
+       move(BSZ4, 0);
        addstr(str);
        clrtoeol();
-       move(23, len);
+       move(BSZ4, len);
        refresh();
 }
 
 int
-getline(buf, size)
-       char *buf;
-       int size;
+get_key(const char *allowed)
+{
+       int ch;
+
+       while (1) {
+               ch = getch();
+               if (allowed != NULL &&
+                   ch != '\0' && strchr(allowed, ch) == NULL) {
+                       beep();
+                       refresh();
+                       continue;
+               }
+               break;
+       }
+       return ch;
+}
+
+int
+get_line(char *buf, int size)
 {
        char *cp, *end;
        int c;
@@ -286,3 +319,148 @@ getline(buf, size)
        *cp = '\0';
        return(c != EOF);
 }
+
+/*
+ * Decent (n)curses interface for the game, based on Eric S. Raymond's
+ * modifications to the battleship (bs) user interface.
+ */
+int
+get_coord(void)
+{
+       static int curx = BSZ / 2;
+       static int cury = BSZ / 2;
+       int ny, nx, ch;
+
+       BGOTO(cury, curx);
+       refresh();
+       nx = curx;
+       ny = cury;
+       for (;;) {
+               mvprintw(BSZ3, (BSZ -6)/2, "(%c %d) ", 
+                               'A'+ ((curx > 7) ? (curx+1) : curx), cury + 1);
+               BGOTO(cury, curx);
+
+               ch = getch();
+               switch (ch) {
+               case 'k':
+               case '8':
+               case KEY_UP:
+                       nx = curx;
+                       ny = cury + 1;
+                       break;
+               case 'j':
+               case '2':
+               case KEY_DOWN:
+                       nx = curx;
+                       ny = BSZ + cury - 1;
+                       break;
+               case 'h':
+               case '4':
+               case KEY_LEFT:
+                       nx = BSZ + curx - 1;
+                       ny = cury;
+                       break;
+               case 'l':
+               case '6':
+               case KEY_RIGHT:
+                       nx = curx + 1;
+                       ny = cury;
+                       break;
+               case 'y':
+               case '7':
+               case KEY_A1:
+                       nx = BSZ + curx - 1;
+                       ny = cury + 1;
+                       break;
+               case 'b':
+               case '1':
+               case KEY_C1:
+                       nx = BSZ + curx - 1;
+                       ny = BSZ + cury - 1;
+                       break;
+               case 'u':
+               case '9':
+               case KEY_A3:
+                       nx = curx + 1;
+                       ny = cury + 1;
+                       break;
+               case 'n':
+               case '3':
+               case KEY_C3:
+                       nx = curx + 1;
+                       ny = BSZ + cury - 1;
+                       break;
+               case 'K':
+                       nx = curx;
+                       ny = cury + 5;
+                       break;
+               case 'J':
+                       nx = curx;
+                       ny = BSZ + cury - 5;
+                       break;
+               case 'H':
+                       nx = BSZ + curx - 5;
+                       ny = cury;
+                       break;
+               case 'L':
+                       nx = curx + 5;
+                       ny = cury;
+                       break;
+               case 'Y':
+                       nx = BSZ + curx - 5;
+                       ny = cury + 5;
+                       break;
+               case 'B':
+                       nx = BSZ + curx - 5;
+                       ny = BSZ + cury - 5;
+                       break;
+               case 'U':
+                       nx = curx + 5;
+                       ny = cury + 5;
+                       break;
+               case 'N':
+                       nx = curx + 5;
+                       ny = BSZ + cury - 5;
+                       break;
+               case '\f':
+                       nx = curx;
+                       ny = cury;
+                       (void)clearok(stdscr, TRUE);
+                       (void)refresh();
+                       break;
+#if 0 /* notyet */
+               case KEY_MOUSE:
+               {
+                       MEVENT  myevent;
+
+                       getmouse(&myevent);
+                       if (myevent.y >= 1 && myevent.y <= BSZ1 &&
+                           myevent.x >= 3 && myevent.x <= (2 * BSZ + 1)) {
+                               curx = (myevent.x - 3) / 2;
+                               cury = BSZ - myevent.y;
+                               return PT(curx,cury);
+                       } else {
+                               beep();
+                       }
+               }
+               break;
+#endif /* 0 */
+               case 'Q':
+               case 'q':
+                       return RESIGN;
+                       break;
+               case 'S':
+               case 's':
+                       return SAVE;
+                       break;
+               case ' ':
+               case '\r':
+                       (void) mvaddstr(BSZ3, (BSZ -6)/2, "      ");
+                       return PT(curx+1,cury+1);
+                       break;
+       }
+
+       curx = nx % BSZ;
+       cury = ny % BSZ;
+    }
+}