summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Janzen <pjanzen@cvs.openbsd.org>2001-02-18 16:03:04 +0000
committerPaul Janzen <pjanzen@cvs.openbsd.org>2001-02-18 16:03:04 +0000
commit86ce38fde654099562e79e314e9fdd1c4f486918 (patch)
tree01cf95effc69d46d8c10e8e1a291c6c950ce104e
parent8642ba18a7e9c8007d8e6b20a3146da4bd26ec52 (diff)
Convert to curses and tidy some. Generally based on NetBSD changes.
-rw-r--r--games/snake/Makefile4
-rw-r--r--games/snake/move.c703
-rw-r--r--games/snake/snake.66
-rw-r--r--games/snake/snake.c438
-rw-r--r--games/snake/snake.h150
-rw-r--r--games/snake/snscore.c6
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
*/