X-Git-Url: https://git.cameronkatri.com/bsdgames-darwin.git/blobdiff_plain/f12b51f99bbe8bb6ad7eca12b047ba9b46836ee6..cd6a6786a83c6ffc71841f4c49e6192f2296b2a1:/gomoku/bdisp.c diff --git a/gomoku/bdisp.c b/gomoku/bdisp.c index 522d92f1..db2e74a2 100644 --- a/gomoku/bdisp.c +++ b/gomoku/bdisp.c @@ -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 @@ -37,12 +37,14 @@ #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 #include +#include +#include #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; + } +}