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