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