Initial import from FreeBSD RELENG_4:
[dragonfly.git] / games / rain / rain.c
CommitLineData
984263bc
MD
1/*
2 * Copyright (c) 1980, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. All advertising materials mentioning features or use of this software
14 * must display the following acknowledgement:
15 * This product includes software developed by the University of
16 * California, Berkeley and its contributors.
17 * 4. Neither the name of the University nor the names of its contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 */
33
34#ifndef lint
35static const char copyright[] =
36"@(#) Copyright (c) 1980, 1993\n\
37 The Regents of the University of California. All rights reserved.\n";
38#endif /* not lint */
39
40#ifndef lint
41#if 0
42static char sccsid[] = "@(#)rain.c 8.1 (Berkeley) 5/31/93";
43#endif
44static const char rcsid[] =
45 "$FreeBSD: src/games/rain/rain.c,v 1.8.2.1 2001/03/05 11:54:10 kris Exp $";
46#endif /* not lint */
47
48/*
49 * rain 11/3/1980 EPS/CITHEP
50 * cc rain.c -o rain -O -ltermlib
51 */
52
53#include <sys/types.h>
54#include <curses.h>
55#include <err.h>
56#include <stdio.h>
57#include <signal.h>
58#include <stdlib.h>
59#include <unistd.h>
60
61volatile sig_atomic_t sig_caught = 0;
62
63static void onsig __P((int sig));
64
65int
66main(int argc, char **argv)
67{
68 int x, y, j;
69 long cols, lines;
70 int xpos[5], ypos[5];
71 unsigned int delay = 0;
72 int ch;
73
74 while ((ch = getopt(argc, argv, "d:h")) != -1)
75 switch (ch) {
76 case 'd':
77 if ((delay = (unsigned int)strtoul(optarg, (char **)NULL, 10)) < 1
78 || delay > 1000)
79 errx(1, "invalid delay (1-1000)");
80 delay *= 1000; /* ms -> us */
81 break;
82 case 'h':
83 default:
84 (void)fprintf(stderr, "usage: rain [-d delay]\n");
85 exit(1);
86 }
87 srandomdev();
88
89 initscr();
90 cols = COLS - 4;
91 lines = LINES - 4;
92
93 (void)signal(SIGHUP, onsig);
94 (void)signal(SIGINT, onsig);
95 (void)signal(SIGQUIT, onsig);
96 (void)signal(SIGSTOP, onsig);
97 (void)signal(SIGTSTP, onsig);
98 (void)signal(SIGTERM, onsig);
99
100 for (j = 4; j >= 0; --j) {
101 xpos[j] = random() % cols + 2;
102 ypos[j] = random() % lines + 2;
103 }
104 for (j = 0;;) {
105 if (sig_caught) {
106 endwin();
107 exit(0);
108 }
109 x = random() % cols + 2;
110 y = random() % lines + 2;
111 mvaddch(y, x, '.');
112 mvaddch(ypos[j], xpos[j], 'o');
113 if (!j--)
114 j = 4;
115 mvaddch(ypos[j], xpos[j], 'O');
116 if (!j--)
117 j = 4;
118 mvaddch(ypos[j] - 1, xpos[j], '-');
119 mvaddstr(ypos[j], xpos[j] - 1, "|.|");
120 mvaddch(ypos[j] + 1, xpos[j], '-');
121 if (!j--)
122 j = 4;
123 mvaddch(ypos[j] - 2, xpos[j], '-');
124 mvaddstr(ypos[j] - 1, xpos[j] - 1, "/ \\");
125 mvaddstr(ypos[j], xpos[j] - 2, "| O |");
126 mvaddstr(ypos[j] + 1, xpos[j] - 1, "\\ /");
127 mvaddch(ypos[j] + 2, xpos[j], '-');
128 if (!j--)
129 j = 4;
130 mvaddch(ypos[j] - 2, xpos[j], ' ');
131 mvaddstr(ypos[j] - 1, xpos[j] - 1, " ");
132 mvaddstr(ypos[j], xpos[j] - 2, " ");
133 mvaddstr(ypos[j] + 1, xpos[j] - 1, " ");
134 mvaddch(ypos[j] + 2, xpos[j], ' ');
135 xpos[j] = x;
136 ypos[j] = y;
137 refresh();
138 if (delay) usleep(delay);
139 }
140}
141
142static void
143onsig(int sig)
144{
145
146 sig = 0;
147 sig_caught = 1;
148}