xref: /dragonfly/games/robots/main.c (revision 03517d4e)
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. Neither the name of the University nor the names of its contributors
14  *    may be used to endorse or promote products derived from this software
15  *    without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  *
29  * @(#) Copyright (c) 1980, 1993 The Regents of the University of California.  All rights reserved.
30  * @(#)main.c	8.1 (Berkeley) 5/31/93
31  * $FreeBSD: src/games/robots/main.c,v 1.7 1999/11/30 03:49:18 billf Exp $
32  */
33 
34 #include "robots.h"
35 #include <signal.h>
36 #include <ctype.h>
37 
38 static bool another(void);
39 
40 int
41 main(int argc, char **argv)
42 {
43 	char *sp;
44 	bool bad_arg;
45 	bool show_only;
46 
47 	show_only = false;
48 	if (argc > 1) {
49 		bad_arg = false;
50 		for (++argv; argc > 1 && *argv[0]; argv++, argc--)
51 			if (argv[0][0] != '-')
52 				if (isdigit(argv[0][0]))
53 					Max_per_uid = atoi(argv[0]);
54 				else {
55 					Scorefile = argv[0];
56 #ifdef	FANCY
57 					sp = rindex(Scorefile, '/');
58 					if (sp == NULL)
59 						sp = Scorefile;
60 					if (strcmp(sp, "pattern_roll") == 0)
61 						Pattern_roll = true;
62 					else if (strcmp(sp, "stand_still") == 0)
63 						Stand_still = true;
64 					if (Pattern_roll || Stand_still)
65 						Teleport = true;
66 #endif
67 				}
68 			else
69 				for (sp = &argv[0][1]; *sp; sp++)
70 					switch (*sp) {
71 					  case 's':
72 						show_only = true;
73 						break;
74 					  case 'r':
75 						Real_time = true;
76 						break;
77 					  case 'a':
78 						Start_level = 4;
79 						break;
80 					  case 'j':
81 						Jump = true;
82 						break;
83 					  case 't':
84 						Teleport = true;
85 						break;
86 					  default:
87 						fprintf(stderr, "robots: unknown option: %c\n", *sp);
88 						bad_arg = true;
89 						break;
90 					}
91 		if (bad_arg) {
92 			exit(1);
93 			/* NOTREACHED */
94 		}
95 	}
96 
97 	if (show_only) {
98 		show_score();
99 		exit(0);
100 		/* NOTREACHED */
101 	}
102 
103 	initscr();
104 	signal(SIGINT, quit);
105 	cbreak();
106 	noecho();
107 	nonl();
108 	if (LINES != Y_SIZE || COLS != X_SIZE) {
109 		if (LINES < Y_SIZE || COLS < X_SIZE) {
110 			endwin();
111 			printf("Need at least a %dx%d screen\n",
112 			    Y_SIZE, X_SIZE);
113 			exit(1);
114 		}
115 		delwin(stdscr);
116 		stdscr = newwin(Y_SIZE, X_SIZE, 0, 0);
117 	}
118 
119 	srandomdev();
120 	if (Real_time)
121 		signal(SIGALRM, move_robots);
122 	do {
123 		init_field();
124 		for (Level = Start_level; !Dead; Level++) {
125 			make_level();
126 			play_level();
127 		}
128 		move(My_pos.y, My_pos.x);
129 		printw("AARRrrgghhhh....");
130 		refresh();
131 		score();
132 	} while (another());
133 	quit(0);
134 	/* NOTREACHED */
135 	return(0);
136 }
137 
138 /*
139  * quit:
140  *	Leave the program elegantly.
141  */
142 void
143 quit(__unused int sig)
144 {
145 	endwin();
146 	exit(0);
147 	/* NOTREACHED */
148 }
149 
150 /*
151  * another:
152  *	See if another game is desired
153  */
154 static bool
155 another(void)
156 {
157 	int y;
158 
159 #ifdef FANCY
160 	if ((Stand_still || Pattern_roll) && !Newscore)
161 		return true;
162 #endif
163 
164 	if (query("Another game?")) {
165 		if (Full_clear) {
166 			for (y = 1; y <= Num_scores; y++) {
167 				move(y, 1);
168 				clrtoeol();
169 			}
170 			refresh();
171 		}
172 		return true;
173 	}
174 	return false;
175 }
176