xref: /dragonfly/games/robots/main.c (revision 2cd2d2b5)
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 }
188