1 /* $NetBSD: fly.c,v 1.12 2004/01/27 20:30:29 jsm Exp $ */ 2 3 /* 4 * Copyright (c) 1983, 1993 5 * The Regents of the University of California. All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. Neither the name of the University nor the names of its contributors 16 * may be used to endorse or promote products derived from this software 17 * without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29 * SUCH DAMAGE. 30 */ 31 32 #include <sys/cdefs.h> 33 #ifndef lint 34 #if 0 35 static char sccsid[] = "@(#)fly.c 8.2 (Berkeley) 4/28/95"; 36 #else 37 __RCSID("$NetBSD: fly.c,v 1.12 2004/01/27 20:30:29 jsm Exp $"); 38 #endif 39 #endif /* not lint */ 40 41 #include "extern.h" 42 #undef UP 43 #include <curses.h> 44 45 #define MIDR (LINES/2 - 1) 46 #define MIDC (COLS/2 - 1) 47 48 static int row, column; 49 static int dr = 0, dc = 0; 50 static char destroyed; 51 int ourclock = 120; /* time for all the flights in the game */ 52 static char cross = 0; 53 static sig_t oldsig; 54 55 static void blast(void); 56 static void endfly(void); 57 static void moveenemy(int); 58 static void notarget(void); 59 static void screen(void); 60 static void succumb(int); 61 static void target(void); 62 63 static void 64 succumb(dummy) 65 int dummy __attribute__((__unused__)); 66 { 67 if (oldsig == SIG_DFL) { 68 endfly(); 69 exit(1); 70 } 71 if (oldsig != SIG_IGN) { 72 endfly(); 73 (*oldsig) (SIGINT); 74 } 75 } 76 77 int 78 visual() 79 { 80 destroyed = 0; 81 if (initscr() == NULL) { 82 puts("Whoops! No more memory..."); 83 return (0); 84 } 85 oldsig = signal(SIGINT, succumb); 86 cbreak(); 87 noecho(); 88 screen(); 89 row = rnd(LINES - 3) + 1; 90 column = rnd(COLS - 2) + 1; 91 moveenemy(0); 92 for (;;) { 93 switch (getchar()) { 94 95 case 'h': 96 case 'r': 97 dc = -1; 98 fuel--; 99 break; 100 101 case 'H': 102 case 'R': 103 dc = -5; 104 fuel -= 10; 105 break; 106 107 case 'l': 108 dc = 1; 109 fuel--; 110 break; 111 112 case 'L': 113 dc = 5; 114 fuel -= 10; 115 break; 116 117 case 'j': 118 case 'u': 119 dr = 1; 120 fuel--; 121 break; 122 123 case 'J': 124 case 'U': 125 dr = 5; 126 fuel -= 10; 127 break; 128 129 case 'k': 130 case 'd': 131 dr = -1; 132 fuel--; 133 break; 134 135 case 'K': 136 case 'D': 137 dr = -5; 138 fuel -= 10; 139 break; 140 141 case '+': 142 if (cross) { 143 cross = 0; 144 notarget(); 145 } else 146 cross = 1; 147 break; 148 149 case ' ': 150 case 'f': 151 if (torps) { 152 torps -= 2; 153 blast(); 154 if (row == MIDR && column - MIDC < 2 && MIDC - column < 2) { 155 destroyed = 1; 156 alarm(0); 157 } 158 } else 159 mvaddstr(0, 0, "*** Out of torpedoes. ***"); 160 break; 161 162 case 'q': 163 endfly(); 164 return (0); 165 166 default: 167 mvaddstr(0, 26, "Commands = r,R,l,L,u,U,d,D,f,+,q"); 168 continue; 169 170 case EOF: 171 break; 172 } 173 if (destroyed) { 174 endfly(); 175 return (1); 176 } 177 if (ourclock <= 0) { 178 endfly(); 179 die(); 180 } 181 } 182 } 183 184 static void 185 screen() 186 { 187 int r, c, n; 188 int i; 189 190 clear(); 191 i = rnd(100); 192 for (n = 0; n < i; n++) { 193 r = rnd(LINES - 3) + 1; 194 c = rnd(COLS); 195 mvaddch(r, c, '.'); 196 } 197 mvaddstr(LINES - 1 - 1, 21, "TORPEDOES FUEL TIME"); 198 refresh(); 199 } 200 201 static void 202 target() 203 { 204 int n; 205 206 move(MIDR, MIDC - 10); 207 addstr("------- + -------"); 208 for (n = MIDR - 4; n < MIDR - 1; n++) { 209 mvaddch(n, MIDC, '|'); 210 mvaddch(n + 6, MIDC, '|'); 211 } 212 } 213 214 static void 215 notarget() 216 { 217 int n; 218 219 move(MIDR, MIDC - 10); 220 addstr(" "); 221 for (n = MIDR - 4; n < MIDR - 1; n++) { 222 mvaddch(n, MIDC, ' '); 223 mvaddch(n + 6, MIDC, ' '); 224 } 225 } 226 227 static void 228 blast() 229 { 230 int n; 231 232 alarm(0); 233 move(LINES - 1, 24); 234 printw("%3d", torps); 235 for (n = LINES - 1 - 2; n >= MIDR + 1; n--) { 236 mvaddch(n, MIDC + MIDR - n, '/'); 237 mvaddch(n, MIDC - MIDR + n, '\\'); 238 refresh(); 239 } 240 mvaddch(MIDR, MIDC, '*'); 241 for (n = LINES - 1 - 2; n >= MIDR + 1; n--) { 242 mvaddch(n, MIDC + MIDR - n, ' '); 243 mvaddch(n, MIDC - MIDR + n, ' '); 244 refresh(); 245 } 246 alarm(1); 247 } 248 249 static void 250 moveenemy(dummy) 251 int dummy __attribute__((__unused__)); 252 { 253 double d; 254 int oldr, oldc; 255 256 oldr = row; 257 oldc = column; 258 if (fuel > 0) { 259 if (row + dr <= LINES - 3 && row + dr > 0) 260 row += dr; 261 if (column + dc < COLS - 1 && column + dc > 0) 262 column += dc; 263 } else 264 if (fuel < 0) { 265 fuel = 0; 266 mvaddstr(0, 60, "*** Out of fuel ***"); 267 } 268 d = (double) ((row - MIDR) * (row - MIDR) + (column - MIDC) * (column - MIDC)); 269 if (d < 16) { 270 row += (rnd(9) - 4) % (4 - abs(row - MIDR)); 271 column += (rnd(9) - 4) % (4 - abs(column - MIDC)); 272 } 273 ourclock--; 274 mvaddstr(oldr, oldc - 1, " "); 275 if (cross) 276 target(); 277 mvaddstr(row, column - 1, "/-\\"); 278 move(LINES - 1, 24); 279 printw("%3d", torps); 280 move(LINES - 1, 42); 281 printw("%3d", fuel); 282 move(LINES - 1, 57); 283 printw("%3d", ourclock); 284 refresh(); 285 signal(SIGALRM, moveenemy); 286 alarm(1); 287 } 288 289 static void 290 endfly() 291 { 292 alarm(0); 293 signal(SIGALRM, SIG_DFL); 294 mvcur(0, COLS - 1, LINES - 1, 0); 295 endwin(); 296 signal(SIGTSTP, SIG_DFL); 297 signal(SIGINT, oldsig); 298 } 299