Initial import, 0.1 + pk 0.2.4-B1
[unix-history] / games / robots / main.c
CommitLineData
15637ed4
RG
1/*
2 * Copyright (c) 1980 Regents of the University of California.
3 * 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
35char copyright[] =
36"@(#) Copyright (c) 1980 Regents of the University of California.\n\
37 All rights reserved.\n";
38#endif /* not lint */
39
40#ifndef lint
41static char sccsid[] = "@(#)main.c 5.5 (Berkeley) 2/28/91";
42#endif /* not lint */
43
44# include "robots.h"
45# include <signal.h>
46# include <ctype.h>
47
48main(ac, av)
49int ac;
50char **av;
51{
52 register char *sp;
53 register bool bad_arg;
54 register bool show_only;
55 extern char *Scorefile;
56 extern int Max_per_uid;
57 void quit();
58
59 show_only = FALSE;
60 if (ac > 1) {
61 bad_arg = FALSE;
62 for (++av; ac > 1 && *av[0]; av++, ac--)
63 if (av[0][0] != '-')
64 if (isdigit(av[0][0]))
65 Max_per_uid = atoi(av[0]);
66 else {
67 setuid(getuid());
68 setgid(getgid());
69 Scorefile = av[0];
70# ifdef FANCY
71 sp = rindex(Scorefile, '/');
72 if (sp == NULL)
73 sp = Scorefile;
74 if (strcmp(sp, "pattern_roll") == 0)
75 Pattern_roll = TRUE;
76 else if (strcmp(sp, "stand_still") == 0)
77 Stand_still = TRUE;
78 if (Pattern_roll || Stand_still)
79 Teleport = TRUE;
80# endif
81 }
82 else
83 for (sp = &av[0][1]; *sp; sp++)
84 switch (*sp) {
85 case 's':
86 show_only = TRUE;
87 break;
88 case 'r':
89 Real_time = TRUE;
90 break;
91 case 'a':
92 Start_level = 4;
93 break;
94 case 'j':
95 Jump = TRUE;
96 break;
97 case 't':
98 Teleport = TRUE;
99 break;
100 default:
101 fprintf(stderr, "robots: uknown option: %c\n", *sp);
102 bad_arg = TRUE;
103 break;
104 }
105 if (bad_arg) {
106 exit(1);
107 /* NOTREACHED */
108 }
109 }
110
111 if (show_only) {
112 show_score();
113 exit(0);
114 /* NOTREACHED */
115 }
116
117 initscr();
118 signal(SIGINT, quit);
119 crmode();
120 noecho();
121 nonl();
122 if (LINES != Y_SIZE || COLS != X_SIZE) {
123 if (LINES < Y_SIZE || COLS < X_SIZE) {
124 endwin();
125 printf("Need at least a %dx%d screen\n",
126 Y_SIZE, X_SIZE);
127 exit(1);
128 }
129 delwin(stdscr);
130 stdscr = newwin(Y_SIZE, X_SIZE, 0, 0);
131 }
132
133 srand(getpid());
134 if (Real_time)
135 signal(SIGALRM, move_robots);
136 do {
137 init_field();
138 for (Level = Start_level; !Dead; Level++) {
139 make_level();
140 play_level();
141 }
142 move(My_pos.y, My_pos.x);
143 printw("AARRrrgghhhh....");
144 refresh();
145 score();
146 } while (another());
147 quit();
148}
149
150/*
151 * quit:
152 * Leave the program elegantly.
153 */
154void
155quit()
156{
157 extern int _putchar();
158
159 mvcur(0, COLS - 1, LINES - 1, 0);
160 if (CE) {
161 tputs(CE, 1, _putchar);
162 endwin();
163 }
164 else {
165 endwin();
166 putchar('\n');
167 }
168 exit(0);
169 /* NOTREACHED */
170}
171
172/*
173 * another:
174 * See if another game is desired
175 */
176another()
177{
178 register int y;
179
180#ifdef FANCY
181 if ((Stand_still || Pattern_roll) && !Newscore)
182 return TRUE;
183#endif
184
185 if (query("Another game?")) {
186 if (Full_clear) {
187 for (y = 1; y <= Num_scores; y++) {
188 move(y, 1);
189 clrtoeol();
190 }
191 refresh();
192 }
193 return TRUE;
194 }
195 return FALSE;
196}