1 1.34 christos /* $NetBSD: main.c,v 1.34 2022/06/27 18:48:49 christos Exp $ */ 2 1.5 cgd 3 1.1 cgd /* 4 1.5 cgd * Copyright (c) 1980, 1993 5 1.5 cgd * The Regents of the University of California. All rights reserved. 6 1.1 cgd * 7 1.1 cgd * Redistribution and use in source and binary forms, with or without 8 1.1 cgd * modification, are permitted provided that the following conditions 9 1.1 cgd * are met: 10 1.1 cgd * 1. Redistributions of source code must retain the above copyright 11 1.1 cgd * notice, this list of conditions and the following disclaimer. 12 1.1 cgd * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 cgd * notice, this list of conditions and the following disclaimer in the 14 1.1 cgd * documentation and/or other materials provided with the distribution. 15 1.19 agc * 3. Neither the name of the University nor the names of its contributors 16 1.1 cgd * may be used to endorse or promote products derived from this software 17 1.1 cgd * without specific prior written permission. 18 1.1 cgd * 19 1.1 cgd * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 20 1.1 cgd * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 1.1 cgd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 1.1 cgd * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 23 1.1 cgd * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24 1.1 cgd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25 1.1 cgd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26 1.1 cgd * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27 1.1 cgd * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28 1.1 cgd * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29 1.1 cgd * SUCH DAMAGE. 30 1.1 cgd */ 31 1.1 cgd 32 1.6 lukem #include <sys/cdefs.h> 33 1.1 cgd #ifndef lint 34 1.23 lukem __COPYRIGHT("@(#) Copyright (c) 1980, 1993\ 35 1.23 lukem The Regents of the University of California. All rights reserved."); 36 1.1 cgd #endif /* not lint */ 37 1.1 cgd 38 1.1 cgd #ifndef lint 39 1.5 cgd #if 0 40 1.5 cgd static char sccsid[] = "@(#)main.c 8.1 (Berkeley) 5/31/93"; 41 1.5 cgd #else 42 1.34 christos __RCSID("$NetBSD: main.c,v 1.34 2022/06/27 18:48:49 christos Exp $"); 43 1.5 cgd #endif 44 1.1 cgd #endif /* not lint */ 45 1.1 cgd 46 1.28 dholland #include <ctype.h> 47 1.28 dholland #include <curses.h> 48 1.34 christos #include <string.h> 49 1.28 dholland #include <err.h> 50 1.28 dholland #include <errno.h> 51 1.28 dholland #include <fcntl.h> 52 1.28 dholland #include <signal.h> 53 1.28 dholland #include <stdlib.h> 54 1.29 dholland #include <time.h> 55 1.28 dholland #include <unistd.h> 56 1.26 dholland #include "robots.h" 57 1.1 cgd 58 1.26 dholland extern const char *Scorefile; 59 1.26 dholland extern int Max_per_uid; 60 1.17 christos 61 1.32 dholland static bool another(void); 62 1.32 dholland 63 1.6 lukem int 64 1.30 dholland main(int argc, char **argv) 65 1.1 cgd { 66 1.30 dholland const char *word; 67 1.26 dholland bool show_only; 68 1.26 dholland int score_wfd; /* high score writable file descriptor */ 69 1.26 dholland int score_err = 0; /* hold errno from score file open */ 70 1.30 dholland int maximum = 0; 71 1.31 christos int ch, i; 72 1.11 jsm 73 1.11 jsm score_wfd = open(Scorefile, O_RDWR); 74 1.11 jsm if (score_wfd < 0) 75 1.11 jsm score_err = errno; 76 1.11 jsm else if (score_wfd < 3) 77 1.11 jsm exit(1); 78 1.11 jsm 79 1.11 jsm /* Revoke setgid privileges */ 80 1.16 mycroft setgid(getgid()); 81 1.1 cgd 82 1.28 dholland show_only = false; 83 1.8 christos Num_games = 1; 84 1.30 dholland 85 1.30 dholland while ((ch = getopt(argc, argv, "Aajnrst")) != -1) { 86 1.30 dholland switch (ch) { 87 1.30 dholland case 'A': 88 1.30 dholland Auto_bot = true; 89 1.30 dholland break; 90 1.30 dholland case 'a': 91 1.30 dholland Start_level = 4; 92 1.30 dholland break; 93 1.30 dholland case 'j': 94 1.30 dholland Jump = true; 95 1.30 dholland break; 96 1.30 dholland case 'n': 97 1.30 dholland Num_games++; 98 1.30 dholland break; 99 1.30 dholland case 'r': 100 1.30 dholland Real_time = true; 101 1.30 dholland break; 102 1.30 dholland case 's': 103 1.30 dholland show_only = true; 104 1.30 dholland break; 105 1.30 dholland case 't': 106 1.30 dholland Teleport = true; 107 1.30 dholland break; 108 1.30 dholland default: 109 1.30 dholland errx(1, 110 1.30 dholland "Usage: robots [-Aajnrst] [maximum] [scorefile]"); 111 1.30 dholland break; 112 1.30 dholland } 113 1.30 dholland } 114 1.30 dholland 115 1.30 dholland for (i = optind; i < argc; i++) { 116 1.30 dholland word = argv[i]; 117 1.30 dholland if (isdigit((unsigned char)word[0])) { 118 1.30 dholland maximum = atoi(word); 119 1.30 dholland } else { 120 1.30 dholland Scorefile = word; 121 1.30 dholland Max_per_uid = maximum; 122 1.30 dholland if (score_wfd >= 0) 123 1.30 dholland close(score_wfd); 124 1.30 dholland score_wfd = open(Scorefile, O_RDWR); 125 1.30 dholland if (score_wfd < 0) 126 1.30 dholland score_err = errno; 127 1.27 dholland #ifdef FANCY 128 1.30 dholland word = strrchr(Scorefile, '/'); 129 1.30 dholland if (word == NULL) 130 1.30 dholland word = Scorefile; 131 1.30 dholland if (strcmp(word, "pattern_roll") == 0) 132 1.30 dholland Pattern_roll = true; 133 1.30 dholland else if (strcmp(word, "stand_still") == 0) 134 1.30 dholland Stand_still = true; 135 1.30 dholland if (Pattern_roll || Stand_still) 136 1.30 dholland Teleport = true; 137 1.27 dholland #endif 138 1.1 cgd } 139 1.1 cgd } 140 1.1 cgd 141 1.1 cgd if (show_only) { 142 1.1 cgd show_score(); 143 1.1 cgd exit(0); 144 1.1 cgd /* NOTREACHED */ 145 1.1 cgd } 146 1.1 cgd 147 1.11 jsm if (score_wfd < 0) { 148 1.11 jsm errno = score_err; 149 1.11 jsm warn("%s", Scorefile); 150 1.11 jsm warnx("High scores will not be recorded!"); 151 1.11 jsm sleep(2); 152 1.11 jsm } 153 1.11 jsm 154 1.24 drochner if (!initscr()) 155 1.24 drochner errx(0, "couldn't initialize screen"); 156 1.1 cgd signal(SIGINT, quit); 157 1.18 blymn cbreak(); 158 1.1 cgd noecho(); 159 1.1 cgd nonl(); 160 1.1 cgd if (LINES != Y_SIZE || COLS != X_SIZE) { 161 1.1 cgd if (LINES < Y_SIZE || COLS < X_SIZE) { 162 1.1 cgd endwin(); 163 1.1 cgd printf("Need at least a %dx%d screen\n", 164 1.1 cgd Y_SIZE, X_SIZE); 165 1.1 cgd exit(1); 166 1.1 cgd } 167 1.1 cgd delwin(stdscr); 168 1.1 cgd stdscr = newwin(Y_SIZE, X_SIZE, 0, 0); 169 1.1 cgd } 170 1.1 cgd 171 1.1 cgd if (Real_time) 172 1.1 cgd signal(SIGALRM, move_robots); 173 1.1 cgd do { 174 1.8 christos while (Num_games--) { 175 1.8 christos init_field(); 176 1.8 christos for (Level = Start_level; !Dead; Level++) { 177 1.8 christos make_level(); 178 1.8 christos play_level(); 179 1.8 christos if (Auto_bot) 180 1.8 christos sleep(1); 181 1.8 christos } 182 1.8 christos move(My_pos.y, My_pos.x); 183 1.8 christos printw("AARRrrgghhhh...."); 184 1.8 christos refresh(); 185 1.8 christos if (Auto_bot) 186 1.8 christos sleep(1); 187 1.11 jsm score(score_wfd); 188 1.8 christos if (Auto_bot) 189 1.8 christos sleep(1); 190 1.8 christos refresh(); 191 1.1 cgd } 192 1.15 jsm Num_games = 1; 193 1.8 christos } while (!Auto_bot && another()); 194 1.6 lukem quit(0); 195 1.6 lukem /* NOTREACHED */ 196 1.6 lukem return(0); 197 1.5 cgd } 198 1.5 cgd 199 1.1 cgd /* 200 1.1 cgd * quit: 201 1.1 cgd * Leave the program elegantly. 202 1.1 cgd */ 203 1.1 cgd void 204 1.25 dholland quit(int dummy __unused) 205 1.1 cgd { 206 1.3 mycroft endwin(); 207 1.1 cgd exit(0); 208 1.1 cgd /* NOTREACHED */ 209 1.1 cgd } 210 1.1 cgd 211 1.1 cgd /* 212 1.1 cgd * another: 213 1.1 cgd * See if another game is desired 214 1.1 cgd */ 215 1.32 dholland static bool 216 1.25 dholland another(void) 217 1.1 cgd { 218 1.26 dholland int y; 219 1.1 cgd 220 1.26 dholland #ifdef FANCY 221 1.1 cgd if ((Stand_still || Pattern_roll) && !Newscore) 222 1.28 dholland return true; 223 1.1 cgd #endif 224 1.1 cgd 225 1.1 cgd if (query("Another game?")) { 226 1.1 cgd if (Full_clear) { 227 1.1 cgd for (y = 1; y <= Num_scores; y++) { 228 1.1 cgd move(y, 1); 229 1.1 cgd clrtoeol(); 230 1.1 cgd } 231 1.1 cgd refresh(); 232 1.1 cgd } 233 1.28 dholland return true; 234 1.1 cgd } 235 1.28 dholland return false; 236 1.1 cgd } 237