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