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