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