Merge branch 'vendor/OPENSSL'
[dragonfly.git] / games / robots / main.c
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  * @(#) Copyright (c) 1980, 1993 The Regents of the University of California.  All rights reserved.
34  * @(#)main.c   8.1 (Berkeley) 5/31/93
35  * $FreeBSD: src/games/robots/main.c,v 1.7 1999/11/30 03:49:18 billf Exp $
36  * $DragonFly: src/games/robots/main.c,v 1.3 2006/08/27 21:45:07 pavalos Exp $
37  */
38
39 # include       "robots.h"
40 # include       <signal.h>
41 # include       <ctype.h>
42
43 static bool     another(void);
44
45 int
46 main(int ac, char **av)
47 {
48         char    *sp;
49         bool    bad_arg;
50         bool    show_only;
51
52         show_only = FALSE;
53         if (ac > 1) {
54                 bad_arg = FALSE;
55                 for (++av; ac > 1 && *av[0]; av++, ac--)
56                         if (av[0][0] != '-')
57                                 if (isdigit(av[0][0]))
58                                         Max_per_uid = atoi(av[0]);
59                                 else {
60                                         Scorefile = av[0];
61 # ifdef FANCY
62                                         sp = rindex(Scorefile, '/');
63                                         if (sp == NULL)
64                                                 sp = Scorefile;
65                                         if (strcmp(sp, "pattern_roll") == 0)
66                                                 Pattern_roll = TRUE;
67                                         else if (strcmp(sp, "stand_still") == 0)
68                                                 Stand_still = TRUE;
69                                         if (Pattern_roll || Stand_still)
70                                                 Teleport = TRUE;
71 # endif
72                                 }
73                         else
74                                 for (sp = &av[0][1]; *sp; sp++)
75                                         switch (*sp) {
76                                           case 's':
77                                                 show_only = TRUE;
78                                                 break;
79                                           case 'r':
80                                                 Real_time = TRUE;
81                                                 break;
82                                           case 'a':
83                                                 Start_level = 4;
84                                                 break;
85                                           case 'j':
86                                                 Jump = TRUE;
87                                                 break;
88                                           case 't':
89                                                 Teleport = TRUE;
90                                                 break;
91                                           default:
92                                                 fprintf(stderr, "robots: uknown option: %c\n", *sp);
93                                                 bad_arg = TRUE;
94                                                 break;
95                                         }
96                 if (bad_arg) {
97                         exit(1);
98                         /* NOTREACHED */
99                 }
100         }
101
102         if (show_only) {
103                 show_score();
104                 exit(0);
105                 /* NOTREACHED */
106         }
107
108         initscr();
109         signal(SIGINT, (sig_t)quit);
110         crmode();
111         noecho();
112         nonl();
113         if (LINES != Y_SIZE || COLS != X_SIZE) {
114                 if (LINES < Y_SIZE || COLS < X_SIZE) {
115                         endwin();
116                         printf("Need at least a %dx%d screen\n",
117                             Y_SIZE, X_SIZE);
118                         exit(1);
119                 }
120                 delwin(stdscr);
121                 stdscr = newwin(Y_SIZE, X_SIZE, 0, 0);
122         }
123
124         srandomdev();
125         if (Real_time)
126                 signal(SIGALRM, (sig_t)move_robots);
127         do {
128                 init_field();
129                 for (Level = Start_level; !Dead; Level++) {
130                         make_level();
131                         play_level();
132                 }
133                 move(My_pos.y, My_pos.x);
134                 printw("AARRrrgghhhh....");
135                 refresh();
136                 score();
137         } while (another());
138         quit();
139         /* NOTREACHED */
140         return(0);
141 }
142
143 /*
144  * quit:
145  *      Leave the program elegantly.
146  */
147 void
148 quit(void)
149 {
150         endwin();
151         exit(0);
152         /* NOTREACHED */
153 }
154
155 /*
156  * another:
157  *      See if another game is desired
158  */
159 static bool
160 another(void)
161 {
162         int     y;
163
164 #ifdef  FANCY
165         if ((Stand_still || Pattern_roll) && !Newscore)
166                 return TRUE;
167 #endif
168
169         if (query("Another game?")) {
170                 if (Full_clear) {
171                         for (y = 1; y <= Num_scores; y++) {
172                                 move(y, 1);
173                                 clrtoeol();
174                         }
175                         refresh();
176                 }
177                 return TRUE;
178         }
179         return FALSE;
180 }