diff options
author | Paul Janzen <pjanzen@cvs.openbsd.org> | 2001-02-18 16:03:04 +0000 |
---|---|---|
committer | Paul Janzen <pjanzen@cvs.openbsd.org> | 2001-02-18 16:03:04 +0000 |
commit | 86ce38fde654099562e79e314e9fdd1c4f486918 (patch) | |
tree | 01cf95effc69d46d8c10e8e1a291c6c950ce104e | |
parent | 8642ba18a7e9c8007d8e6b20a3146da4bd26ec52 (diff) |
Convert to curses and tidy some. Generally based on NetBSD changes.
-rw-r--r-- | games/snake/Makefile | 4 | ||||
-rw-r--r-- | games/snake/move.c | 703 | ||||
-rw-r--r-- | games/snake/snake.6 | 6 | ||||
-rw-r--r-- | games/snake/snake.c | 438 | ||||
-rw-r--r-- | games/snake/snake.h | 150 | ||||
-rw-r--r-- | games/snake/snscore.c | 6 |
6 files changed, 242 insertions, 1065 deletions
diff --git a/games/snake/Makefile b/games/snake/Makefile index 341d41dabfb..661db7573e8 100644 --- a/games/snake/Makefile +++ b/games/snake/Makefile @@ -1,8 +1,8 @@ -# $OpenBSD: Makefile,v 1.4 2000/04/25 16:51:18 espie Exp $ +# $OpenBSD: Makefile,v 1.5 2001/02/18 16:03:01 pjanzen Exp $ # @(#)Makefile 8.1 (Berkeley) 5/31/93 PROG= snake -SRCS= snake.c move.c snscore.c +SRCS= snake.c snscore.c MAN= snake.6 DPADD= ${LIBM} ${LIBCURSES} LDADD= -lm -lcurses diff --git a/games/snake/move.c b/games/snake/move.c deleted file mode 100644 index ecf8c55d833..00000000000 --- a/games/snake/move.c +++ /dev/null @@ -1,703 +0,0 @@ -/* $OpenBSD: move.c,v 1.2 2000/04/21 03:10:31 pjanzen Exp $ */ -/* $NetBSD: move.c,v 1.12 1996/05/19 20:22:09 pk Exp $ */ - -/* - * Copyright (c) 1980, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -#ifndef lint -#if 0 -static char sccsid[] = "@(#)move.c 8.1 (Berkeley) 7/19/93"; -#else -static char rcsid[] = "$OpenBSD: move.c,v 1.2 2000/04/21 03:10:31 pjanzen Exp $"; -#endif -#endif /* not lint */ - -/************************************************************************* - * - * MOVE LIBRARY - * - * This set of subroutines moves a cursor to a predefined - * location, independent of the terminal type. If the - * terminal has an addressable cursor, it uses it. If - * not, it optimizes for tabs (currently) even if you don't - * have them. - * - * At all times the current address of the cursor must be maintained, - * and that is available as structure cursor. - * - * The following calls are allowed: - * move(sp) move to point sp. - * up() move up one line. - * down() move down one line. - * bs() move left one space (except column 0). - * nd() move right one space(no write). - * clear() clear screen. - * home() home. - * ll() move to lower left corner of screen. - * cr() carriage return (no line feed). - * pr() just like standard printf, but keeps track - * of cursor position. (Uses pstring). - * apr() same as printf, but first argument is &point. - * (Uses pstring). - * pstring(s) output the string of printing characters. - * However, '\r' is interpreted to mean return - * to column of origination AND do linefeed. - * '\n' causes <cr><lf>. - * putpad(str) calls tputs to output character with proper - * padding. - * outch() the output routine for a character used by - * tputs. It just calls putchar. - * pch(ch) output character to screen and update - * cursor address (must be a standard - * printing character). WILL SCROLL. - * pchar(ps,ch) prints one character if it is on the - * screen at the specified location; - * otherwise, dumps it.(no wrap-around). - * - * getcap() initializes strings for later calls. - * cap(string) outputs the string designated in the terminfo - * data base. (Should not move the cursor.) - * - * cook() returns the terminal to initial state. - * - * point(&p,x,y) return point set to x,y. - * - * delay(t) causes an approximately constant delay - * independent of baudrate. - * Duration is ~ t/20 seconds. - * - ******************************************************************************/ - -#ifdef __STDC__ -#include <stdarg.h> -#else -#include <varargs.h> -#endif -#include <err.h> -#include <stdlib.h> -#include <term.h> -#include <unistd.h> -#include "snake.h" - -int CMlength; -int NDlength; -int BSlength; -int delaystr[10]; -speed_t ospeed; - -static char str[80]; - -void -move(sp) - struct point *sp; -{ - int distance; - int tabcol, ct; - struct point z; - - if (sp->line < 0 || sp->col < 0 || sp->col > COLUMNS) { - pr("move to [%d,%d]?", sp->line, sp->col); - return; - } - if (sp->line >= LINES) { - move(point(&z, sp->col, LINES - 1)); - while (sp->line-- >= LINES) - putchar('\n'); - return; - } - - if (CM != 0) { - char *cmstr = tgoto(CM, sp->col, sp->line); - - CMlength = strlen(cmstr); - if (cursor.line == sp->line) { - distance = sp->col - cursor.col; - if (distance == 0) - return; /* Already there! */ - if (distance > 0) { /* Moving to the right */ - if (distance * NDlength < CMlength) { - right(sp); - return; - } - if (TA) { - ct = sp->col & 7; - tabcol = (cursor.col | 7) + 1; - do { - ct++; - tabcol = (tabcol | 7) + 1; - } - while (tabcol < sp->col); - if (ct<CMlength) { - right(sp); - return; - } - } - } else { /* Moving to the left */ - if (-distance * BSlength < CMlength) { - gto(sp); - return; - } - } - if (sp->col < CMlength) { - cr(); - right(sp); - return; - } - /* No more optimizations on same row. */ - } - distance = sp->col - cursor.col; - distance = distance > 0 ? - distance * NDlength : -distance * BSlength; - if (distance < 0) - pr("ERROR: distance is negative: %d", distance); - distance += abs(sp->line - cursor.line); - if (distance >= CMlength) { - putpad(cmstr); - cursor.line = sp->line; - cursor.col = sp->col; - return; - } - } - /* - * If we get here we have a terminal that can't cursor - * address but has local motions or one which can cursor - * address but can get there quicker with local motions. - */ - gto(sp); -} - -void -gto(sp) - struct point *sp; -{ - int distance, f, tfield; - - if (cursor.line > LINES || cursor.line <0 || - cursor.col <0 || cursor.col > COLUMNS) - pr("ERROR: cursor is at %d,%d\n", cursor.line, cursor.col); - if (sp->line > LINES || sp->line < 0 || sp->col < 0 || sp->col > COLUMNS) - pr("ERROR: target is %d,%d\n", sp->line, sp->col); - tfield = (sp->col) >> 3; - if (sp->line == cursor.line) { - if (sp->col > cursor.col) - right(sp); - else { - distance = (cursor.col - sp->col) * BSlength; - if (((TA) && (distance > tfield + ((sp->col) & 7) * NDlength)) || - (((cursor.col)*NDlength) < distance)) { - cr(); - right(sp); - } else { - while(cursor.col > sp->col) - bs(); - } - } - return; - } - /*must change row */ - if (cursor.col - sp->col > (cursor.col >> 3)) { - if (cursor.col == 0) - f = 0; - else - f = -1; - } - else f = cursor.col >> 3; - if (((sp->line << 1) + 1 < cursor.line - f) && (HO != 0)) { - /* - * home quicker than rlf: - * (sp->line + f > cursor.line - sp->line) - */ - putpad(HO); - cursor.col = cursor.line = 0; - gto(sp); - return; - } - if (((sp->line << 1) > cursor.line + LINES + 1 + f) && (LL != 0)) { - /* home,rlf quicker than lf - * (LINES+1 - sp->line + f < sp->line - cursor.line) - */ - if (cursor.line > f + 1) { - /* is home faster than wraparound lf? - * (cursor.line + 20 - sp->line > 21 - sp->line + f) - */ - ll(); - gto(sp); - return; - } - } - if ((LL != 0) && (sp->line > cursor.line + (LINES >> 1) - 1)) - cursor.line += LINES; - while(sp->line > cursor.line) - down(); - while(sp->line < cursor.line) - up(); - gto(sp); /*can recurse since cursor.line = sp->line */ -} - -void -right(sp) - struct point *sp; -{ - int field, tfield; - int tabcol, strlength; - - if (sp->col < cursor.col) - pr("ERROR:right() can't move left\n"); - if (TA) { /* If No Tabs: can't send tabs because ttydrive - * loses count with control characters. - */ - field = cursor.col >> 3; -/* - * This code is useful for a terminal which wraps around on backspaces. - * (Mine does.) Unfortunately, this is not specified in terminfo, and - * most terminals don't work that way. (Of course, most terminals - * have addressible cursors, too). - */ - if (BW && (CM == 0) && - ((sp->col << 1) - field > (COLUMNS - 8) << 1 )) { - if (cursor.line == 0) - outch('\n'); - outch('\r'); - cursor.col = COLUMNS + 1; - while (cursor.col > sp->col) - bs(); - if (cursor.line != 0) - outch('\n'); - return; - } - tfield = sp->col >> 3; - - while (field < tfield) { - putpad(TA); - cursor.col = ++field << 3; - } - tabcol = (cursor.col | 7) + 1; - strlength = (tabcol - sp->col) * BSlength + 1; - /* length of sequence to overshoot */ - if (((sp->col - cursor.col) * NDlength > strlength) && - (tabcol < COLUMNS) - ){ - /* Tab past and backup */ - putpad(TA); - cursor.col = (cursor.col | 7) + 1; - while(cursor.col > sp->col) - bs(); - } - } - while (sp->col > cursor.col) { - nd(); - } -} - -void -cr() -{ - outch('\r'); - cursor.col = 0; -} - -void -clear() -{ - int i; - - if (CL){ - putpad(CL); - cursor.col = cursor.line = 0; - } else { - for(i=0; i<LINES; i++) { - putchar('\n'); - } - cursor.line = LINES - 1; - home(); - } -} - -void -home() -{ - struct point z; - - if (HO != 0) { - putpad(HO); - cursor.col = cursor.line = 0; - return; - } - z.col = z.line = 0; - move(&z); -} - -void -ll() -{ - int l; - struct point z; - - l = lcnt + 2; - if (LL != NULL && LINES == l) { - putpad(LL); - cursor.line = LINES - 1; - cursor.col = 0; - return; - } - z.col = 0; - z.line = l - 1; - move(&z); -} - -void -up() -{ - putpad(UP); - cursor.line--; -} - -void -down() -{ - putpad(DO); - cursor.line++; - if (cursor.line >= LINES) - cursor.line = LINES - 1; -} - -void -bs() -{ - if (cursor.col > 0) { - putpad(BS); - cursor.col--; - } -} - -void -nd() -{ - putpad(ND); - cursor.col++; - if (cursor.col == COLUMNS + 1) { - cursor.line++; - cursor.col = 0; - if (cursor.line >= LINES) - cursor.line = LINES - 1; - } -} - -void -pch(c) - int c; -{ - outch(c); - if(++cursor.col >= COLUMNS && AM) { - cursor.col = 0; - ++cursor.line; - } -} - -void -#ifdef __STDC__ -apr(struct point *ps, const char *fmt, ...) -#else -apr(ps, fmt, va_alist) - struct point *ps; - char *fmt; - va_dcl -#endif -{ - struct point p; - va_list ap; - - p.line = ps->line + 1; - p.col = ps->col + 1; - move(&p); -#ifdef __STDC__ - va_start(ap, fmt); -#else - va_start(ap); -#endif - (void)vsprintf(str, fmt, ap); - va_end(ap); - pstring(str); -} - -void -#ifdef __STDC__ -pr(const char *fmt, ...) -#else -pr(fmt, va_alist) - char *fmt; - va_dcl -#endif -{ - va_list ap; - -#ifdef __STDC__ - va_start(ap, fmt); -#else - va_start(ap); -#endif - (void)vsprintf(str, fmt, ap); - va_end(ap); - pstring(str); -} - -void -pstring(s) - const char *s; -{ - struct point z; - int stcol; - - stcol = cursor.col; - while (s[0] != '\0') { - switch (s[0]) { - case '\n': - move(point(&z, 0, cursor.line + 1)); - break; - case '\r': - move(point(&z, stcol, cursor.line + 1)); - break; - case '\t': - z.col = (((cursor.col + 8) >> 3) << 3); - z.line = cursor.line; - move(&z); - break; - case '\b': - bs(); - break; - case CTRL('g'): - outch(CTRL('g')); - break; - default: - if (s[0] < ' ') - break; - pch(s[0]); - } - s++; - } -} - -void -pchar(ps,ch) - struct point *ps; - char ch; -{ - struct point p; - - p.col = ps->col + 1; - p.line = ps->line + 1; - if ((p.col >= 0) && (p.line >= 0) && - (((p.line < LINES) && (p.col < COLUMNS)) || - ((p.col == COLUMNS) && (p.line < LINES-1)))) { - move(&p); - pch(ch); - } -} - -int -outch(c) - int c; -{ - putchar(c); - return(0); -} - -void -putpad(str) - char *str; -{ - if (str) - tputs(str, 1, outch); -} - -void -delay(t) - int t; -{ - useconds_t us; - /* This can't depend on terminal timing in light of X */ - - us = t * 50000; /* From units of 1/20 s */ - usleep(us); -} - -void -cook() -{ - delay(1); - putpad(TE); - putpad(KE); - putpad(VE); - fflush(stdout); - tcsetattr(0, TCSADRAIN, &orig); -} - -void -raw() -{ - tcsetattr(0, TCSADRAIN, &new); - putpad(VI); -} - -struct point * -point(ps, x, y) - struct point *ps; - int x, y; -{ - ps->col = x; - ps->line = y; - return(ps); -} - -void -getcap() -{ - char *ap; - char *term; - char *xPC; -#ifdef TIOCGWINSZ - struct winsize win; -#endif - - term = getenv("TERM"); - if (term == 0) - errx(1, "No TERM in environment"); - switch (tgetent(tbuf, term)) { - case -1: - errx(2, "Cannot open terminfo file"); - case 0: - errx(3, "unknown terminal `%s'", term); - } - - ap = tcapbuf; - -#ifdef TIOCGWINSZ - if (ioctl(0, TIOCGWINSZ, (char *) &win) < 0 || - (LINES = win.ws_row) == 0 || (COLUMNS = win.ws_col) == 0) { -#endif - LINES = tgetnum("li"); - COLUMNS = tgetnum("co"); -#ifdef TIOCGWINSZ - } -#endif - if (!lcnt) - lcnt = LINES - 2; - if (!ccnt) - ccnt = COLUMNS - 3; - /* make sure user didn't specify a screen larger than he has */ - if (lcnt > LINES - 2) - lcnt = LINES - 2; - if (ccnt > COLUMNS - 3) - ccnt = COLUMNS - 3; - - AM = tgetflag("am"); - BW = tgetflag("bw"); - - ND = tgetstr("nd", &ap); - UP = tgetstr("up", &ap); - - DO = tgetstr("do", &ap); - if (DO == 0) - DO = "\n"; - - BS = tgetstr("le", &ap); - if (BS == 0) { - /* try using obsolete capabilities */ - BS = tgetstr("bc", &ap); - if (BS == 0 && tgetflag("bs")) - BS = "\b"; - } - TA = tgetstr("ta", &ap); - if (TA == 0 && tgetflag("pt")) - TA = "\t"; - - HO = tgetstr("ho", &ap); - CL = tgetstr("cl", &ap); - CM = tgetstr("cm", &ap); - LL = tgetstr("ll", &ap); - - KL = tgetstr("kl", &ap); - KR = tgetstr("kr", &ap); - KU = tgetstr("ku", &ap); - KD = tgetstr("kd", &ap); - if (KL && KR && KU && KD) - Klength = strlen(KL); - else - Klength = 0; - /* NOTE: If KL, KR, KU, and KD are not - * all the same length, some problems - * may arise, since tests are made on - * all of them together. - */ - - TI = tgetstr("ti", &ap); - TE = tgetstr("te", &ap); - KS = tgetstr("ks", &ap); - KE = tgetstr("ke", &ap); - VE = tgetstr("ve", &ap); - VI = tgetstr("vi", &ap); - - xPC = tgetstr("pc", &ap); - if (xPC) - PC = *xPC; - - if ((CM == 0) && - (HO == 0 || UP == 0 || BS == 0 || ND == 0)) - errx(5, "Terminal must have addressable cursor or home + 4 local motions"); - if (ND == 0) - errx(5, "Terminal must have `nd' capability"); - NDlength = strlen(ND); - if (BS == 0) - errx(5, "Terminal must have `le' or `bs' or `bc' capability"); - BSlength = strlen(BS); - if (tgetflag("os")) - errx(5, "Terminal must not overstrike"); - if (LINES <= 0 || COLUMNS <= 0) - errx(5, "Must know the screen size"); - - tcgetattr(0, &orig); - new = orig; - new.c_lflag &= ~(ECHO | ICANON); - new.c_oflag &= ~(ONLCR | OXTABS); - signal(SIGINT, stop); - ospeed = cfgetospeed(&orig); - new.c_cc[VSUSP] = _POSIX_VDISABLE; - new.c_cc[VDSUSP] = _POSIX_VDISABLE; - raw(); - - if (orig.c_oflag & OXTABS) - TA=0; - putpad(KS); - putpad(TI); - point(&cursor, 0, LINES - 1); -} diff --git a/games/snake/snake.6 b/games/snake/snake.6 index 2bb54b9041f..c1a719d178a 100644 --- a/games/snake/snake.6 +++ b/games/snake/snake.6 @@ -1,4 +1,4 @@ -.\" $OpenBSD: snake.6,v 1.3 1999/10/29 04:02:48 pjanzen Exp $ +.\" $OpenBSD: snake.6,v 1.4 2001/02/18 16:03:02 pjanzen Exp $ .\" $NetBSD: snake.6,v 1.5 1995/04/22 08:34:35 cgd Exp $ .\" .\" Copyright (c) 1980, 1993 @@ -46,6 +46,7 @@ .Op Fl w Ar width .Op Fl l Ar length .Op Fl s +.Op Fl t .br .Nm snscore .Sh DESCRIPTION @@ -61,6 +62,9 @@ By default the entire screen (except for the last column) is used. The .Fl s option shows all scores. +The +.Fl t +option makes the game assume you are on a slow terminal. .Pp You are represented on the screen by an I. The snake is 6 squares long and is represented by s's with an S at the head. diff --git a/games/snake/snake.c b/games/snake/snake.c index 43a803a7a0c..d5a774055a6 100644 --- a/games/snake/snake.c +++ b/games/snake/snake.c @@ -1,4 +1,4 @@ -/* $OpenBSD: snake.c,v 1.2 1999/04/20 23:01:12 pjanzen Exp $ */ +/* $OpenBSD: snake.c,v 1.3 2001/02/18 16:03:02 pjanzen Exp $ */ /* $NetBSD: snake.c,v 1.8 1995/04/29 00:06:41 mycroft Exp $ */ /* @@ -44,7 +44,7 @@ static char copyright[] = #if 0 static char sccsid[] = "@(#)snake.c 8.2 (Berkeley) 1/7/94"; #else -static char rcsid[] = "$OpenBSD: snake.c,v 1.2 1999/04/20 23:01:12 pjanzen Exp $"; +static char rcsid[] = "$OpenBSD: snake.c,v 1.3 2001/02/18 16:03:02 pjanzen Exp $"; #endif #endif /* not lint */ @@ -56,42 +56,97 @@ static char rcsid[] = "$OpenBSD: snake.c,v 1.2 1999/04/20 23:01:12 pjanzen Exp $ * arrow keys. You can leave at the exit any time. * * compile as follows: - * cc -O snake.c move.c -o snake -lm -ltermlib + * cc -O snake.c move.c -o snake -lm -lcurses */ #include <sys/param.h> +#include <sys/types.h> +#include <sys/ioctl.h> -#include <errno.h> +#include <curses.h> +#include <err.h> #include <fcntl.h> +#include <math.h> #include <pwd.h> +#include <signal.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <termios.h> #include <time.h> #include <unistd.h> -#include "snake.h" #include "pathnames.h" +#ifdef DEBUG +#define cashvalue (loot-penalty)/25 +#else +#define cashvalue chunk*(loot-penalty)/25 +#endif + +struct point { + int col, line; +}; + +#define same(s1, s2) ((s1)->line == (s2)->line && (s1)->col == (s2)->col) + +#define PENALTY 10 /* % penalty for invoking spacewarp */ + +#define ME 'I' +#define SNAKEHEAD 'S' +#define SNAKETAIL 's' +#define TREASURE '$' +#define GOAL '#' + +#define TOPN 3 /* top scores to print if you lose */ + +#define pchar(point, c) mvaddch((point)->line + 1, (point)->col + 1, (c)) +/* Can't use terminal timing to do delay, in light of X */ +#define delay(t) usleep((t) * 50000) +/* Delay units are 1/20 s */ + struct point you; struct point money; struct point finish; struct point snake[6]; int loot, penalty; -int long tl, tm=0L; int moves; -char stri[BSIZE]; -char *p; -char ch, savec; -char *kl, *kr, *ku, *kd; -int fast=1; -int repeat=1; -time_t tv; -char *tn; +int fast = 1; int rawscores; #ifdef LOGGING FILE *logfile; #endif +int lcnt, ccnt; /* user's idea of screen size */ +int chunk; /* amount of money given at a time */ + +void snscore __P((int, int)); + +void chase __P((struct point *, struct point *)); +int chk __P((struct point *)); +void drawbox __P((void)); +void length __P((int)); +void mainloop __P((void)); +int post __P((int, int)); +int pushsnake __P((void)); +void setup __P((void)); +void snrand __P((struct point *)); +void snap __P((void)); +void spacewarp __P((int)); +void stop __P((int)); +int stretch __P((struct point *)); +void surround __P((struct point *)); +void suspend __P((void)); +void win __P((struct point *)); +void winnings __P((int)); + +#ifdef LOGGING +void logit __P((char *)); +#endif + + int main(argc, argv) int argc; @@ -99,6 +154,7 @@ main(argc, argv) { int ch, i; char *p, **av; + time_t tv; /* don't create the score file if it doesn't exist. */ rawscores = open(_PATH_RAWSCORES, O_RDWR, 0664); @@ -111,7 +167,6 @@ main(argc, argv) setgid(getgid()); (void)time(&tv); - srandom((int)tv); /* check to see if we were called as snscore */ av = argv; @@ -123,7 +178,7 @@ main(argc, argv) exit(0); } - while ((ch = getopt(argc, argv, "hl:sw:")) != -1) + while ((ch = getopt(argc, argv, "hl:stw:")) != -1) switch ((char)ch) { #if 0 case 'd': @@ -140,6 +195,9 @@ main(argc, argv) snscore(rawscores, 0); exit(0); break; + case 't': /* slow terminal */ + fast = 0; + break; case '?': case 'h': default: @@ -148,12 +206,24 @@ main(argc, argv) exit(1); } + srandom((int)tv); penalty = loot = 0; - getcap(); + initscr(); +#ifdef KEY_LEFT + keypad(stdscr, TRUE); +#endif + nonl(); + cbreak(); + noecho(); + + if (!lcnt || lcnt > LINES - 2) + lcnt = LINES - 2; + if (!ccnt || ccnt > COLS - 3) + ccnt = COLS - 3; i = MIN(lcnt, ccnt); if (i < 4) { - cook(); + endwin(); errx(1, "screen too small for a fair game."); } /* @@ -181,16 +251,12 @@ main(argc, argv) chunk = (675.0 / (i + 6)) + 2.5; /* min screen edge */ signal(SIGINT, stop); - putpad(TI); /* String to begin programs that use cm */ - putpad(KS); /* Put terminal in keypad transmit mode */ snrand(&finish); snrand(&you); snrand(&money); snrand(&snake[0]); - if (ospeed < 9600 || ((!CM) && (!TA))) - fast = 0; for (i = 1; i < 6; i++) chase(&snake[i], &snake[i - 1]); setup(); @@ -203,79 +269,37 @@ main(argc, argv) void mainloop() { - int j, k; - int c, match, lastc = 0; - struct point tmp; + int k; + int c, lastc = 0; + int repeat = 1; for (;;) { - tmp.col = you.col + 1; - tmp.line = you.line + 1; /* Highlight you, not left & above */ - move(&tmp); - fflush(stdout); - if (((c = getchar() & 0177) <= '9') && (c >= '0')) { - ungetc(c, stdin); - j = scanf("%d", &repeat); - c = getchar() & 0177; + /* Highlight you, not left & above */ + move(you.line + 1, you.col + 1); + refresh(); + if (((c = getch()) <= '9') && (c >= '0')) { + repeat = c - '0'; + while (((c = getch()) <= '9') && (c >= '0')) + repeat = 10 * repeat + (c - '0'); } else { if (c != '.') repeat = 1; } if (c == '.') c = lastc; - if ((Klength > 0) && - (c == *KL || c == *KR || c == *KU || c == *KD)) { - savec = c; - match = 0; - kl = KL; - kr = KR; - ku = KU; - kd = KD; - for (j = Klength; j > 0; j--) { - if (match != 1) { - match = 0; - if (*kl++ == c) { - ch = 'h'; - match++; - } - if (*kr++ == c) { - ch = 'l'; - match++; - } - if (*ku++ == c) { - ch = 'k'; - match++; - } - if (*kd++ == c) { - ch = 'j'; - match++; - } - if (match == 0) { - ungetc(c, stdin); - ch = savec; - /* Oops! - * This works if we figure it out on second character. - */ - break; - } - } - savec = c; - if (j != 1) - c = getchar() & 0177; - } - c = ch; - } if (!fast) - flushi(); + flushinp(); lastc = c; + switch (c) { case CTRL('z'): suspend(); continue; - case EOT: + case '\044': case 'x': case 0177: /* del or end of file */ - ll(); - cook(); + case ERR: + endwin(); length(moves); #ifdef LOGGING logit("quit"); @@ -329,54 +353,71 @@ mainloop() c = 'j'; break; } - for(k = 1; k <= repeat; k++) { + for (k = 1; k <= repeat; k++) { moves++; switch (c) { case 's': case 'h': +#ifdef KEY_LEFT + case KEY_LEFT: +#endif case '\b': - if (you.col >0) { + if (you.col > 0) { if ((fast) || (k == 1)) - pchar(&you,' '); + pchar(&you, ' '); you.col--; - if ((fast) || (k == repeat) || (you.col == 0)) - pchar(&you,ME); + if ((fast) || (k == repeat) || + (you.col == 0)) + pchar(&you, ME); } break; case 'f': case 'l': +#ifdef KEY_RIGHT + case KEY_RIGHT: +#endif case ' ': - if (you.col < ccnt-1) { + if (you.col < ccnt - 1) { if ((fast) || (k == 1)) pchar(&you, ' '); you.col++; - if ((fast) || (k == repeat) || (you.col == ccnt-1)) + if ((fast) || (k == repeat) || + (you.col == ccnt - 1)) pchar(&you, ME); } break; case CTRL('p'): case 'e': case 'k': +#ifdef KEY_UP + case KEY_UP: +#endif case 'i': if (you.line > 0) { if ((fast) || (k == 1)) - pchar(&you,' '); + pchar(&you, ' '); you.line--; - if ((fast) || (k == repeat) || (you.line == 0)) - pchar(&you,ME); + if ((fast) || (k == repeat) || + (you.line == 0)) + pchar(&you, ME); } break; case CTRL('n'): case 'c': case 'j': - case LF: +#ifdef KEY_DOWN + case KEY_DOWN: +#endif + case '\n': + case '\r': case 'm': - if (you.line+1 < lcnt) { + if (you.line + 1 < lcnt) { if ((fast) || (k == 1)) - pchar(&you,' '); + pchar(&you, ' '); you.line++; - if ((fast) || (k == repeat) || (you.line == lcnt-1)) - pchar(&you,ME); + if ((fast) || (k == repeat) || + (you.line == lcnt - 1)) + pchar(&you, ME); } break; } @@ -387,18 +428,21 @@ mainloop() pchar(&you, ' '); do { snrand(&money); - } while ((money.col == finish.col && money.line == finish.line) || - (money.col < 5 && money.line == 0) || - (money.col == you.col && money.line == you.line)); + } while ((money.col == finish.col && + money.line == finish.line) || + (money.col < 5 && money.line == 0) || + (money.col == you.col && + money.line == you.line)); pchar(&money, TREASURE); winnings(cashvalue); /* continue; Previously, snake missed a turn! */ } - if (same(&you,&finish)) { + if (same(&you, &finish)) { win(&finish); - ll(); - cook(); + flushinp(); + endwin(); printf("You have won with $%d.\n", cashvalue); + fflush(stdout); #ifdef LOGGING logit("won"); #endif @@ -410,7 +454,6 @@ mainloop() if (pushsnake()) break; } - fflush(stdout); } } @@ -420,7 +463,7 @@ setup() { int i; - clear(); + erase(); pchar(&you, ME); pchar(&finish, GOAL); pchar(&money, TREASURE); @@ -429,34 +472,21 @@ setup() } pchar(&snake[0], SNAKEHEAD); drawbox(); - fflush(stdout); + refresh(); } void drawbox() { int i; - struct point p; - p.line = -1; - for (i = 0; i < ccnt; i++) { - p.col = i; - pchar(&p, '-'); - } - p.col = ccnt; - for (i = -1; i <= lcnt; i++) { - p.line = i; - pchar(&p, '|'); + for (i = 1; i <= ccnt; i++) { + mvaddch(0, i, '-'); + mvaddch(lcnt + 1, i, '-'); } - p.col = -1; - for (i = -1; i <= lcnt; i++) { - p.line = i; - pchar(&p, '|'); - } - p.line = lcnt; - for (i = 0; i < ccnt; i++) { - p.col = i; - pchar(&p, '-'); + for (i = 0; i <= lcnt + 1; i++) { + mvaddch(i, 0, '|'); + mvaddch(i, ccnt + 1, '|'); } } @@ -495,10 +525,10 @@ post(iscore, flag) int iscore, flag; { short score = iscore; - short oldbest=0; + short oldbest = 0; uid_t uid; - /* I want to printf() the scores for terms that clear on cook(), + /* I want to printf() the scores for terms that clear on endwin(), * but this routine also gets called with flag == 0 to see if * the snake should wink. If (flag) then we're at game end and * can printf. @@ -513,8 +543,7 @@ post(iscore, flag) } if (rawscores == -1) { if (flag) - printf("Can't open score file %s: %s.\n", - _PATH_RAWSCORES, strerror(errno)); + warnx("Can't open score file %s", _PATH_RAWSCORES); return(1); } /* Figure out what happened in the past */ @@ -537,24 +566,13 @@ post(iscore, flag) return(1); } -/* - * Flush typeahead to keep from buffering a bunch of chars and then - * overshooting. This loses horribly at 9600 baud, but works nicely - * if the terminal gets behind. - */ -void -flushi() -{ - tcflush(0, TCIFLUSH); -} - -int mx [8] = { 0, 1, 1, 1, 0,-1,-1,-1}; -int my [8] = {-1,-1, 0, 1, 1, 1, 0,-1}; -float absv[8] = {1, 1.4, 1, 1.4, 1, 1.4, 1, 1.4}; +const int mx[8] = { 0, 1, 1, 1, 0,-1,-1,-1}; +const int my[8] = {-1,-1, 0, 1, 1, 1, 0,-1}; +const float absv[8] = {1, 1.4, 1, 1.4, 1, 1.4, 1, 1.4}; int oldw = 0; void -chase (np, sp) +chase(np, sp) struct point *sp, *np; { /* this algorithm has bugs; otherwise the snake would get too good */ @@ -562,12 +580,12 @@ chase (np, sp) int w, i, wt[8]; double v1, v2, vp, max; - point(&d, you.col-sp->col, you.line-sp->line); + d.col = you.col-sp->col; + d.line = you.line-sp->line; v1 = sqrt((double)(d.col * d.col + d.line * d.line) ); - w = 0; + w = 0; max = 0; - for(i = 0; i < 8; i++) - { + for (i = 0; i < 8; i++) { vp = d.col * mx[i] + d.line * my[i]; v2 = absv[i]; if (v1 > 0) @@ -580,7 +598,8 @@ chase (np, sp) } } for (i = 0; i < 8; i++) { - point(&d, sp->col + mx[i], sp->line + my[i]); + d.col = sp->col + mx[i]; + d.line = sp->line + my[i]; wt[i] = 0; if (d.col < 0 || d.col >= ccnt || d.line < 0 || d.line >= lcnt) continue; @@ -594,25 +613,26 @@ chase (np, sp) if (same(&d, &money) || same(&d,&finish)) continue; wt[i] = (i == w ? loot/10 : 1); - if (i == oldw) + if (i == oldw) wt[i] += loot/20; } for (w = i = 0; i < 8; i++) w += wt[i]; - vp = ((rand() >> 6) & 01777) % w; + vp = ((random() >> 6) & 01777) % w; for (i = 0; i < 8; i++) if (vp < wt[i]) break; else vp -= wt[i]; if (i == 8) { - pr("failure\n"); + printw("failure\n"); i = 0; while (wt[i] == 0) i++; } oldw = w = i; - point(np, sp->col + mx[w], sp->line + my[w]); + np->col = sp->col + mx[w]; + np->line = sp->line + my[w]; } void @@ -624,7 +644,8 @@ spacewarp(w) char *str; snrand(&you); - point(&p, COLUMNS / 2 - 8, LINES / 2 - 1); + p.col = COLS / 2 - 8; + p.line = LINES / 2 - 1; if (p.col < 0) p.col = 0; if (p.line < 0) @@ -638,11 +659,11 @@ spacewarp(w) penalty += loot / PENALTY; } for (j = 0; j < 3; j++) { - clear(); - fflush(stdout); + erase(); + refresh(); delay(5); - apr(&p, str); - fflush(stdout); + mvaddstr(p.line + 1, p.col + 1, str); + refresh(); delay(10); } setup(); @@ -652,11 +673,12 @@ spacewarp(w) void snap() { - struct point p; /* I don't see the graphical purpose of the next block of code. * It just makes no sense. * + * struct point p; + * * if (you.line < 3) * pchar(point(&p, you.col, 0), '-'); * if (you.line > lcnt - 4) @@ -668,10 +690,10 @@ snap() */ if (!stretch(&money)) if (!stretch(&finish)) { - pchar(point(&p, you.col, you.line), '?'); - fflush(stdout); + pchar(&you, '?'); + refresh(); delay(10); - pchar(point(&p, you.col, you.line), ME); + pchar(&you, ME); } /* Again, I don't see the point of the following either. * @@ -692,7 +714,7 @@ snap() * chk(&p); * } */ - fflush(stdout); + refresh(); } int @@ -701,19 +723,20 @@ stretch(ps) { struct point p; - point(&p, you.col, you.line); + p.col = you.col; + p.line = you.line; if ((abs(ps->col - you.col) < (ccnt / 12)) && (you.line != ps->line)) { if (you.line < ps->line) { for (p.line = you.line + 1; p.line <= ps->line; p.line++) pchar(&p, 'v'); - fflush(stdout); + refresh(); delay(10); for (; p.line > you.line; p.line--) chk(&p); } else { for (p.line = you.line - 1; p.line >= ps->line; p.line--) pchar(&p, '^'); - fflush(stdout); + refresh(); delay(10); for (; p.line < you.line; p.line++) chk(&p); @@ -724,14 +747,14 @@ stretch(ps) if (you.col < ps->col) { for (p.col = you.col + 1; p.col <= ps->col; p.col++) pchar(&p, '>'); - fflush(stdout); + refresh(); delay(10); for (; p.col > you.col; p.col--) chk(&p); } else { for (p.col = you.col - 1; p.col >= ps->col; p.col--) pchar(&p, '<'); - fflush(stdout); + refresh(); delay(10); for (; p.col < you.col; p.col++) chk(&p); @@ -745,35 +768,44 @@ void surround(ps) struct point *ps; { - struct point x; int j; if (ps->col == 0) ps->col++; if (ps->line == 0) ps->line++; - if (ps->line == LINES -1) + if (ps->line == LINES - 1) ps->line--; - if (ps->col == COLUMNS -1) + if (ps->col == COLS - 1) ps->col--; - apr(point(&x, ps->col-1, ps->line-1), "/*\\\r* *\r\\*/"); + mvaddstr(ps->line, ps->col, "/*\\"); + mvaddstr(ps->line + 1, ps->col, "* *"); + mvaddstr(ps->line + 2, ps->col, "\\*/"); for (j = 0; j < 20; j++) { pchar(ps, '@'); - fflush(stdout); + refresh(); delay(1); - pchar(ps,' '); - fflush(stdout); + pchar(ps, ' '); + refresh(); delay(1); } if (post(cashvalue, 0)) { - apr(point(&x, ps->col - 1, ps->line - 1), " \ro.o\r\\_/"); - fflush(stdout); + mvaddstr(ps->line, ps->col, " "); + mvaddstr(ps->line + 1, ps->col, "o.o"); + mvaddstr(ps->line + 2, ps->col, "\\_/"); + refresh(); delay(6); - apr(point(&x,ps->col - 1, ps->line - 1), " \ro.-\r\\_/"); - fflush(stdout); + mvaddstr(ps->line, ps->col, " "); + mvaddstr(ps->line + 1, ps->col, "o.-"); + mvaddstr(ps->line + 2, ps->col, "\\_/"); + refresh(); delay(6); } - apr(point(&x, ps->col - 1, ps->line - 1), " \ro.o\r\\_/"); + mvaddstr(ps->line, ps->col, " "); + mvaddstr(ps->line + 1, ps->col, "o.o"); + mvaddstr(ps->line + 2, ps->col, "\\_/"); + refresh(); + delay(6); } void @@ -781,11 +813,12 @@ win(ps) struct point *ps; { struct point x; - int j,k; + int j, k; int boxsize; /* actually diameter of box, not radius */ boxsize = (fast ? 10 : 4); - point(&x, ps->col, ps->line); + x.col = ps->col; + x.line = ps->line; for (j = 1; j < boxsize; j++) { for (k = 0; k < j; k++) { pchar(&x, '#'); @@ -804,7 +837,7 @@ win(ps) pchar(&x, '#'); x.col--; } - fflush(stdout); + refresh(); delay(1); } } @@ -822,13 +855,14 @@ pushsnake() * on a fast terminal with typematic keys or not. * So I have taken the call to times out. */ - for (i = 4; i >=0; i--) + for (i = 4; i >= 0; i--) if (same(&snake[i], &snake[5])) issame++; if (!issame) pchar(&snake[5], ' '); /* Need the following to catch you if you step on the snake's tail */ - tmp.col = snake[5].col; tmp.line = snake[5].line; + tmp.col = snake[5].col; + tmp.line = snake[5].line; for (i = 4; i >= 0; i--) snake[i + 1] = snake[i]; chase(&snake[0], &snake[1]); @@ -839,20 +873,20 @@ pushsnake() surround(&you); i = (cashvalue) % 10; bonus = ((random() >> 8) & 0377) % 10; - ll(); - pr("%d\n", bonus); - fflush(stdout); + mvprintw(lcnt + 1, 0, "%d\n", bonus); + refresh(); delay(30); if (bonus == i) { spacewarp(1); #ifdef LOGGING logit("bonus"); #endif - flushi(); + flushinp(); return(1); } - cook(); - if ( loot >= penalty ) { + flushinp(); + endwin(); + if (loot >= penalty) { printf("\nYou and your $%d have been eaten\n", cashvalue); } else { printf("\nThe snake ate you. You owe $%d.\n", -cashvalue); @@ -868,10 +902,10 @@ pushsnake() } return(0); } - + int chk(sp) -struct point *sp; + struct point *sp; { int j; @@ -896,7 +930,7 @@ struct point *sp; if ((sp->col < 4) && (sp->line == 0)) { winnings(cashvalue); if ((you.line == 0) && (you.col < 4)) - pchar(&you,ME); + pchar(&you, ME); return(5); } if (same(sp, &you)) { @@ -911,13 +945,8 @@ void winnings(won) int won; { - struct point p; - - p.line = p.col = 1; - if (won > 0) { - move(&p); - pr("$%d ", won); - } + if (won > 0) + mvprintw(1, 1, "$%d ", won); } void @@ -925,8 +954,7 @@ stop(dummy) int dummy; { signal(SIGINT, SIG_IGN); - ll(); - cook(); + endwin(); length(moves); exit(0); } @@ -934,11 +962,9 @@ stop(dummy) void suspend() { - ll(); - cook(); + endwin(); kill(getpid(), SIGTSTP); - raw(); - setup(); + refresh(); winnings(cashvalue); } @@ -946,7 +972,7 @@ void length(num) int num; { - printf("You made %d moves.\n",num); + printf("You made %d moves.\n", num); } #ifdef LOGGING @@ -960,7 +986,7 @@ logit(msg) time(&t); fprintf(logfile, "%s $%d %dx%d %s %s", getlogin(), cashvalue, lcnt, ccnt, msg, ctime(&t)); - fclose(logfile); + fflush(logfile); } } #endif diff --git a/games/snake/snake.h b/games/snake/snake.h deleted file mode 100644 index ae1770b8176..00000000000 --- a/games/snake/snake.h +++ /dev/null @@ -1,150 +0,0 @@ -/* $OpenBSD: snake.h,v 1.1 1999/03/13 02:08:10 pjanzen Exp $ */ - -/* - * Copyright (c) 1980, 1993 - * The Regents of the University of California. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * @(#)snake.h 8.1 (Berkeley) 5/31/93 - */ - -#include <sys/types.h> -#include <sys/ioctl.h> -#include <err.h> -#include <math.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <termios.h> - -#define PENALTY 10 /* % penalty for invoking spacewarp */ - -#define EOT '\004' -#define ESC '\033' -#define LF '\n' -#define DEL '\177' - -#define ME 'I' -#define SNAKEHEAD 'S' -#define SNAKETAIL 's' -#define TREASURE '$' -#define GOAL '#' - -#define BSIZE 80 -#define TOPN 3 /* top scores to print if you lose */ - -struct tbuffer { - long t[4]; -} tbuffer; - -char *CL, *UP, *DO, *ND, *BS, - *HO, *CM, - *TA, *LL, - *KL, *KR, *KU, *KD, - *TI, *TE, *KS, *KE, *VE, *VI; -int LINES, COLUMNS; /* physical screen size. */ -int lcnt, ccnt; /* user's idea of screen size */ -char PC; -int AM, BW; -char tbuf[1024], tcapbuf[128]; -char *tgetstr(), *tgoto(); -int Klength; /* length of KX strings */ -int chunk; /* amount of money given at a time */ -speed_t ospeed; -#ifdef DEBUG -#define cashvalue (loot-penalty)/25 -#else -#define cashvalue chunk*(loot-penalty)/25 -#endif - -struct point { - int col, line; -}; -struct point cursor; -struct termios orig, new; -struct point *point(); -#ifdef __STDC__ -void apr(struct point *, const char *, ...); -void pr(const char *, ...); -#else -void apr(); -void pr(); -#endif - -#define same(s1, s2) ((s1)->line == (s2)->line && (s1)->col == (s2)->col) - -void snscore __P((int, int)); - -void mainloop __P((void)); -void chase __P((struct point *, struct point *)); -void setup __P((void)); -void drawbox __P((void)); -void snrand __P((struct point *)); -int post __P((int, int)); -void flushi __P((void)); -void spacewarp __P((int)); -void snap __P((void)); -int stretch __P((struct point *)); -void surround __P((struct point *)); -void win __P((struct point *)); -int pushsnake __P((void)); -int chk __P((struct point *)); -void winnings __P((int)); -void stop __P((int)); -void suspend __P((void)); -void length __P((int)); -void move __P((struct point *)); - -#ifdef LOGGING -void logit __P((char *)); -#endif - -void gto __P((struct point *)); -void right __P((struct point *)); -void up __P((void)); -void down __P((void)); -void bs __P((void)); -void nd __P((void)); -void clear __P((void)); -void home __P((void)); -void ll __P((void)); -void cr __P((void)); -void pstring __P((const char *)); -void pch __P((int)); -void pchar __P((struct point *, char)); -int outch __P((int)); -void putpad __P((char *)); -void cook __P((void)); -void raw __P((void)); -struct point *point __P((struct point *, int, int)); -void delay __P((int)); -void getcap __P((void)); - diff --git a/games/snake/snscore.c b/games/snake/snscore.c index 87a90056219..1846f2b72ae 100644 --- a/games/snake/snscore.c +++ b/games/snake/snscore.c @@ -1,4 +1,4 @@ -/* $OpenBSD: snscore.c,v 1.2 2001/02/04 02:17:54 pjanzen Exp $ */ +/* $OpenBSD: snscore.c,v 1.3 2001/02/18 16:03:03 pjanzen Exp $ */ /* $NetBSD: snscore.c,v 1.5 1995/04/24 12:25:43 cgd Exp $ */ /* @@ -44,7 +44,7 @@ static char copyright[] = #if 0 static char sccsid[] = "@(#)snscore.c 8.1 (Berkeley) 7/19/93"; #else -static char rcsid[] = "$OpenBSD: snscore.c,v 1.2 2001/02/04 02:17:54 pjanzen Exp $"; +static char rcsid[] = "$OpenBSD: snscore.c,v 1.3 2001/02/18 16:03:03 pjanzen Exp $"; #endif #endif /* not lint */ @@ -85,7 +85,7 @@ snscore(fd, topn) } lseek(fd, 0, SEEK_SET); - printf("%sSnake scores to date\n", topn > 0 ? "Top " : ""); + printf("%sSnake scores to date:\n", topn > 0 ? "Top " : ""); /* read(fd, &whoallbest, sizeof(uid_t)); * read(fd, &allbest, sizeof(short)); SCOREFILE FORMAT CHANGE */ |