xref: /csrg-svn/games/battlestar/fly.c (revision 69064)
118720Sedward /*
260750Sbostic  * Copyright (c) 1983, 1993
360750Sbostic  *	The Regents of the University of California.  All rights reserved.
434234Sbostic  *
542569Sbostic  * %sccs.include.redist.c%
618720Sedward  */
718720Sedward 
817384Sedward #ifndef lint
9*69064Sbostic static char sccsid[] = "@(#)fly.c	8.2 (Berkeley) 04/28/95";
1034234Sbostic #endif /* not lint */
1117384Sedward 
12*69064Sbostic #include "extern.h"
1317384Sedward #undef UP
1417384Sedward #include <curses.h>
1517384Sedward 
1617384Sedward #define abs(a)	((a) < 0 ? -(a) : (a))
1717384Sedward #define MIDR  (LINES/2 - 1)
1817384Sedward #define MIDC  (COLS/2 - 1)
1917384Sedward 
2017384Sedward int row, column;
2117384Sedward int dr = 0, dc = 0;
2217384Sedward char destroyed;
2317384Sedward int clock = 120;		/* time for all the flights in the game */
2417384Sedward char cross = 0;
2539155Sbostic sig_t oldsig;
2617384Sedward 
2746732Sbostic void
succumb()2817384Sedward succumb()
2917384Sedward {
3031354Sbostic 	if (oldsig == SIG_DFL) {
3117439Sedward 		endfly();
3217439Sedward 		exit(1);
3331354Sbostic 	}
3431354Sbostic 	if (oldsig != SIG_IGN) {
3517439Sedward 		endfly();
3646732Sbostic 		(*oldsig)(SIGINT);
3717439Sedward 	}
3817384Sedward }
3917384Sedward 
visual()4017384Sedward visual()
4117384Sedward {
4246966Sbostic 	void moveenemy();
4317384Sedward 
4417384Sedward 	destroyed = 0;
4517384Sedward 	if(initscr() == ERR){
4617384Sedward 		puts("Whoops!  No more memory...");
4717384Sedward 		return(0);
4817384Sedward 	}
4917384Sedward 	oldsig = signal(SIGINT, succumb);
5017384Sedward 	crmode();
5117384Sedward 	noecho();
5217384Sedward 	screen();
5317384Sedward 	row = rnd(LINES-3) + 1;
5417384Sedward 	column = rnd(COLS-2) + 1;
5517384Sedward 	moveenemy();
5617384Sedward 	for (;;) {
5717384Sedward 		switch(getchar()){
5817384Sedward 
5917384Sedward 			case 'h':
6017384Sedward 			case 'r':
6117384Sedward 				dc = -1;
6217384Sedward 				fuel--;
6317384Sedward 				break;
6417384Sedward 
6517384Sedward 			case 'H':
6617384Sedward 			case 'R':
6717384Sedward 				dc = -5;
6817384Sedward 				fuel -= 10;
6917384Sedward 				break;
7017384Sedward 
7117384Sedward 			case 'l':
7217384Sedward 				dc = 1;
7317384Sedward 				fuel--;
7417384Sedward 				break;
7517384Sedward 
7617384Sedward 			case 'L':
7717384Sedward 				dc = 5;
7817384Sedward 				fuel -= 10;
7917384Sedward 				break;
8017384Sedward 
8117384Sedward 			case 'j':
8217384Sedward 			case 'u':
8317384Sedward 				dr = 1;
8417384Sedward 				fuel--;
8517384Sedward 				break;
8617384Sedward 
8717384Sedward 			case 'J':
8817384Sedward 			case 'U':
8917384Sedward 				dr = 5;
9017384Sedward 				fuel -= 10;
9117384Sedward 				break;
9217384Sedward 
9317384Sedward 			case 'k':
9417384Sedward 			case 'd':
9517384Sedward 				dr = -1;
9617384Sedward 				fuel--;
9717384Sedward 				break;
9817384Sedward 
9917384Sedward 			case 'K':
10017384Sedward 			case 'D':
10117384Sedward 				dr = -5;
10217384Sedward 				fuel -= 10;
10317384Sedward 				break;
10417384Sedward 
10517384Sedward 			case '+':
10617384Sedward 				if (cross){
10717384Sedward 					cross = 0;
10817384Sedward 					notarget();
10917384Sedward 				}
11017384Sedward 				else
11117384Sedward 					cross = 1;
11217384Sedward 				break;
11317384Sedward 
11417384Sedward 			case ' ':
11517384Sedward 			case 'f':
11617384Sedward 				if (torps){
11717384Sedward 					torps -= 2;
11817384Sedward 					blast();
11917384Sedward 					if (row == MIDR && column - MIDC < 2 && MIDC - column < 2){
12017384Sedward 						destroyed = 1;
12117384Sedward 						alarm(0);
12217384Sedward 					}
12317384Sedward 				}
12417384Sedward 				else
12517384Sedward 					mvaddstr(0,0,"*** Out of torpedoes. ***");
12617384Sedward 				break;
12717384Sedward 
12817384Sedward 			case 'q':
12917384Sedward 				endfly();
13017384Sedward 				return(0);
13117384Sedward 
13217384Sedward 			default:
13317384Sedward 				mvaddstr(0,26,"Commands = r,R,l,L,u,U,d,D,f,+,q");
13417384Sedward 				continue;
13517384Sedward 
13617384Sedward 			case EOF:
13717384Sedward 				break;
13817384Sedward 		}
13917384Sedward 		if (destroyed){
14017384Sedward 			endfly();
14117384Sedward 			return(1);
14217384Sedward 		}
14317384Sedward 		if (clock <= 0){
14417384Sedward 			endfly();
14517384Sedward 			die();
14617384Sedward 		}
14717384Sedward 	}
14817384Sedward }
14917384Sedward 
screen()15017384Sedward screen()
15117384Sedward {
15217384Sedward 	register int r,c,n;
15317384Sedward 	int i;
15417384Sedward 
15517384Sedward 	clear();
15617384Sedward 	i = rnd(100);
15717384Sedward 	for (n=0; n < i; n++){
15817384Sedward 		r = rnd(LINES-3) + 1;
15917384Sedward 		c = rnd(COLS);
16017384Sedward 		mvaddch(r, c, '.');
16117384Sedward 	}
16217384Sedward 	mvaddstr(LINES-1-1,21,"TORPEDOES           FUEL           TIME");
16317384Sedward 	refresh();
16417384Sedward }
16517384Sedward 
target()16617384Sedward target()
16717384Sedward {
16817384Sedward 	register int n;
16917384Sedward 
17017384Sedward 	move(MIDR,MIDC-10);
17117384Sedward 	addstr("-------   +   -------");
17217384Sedward 	for (n = MIDR-4; n < MIDR-1; n++){
17317384Sedward 		mvaddch(n,MIDC,'|');
17417384Sedward 		mvaddch(n+6,MIDC,'|');
17517384Sedward 	}
17617384Sedward }
17717384Sedward 
notarget()17817384Sedward notarget()
17917384Sedward {
18017384Sedward 	register int n;
18117384Sedward 
18217384Sedward 	move(MIDR,MIDC-10);
18317384Sedward 	addstr("                     ");
18417384Sedward 	for (n = MIDR-4; n < MIDR-1; n++){
18517384Sedward 		mvaddch(n,MIDC,' ');
18617384Sedward 		mvaddch(n+6,MIDC,' ');
18717384Sedward 	}
18817384Sedward }
18917384Sedward 
blast()19017384Sedward blast()
19117384Sedward {
19217384Sedward 	register int n;
19317384Sedward 
19417384Sedward 	alarm(0);
19517384Sedward 	move(LINES-1, 24);
19617384Sedward 	printw("%3d", torps);
19717384Sedward 	for(n = LINES-1-2; n >= MIDR + 1; n--){
19817384Sedward 		mvaddch(n, MIDC+MIDR-n, '/');
19917384Sedward 		mvaddch(n, MIDC-MIDR+n, '\\');
20017384Sedward 		refresh();
20117384Sedward 	}
20217384Sedward 	mvaddch(MIDR,MIDC,'*');
20317384Sedward 	for(n = LINES-1-2; n >= MIDR + 1; n--){
20417384Sedward 		mvaddch(n, MIDC+MIDR-n, ' ');
20517384Sedward 		mvaddch(n, MIDC-MIDR+n, ' ');
20617384Sedward 		refresh();
20717384Sedward 	}
20817384Sedward 	alarm(1);
20917384Sedward }
21017384Sedward 
21146732Sbostic void
moveenemy()21217384Sedward moveenemy()
21317384Sedward {
21417384Sedward 	double d;
21517384Sedward 	int oldr, oldc;
21617384Sedward 
21717384Sedward 	oldr = row;
21817384Sedward 	oldc = column;
21917384Sedward 	if (fuel > 0){
22017384Sedward 		if (row + dr <= LINES-3 && row + dr > 0)
22117384Sedward 			row += dr;
22217384Sedward 		if (column + dc < COLS-1 && column + dc > 0)
22317384Sedward 			column += dc;
22417384Sedward 	} else if (fuel < 0){
22517384Sedward 		fuel = 0;
22617384Sedward 		mvaddstr(0,60,"*** Out of fuel ***");
22717384Sedward 	}
22817384Sedward 	d = (double) ((row - MIDR)*(row - MIDR) + (column - MIDC)*(column - MIDC));
22917384Sedward 	if (d < 16){
23017384Sedward 		row += (rnd(9) - 4) % (4 - abs(row - MIDR));
23117384Sedward 		column += (rnd(9) - 4) % (4 - abs(column - MIDC));
23217384Sedward 	}
23317384Sedward 	clock--;
23417384Sedward 	mvaddstr(oldr, oldc - 1, "   ");
23517384Sedward 	if (cross)
23617384Sedward 		target();
23717384Sedward 	mvaddstr(row, column - 1, "/-\\");
23817384Sedward 	move(LINES-1, 24);
23917384Sedward 	printw("%3d", torps);
24017384Sedward 	move(LINES-1, 42);
24117384Sedward 	printw("%3d", fuel);
24217384Sedward 	move(LINES-1, 57);
24317384Sedward 	printw("%3d", clock);
24417384Sedward 	refresh();
24517384Sedward 	signal(SIGALRM, moveenemy);
24617384Sedward 	alarm(1);
24717384Sedward }
24817384Sedward 
endfly()24917384Sedward endfly()
25017384Sedward {
25117384Sedward 	alarm(0);
25217384Sedward 	signal(SIGALRM, SIG_DFL);
25317384Sedward 	mvcur(0,COLS-1,LINES-1,0);
25417384Sedward 	endwin();
25517384Sedward 	signal(SIGTSTP, SIG_DFL);
25617384Sedward 	signal(SIGINT, oldsig);
25717384Sedward }
258