diff options
author | steve <steve@FreeBSD.org> | 1999-05-03 02:08:31 +0000 |
---|---|---|
committer | steve <steve@FreeBSD.org> | 1999-05-03 02:08:31 +0000 |
commit | cac2154a9646500f9147bc1cf675ffdb4959d1c8 (patch) | |
tree | 9e771c3ccb36de6d9ba45a329e12d4e756cbae45 /games/rain | |
parent | 6c01d880e5a7bed8c215df0862c927511e67029f (diff) | |
download | FreeBSD-src-cac2154a9646500f9147bc1cf675ffdb4959d1c8.zip FreeBSD-src-cac2154a9646500f9147bc1cf675ffdb4959d1c8.tar.gz |
Round two of MetBSD games merges.
Submitted by: Stephen J. Roznowski <sjr@home.net>
Diffstat (limited to 'games/rain')
-rw-r--r-- | games/rain/Makefile | 4 | ||||
-rw-r--r-- | games/rain/rain.6 | 14 | ||||
-rw-r--r-- | games/rain/rain.c | 199 |
3 files changed, 55 insertions, 162 deletions
diff --git a/games/rain/Makefile b/games/rain/Makefile index fb3be9d..8d438d3 100644 --- a/games/rain/Makefile +++ b/games/rain/Makefile @@ -2,7 +2,7 @@ PROG= rain MAN6= rain.6 -DPADD= ${LIBTERMCAP} ${LIBCOMPAT} -LDADD= -ltermcap -lcompat +DPADD= ${LIBCURSES} ${LIBTERMCAP} +LDADD= -lcurses -ltermcap .include <bsd.prog.mk> diff --git a/games/rain/rain.6 b/games/rain/rain.6 index 0f3d551..e3a2fa2 100644 --- a/games/rain/rain.6 +++ b/games/rain/rain.6 @@ -37,18 +37,16 @@ rain \- animated raindrops display .SH SYNOPSIS rain +[ \-d delay ] .SH DESCRIPTION .PP .ad b .IR Rain 's display is modeled after the VAX/VMS program of the same name. -The terminal has to be set for 9600 baud to obtain the proper effect. -.PP -As with all programs that use -.IR termcap , -the TERM environment -variable must be set (and exported) to the type of the terminal being used. -.SH FILES -/etc/termcap +To obtain the proper effect, either the terminal must be set for 9600 +baud or the +.Fl d +option must be used to specify a delay, in milliseconds, between each +update. A reasonable delay is 120; the default is 0. .SH AUTHOR Eric P. Scott diff --git a/games/rain/rain.c b/games/rain/rain.c index 55ecbbe..5f5e5c1 100644 --- a/games/rain/rain.c +++ b/games/rain/rain.c @@ -47,202 +47,97 @@ static char sccsid[] = "@(#)rain.c 8.1 (Berkeley) 5/31/93"; */ #include <sys/types.h> +#include <curses.h> +#include <err.h> #include <stdio.h> -#ifdef USG -#include <termio.h> -#else -#include <sgtty.h> -#endif #include <signal.h> -#include <termcap.h> #include <stdlib.h> -#include <string.h> +#include <unistd.h> -#define cursor(c, r) tputs(tgoto(CM, c, r), 1, fputchar) - -#ifdef USG -static struct termio sg, old_tty; -#else -static struct sgttyb sg, old_tty; -#endif - -int fputchar(); -char *LL, *TE; +volatile sig_atomic_t sig_caught = 0; +int main(argc, argv) int argc; char **argv; { - extern short ospeed; - extern char *UP; register int x, y, j; - register char *CM, *BC, *DN, *ND, *term; - char *TI, *tcp, *mp, tcb[100]; long cols, lines; int xpos[5], ypos[5]; + unsigned int delay = 0; + int ch; static void onsig(); - if (!(term = getenv("TERM"))) { - fprintf(stderr, "%s: TERM: parameter not set\n", *argv); - exit(1); - } - if (!(mp = malloc((u_int)1024))) { - fprintf(stderr, "%s: out of space.\n", *argv); - exit(1); - } - if (tgetent(mp, term) <= 0) { - fprintf(stderr, "%s: %s: unknown terminal type\n", *argv, term); - exit(1); - } - tcp = tcb; - if (!(CM = tgetstr("cm", &tcp))) { - fprintf(stderr, "%s: terminal not capable of cursor motion\n", *argv); - exit(1); - } - if (!(BC = tgetstr("bc", &tcp))) - BC = "\b"; - if (!(DN = tgetstr("dn", &tcp))) - DN = "\n"; - if (!(ND = tgetstr("nd", &tcp))) - ND = " "; - if ((cols = tgetnum("co")) == -1) - cols = 80; - if ((lines = tgetnum("li")) == -1) - lines = 24; - cols -= 4; - lines -= 4; - TE = tgetstr("te", &tcp); - TI = tgetstr("ti", &tcp); - UP = tgetstr("up", &tcp); - if (!(LL = tgetstr("ll", &tcp))) { - if (!(LL = malloc((u_int)10))) { - fprintf(stderr, "%s: out of space.\n", *argv); + while ((ch = getopt(argc, argv, "d:h")) != -1) + switch (ch) { + case 'd': + if ((delay = (unsigned int)strtoul(optarg, (char **)NULL, 10)) < 1 + || delay > 1000) + errx(1, "invalid delay (1-1000)"); + delay *= 1000; /* ms -> us */ + break; + case 'h': + default: + (void)fprintf(stderr, "usage: rain [-d delay]\n"); exit(1); } - (void)strcpy(LL, tgoto(CM, 0, 23)); - } srandomdev(); -#ifdef USG - ioctl(1, TCGETA, &sg); - ospeed = sg.c_cflag&CBAUD; -#else - gtty(1, &sg); - ospeed = sg.sg_ospeed; -#endif + + initscr(); + cols = COLS - 4; + lines = LINES - 4; + (void)signal(SIGHUP, onsig); (void)signal(SIGINT, onsig); (void)signal(SIGQUIT, onsig); (void)signal(SIGSTOP, onsig); (void)signal(SIGTSTP, onsig); (void)signal(SIGTERM, onsig); -#ifdef USG - ioctl(1, TCGETA, &old_tty); /* save tty bits for exit */ - ioctl(1, TCGETA, &sg); - sg.c_iflag &= ~ICRNL; - sg.c_oflag &= ~ONLCR; - sg.c_lflag &= ~ECHO; - ioctl(1, TCSETAW, &sg); -#else - gtty(1, &old_tty); /* save tty bits for exit */ - gtty(1, &sg); - sg.sg_flags &= ~(CRMOD|ECHO); - stty(1, &sg); -#endif - if (TI) - tputs(TI, 1, fputchar); - tputs(tgetstr("cl", &tcp), 1, fputchar); - (void)fflush(stdout); + for (j = 4; j >= 0; --j) { xpos[j] = random() % cols + 2; ypos[j] = random() % lines + 2; } for (j = 0;;) { + if (sig_caught) { + endwin(); + exit(0); + } x = random() % cols + 2; y = random() % lines + 2; - cursor(x, y); - fputchar('.'); - cursor(xpos[j], ypos[j]); - fputchar('o'); + mvaddch(y, x, '.'); + mvaddch(ypos[j], xpos[j], 'o'); if (!j--) j = 4; - cursor(xpos[j], ypos[j]); - fputchar('O'); + mvaddch(ypos[j], xpos[j], 'O'); if (!j--) j = 4; - cursor(xpos[j], ypos[j] - 1); - fputchar('-'); - tputs(DN, 1, fputchar); - tputs(BC, 1, fputchar); - tputs(BC, 1, fputchar); - fputs("|.|", stdout); - tputs(DN, 1, fputchar); - tputs(BC, 1, fputchar); - tputs(BC, 1, fputchar); - fputchar('-'); + mvaddch(ypos[j] - 1, xpos[j], '-'); + mvaddstr(ypos[j], xpos[j] - 1, "|.|"); + mvaddch(ypos[j] + 1, xpos[j], '-'); if (!j--) j = 4; - cursor(xpos[j], ypos[j] - 2); - fputchar('-'); - tputs(DN, 1, fputchar); - tputs(BC, 1, fputchar); - tputs(BC, 1, fputchar); - fputs("/ \\", stdout); - cursor(xpos[j] - 2, ypos[j]); - fputs("| O |", stdout); - cursor(xpos[j] - 1, ypos[j] + 1); - fputs("\\ /", stdout); - tputs(DN, 1, fputchar); - tputs(BC, 1, fputchar); - tputs(BC, 1, fputchar); - fputchar('-'); + mvaddch(ypos[j] - 2, xpos[j], '-'); + mvaddstr(ypos[j] - 1, xpos[j] - 1, "/ \\"); + mvaddstr(ypos[j], xpos[j] - 2, "| O |"); + mvaddstr(ypos[j] + 1, xpos[j] - 1, "\\ /"); + mvaddch(ypos[j] + 2, xpos[j], '-'); if (!j--) j = 4; - cursor(xpos[j], ypos[j] - 2); - fputchar(' '); - tputs(DN, 1, fputchar); - tputs(BC, 1, fputchar); - tputs(BC, 1, fputchar); - fputchar(' '); - tputs(ND, 1, fputchar); - fputchar(' '); - cursor(xpos[j] - 2, ypos[j]); - fputchar(' '); - tputs(ND, 1, fputchar); - fputchar(' '); - tputs(ND, 1, fputchar); - fputchar(' '); - cursor(xpos[j] - 1, ypos[j] + 1); - fputchar(' '); - tputs(ND, 1, fputchar); - fputchar(' '); - tputs(DN, 1, fputchar); - tputs(BC, 1, fputchar); - tputs(BC, 1, fputchar); - fputchar(' '); + mvaddch(ypos[j] - 2, xpos[j], ' '); + mvaddstr(ypos[j] - 1, xpos[j] - 1, " "); + mvaddstr(ypos[j], xpos[j] - 2, " "); + mvaddstr(ypos[j] + 1, xpos[j] - 1, " "); + mvaddch(ypos[j] + 2, xpos[j], ' '); xpos[j] = x; ypos[j] = y; - (void)fflush(stdout); + refresh(); + if (delay) usleep(delay); } } static void onsig() { - tputs(LL, 1, fputchar); - if (TE) - tputs(TE, 1, fputchar); - (void)fflush(stdout); -#ifdef USG - ioctl(1, TCSETAW, &old_tty); -#else - stty(1, &old_tty); -#endif - exit(0); -} - -int -fputchar(c) - int c; -{ - putchar(c); + sig_caught = 1; } |