xref: /dragonfly/games/robots/main.c (revision 0cfebe3d)
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 }
181