|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T t
Length: 9474 (0x2502) Types: TextFile Names: »tty.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987 └─⟦this⟧ »EUUGD18/General/Scrabble/tty.c«
/* RCS Info: $Revision: 1.2 $ on $Date: 89/03/15 16:33:18 $ * $Source: /yew3/faustus/src/scrabble/RCS/tty.c,v $ * Copyright (c) 1989 Wayne A. Christopher, U. C. Berkeley CS Dept * faustus@renoir.berkeley.edu, ucbvax!faustus * Permission is granted to modify and re-distribute this code in any manner * as long as this notice is preserved. All standard disclaimers apply. * */ #ifdef MSDOS #include <curses.h> #include "scrabble.h" #else #include "scrabble.h" #include <curses.h> #undef bool #endif static WINDOW *boardwin, *scores, *summary, *dialog; #ifdef notdef static WINDOW *title; #endif static char lbchar[] = " `\"(<"; static char rbchar[] = " '\")>"; static int messline = 0; #define bpos(px, py, x, y) (px) = 3 * (x) + 4; (py) = (y) + 1; #define MESS_SIZE 5 #define beep() putc('\007', stderr); fflush(stderr); static char *help[] = { "Scrabble Version 1.0, by Wayne Christopher (faustus@renoir.Berkeley.EDU) ", " ", " The rules of the game are the same as those of the board game, and will ", " not be described here. The screen is divided up into a board area, ", " which the player can move around in, a status and score window to the ", " right, and a message window at the bottom. A star appears by the name ", " of the player whose turn it is, and if this is not a machine player the ", " commands below may be given. The commands H, V, Q, and T terminate the ", " player's turn, assuming the word is valid. ", " ", "Available commands are: ", " h, j, k, l : Move the cursor around the board. ", " H : Create a horizontal word at the cursor position. ", " V : Create a vertical word at the cursor position. ", " T : Trade in a number of tiles for new tiles. ", " S : Save the game into a file. ", " R : Restore a game from a file (loses the current game). ", " A : Ask for advice from the computer. ", " Q : Quit the game. ", " ^L : Redraw the screen. ", " ? : Print this help message. " } ; #ifdef _STDC_ void tty_init(board_t *board, player_t *players[], int numplayers) #else void tty_init(board, players, numplayers) board_t *board; player_t *players[]; int numplayers; #endif { int i, j; int x, y; initscr(); noecho(); crmode(); #ifdef notdef title = newwin(2, 80, 0, 0); #endif boardwin = newwin(17, 51, 0, 0); scores = newwin(9, 29, 3, 51); summary = newwin(3, 29, 14, 51); dialog = newwin(0, 80, 18, 0); #ifdef notdef /* Draw the title... */ wmove(title, 0, 7); wprintw(title, "Scrabble %s, by %s (%s)", VERSION, AUTHOR, ADDRESS); #endif /* Draw the board... top and bottom... */ for (i = 0; i < 15; i++) { wmove(boardwin, 0, 3 * i + 4); wprintw(boardwin, "%-2d", i); wmove(boardwin, 16, 3 * i + 4); wprintw(boardwin, "%-2d", i); } /* Left and right... */ for (i = 0; i < 15; i++) { wmove(boardwin, 1 + i, 0); wprintw(boardwin, "%2d", i); wmove(boardwin, 1 + i, 49); wprintw(boardwin, "%-2d", i); } for (i = 0; i < 15; i++) for (j = 0; j < 15; j++) { bpos(x, y, i, j); wmove(boardwin, y, x - 1); waddch(boardwin, lbchar[(int)board->bonus[j][i]]); wmove(boardwin, y, x); waddch(boardwin, '.'); wmove(boardwin, y, x + 1); waddch(boardwin, rbchar[(int)board->bonus[j][i]]); } /* Draw the scores display... */ wmove(scores, 0, 0); wprintw(scores, " Scrabble %s", VERSION); wmove(scores, 1, 0); wprintw(scores, " by %s", AUTHOR); wmove(scores, 3, 0); wprintw(scores, " Name Score Letters"); for (i = 0; i < numplayers; i++) tty_drawplayer(players[i], i, (i == 0) ? true : false); /* Draw the summary window. */ tty_drawsummary(board, 0); /* The dialog window is blank. */ wrefresh(boardwin); return; } #ifdef _STDC_ void tty_message(char *message) #else void tty_message(message) char *message; #endif { /* Print the message and clear the line below it. */ messline = (messline + 1) % MESS_SIZE; if (messline < MESS_SIZE - 1) { wmove(dialog, messline + 1, 0); wclrtoeol(dialog); } wmove(dialog, messline, 0); wclrtoeol(dialog); wprintw(dialog, "%s", message); wrefresh(dialog); return; } #ifdef _STDC_ char * tty_question(char *message) #else char * tty_question(message) char *message; #endif { static char buf[BSIZE]; tty_message(message); wmove(dialog, messline, strlen(message) + 1); wrefresh(dialog); echo(); nocrmode(); wgetstr(dialog, buf); crmode(); noecho(); return (buf); } #ifdef _STDC_ bool tty_confirm(char *message) #else bool tty_confirm(message) char *message; #endif { char c; tty_message(message); wmove(dialog, messline, strlen(message) + 1); wrefresh(dialog); c = wgetch(dialog); if ((c == 'y') || (c == 'Y')) return (true); else return (false); } /* Let the player move to a place in the board, type 'h' or 'v', then enter * a word. Other commands are 'T', 'S', 'R', 'Q', and '?'. */ #ifdef _STDC_ command_t tty_command(board_t *board, player_t *player, move_t *mv) #else command_t tty_command(board, player, mv) board_t *board; player_t *player; move_t *mv; #endif { int x = 7, y = 7; int px, py; bool horiz = false, done = false; char *word, buf[BSIZE]; char c; int i; for (;;) { bpos(px, py, x, y); wmove(boardwin, py, px); wrefresh(boardwin); c = wgetch(boardwin); switch (c) { case '\014': tty_update(); break; case 'h': if (x > 0) x--; else { beep(); } break; case 'j': if (y < SIZE - 1) y++; else { beep(); } break; case 'k': if (y > 0) y--; else { beep(); } break; case 'l': if (x < SIZE - 1) x++; else { beep(); } break; case 'H': horiz = true; done = true; break; case 'V': horiz = false; done = true; break; case 'T': return (TRADEIN); case 'S': return (SAVE); case 'R': return (RESTORE); case 'A': return (ADVICE); case 'Q': if (tty_confirm("Really quit?")) return (QUIT); else break; case '?': return (HELP); default: beep(); break; } if (done) break; } if (horiz) sprintf(buf, "Horiz word at (%d, %d):", x, y); else sprintf(buf, "Vert word at (%d, %d):", x, y); word = tty_question(buf); if (strlen(word) > SIZE) word[SIZE] = '\0'; mv->word = strsav(word); mv->x = x; mv->y = y; mv->length = strlen(word); mv->horiz = horiz; mv->points = 0; for (i = 0; i < SIZE; i++) mv->wild[i] = false; for (i = 0; i < mv->length; i++) { if (!isalpha(mv->word[i])) { tty_message("Invalid word."); return (NOTHING); } else if (isupper(mv->word[i])) { mv->word[i] = tolower(mv->word[i]); } } return (MOVE); } #ifdef _STDC_ void tty_drawplayer(player_t *player, int pos, bool up) #else void tty_drawplayer(player, pos, up) player_t *player; int pos; bool up; #endif { int i; wmove(scores, pos + 5, 0); wprintw(scores, " %c %-6.6s %3d ", up ? '*' : ' ', player->name, player->score); for (i = 0; i < player->numworking; i++) wprintw(scores, " %c", player->working[i]); wclrtoeol(scores); wmove(scores, pos + 5, 0); wrefresh(scores); return; } #ifdef _STDC_ void tty_drawsummary(board_t *board, int turn) #else void tty_drawsummary(board, turn) board_t *board; int turn; #endif { wmove(summary, 0, 0); wprintw(summary, " Game turn: %d ", turn); wmove(summary, 1, 0); wprintw(summary, " Tiles left: %d ", board->numleft); wrefresh(summary); return; } #ifdef _STDC_ void tty_drawmove(board_t *board, move_t *mv, player_t *player) #else void tty_drawmove(board, mv, player) board_t *board; move_t *mv; player_t *player; #endif { int i, x, y; char c; char buf[BSIZE]; for (i = 0; i < mv->length; i++) { c = mv->word[i]; if (!mv->wild[i]) c = toupper(c); if (mv->horiz) { bpos(x, y, mv->x + i, mv->y); } else { bpos(x, y, mv->x, mv->y + i); } assert((x >= 0) && (x < 51) && (y >= 0) && (y < 17)); wmove(boardwin, y, x); waddch(boardwin, c); } wrefresh(boardwin); sprintf(buf, "%s: \"%s\" at (%d, %d), %s, %d points.", player->name, mv->word, mv->x, mv->y, mv->horiz ? "horiz" : "vert", mv->points); tty_message(buf); return; } void tty_givehelp() { WINDOW *hwin = newwin(24, 80, 0, 0); int i; wclear(hwin); overwrite(hwin, stdscr); wrefresh(hwin); wrefresh(stdscr); for (i = 0; i < sizeof (help) / sizeof (help[0]); i++) { wmove(hwin, i, 0); wprintw(hwin, "%s", help[i]); } wmove(hwin, i + 1, 0); wprintw(hwin, "Hit return to continue..."); wrefresh(hwin); (void) wgetch(hwin); wclear(hwin); wrefresh(hwin); delwin(hwin); touchwin(boardwin); touchwin(scores); touchwin(summary); touchwin(dialog); tty_update(); return; } void tty_update() { wrefresh(boardwin); wrefresh(scores); wrefresh(summary); wrefresh(dialog); return; } void tty_cleanup() { move(23, 0); clrtoeol(); refresh(); endwin(); return; }