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: uknown 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